[VBA] Consiglio su struttura programma!

martedì 25 settembre 2007 - 09.48

iltexano Profilo | Newbie

Allora ragazzi mi serve un consiglio su come strutturare un programma.. o se dividerlo in mini programmi.

Il suddetto in questione deve fare questo:

1) Scansionare l'intera tabella che è suddivisa per provincia e contare quanti sono i record per provincia

2) Nell'ultimo record dell'ultima provincia, prima di passare alla successiva (record successivo quindi) segnare il valore di un campo, che è il progressivo piu alto stabilito con il precedente programma

3) riempire una nuova tabella gia creata partendo dal progressivo piu alto segnato per ogni provincia riutilizzando praticamente il programma precedente


Ora io pensavo.. considerando che non sono a conoscenza della possibilità di far 2 scansioni di una stessa tabella senza impicciare il computere e il mio cervello potrei usare uno di questi metodi

A) Creare una tabella di appoggio con solo codice provincia e progressivo piu alto, da utilizzare poi su un ulteriore modulo

B) Clonare la Tabella ed utilizzare una do until parallela (mi sembra molto macchinoso)

La prima mi sembra la piu fattibile, perche poi mi basterebbe utilizzare una variabile d'appoggio e poi fare una if fino alla fine del record, giusto?

alla fine l'ho studiata cosi, ma dove vedete evidenziato mi da un errore dicendo che non c'è nessun record corrente.. dove sbaglio?

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

alx_81 Profilo | Guru

>Allora ragazzi mi serve un consiglio su come strutturare un programma..
>o se dividerlo in mini programmi.
Ciao
>
>Il suddetto in questione deve fare questo:
>
>1) Scansionare l'intera tabella che è suddivisa per provincia e contare quanti sono i record per provincia
Ma non puoi contare i record solo con la clausola group by di SQL?
SELECT Provincia, COUNT(*) as Conteggio FROM TuaTabella GROUP BY Provincia
>
>2) Nell'ultimo record dell'ultima provincia, prima di passare
>alla successiva (record successivo quindi) segnare il valore
>di un campo, che è il progressivo piu alto stabilito con il precedente
>programma
Avendo un record per ogni provincia direi che questo passo non ti serve più..
>
>3) riempire una nuova tabella gia creata partendo dal progressivo
>piu alto segnato per ogni provincia riutilizzando praticamente
>il programma precedente
Puoi usare direttamente la query, senza per forza scrivere una nuova tabella. Questo potrebbe accadere solo se i record sono veramente tanti e se le query di lettura rallentano davvero l'applicazione.
>
>
>Ora io pensavo.. considerando che non sono a conoscenza della
>possibilità di far 2 scansioni di una stessa tabella senza impicciare
>il computere e il mio cervello potrei usare uno di questi metodi
>
>A) Creare una tabella di appoggio con solo codice provincia e
>progressivo piu alto, da utilizzare poi su un ulteriore modulo
>
>B) Clonare la Tabella ed utilizzare una do until parallela (mi
>sembra molto macchinoso)
Sinceramente lascerei perdere le scansioni.. con una query risolvi tutto..
Forse mi sono perso qualche pezzo?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

iltexano Profilo | Newbie

il fatto è che i progressivi partono da 1234, quindi non so quale è il numero dell'ultimo record!!!

cioè deve essere una cosa automatica, che io lancio e fa tutto da sola, per questo sto scrivendo il codice in vba..

calcola che il file completo saranno circa 500.000 record..

per il resto nel codice che mi sono scritto prima mi da quell'errore, ma non capisco perchè, sai aiutarmi?:)

alx_81 Profilo | Guru

>il fatto è che i progressivi partono da 1234, quindi non so quale
>è il numero dell'ultimo record!!!
Ma a te serve sapere quanti sono, li vuoi numerare progressivamente oppure vuoi trovare il progressivo più alto per ogni provincia?
Prima devo capire bene quali sono le tue esigenze..
magari posta la CREATE della tabella, qualche insert e il risultato che vuoi ottenere.
Perchè una volta che hai ottenuto il resultset devo capire anche a che ti serve, per vedere se ci sono altre vie..
Al max alla fine controlliamo il vb..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

iltexano Profilo | Newbie

allora il programma che mi calcola i progressivi lo ho gia fatto!

a me serve sapere quanti recordo sono per provincia per calcolare il 10% del numero totale delle provincie, e partire la successiva numerazione dal progressivo piu alto registrato in precedenza!

piu chiaro?

alx_81 Profilo | Guru

