• User

    Come fare i Totali in una Tabella ?

    Buona giornata a tutti,
    sto cercando di comprendere ed assimilare i vari linguaggi per la costrizione dei siti web ed ora mi trovo di fronte ad una serie di problemi che per me sono di ardua soluzione, ma sono sicuro che voi mi fornirete le risposte più esaurienti.

    Prima di tutto qui di seguito vi metto lo script in php che ho realizzato e poi vado a spiegare cosa voglio fare e dove mi sono arenato:

    ************ INIZIO DELLO SCRIPT IN PHP ****************

    <body>

    <form name="Pippo" action="#">
    <table width="50%" border="1">

    <tr>
    <td>Quantità</td>
    <td>Importo</td>
    <td>Totale</td>
    </tr>

    <?php for ($NrRk = 1; $NrRk <=20; ++$NrRk) { ?>
    <tr>

    <td><input onChange="form.Tot<?php echo $NrRk; ?>.value = form.Qta<?php echo $NrRk; ?>.value * form.Imp<?php echo $NrRk; ?>.value; form.Progr.value += form.Tot<?php echo $NrRk; ?>.value" size="10" name="Qta<?php echo $NrRk; ?>"></td>

    <td><input onChange="form.Tot<?php echo $NrRk; ?>.value = form.Qta<?php echo $NrRk; ?>.value * form.Imp<?php echo $NrRk; ?>.value; form.Progr.value += form.Tot<?php echo $NrRk; ?>.value" size="10" name="Imp<?php echo $NrRk; ?>"></td>

    <td><input name="Tot<?php echo $NrRk; ?>" disabled="disabled" size="10"></td>

    </tr>
    <?php } ?>

    <tr>
    <td colspan="2" align="right">TOTALE GENERALE</td>
    <td><input name="Progr" disabled="disabled" size="10"></td>
    </tr>

    </table>
    <br>
    <input type="submit" value="Invia" name="conferma">
    <input type="reset" value="Reset" name="cancella">

    </form>

    </body>

    ************ FINE DELLO SCRIPT IN PHP ****************

    Con questo script l?intenzione è quella di inserire dei valori nella colonna Quantità (Qta) ed altri nella colonna Importo (Imp) ed ottenere un Totale (Tot) dato dalla moltiplicazione di Qta * Imp per ogni riga inserita ed un Totale Generale (Progr) che cambia ad ogni inserimento di un nuovo dato.

    Successivamente queste informazioni andranno inserite in un DataBase MySql, ma per questa procedura non dovrebbero esserci problemi (almeno spero), manca infatti tutta la parte relativa alla INSERT ma è stata volutamente omessa per non ingarbugliare ulteriormente le cose come mancano anche altre informazioni utili per il DataBase ma ininfluenti per i problemi di questo script (es. data, descrizione, codice, ecc.).

    A questo punto la prima parte dello script funziona benissimo; la moltiplicazione di Qta * Imp di ogni riga è corretta ma poi vengono le domande che sono le seguenti:

    • Nel campo ?Progr? non viene riportata la somma dei campi ?Tot? ma crea invece una stringa che continua ad accodare i risultati dei campi ?Tot? delle diverse righe ogni volta che io modifico un valore.
    • I campi ?Tot? e ?Progr? sono disabilitati in quanto al loro interno va a finire il risultato di un?operazione e non possono essere modificati manualmente; questi campi vengono visualizzati in grigio, come faccio a modificare il colore dei caratteri ? (ho provato con i CSS ma non succede nulla).
    • Il ciclo di caricamento dei dati è composto da 20 records per essere sicuro di poterli inserire tutti, ma il mio obiettivo è quello di poterne inserire da UNO (minimo) ad ?N? (valore non predeterminato) e poi caricarli nel DataBase. Non posso conoscere a priori il valore di ?N? perchè non posso mettermi a contare ogni volta quanti dati devo inserire prima di inserirli.
      Ringrazio in anticipo per la vostra fattiva collaborazione e non esitate a chiedere ulteriori ragguagli se in qualche punto non sono stato molto chiaro (io so cosa voglio ottenere, il problema è spiegarlo agli altri).

  • User Attivo

    Al volo il 2. -> invece di mettere il campo "disabilitato" (che oltretutto se lo passi a una query/form è "") devi usare l'attributo "readonly" e così eviti anche che sia grigio (ma cmq non è modificabile dall'utente). <- tra l'altro il problema 1. potrebbe proprio dipendere dal fatto che il campo disabilitato non passa valori... è disabilitato... anche se dentro c'è un valore non viene passato...

    Correggi tutti i <?php echo $NrRk; ?> che sono nelle righe degli input in <?=$NrRk?> così intanto il codice si legge meglio... 😄

    keiske


  • User

    Per quanto riguarda il punto 2 è tutto OK, adesso i numeri li vedo "normali"; però il resto continua a non funzionare.

    @Privacy-Impresa said:

    Correggi tutti i <?php echo $NrRk; ?> che sono nelle righe degli input in <?=$NrRk?> così intanto il codice si legge meglio... 😄

    In particolare se faccio questo non mi fa più neanche le moltiplicazioni riga per riga :mmm:

    @Privacy-Impresa said:

    potrebbe proprio dipendere dal fatto che il campo disabilitato non passa valori... è disabilitato... anche se dentro c'è un valore non viene passato

    Nel campo 'Progr' vengono passati dei valori però non vengono sommati ma concatenati uno con l'altro in una stringa anche se sono solo dei numeri ed è questo lo scoglio che non riesco a superare (oltre a quello del punto 3).


  • User Attivo

    Nell'onchange hai valutato che stai operando in javasrcipt? Potrebbe darsi che stai usando qualcosa di sintassi php e non js... fai qualche controllo...

    Ad ogni modo per chiarezza ti converrebbe operare dentro al ciclo while in php prima di inserire l'input... fai una funzione in php che lavori i dati e poi li inserisci nell'input quando sono lavorati come vuoi tu...

    keiske


  • User

    @Privacy-Impresa said:

    Ad ogni modo per chiarezza ti converrebbe operare dentro al ciclo while in php prima di inserire l'input... fai una funzione in php che lavori i dati e poi li inserisci nell'input quando sono lavorati come vuoi tu...

    Onestamente non ho capito cosa vuoi dire (non sono così esperto di php e tantomento di JavaScript) comunque sto rimuginando qualche altra soluzione e se arrivo a qualcosa faccio sapere; intanto se tu o altri avete idee o suggerimenti li accetto più che volentieri


  • Bannato User Attivo

    Nel campo ‘Progr’ non viene riportata la somma dei campi ‘Tot’ ma crea invece una stringa che continua ad accodare i risultati dei campi ‘Tot’ delle diverse righe ogni volta che io modifico un valore.perchè i tuoi valori vengono considerati come stringhe, la soluzione percorribile potrebbe essere:
    a) mettere 0 come valore iniziale a Prog
    b) usare parseInt (o parseFloat) ```
    form.Progr.value += parseFloat(form.Tot)


  • User

    Come dicevo ci ho rimugianto su e credo di aver risolto i miei problemi aggirando l'ostacolo; in pratica ho creato 2 tabelle di DB, una di appoggio e l'altra quella definitiva.
    In quella di appoggio inserisco i dati riga per riga e ricarico la pagina mostrando i dati caricati così il totale generale lo faccio con una query dedicata.
    La tabella che mostra i dati caricati in realtà è un 'form' con tutti i campi 'hidden' che, quando ho terminato gli inserimenti, va ad aggiornare la tabella definitiva e svuota quella di appoggio per gli inserimenti futuri.
    L'ho anche ampliato per le correzioni di eventuali errori di digitazione e per la cancellazione di record inseriti per errore sulla tabella di appoggio.

    Se vi interessa posso postare il codice (anche se è un po' lungo) però mi spiegate come faccio a metterlo nel quadratino azzurro come ho visto su altri post ???

    x Saro78
    Avevo già provato a mettere ZERO come valore iniziale di 'Progr' ma il risultato era lo stesso (anzi mi accodava i dati a partire dallo zero invece che da 'null')
    Le istruzioni che mi hai dato non ho neanche la più pallida idea di cosa siano (sto appena imparando ad usare JS e non lo conosco bene)

    Comunque grazie a tutti dell'aiuto.


  • User Attivo

    Non credo che creare due tabelle sia la soluzione... anche perchè così hai una quantità notevole di query al database con aggravio del server...

    Immagina 100 persone collegate insieme... ti mandano il server mysql in balla...

    Rispiega bene la funzione della tabella con quantità, prezzi e totali vari e cosa effettivamente vuoi inserire alla fine e vedo di darti una sequenza logica di azioni senza bisogno di 2 tabelle e tutte quelle query...

    keiske


  • User

    Allora, vedo di spiegarmi meglio; il mio scopo è quello di fare una FATTURA.

    In sintesi io devo partire da una Data di Emissione della Fattura e da un Codice Cliente al quale emettere la Fattura e poi devo inserire tutte le righe che compongono la Fattura stessa che sono composte dai campi: Codice Prodotto, Descrizione Prodotto (collegato al Codice Prodotto), Quantità, Importo Unitario, Importo Totale (risultato della moltiplicazione di Quantità * Importo Unitario), Codice IVA (collegato ad una Tabella con le aliquote IVA da applicare).

    Devono quindi essere effettuati i seguenti Totali complessivi:

    • Totale Imponibile: è la somma di tutti i campi ?Importo Totale?.
    • Calcolo IVA: vengono sommati i campi ?Importo Totale? suddivisi per Codice IVA e sugli stessi deve essere calcolata l?IVA con le aliquote previste in Tabella = ?Importo IVA?
    • Totale IVA: è la somma di tutti i campi ?Importo IVA?
    • Totale Fattura = ?Totale Imponibile? + ?Totale IVA?
      Ad ogni inserimento di una nuova riga, o ad ogni variazione o cancellazione della stessa, tutti i suddetti totali devono essere ricalcolati.

    Una volta che i dati sono stati caricati in modo corretto, devo inserirli su un DB (assegnando al contempo anche un Numero Progressivo di Fattura) in modo che posso poi gestirli successivamente: stamparli, rivederli e fare statistiche varie senza che i dati stessi debbano essere ricalcolati.

    Ho chiesto aiuto sui totali di colonna perchè una volta capito come risolvere questo problema, credo che per estensione dovrei riuscire a calcolare anche gli altri totali che mi servono.

    Per la scrittura sul DataBase avevo invece pensato a TRE Tabelle:

    • Dettaglio Fattura: vengono inserite tutte le righe della fattura
    • Dettaglio IVA: vengono inserite le righe di dettaglio dell?IVA
    • Totale Fattura: vengono inseriti il ?Totale Imponibile?, il ?Totale IVA? ed il ?Totale Fattura?

    In questo modo posso poi fare tutte le statistiche che mi possono servire (Quantità vendute per Tipo di Prodotto, Fatturato per Prodotto, per Cliente, ecc.) oltre ad informazioni utili (ammontare IVA da versare, scadenziario fatture, ecc).

    Con la strada che ho intrapreso (creazione di una tabella di appoggio e di una tabella definitiva) la cosa sembra che stia funzionando bene però non ho nessun problema ad accantonare tutto e provare soluzioni diverse .... sempre pronto ad imparare nuove cose.

    Grazie in anticipo per l?aiuto.


  • User Attivo

    Di queste righe qua per un cliente e per una fattura potrebbero essercene anche 40, giusto?

    Codice Prodotto, Descrizione Prodotto (collegato al Codice Prodotto), Quantità, Importo Unitario, Importo Totale (risultato della moltiplicazione di Quantità * Importo Unitario), Codice IVA (collegato ad una Tabella con le aliquote IVA da applicare)

    Dipende da cosa e quanto acquista un cliente in un unico colpo?

    keiske


  • User

    Esatto, le righe possono da una (valore minimo) fino a potenzialmente all'infinito (è per questo che non voglio usare il 'FOR' in quanto non so a priori quante righe dovrò inserire).

    Stesso discorso per il 'Calcolo IVA' anche qui le righe possono essere da un minimo di UNA ad un massimo non definibile a priori (dipende dalle tipologie di merce acquistata ed a quale aliquota è soggetta).

    Infatti il numero totale di righe sia per il dettaglio sia per l'IVA dipende solo da cosa viene comprato e non da quanto.
    Esempio: se compro 5000 pezzi del Prodotto A ed avrò solo una riga per il dettaglio ed una riga per l'IVA
    Se invece compro UN pezzo del prodotto A, UN pezzo del prodotto B ed un pezzo del prodotto C avrò sicuramente 3 righe di dettaglio mentre per l'IVA dipende da quale aliquota si applica ad ogni prodotto (quindi potrei averne UNA, DUE oppure TRE).


  • User

    Ehi ..... ci sono delle novità ??????

    Io sto andando avanti con la tabella di appoggio, ma aspetto soluzioni diverse ......

    Ho anche pensato di popolare un array bidimensionale (che diventerebbe a tutti gli effetti una matrice) ma con JavaScript ci faccio ancora a cazzotti (e con php non vado molto meglio) ....


  • User Attivo

    @PippoJoe said:

    Esatto, le righe possono da una (valore minimo) fino a potenzialmente all'infinito (è per questo che non voglio usare il 'FOR' in quanto non so a priori quante righe dovrò inserire).

    Stesso discorso per il 'Calcolo IVA' anche qui le righe possono essere da un minimo di UNA ad un massimo non definibile a priori (dipende dalle tipologie di merce acquistata ed a quale aliquota è soggetta).

    Infatti il numero totale di righe sia per il dettaglio sia per l'IVA dipende solo da cosa viene comprato e non da quanto.
    Esempio: se compro 5000 pezzi del Prodotto A ed avrò solo una riga per il dettaglio ed una riga per l'IVA
    Se invece compro UN pezzo del prodotto A, UN pezzo del prodotto B ed un pezzo del prodotto C avrò sicuramente 3 righe di dettaglio mentre per l'IVA dipende da quale aliquota si applica ad ogni prodotto (quindi potrei averne UNA, DUE oppure TRE).

    Ok, all'infinito, ma le righe le sai quando il cliente finisce di acquistare e guarda la tabella... o se si ferma a metà per vedere quello che ha acquistato e poi ricomincia...

    La tua tabella quando deve vedersi?

    keiske


  • User

    La tabella deve vedersi SEMPRE, man mano che vengono inserite nuove righe si devono vedere tutte quelle già inserite con i relativi totali aggiornati (Imponibile, IVA, Totale Fattura).


  • User Attivo

    Ok, ma la tabella vuoi che si crei man mano che inserisci le righe e le "mandi" al server o vuoi che tutto avvenga senza il ricaricamento della pagina (stile ajax)?

    keiske


  • User

    Non ho la più pallida idea di cosa sia 'ajax' (se non l'ex squadra di Van Basten 🙂 ) .....

    Comunque la cosa è indifferente, può anche essere creata man mano che inserisco le righe e poi la invio al server tutta insieme oppure la creo sul server riga per riga (però in questo caso penso convenga tornare alla mia tabella di appoggio originale)


  • User Newbie

    salve a tutti e complimenti per il forum ...
    prendo spunto da questa discussione per esporvi un mio problema ...
    allora devo fare un form per un inserimento di una fattura tutto con php mysql..
    nelle righe della descrizione ho una select che legge i valori direttamente da mysql vorrei che al momento della selezione si popolasse automaticamente il campo vicino con il prezzo del prodotto ...
    ho provato con ajax ma non ho risolto molto nel senso che il valore viene correttamente scritto su un div ma non riesco ad inserirlo nell'input box della riga corrispondente ...
    codice ...
    descrizione.js

    var xmlHttp
    function getprezzo(str)
    { 
    xmlHttp=GetXmlHttpObject()
    if (xmlHttp==null)
     {
     alert ("Browser does not support HTTP Request")
     return
     }
    var url="descrizione.php"
    url=url+"?q="+str
    xmlHttp.onreadystatechange=stateChanged 
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
    }
    function stateChanged() 
    { 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
     { 
     document.getElementById("nascosto").innerHTML=xmlHttp.responseText 
     } 
    }
    function GetXmlHttpObject()
    {
    var xmlHttp=null;
    try
     {
     // Firefox, Opera 8.0+, Safari
     xmlHttp=new XMLHttpRequest();
     }
    catch (e)
     {
     //Internet Explorer
     try
      {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
      }
     catch (e)
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
     }
    return xmlHttp;
    }
    

    nuovafattura.php (la parte delle righe)

     <? for ($i=0;$i<8;$i++){?>
      <tr class="bodystyle">
        <td><div align="center">
          <select name="codice<?=$i;?>" id="codice<?=$i;?>" onchange="getprezzo(this.value)" >
    	  	  <option selected="selected" value="null">Scegli un articolo ....</option>
    
    	<? $queryarticoli= "select * from articoli order by codice asc";
    	 $ris_articoli = mysql_query($queryarticoli) or die ("Query fallita");
    	 while($row_articoli=mysql_fetch_array($ris_articoli)){
    	?>
    
    
    	  <option value="<?=$row_articoli['codice']?>" ><? echo $row_articoli['descrizione'];}
    
    
      ?></option>
          </select>
        </div>      <div align="center"></div></td>
        <td><div align="center">
          <input maxlength="6" size="6" readonly="readonly" name="importo<?=$i;?>" >
        </div></td>
        <td><div align="center">
          <input maxlength="2" size="4" readonly="readonly" name="iva<?=$i;?>" >
        </div></td>
        <td><div align="center">
          <input maxlength="2" size="4" readonly="readonly" name="prezzo<?=$i;?>" id="prezzo<?=$i;?>" >
        </div></td>
        </tr>
    	<? } ?>
    </table>
    <p align="center">
      <input type="submit" name="lanciaform" value="Inserisci Fattura">
    </p>
    </div>
    
    </form> 
    <br>
    <p>
    
    <p>
    <div id="nascosto"><b>User info will be listed here.</b></div>
    </p>
    </p>
    </body>
    </html>
    

    da notare che anche se cambio il div dell'input box (esempio prezzo1) nel file descrizione.js non viene popolato
    ho trovato solo esempi per popolare select in cascata e ho appena iniziato con ajax ...
    qualche idea o soluzione ?
    grazie a chiunque mi potrà aiutare


  • User Attivo

    Ho come l'impressione che il problema principale sia la soluzione scelta per gestire la tua fattura...

    Se tu hai il prodotto e il prezzo nel database dovresti fare in modo che quando selezioni un prodotto venga lanciata una query che ricava il prezzo e lo mette a fianco del prodotto... così dovresti gestire il tutto più facilmente di come hai impostato tu...

    keiske


  • User Newbie

    @Privacy-Impresa said:

    Ho come l'impressione che il problema principale sia la soluzione scelta per gestire la tua fattura...

    Se tu hai il prodotto e il prezzo nel database dovresti fare in modo che quando selezioni un prodotto venga lanciata una query che ricava il prezzo e lo mette a fianco del prodotto... così dovresti gestire il tutto più facilmente di come hai impostato tu...

    keiske

    la domanda è : come si fa ? :arrabbiato:


  • User Attivo

    partiamo dal ragionamento puro senza codice:

    a te serve una pagina dove hai una riga dove puoi selezionare un prodotto tra tutti quelli che hai in database, da un menu a tendina... e a seconda del prodotto che selezioni di fianco deve apparire il prezzo...

    poi ti serve avere più righe così o ne basta una? se devi fare una fattura con 5 prodotti, uno per riga?

    cmq partiamo da una riga sola:

    1. query al DB per estrarre tutti i prodotti in database e estraiamo anche i prezzi per ogni prodotto.
    2. popolamento dinamico di un select con i prodotti
    3. creazione del div dove far apparire il prezzo
    4. associazione nel div del prezzo col prodotto

    siccome a seguito della query hai le variabili salvate in un array potresti usare il dom (o innerhtml) per scrivere nel div il prezzo corrispondente al prodotto... ad esempio:

    on select prodotto-10 <- innerhtml sul div col prezzo del prodotto-10 che hai ancora salvato nell'array dell query...

    keiske