PDA

Visualizza la versione completa : [DELPHI] Calcolo doppio in procedura


uisum
21-10-2017, 11:21
Salve sto cercando di creare un calcolo , non trovo soluzione .
In pratica cliccando il pulsante il valore e corretto , cliccando nuovamente il pulsante mi calcola nuovamente il valore raddoppiando il valore , cliccando ancora triplica e cosi via . Vorrei che il valore sia calcolato una sola volta .

Il cosice e questo :


procedure Tdett_form.calcolaGiacenza;
var
scaricoTotale:extended;
begin
try
Table1.DisableControls;
scaricoTotale:=0;
Table1.First;
while notTable1.EOF do
begin
scaricototale:=scaricototale+Table1Scarico.Value;
Table1.Next;
end;
GiacenzaScarico.Edit;
Giacenzascarico.Value:=Giacenzascarico.Value+scari cototale;
Giacenza.Post;
end;

finally
Table1.enableControls;
end;
end;


Il calcolo che viene fuori e corretto -
Cliccando nuovamente ricalcola mi calcola nuovamente tutto andando ad aggiungere nuovamente il totale .
Si dovrebbe fermare ad un solo calcolo .
Ho provato a lasciare solo SCARICOTOTALE , cosi e corretto , ma se cambio voce tabella mi da quella nuova sostituendo il vecchio valore . Per essere chiari :

Fattura 1 : scaricototale 10
Fattura 2 : scaricototale 15
Fattura 3 : scaricototale 20
Quindi in giacenzascarico dovrei avere scarico 10+15+20

Attualmente cliccando con il codice suddetto lasciando Giacenzascarico.Value:=scaricototale; mi da giacenza 10 o 15 0 20 , mettendo Giacenzascarico.Value:=Giacenzascarico.Value+scari cototale; mi raddoppia contunuamente i valori ad ogni clic .
Spero di essere stato chiaro .
Grazie

Nettuno95
21-10-2017, 23:42
....
Giacenzascarico.Value:=Giacenzascarico.Value+scari cototale;
.....
[/CODE]



Il codice parla chiaro.
Ad on click il campo Giacenzascarico viene aumentato del suo valore più un valore proveniente da un calcolo, secondo me ti manca un flag di controllo nelle varie tabelle che dice se i vari campi sono stati calcolati oppure no, qualcosa del tipo:


table1.filtered := false;
table1.filter := 'flagscaricato=false';
table1.filtered := true;
try
while notTable1.EOF do
begin
// oppure al posto del comandi filter
// if not tabella1flagscaricato.asboolean then
scaricototale:=scaricototale+Table1Scarico.Value;
tabella1flagscaricato.asboolean := true;
Table1.Next;
end;
GiacenzaScarico.Edit;
Giacenzascarico.Value:=Giacenzascarico.Value+scari cototale;
Giacenza.Post;
finally
table1.filtered := false;
end;


Spero di aver capito il problema

N.

uisum
22-10-2017, 11:47
Instanto grazie tante della tua pazienza e risposta .
Se guardi le immagini capirai meglio di sicuro .

https://ibb.co/gjX5WR
https://ibb.co/c7wXBR




Il codice parla chiaro.
Ad on click il campo Giacenzascarico viene aumentato del suo valore più un valore proveniente da un calcolo, secondo me ti manca un flag di controllo nelle varie tabelle che dice se i vari campi sono stati calcolati oppure no, qualcosa del tipo:


table1.filtered := false;
table1.filter := 'flagscaricato=false';
table1.filtered := true;
try
while notTable1.EOF do
begin
// oppure al posto del comandi filter
// if not tabella1flagscaricato.asboolean then
scaricototale:=scaricototale+Table1Scarico.Value;
tabella1flagscaricato.asboolean := true;
Table1.Next;
end;
GiacenzaScarico.Edit;
Giacenzascarico.Value:=Giacenzascarico.Value+scari cototale;
Giacenza.Post;
finally
table1.filtered := false;
end;


Spero di aver capito il problema

N.

alka
23-10-2017, 10:39
Instanto grazie tante della tua pazienza e risposta .
Se guardi le immagini capirai meglio di sicuro .


Ok le immagini, ma forse sarebbe più significativo capire che cosa rappresentano le variabili che usi, ad esempio GiacenzaScarico, Giacenza, FlagScaricato, ...

Si può ipotizzare di cosa si tratti, ma come ti è stato già risposto l'esecuzione del codice aumenta ogni volta i valori, quindi non è chiaro se questo è l'intento. Se la risposta è negativa, direi che abbiamo trovato il problema, altrimenti aggiungi qualche dettaglio per farci capire in merito alla logica della finestra (in modo discorsivo, più che con screenshot).

Ciao! :ciauz:

