Visualizzazione dei risultati da 1 a 4 su 4

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2021
    Messaggi
    15

    Ajax e somma tra valori numerici (problema di somme)

    Buongiorno! Sto implementando una pagina per la creazione di "fatture". Ho una tabella con una serie di checkbox, una per ogni pratica "potenzialmente fatturabile".. Una volta che l'operatore ha selezionato tutte le righe che gl'interessano una funzione JavaScript tramite ciclo manda ad una pagina php (tramite ajax) il codice rispettivo della riga la quale ritorna un valore che potrà essere 1, 0.5 o 0.
    Man mano dovrebbe esservi una variabile (punti) che partendo da 0 viene incrementata.. Infine in base a quel valore andranno ad auto-compilarsi due input di un form.

    Il problema è che, malgrado tramite controlli il valore restituito sia corretto e coerente, la variabile "punti" che andrebbe man mano incrementata con quei valori rimane sempre a 0

    Di seguito riporto il codice della funzione JS:
    codice:
    function calcolaBonus(){
        var tabella=document.getElementById("tabellaProvvigioni"); //tabella con checkbox
        var tagCheck=tabella.getElementsByTagName("input","checkbox"); 
        var punti=0.0; //variabile incrementale
        var bonusProduzione,bonusTrainer; //futuri valori form-input
        for(var i=0;i<tagCheck.length;i++){
          if(tagCheck[i].checked==true){//considero solo le checkbox selezionate
            console.log(i+": "+punti);//Per controllo
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.onreadystatechange = function() {
              if (this.readyState == 4 && this.status == 200) {
                if(this.responseText=="1"){
                  alert("1");//Per controllo
                  punti=punti+1;
                }
                if(this.responseText=="0.5"){
                  alert("0.5");//Per controllo
                  punti=punti+0.5;
                }
              }
            };
            var link="../../ajax/punteggioPod.php?idFornitura=" +  tagCheck[i].id; //pagina php che interroga il server e restituisce un valore pari a :0/0.5/1
            xmlhttp.open("GET", link, true);
            xmlhttp.send();
          }
        }
    
    
        if(punti<20)
          bonusProduzione=punti*17;
        else if(punti<30)//20
          bonusProduzione=400;
        else if(punti<40)//30
          bonusProduzione=500;
        else if(punti<50)//40
          bonusProduzione=750;
        else if(punti<60)//50
          bonusProduzione=950;
        else if(punti<80)//60
          bonusProduzione=1200;
        else if(punti>=80)//80
          bonusProduzione=1600;
    
    
        if(punti<30)
          bonusTrainer=0;
        else
          bonusTrainer=100;
    
    
        document.getElementById("formProd").value=bonusProduzione;
        document.getElementById("formTrainer").value=bonusTrainer;
    
    
    
    
      }

    Malgrado anche tramite gli alert aggiunti per controllo ho la certezza che il valore restituito sia corretto l'unica opzione che mi rimane da pensare è che il problema sia nell'istruzione:
    codice:
    punti=punti+1;

  2. #2
    Utente di HTML.it L'avatar di vic53
    Registrato dal
    Oct 2010
    residenza
    Fonte Nuova (Roma)
    Messaggi
    592
    codice:
     
    if(this.responseText=="0.5") 
    ...fallo diventare
    if (parseFloat(this.responseText)==0.5)) ...
    però potevi usare una istruzione switch... al posto della if nidificata...
    [
    Vic53

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2021
    Messaggi
    15
    Inialmente avevo cominciato con il "parseFloat" ma avendo problemi con il risultato, per escludere la possibilità che il problema fosse quello, ho cambiato lo script in modo che lavorasse il risultato come una stringa..

    Per quanto riguarda lo switch mi è indifferente, o per meglio dire, quel If concatenato l'ho copiato dal vecchio script e quindi mi son limitato ad un semplice copia-incolla..

    Ho trovato il problema!
    Nel mio script la variabile punti viene correttamente aggiornata. Di fatto prendo il suo valore e lo lavoro (switch e setting di due input) subito dopo la chiamata asincrona che faccio alla pagina PHP.. in poche parole lavoro sulla variabile "punti" prima ancora di avere una risposta dal server..

    Capito questo problema qualcuno sa una possibile soluzione?
    Ho pensato ad un timeout per chiamare una funzione che lavoro a chiamata fatta la variabile punti.. ma non è una soluzione ottimale.. i checkbox potrebbero essere 3 come 3000 o più.. quindi il tempo d'attesa per tutte le chiamate è mutevole e non prevedibile..

    Altre soluzioni?

  4. #4
    Utente di HTML.it L'avatar di vic53
    Registrato dal
    Oct 2010
    residenza
    Fonte Nuova (Roma)
    Messaggi
    592
    Quote Originariamente inviata da Niknex Visualizza il messaggio
    Inialmente avevo cominciato con il "parseFloat" ma avendo problemi con il risultato, per escludere la possibilità che il problema fosse quello, ho cambiato lo script in modo che lavorasse il risultato come una stringa..

    Per quanto riguarda lo switch mi è indifferente, o per meglio dire, quel If concatenato l'ho copiato dal vecchio script e quindi mi son limitato ad un semplice copia-incolla..

    Ho trovato il problema!
    Nel mio script la variabile punti viene correttamente aggiornata. Di fatto prendo il suo valore e lo lavoro (switch e setting di due input) subito dopo la chiamata asincrona che faccio alla pagina PHP.. in poche parole lavoro sulla variabile "punti" prima ancora di avere una risposta dal server..

    Capito questo problema qualcuno sa una possibile soluzione?
    Ho pensato ad un timeout per chiamare una funzione che lavoro a chiamata fatta la variabile punti.. ma non è una soluzione ottimale.. i checkbox potrebbero essere 3 come 3000 o più.. quindi il tempo d'attesa per tutte le chiamate è mutevole e non prevedibile..

    Altre soluzioni?
    se è così, allora metti false al posto di true nella chiamata Ajax così diventa sincrona...
    [codice]
    xmlhttp.open("GET", link, true);
    ...
    diventa
    ...
    xmlhttp.open("GET", link, false);

    [/codice]
    Ultima modifica di vic53; 29-10-2021 a 23:50 Motivo: aggiunta
    Vic53

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 © 2025 vBulletin Solutions, Inc. All rights reserved.