Newsgroup: it.comp.lang.delphi
Titolo: Conteggio incrementale

Ho una tabella contenente i seguenti valori:
CampoA     CampoB
a1                a2
a3                a4
a4                a5
a3                a2
a1                a5
a7                a5
Vorrei che ad ogni record della tabella fosse
calcolato il conteggio progressivo di ogni valore come da tabella sotto
qualcuno mi puo' dare un suggerimento?
(Query,array,cicli??)
Grazie Paolo
CampoA     CampoB     CampoA2     CampoB2
a1                a2             1                    1
a3                a4             1                    1
a4                a5             2                    1
a3                a2             2                    2
a1                a5             2                    2
a7                a5             1                    3

Ciao ....

Scusa ma non ho capito cosa dovresti fare !!!
Ciao
Daniele 
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4080 (20090515) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com

Quarda bene con attenzione la tabella di cui sotto e alla fine capirai.
Lo spiego in altre parole nei campi CampoA2 e CampoB2 devono essere 
riportate il numero delle volte che i valori di CampoA e CampoB
appaiono,per esempio a4 appare una prima volta nel secondo record
poi la seconda volta nel terzo record,mentre a5 appare tre volte(terzo 
record,quinto record e sesto record,indipendentemente dal campo in cui si 
trovano.
Pero' dubito che tu possa aiutarmi,perche' mi sembri nuovo,comunque questa 
e' roba da esperti,ho provato con query e subquery,ma qui credo proprio che 
non bastino!! Grazie lo stesso.


 credo proprio che non bastino!!
Pero' ci provo ... lo stesso !! al massimo dirai che non va bene !!! 
eheheheheh.
Comunque non capisco la logica dell'a4, compare 2 volte la prima volta nel 
secondo record in campob, la seconda nel terzo record campoa.
Posso capire l'incremento numerico nello stesso campo, un po meno quello 
generale ... comunque a te serve e per questo pensiamo ....
Se il tuo problema e' fare una conta paro paro di quello che un campo 
contiene e di quante volte compare .... la soluzione che mi viene in mente 
e' la seguente, conta quante vole lo incontri nella lettura del database !!!
(bada bene che e' quello che farei io che esperto non sono e che magari hai 
gia' fatto tu e hai reputato non idoneo).
Parti dal primo record della tabella (filtrata o meno), leggi i campi che ti 
interessano e li metti in una lista adattata su una cosa del tipo
Type MioRecord = Record
            Articolo                 : String;
            NumeroRipetizioni : Integer;
            CampoA               : Integer;
            CampoB               : Integer;
         End
Quando leggi il record (e hai tutti i campi del reccord che leggi) fai i 
confronti piu' o meno
ControllaCampo(ValoreArticolo,Campo)
e in ControllaCampo scorri la lista e puoi avere due casi
1 - non e' in lista
     Allora aggiungi un record alla lista
               Articolo:=ValoreArticolo
               NumeroRipetizioni:=1;
               CampoA:=0;
               CampoB:=1; // Perche' era in campo B
2 - e' gia' in lista
     Allora Articolo non va cambiato perche' e' gai' presente
               NumeroRipetizioni:=NumeroRipetizioni+1; // perche' e' gia' 
presente
               Se hai passato CampoA CampoA:=CampoA+1;
               Se hai passato CampoB CampoB:=CampoB+1;
Alla fine nella tua lista hai il numero totale di ripetizioni del tuo 
articolo e quante volte e' presente nel campoA e campoB.
Questo e' un esempio di massima adattabile a griglie e simili pero', come ho 
detto in principo, ci sono il 100% delle probabilita' che non fa al caso tuo 
!!, inoltre non ho idea della lentezza dell'operazione se il database ha 
decine di migliaia di record ....


Sto tentando di decifrare la tua tabella del primo post...
Ma se tu vuoi effettivamente contare quante volte i singoli valori in
CampoA e CampoB si ripetono all'interno dei due campi, la tabella non
dovrebbe essere come la seguente?
CampoA     CampoB     CampoA2     CampoB2
a1                a2             2                    2
a3                a4             2                    2
a4                a5             2                    3
a3                a2             2                    2
a1                a5             2                    3
a7                a5             1                    3
Infatti l'unico valore che compare una volta sola e' "a7", mentre
nella tua tabella c'erano un sacco di "1"...
Per contarli direi che puoi seguire l'esempio che ti e' stato dato,
anche se per una grande quantita' di dati potrebbe essere un po'
lento.
Saluti!

Immagina che la lista sia un elenco successivo di partite di calcio,(in casa 
e fuori casa)
ad ogni riga vanno calcolate in maniera incrementale quante partite hanno 
giocato le rispettive squadre
fino ad ogni  riga corrente,questo forse ti chiarirï¿½ meglio le cose.
Comunque provo il tuo suggerimento se nel frattempo hai capito meglio il 
meccanismo guarda se puoi migliorare il tuo suggerimento.
Grazie
Paolo


 a7                a5             1                    3
No,perche' il conteggio deve essere incrementale,ogni record successivo deve 
riportare il totale dei conteggi precedenti,mantenendo invariati comunque 
quelli dei record precedenti!!
Immagina che la lista siano partite di calcio tra squadre(a1,a2,a3 ecc.),per 
ogni record vanno calcolate le partite totali giocate fino a quel momento da 
ogni squadra,nell'esempio nel primo record a1 e a2 figurano con una 
partita,nel quarto record a2 figurer� con due partite e cos� via...a7 
figurer� nell'ultimo record con una sola partita
Grazie per l'interessamento
Paolo

 Paolo
Secondo il mio parere (da semplice hobbista dunque prendilo con le 
molle), io costruirei il DB in modo diverso, avrei fatto una tabella 
principale che ï¿½ la lista di tutte le squadre, cosï¿½ strutturata:
ID (PK),Squadra, giocate(potrebbe essere la somma di vinte e perse) , 
casa,fuori, vinte, perse, golfatti,golsubiti, variedeventuali
Poi una seconda tabella con i vari scontri e il risultato
SqA,SqB,RisA,RisB nell'evento After post dopo aver fatto i controlli di 
rito (che ci sia il risultato sia x la sqa che per la sqb) e solo nel 
caso in cui il tuo dataset sia in [dsInsert] aggiorni la lista delle 
partite giocate e dei gol fatti/subiti.
Spero di non essere stato abbastanza chiaro e di aver beccato il tuo 
problema .. altrimenti ... sorry :)
^_Goblin_^

> qualcuno mi puo' dare un suggerimento?
Non hai specificato il db che usi.
Se usi Oracle devi cercale query analitiche con le quali puoi fare
esattamente quello che vuoi.
Non so se SQL server di Microsoft le supporta.
Altrimenti non puoi fare altro che una lista di contatori che si
incrementano mano a mano che scorri la tabella.
Matteo


Nn ho capito se ti bastano delle procedure da richiamare ad hoc o campi 
calcolati, se la tabella � gi� riempita nelle prime due colonne e devi 
riempire le altre due o se le cose vanno gestite solo all'inserimento del 
nuovo record, se � possibile modificare successivamentre un record esistente 
(quindi ricostruire la numerazione dei valori che coinvolgeva), ecc...
cmq, se ti servono delle procedure, potresti ragionare cos�.
P1, all'inserimento di un nuovo record faccio una query sul valore CampoA e 
con la clausula COUNT determino il valore di campoA2 del nuovo record. Idem 
per il campo B. Quindi inserisco.
P2, se elimino un record (devo rigenerare la numerazione dei valori 
eliminati), osservo il valore di campoA del record eliminato, quindi faccio 
la query di P1 senza il count, ciclo sul risultato correggendo i rispettivi 
valori di campoA2. Idem per il valore di campoB eliminato.
P3, se modifico un record, mi ritrovo a ripetere P2 sia sul valore 
sostituito che su quello nuovo.
P4, se devo rigenerare la numerazione per tutta la tabella, premetto una 
query sul campoA con la clausula DISTINCT per conoscere tutti i valori 
presenti, quindi ciclo P2 su ognuno. Idem per campoB.
Gianni 


La tabella ï¿½ giï¿½ riempita nelle prime due colonne che sono fisse,non c'ï¿½ 
inserimento
e neppure la modifica di record esistenti,c'ï¿½ solo da calcolare i valori di 
CampoA2 e campoB2 su tutta la lista.
Sono riuscito con la procedura di cui sotto a creare la seguente tabella 
inserendo un campo contatore(ID)
 CampoA     CampoB     CampoA2     CampoB2    ID
 a1                a2             1                    1              1
 a3                a4             1                    1              2
 a4                a5             1                    1              3
 a3                a2             2                    2              4
 a1                a5             2                    2              5
 a7                a5             1                    3              6
Il calcolo incrementale ï¿½ giusto ma solo sulle singole colonne (vedi per 
esempio a5)
nella partita a4-a5 il valore del CampoA2 dovrebbe essere perï¿½ 2 e non 1
infatti a4 in precedenza ha giï¿½ giocato una partita con a3.
procedure TForm1.Button1Click(Sender: TObject);
begin
  TPartite.First;
    While not TPartite.Eof Do
 Begin
                 with QueryA do begin
close;
SQL.Clear;
SQL.Add('select CampoA,count(CampoA)as ContaCampoA');
SQL.Add('from TPartite');
SQL.Add('where CampoA =:SquadraA and ID <=:ID1');
SQL.Add('group by CampoA');
ParamByName('SquadraA').Value :=TPartiteCampoA.AsString ;
ParamByName('ID1').Value :=TPartiteID.AsInteger ;
open;
    end;
                     with QueryB do begin
close;
SQL.Clear;
SQL.Add('select CampoB,count(CampoB)as ContaCampoB');
SQL.Add('from TPartite');
SQL.Add('where CampoB =:SquadraB and ID <=:ID1');
SQL.Add('group by CampoB');
ParamByName('SquadraB').Value :=TPartiteCampoB.AsString ;
ParamByName('ID1').Value :=TPartiteID.AsInteger ;
open;
    end;
    TPartite.Edit;
    TPartiteCampoA2.AsInteger:=QueryAContaCampoA.AsInteger ;/////secondo me 
qui ci vorrebbe del codice ad hoc
    TPartiteCampoB2.AsInteger:=QueryBContaCampoB.AsInteger ;
    TPartite.Edit;
    TPartite.Post;
   TPartite.Next;
 end;
end;
Grazie di nuovo
Paolo 

 esempio a5)
Allora CampoA2 non � semplicemente il
"Count( CampoA) where CampoA =:SquadraA",
bens�
"Count( CampoA) where CampoA =:SquadraA + Count( CampoB) where CampoB 
=:SquadraA"
alias
"Count( ID) where CampoA =:SquadraA OR CampoB =:SquadraA and ID <= ...."
cio� conti SquadraA nelle due colonne con ID <= quello corrente e sommi 
(dando per scontato che la stessa squadra non compaia due volte nella stessa 
partita).
Per� a questo punto, visto che la tabella la devi riempire una sola volta, 
conosci a priori tutte le partire (cio� il numero di record), quindi tutte 
le squadre (cio� sai quante squadre ci sono), e la tabella non avr� 
sicuramente milioni di record, non fai prima a scorrerla tenendo il 
conteggio in un array di integer (dimensionato a quante sono le squadre)?
Gianni

 le squadre (cioï¿½ sai quante squadre ci sono), e la tabella non avrï¿½ 