>allora il programma che mi calcola i progressivi lo ho gia fatto!
>
>a me serve sapere quanti recordo sono per provincia per calcolare
>il 10% del numero totale delle provincie, e partire la successiva
>numerazione dal progressivo piu alto registrato in precedenza!
Dunque.. posso postarti un esempio che ti ricava il numero dei record per provincia con il rispettivo 10%.
Se il programma dei progressivi l'hai già fatto, saprà anche ripartire già dal più alto. Per ricavarlo basta utilizzare la funzione SQL MAX().
In linea di massima per automatizzare con VBA puoi fare un programmino che ricava le righe dalla query che ti ho scritto (usando ADO.Net o ADO, dipende dalla versione che usi) e per ogni record ricavato fare tutte le elaborazioni che ti servono.
Comunque eccoti la query, spero che possa aiutarti, visto che non ho l'idea dei campi che possiedi nelle tabelle e/o se hai anche relazioni:
SELECT Provincia , Count(*) AS Conteggio , Count(*)/100*10 AS DieciPerCento FROM Province GROUP BY Provincia;

Considera che non è necessario scansionare una tabella per simili calcoli. Tante cose puoi risolverle con semplici (o meno) query.





Alx81 =)

http://blogs.dotnethell.it/suxstellino

iltexano Profilo | Newbie

grazie mille per avermi semplificato la vita! :)

provo la query e vedo se va, poi accetto la risposta! :)

iltexano Profilo | Newbie

allora io l'ho scritta, cosi:

SELECT CCP, Count(*) AS Conteggio, Count(*)/100*10 AS DieciPerCento
FROM [str soci]
ORDER BY CCP;


ma mi restituisce un errore

"Impossibile eseguire una query che non include l'espressione "ccp" specificata come parte di una funzione di aggregazione.

E' lo stesso scritta come me la propone access, ossia cosi

SELECT [Str Soci].CCP, Count(*) AS Conteggio, Count(*)/100*10 AS DieciPerCento
FROM [str soci]
ORDER BY [Str Soci].CCP;

Posso salvarmi questi dati in una tabella d'appoggio da utilizzare poi per un altro programma?

OK RISOLTO

SELECT [str soci].CCP, Count(*) AS conteggio, Count(*)/100*10 AS diecipercento INTO percento
FROM [str soci]
GROUP BY [str soci].CCP;

alx_81 Profilo | Guru

>allora io l'ho scritta, cosi:
>
>SELECT CCP, Count(*) AS Conteggio, Count(*)/100*10 AS DieciPerCento
>FROM [str soci]
>ORDER BY CCP;
>
>
>ma mi restituisce un errore
>
>"Impossibile eseguire una query che non include l'espressione
>"ccp" specificata come parte di una funzione di aggregazione.
devi fare GROUP BY ccp, prima di ORDER BY. Perchè la count aggrega i dati, e quindi li "schiaccia". Il campo ccp, va "schiacciato" di conseguenza, o con una funzione di aggregazione MIN(), MAX(), AVG(), ecc.. oppure con la GROUP BY, se non hai criteri particolari.
La tua query viene così:

SELECT CCP , Count(*) AS Conteggio, , Count(*)/100*10 AS DieciPerCento FROM [str soci] GROUP BY CCP ORDER BY CCP;

>Posso salvarmi questi dati in una tabella d'appoggio da utilizzare
>poi per un altro programma?
direi di sì, aggiungendo a insert a monte della tua query.

INSERT INTO nuovatabellacreata (campoccp, campocount1, campocount2) SELECT CCP , Count(*) AS Conteggio, , Count(*)/100*10 AS DieciPerCento FROM [str soci] GROUP BY CCP ORDER BY CCP;

Ma non puoi salvarti la query in un datatable senza passare da una struttura fisica? In quel modo salvi il resultset temporaneo in una struttura in memoria che poi si distrugge poichè non ti serve più..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

iltexano Profilo | Newbie

avevo fatto da me, ma grazie mille cmq (l'avevo anche scritto! ;))

cmq accetto la risposta cosi chiudiamo! :)

anzi no.. posso fare in modo che il campo percentuale venga intero? perchè sulle properità me l'aveva preso, ma nella nuova tabella no!

alx_81 Profilo | Guru

>anzi no.. posso fare in modo che il campo percentuale venga intero?
>perchè sulle properità me l'aveva preso, ma nella nuova tabella
>no!
Metti il tipo di campo intero sulla tabella oppure usa la funzione ROUND(campo, numero di cifre).
Avevo il post aperto in risposta e non ho visto il RISOLTO

Alx81 =)

http://blogs.dotnethell.it/suxstellino
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5