uisum
23-10-2017, 11:21
Ciao Marco ti ringrazio .
Giacenzascarico e appunto un campo presente in tabella giacenza che dovrebbe incrementarsi .
Poi abbiamo Table1Scarico.Value; che e un calcolo che prende tutti i dati dal campo Table1Scarico .
Poi abbiamo la tabella TableMaster .
Table1 e in mastersource con tablemaster .

Quindi :
Gabbia 1 - Table1Scarico.Value = esempio 50
Gabbia 2 - Table1Scarico.Value = esempio 150
Etc
GiacenzaScarico.value dovrebbe prendere sia 50 che 150 , mantenedo il valore che ha .

Esempio :
GiacenzaScarico.value : 250 valore gia presente + 50 +150 = 450
Praticamente è un semplice magazzino .

Grazie mille a tutti spero di essere stato chiaro




Ok le immagini, ma forse sarebbe più significativo capire che cosa rappresentano le variabili che usi, ad esempio GiacenzaScarico, Giacenza, FlagScaricato, ...

Si può ipotizzare di cosa si tratti, ma come ti è stato già risposto l'esecuzione del codice aumenta ogni volta i valori, quindi non è chiaro se questo è l'intento. Se la risposta è negativa, direi che abbiamo trovato il problema, altrimenti aggiungi qualche dettaglio per farci capire in merito alla logica della finestra (in modo discorsivo, più che con screenshot).

Ciao! :ciauz:

uisum
24-10-2017, 19:48
Nessuno mi da una mano ??

alka
26-10-2017, 10:44
Io devo dire che faccio un po' di fatica a comprendere il ruolo delle tabelle, più che altro perché Table1 è un nome poco significativo.

Una domanda: hai provato a eseguire il primo codice che hai postato facendo il debug passo per passo e andando a vedere il valore delle variabili?

Secondo me, è l'unico modo per poter capire qual è lo stato dell'applicazione in quel momento e capire da dove proviene il valore errato.

uisum
26-10-2017, 13:16
Ciao .
Mi sembra la tua una risposta tanto per perdere o prendere tempo .
Nessun errore il codice o meglio, il codice non mi aiuta a fare quello che voglio .
Facendo il debug non mi dice niente , e un problema di procedura che non fa il suo dovere.
Questo e il codice che uso attualmente , ma ad ogni clic mi aggiunge sempre il valore della somma .
La somma e giusta ma se si fa fare nuovamente la procedura viene nuovamente calcolato tutto e aggiunto a TTGiacenzaMangimeQtascarico.Value .


procedure Tdett_form.calcolaGiacenza;
var
old_val : extended;
begin

old_val := datamod.TTGiacenzaMangimeQtascarico.Value; // questo campo deve ricevere i dati
//through some dataset...
DataMod.DettaglioP.First;
while not DataMod.DettaglioP.eof do
begin
old_val := old_val + DataMod.DettaglioPKgMangimeSCARICO.Value; // questo campo raccoglie i // dati della tabella giornalieraMangimescarico
DataMod.DettaglioP.Next;
end;
datamod.TTGiacenzaMangime.Edit;
datamod.TTGiacenzaMangimeQtascarico.AsFloat:=old_v al;
datamod.TTGiacenzaMangime.Post;
end;

Spero che hai capito adesso
By Simo


Io devo dire che faccio un po' di fatica a comprendere il ruolo delle tabelle, pi� che altro perch� Table1 � un nome poco significativo.

Una domanda: hai provato a eseguire il primo codice che hai postato facendo il debug passo per passo e andando a vedere il valore delle variabili?

Secondo me, � l'unico modo per poter capire qual � lo stato dell'applicazione in quel momento e capire da dove proviene il valore errato.

alka
27-10-2017, 00:06
Ciao .
Mi sembra la tua una risposta tanto per perdere o prendere tempo .

Innanzitutto, se non volevo perdere tempo, evitavo di 1) leggerti di nuovo, 2) cercare di capirti, 3) porti le stesse domande che ti sono già state rivolte per chiarire.

Sul "prendere tempo" invece sorvolo, in quanto non mi serve assolutamente: non sei un mio cliente e non sono tenuto a darti alcun servizio garantito, se permetti, e qualora ti si dia una mano, sei tu a doverti sforzare di fornire tutte le info necessarie visto che - fino a prova contraria - il problema è tuo, non mio.



Nessun errore il codice o meglio, il codice non mi aiuta a fare quello che voglio .

Se il codice non fa quello che vuoi, evidentemente un errore c'è, altrimenti il programma funzionerebbe.
Questo è forse l'unico punto fermo che si può dare per assodato.



Facendo il debug non mi dice niente , e un problema di procedura che non fa il suo dovere.

