Newsgroup: it.comp.lang.visual-basic
Titolo: Ottimizzazione Algoritmo di calcolo

La domanda è banale IMHO ma non so trovare una procedura ottimale per
rispolvela... Ecco qui:
Ho una tabella che ha come campi principali:
COD.ART. - ANNO - MESE1 - MESE2 - MESE3 - MESE4 - ... - MESE12 - TOTALE
Per ogni CodArt ci sono memorizzati gli scarichi fatti dal magazzino
mese per mese ed infine il totale. Ogni tanto ci sono degli 0 perchè
in quel mese l'articolo NON è stato scaricato. Mi chiedono di sapere
partendo dal mese corrente quanti mesi di NON utilizzo ha ogni CodArt.
ad esempio potrei avere:
ART01 - 2003 - 50 - 35 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 85
ART01 - 2004 -  0 -  0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 -  0
In questo esempio l'articolo ART01 NON è usato da 22 mesi.
La procedura che ho fatto è lentissima se contate che hanno 90000
articoli e che gli anni da vagliare sono 7 (e tanti articoli non li
usano da 5-6 anni).
Avete idea di come ottimizzare? Come fareste voi?
Grazie a tutti e se servono altre info chiedetemi pure...
Al3x
PS: le tabelle sono di AS400 e non mie quindi NON posso modficarle in
nessuna maniera...

Il database è strutturato parecchio male IMHO.
Andrebbe un po' normalizzato, e con una o due query otterresti il 
risultato in qualche frazione di secondo...
La tabella dovrebbe composta come:
ID_Articolo (intero, alfanumerico, quello che ti pare);
Anno (intero);
Mese (intero piccolo);
O, al massimo:
ID_Articolo;
Anno_mese (char(6));
A questo punto le strade sono due: o memorizzi mese per mese, per ogni 
articolo, quante volte è stato scaricato (quindi otterrai anche dei 
campi a zero), oppure valorizzi soltanto gli articoli scaricati.
Nel primo caso è facile contare quanti record sono a zero per un certo 
periodo di tempo (un bel BETWEEN ti aiuta parecchio);
nel secondo casobasta controllare l'ultimo scarico di un certo articolo 
la cui coppia anno_mese sia strettamente minore a quella attuale.
Una bella sottrazione e ottieni il numero di mesi ad oggi.
Però così com'è il database è difficile ottimizzare molto...
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

Però così com'è il database è difficile ottimizzare molto...
Quello che ho detto pure io al cliente...
Al3x


UH!
scusa eh....prova tu perchč io non posso fare la prova!
se ho ben capito il mese a zero significa non scarico nulla...
OK....
allora una query che conta (COUNT e varianti nei vari dialetti sql)
tutti gli articoli con ANNO<=annoche vuoi and mese <=mese che vuoi
non fa al caso tuo....???
casomai se la fai eseguire all'as400 e tu "digerisci" e mostri i risultati
mi sembra valido no?
...ma per provare....
Attacca access all'as400 (bella espressione mi vedo alex con la colla e la
scatola di access chino sull'as400...insomma hai capito no?) e usalo come
frontend per provare a pasticciare con le query...usiamolo sto access tanto
bistrattato!
:-)

usiamolo sto access tanto bistrattato!
In realtà il sw che sto modificando è fatto in access con tabelle
collegate...
Al3x

 Avete idea di come ottimizzare? Come fareste voi?
Trasponi i dati in record distinti in una tabella a parte.
Poi con quattro righe di Sql faremo tutto.
Altrimenti, non vedo altro che una batteria sconvolgente di CASE END 
(sempre che DB2 supporti il Case).
Ciao
Alberto
-- 
Ma noi no