Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2017
    Messaggi
    4

    [DELPHI] Calcolo doppio in procedura

    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 :

    codice:
    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+scaricototale;
         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

  2. #2
    Quote Originariamente inviata da uisum Visualizza il messaggio

    ....
    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:
    codice:
          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+scaricototale;
            Giacenza.Post;
          finally
            table1.filtered := false;
          end;
    Spero di aver capito il problema

    N.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2017
    Messaggi
    4
    Instanto grazie tante della tua pazienza e risposta .
    Se guardi le immagini capirai meglio di sicuro .

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



    Quote Originariamente inviata da Nettuno95 Visualizza il messaggio
    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:
    codice:
          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+scaricototale;
            Giacenza.Post;
          finally
            table1.filtered := false;
          end;
    Spero di aver capito il problema

    N.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,863
    Quote Originariamente inviata da uisum Visualizza il messaggio
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2017
    Messaggi
    4
    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




    Quote Originariamente inviata da alka Visualizza il messaggio
    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!

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2017
    Messaggi
    4
    Nessuno mi da una mano ??

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,863
    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.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2017
    Messaggi
    4
    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 .

    codice:
    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_val; 
    datamod.TTGiacenzaMangime.Post;
    end;
    Spero che hai capito adesso
    By Simo

    Quote Originariamente inviata da alka Visualizza il messaggio
    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.
    Ultima modifica di uisum; 26-10-2017 a 13:24

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,863
    Quote Originariamente inviata da uisum Visualizza il messaggio
    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.

    Quote Originariamente inviata da uisum Visualizza il messaggio
    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.

    Quote Originariamente inviata da uisum Visualizza il messaggio
    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.

    Quote Originariamente inviata da uisum Visualizza il messaggio
    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.

    Quote Originariamente inviata da uisum Visualizza il messaggio
    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.


    Quote Originariamente inviata da uisum Visualizza il messaggio
    codice:
    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_val; 
    datamod.TTGiacenzaMangime.Post;
    end;
    Spero che hai capito adesso
    By Simo
    Sì, io ho capito.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2017
    Messaggi
    4
    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 ?



    Quote Originariamente inviata da alka Visualizza il messaggio
    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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.