No, perché il risultato non è casuale: da qualche parte c'è senz'altro un passaggio in cui viene memorizzato un valore diverso da quello atteso, ma è analizzando il programma durante l'esecuzione che consente di vedere in ogni momento cosa si sta assegnando e come cambiano i valori all'interno dell'applicazione.

Il debug non è pensato per risolverti autonomamente il problema, ma per consentirti di verificare quello che succede.



Questo e il codice che uso attualmente , ma ad ogni clic mi aggiunge sempre il valore della somma.

Il tuo codice prende il valore di un campo, a esso somma un altro valore e infine lo salva.
E' ovvio che se riesegui la procedura il valore viene sommato all'ultimo salvato e così via, incrementandolo sempre.



La somma e giusta ma se si fa fare nuovamente la procedura viene nuovamente calcolato tutto e aggiunto a TTGiacenzaMangimeQtascarico.Value .

Ma questo è esattamente ciò che hai scritto nel codice! Se incrementi un valore che usi come partenza e poi lo vai a salvare, quando ripeti l'operazione partirai dalla quantità che è stata incrementata precedentemente, perché quello è il valore che hai determinato e salvato, ed è quello il valore da cui riparti, e non può essere diverso, a meno che tu non conservi altrove il valore di base (es. in un campo diverso). Devi separare il valore incrementato da quello di partenza, e aggiornare il primo partendo dal secondo, oppure resettare il campo che hai incrementato al valore base di partenza prima di eseguire la somma. Se sommi e salvi, recuperi, sommi e salvi, recuperi, alla fine avrai un valore che si incrementa sempre all'infinito.






procedure Tdett_form.calcolaGiacenza;
var
old_val : extended;
begin

old_val := datamod.TTGiacenzaMangimeQtascarico.Value; // questo campo deve ricevere i dati
//through some dataset...
DataMod.DettaglioP.First;
while not DataMod.DettaglioP.eof do
begin
old_val := old_val + DataMod.DettaglioPKgMangimeSCARICO.Value; // questo campo raccoglie i // dati della tabella giornalieraMangimescarico
DataMod.DettaglioP.Next;
end;
datamod.TTGiacenzaMangime.Edit;
datamod.TTGiacenzaMangimeQtascarico.AsFloat:=old_v al;
datamod.TTGiacenzaMangime.Post;
end;

Spero che hai capito adesso
By Simo

Sì, io ho capito.

Ciao! :ciauz:

uisum
27-10-2017, 11:33
Ok grazie .
Quindi da
old_val := datamod.TTGiacenzaMangimeQtascarico.Value;
Passerei a :
old_val := 0;

Poi mi creo :
val_giac:=datamod.TTGiacenzaMangimeQtascarico.Valu e ;
Questo mantiene il vecchio dato , ma dove lo metto e come lo uso ?




Innanzitutto, se non volevo perdere tempo, evitavo di 1) leggerti di nuovo, 2) cercare di capirti, 3) porti le stesse domande che ti sono già state rivolte per chiarire.

Sul "prendere tempo" invece sorvolo, in quanto non mi serve assolutamente: non sei un mio cliente e non sono tenuto a darti alcun servizio garantito, se permetti, e qualora ti si dia una mano, sei tu a doverti sforzare di fornire tutte le info necessarie visto che - fino a prova contraria - il problema è tuo, non mio.


Se il codice non fa quello che vuoi, evidentemente un errore c'è, altrimenti il programma funzionerebbe.
Questo è forse l'unico punto fermo che si può dare per assodato.


No, perché il risultato non è casuale: da qualche parte c'è senz'altro un passaggio in cui viene memorizzato un valore diverso da quello atteso, ma è analizzando il programma durante l'esecuzione che consente di vedere in ogni momento cosa si sta assegnando e come cambiano i valori all'interno dell'applicazione.

Il debug non è pensato per risolverti autonomamente il problema, ma per consentirti di verificare quello che succede.


Il tuo codice prende il valore di un campo, a esso somma un altro valore e infine lo salva.
E' ovvio che se riesegui la procedura il valore viene sommato all'ultimo salvato e così via, incrementandolo sempre.


Ma questo è esattamente ciò che hai scritto nel codice! Se incrementi un valore che usi come partenza e poi lo vai a salvare, quando ripeti l'operazione partirai dalla quantità che è stata incrementata precedentemente, perché quello è il valore che hai determinato e salvato, ed è quello il valore da cui riparti, e non può essere diverso, a meno che tu non conservi altrove il valore di base (es. in un campo diverso). Devi separare il valore incrementato da quello di partenza, e aggiornare il primo partendo dal secondo, oppure resettare il campo che hai incrementato al valore base di partenza prima di eseguire la somma. Se sommi e salvi, recuperi, sommi e salvi, recuperi, alla fine avrai un valore che si incrementa sempre all'infinito.




Sì, io ho capito.

Ciao! :ciauz:

Loading