Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di Frankos
    Registrato dal
    Nov 2002
    Messaggi
    505

    Calcolo subtotale in un modulo

    Ciao a tutti,

    ho un modulo dove ho una lista di prodotti, il prezzo in un campo hydden e un campo testo dove inserisco la quantità.
    Ho fatto una funzione in cui mi calcola il subtotale in funzione della quantità immessa per il rpimo prodotto della lista.
    Ma come devo indicizzare il tutto in modo che la stessa funzione abbia effetto su tutti i prodotti della lista?

    Funzine javascript:

    <script language="javascript">
    function subtotale(){
    document.form1.subtot1.value=document.form1.quant1 .value*document.form1.prezzo1.value;
    }
    </script>


    codice del modulo:

    <form name="form1" method="post" action="">
    <table width="600" border="1" cellpadding="0" cellspacing="0">
    <tr>
    <td width="150"><div align="center">Prodotto</div></td>
    <td width="150"><div align="center">Prezzo</div></td>
    <td width="150"><div align="center">Quantit&agrave;</div></td>
    <td width="150"><div align="center">Subtotale</div></td>
    </tr>
    <tr>
    <td width="150">Articolo 1 </td>
    <td width="150"><div align="center">21.50</div></td>
    <td width="150"><div align="center">
    <input name="prezzo1" type="hidden" value="21.50">
    <input name="quant1" type="text" id="quant1" size="6" onkeyup="subtotale()">
    </div></td>
    <td width="150"><div align="center">
    <input name="subtot1" type="text" id="subtot1" size="15">
    </div></td>
    </tr>
    <tr>
    <td width="150">Articolo 2 </td>
    <td width="150"><div align="center">38.00</div></td>
    <td width="150"><div align="center">
    <input name="prezzo2" type="hidden" value="38.00">
    <input name="quant2" type="text" id="quant2" size="6" onkeyup="subtotale()">
    </div></td>
    <td width="150"><div align="center">
    <input name="subtot2" type="text" id="subtot2" size="15">
    </div></td>
    </tr>
    </table>
    </form>


    Grazie a chi mi può dare una mano
    Ciao
    Sempre più in alto...
    www.webdition.com

  2. #2
    Utente di HTML.it L'avatar di Frankos
    Registrato dal
    Nov 2002
    Messaggi
    505
    nessuno?
    Sempre più in alto...
    www.webdition.com

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Nella chiamata:
    <input name="quant1" type="text" id="quant1" size="6" onkeyup="subtotale(1)">
    ...
    <input name="quant2" type="text" id="quant2" size="6" onkeyup="subtotale(2)">
    ...

    Nello script:
    codice:
    function subtotale(n){
      var q = document.form1.elements["quant"+n];
      var p = document.form1.elements["prezzo"+n];
      var s = document.form1.elements["subtot"+n];
      s.value = q.value * p.value;
    }
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  4. #4
    Utente di HTML.it L'avatar di Frankos
    Registrato dal
    Nov 2002
    Messaggi
    505
    si, funziona bene!

    Grazie Mich_
    Sempre più in alto...
    www.webdition.com

  5. #5
    Utente di HTML.it L'avatar di Frankos
    Registrato dal
    Nov 2002
    Messaggi
    505
    ehm, ancora una domanda Mich_ se non disturbo troppo

    ora ho completato lo script con alcuni controlli e con la formattazuone dei decimali e funziona tutto a meraviglia.
    Ho però aggiunto un campo "totale" per calcolare il totale di tutti i subtotali e fin qui nessun problema, ma se poi vado a variare una delle quantità già immesse allora il totale non funziona più nel modo corretto.
    Ti inserisco qui il codice completo della pagina, così puoi verificare direttamente il problema.

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>Documento senza titolo</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script language="javascript">
    var tot=0;
    function subtotale(n){
    // metti i nomi dei campi in una variabile
    var q = document.form1.elements["quant"+n];
    var p = document.form1.elements["prezzo"+n];
    var s = document.form1.elements["subtot"+n];
    // controlla se la quantità é un numero intero
    if(q.value!=parseInt(q.value)&&q.value!=""){
    alert("Inserire un numero intero !");
    q.value="";
    s.value="";
    }else{
    // moltiplica quantità per prezzo
    s.value = q.value * p.value;
    tot=tot+parseFloat(s.value);
    // formatta con due decimali ogni campo subtotale
    stringa=s.value;
    stringa = new String(Math.round((stringa)*100)/100).replace(/\./, ".");
    stringa += (stringa.indexOf(".")<0)?'.00':'00';
    stringa = stringa.substr(0,stringa.indexOf(".")+3);
    s.value=stringa;
    // formatta con due decimali il campo totale
    stringatot=tot;
    stringatot = new String(Math.round((stringatot)*100)/100).replace(/\./, ".");
    stringatot += (stringatot.indexOf(".")<0)?'.00':'00';
    stringatot = stringatot.substr(0,stringatot.indexOf(".")+3);
    document.form1.totale.value=stringatot;
    }
    }
    </script>
    </head>

    <body>
    <form name="form1" method="post" action="">
    <table width="600" border="1" cellpadding="0" cellspacing="0">
    <tr>
    <td width="150"><div align="center">Prodotto</div></td>
    <td width="150"><div align="center">Prezzo</div></td>
    <td width="150"><div align="center">Quantit&agrave;</div></td>
    <td width="150"><div align="center">Subtotale</div></td>
    </tr>
    <tr>
    <td width="150">Articolo 1 </td>
    <td width="150"><div align="center">21.50</div></td>
    <td width="150"><div align="center">
    <input name="prezzo1" type="hidden" id="prezzo1" value="21.50">
    <input name="quant1" type="text" id="quant1" size="6" onkeyup="subtotale(1)">
    </div></td>
    <td width="150"><div align="center">
    <input name="subtot1" type="text" id="subtot1" size="15">
    </div></td>
    </tr>
    <tr>
    <td width="150">Articolo 2 </td>
    <td width="150"><div align="center">38.00</div></td>
    <td width="150"><div align="center">
    <input name="prezzo2" type="hidden" id="prezzo2" value="38.00">
    <input name="quant2" type="text" id="quant2" size="6" onkeyup="subtotale(2)">
    </div></td>
    <td width="150"><div align="center">
    <input name="subtot2" type="text" id="subtot2" size="15">
    </div></td>
    </tr>
    <tr>
    <td></td>
    <td></td>
    <td><div align="center">TOTALE</div></td>
    <td><div align="center">
    <input name="totale" type="text" id="totale" size="15">
    </div></td>
    </tr>
    </table>
    </form>
    </body>
    </html>
    Sempre più in alto...
    www.webdition.com

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    E` chiaro.
    Ogni volta che aggiorni uno dei subtotoali, vai a sommare il valore del subtotale trovato con il totale precedente.
    Ecco un modo per ovviare:
    codice:
    function subtotale(n){
      // metti i nomi dei campi in una variabile
      var f = document.form1;
      var q = f.elements["quant"+n];
      var p = f.elements["prezzo"+n];
      var s = f.elements["subtot"+n];
      // controlla se la quantità é un numero intero
      if(q.value!=parseInt(q.value)&&q.value!=""){
        alert("Inserire un numero intero !");
        q.value="";
        s.value="";
        return false;
      }else{
        // moltiplica quantità per prezzo
        subt = q.value * p.value;
        // formatta con due decimali ogni campo subtotale
        stringa = new String(Math.round((stringa)*100)/100);
        stringa += (stringa.indexOf(".")<0)?'.00':'00';
        stringa = stringa.substr(0,stringa.indexOf(".")+3);
        s.value=stringa;
    
        // calcola valore totale
        var tot = 0;
        for(var i=1; i<2; i++) { // al posto di 2 metti l n. max
          var sub = f.elements["subtot"+i];
          tot += parseFloat(sub);
        }
        // formatta con due decimali il campo totale
        stringatot = new String(Math.round((tot)*100)/100);
        stringatot += (stringatot.indexOf(".")<0)?'.00':'00';
        stringatot = stringatot.substr(0,stringatot.indexOf(".")+3);
        f.totale.value = stringatot;
      }
    }
    Ho tolto la sostituzione del punto con il punto (mi pare un'operazione inutile).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Utente di HTML.it L'avatar di Frankos
    Registrato dal
    Nov 2002
    Messaggi
    505
    Ci deve essere un errore da qualche parte.

    ho cambiato la riga:
    stringa = new String(Math.round((stringa)*100)/100);
    con
    stringa = new String(Math.round((subt)*100)/100);
    altrimenti non mi faceva giusto il subtotale

    ma a parte questo adesso nel totale mi scrive NaN.00, come mai?
    Sempre più in alto...
    www.webdition.com

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Un errore lo hai gia` trovato, il secondo devi organizzare la caccia grossa. Ti do lo strumento, poi lascio usarlo come piu` ti piace:
    codice:
     ...
        // calcola valore totale
        var tot = 0;
        for(var i=1; i<2; i++) { // al posto di 2 metti l n. max
          var sub = f.elements["subtot"+i].value;
          if(sub == "") sub = 0;
          tot += parseFloat(sub);
        }
        alert("il totale e` "+tot);
        // formatta con due decimali il campo totale
        stringatot = new String(Math.round(tot*100)/100);
        stringatot += (stringatot.indexOf(".")<0)?'.00':'00';
        stringatot = stringatot.substr(0,stringatot.indexOf(".")+3);
        alert("il totale e` diventato "+tot);
        f.totale.value = stringatot;
      }
    }
    Ho anche corretto una parentesi nella riga del round ed aggiunto il value al sub oltre ad un controllo del campo vuoto (che pero` potrebbe non servire).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  9. #9
    Utente di HTML.it L'avatar di Frankos
    Registrato dal
    Nov 2002
    Messaggi
    505
    era cosi:

    for(var i=1; i<2 ; i++) { // al posto di 2 metti l n. max

    e deve essere così:

    for(var i=1; i<=2 ; i++) { // al posto di 2 metti l n. max

    giusto?
    Sempre più in alto...
    www.webdition.com

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Se i dati sono due, certo.

    Per il resto va bene? Trovati tutti gli errori?
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

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.