• 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


  • User Newbie

    @Privacy-Impresa said:

    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

    intanto grazie per la risposta...
    teoricamente le righe sono più di una però partendo da una sola per poi replicare ho lo stesso tipo di problema ..
    ho provato con ajax e con innerhtml a far apparire il prezzo su un div qualunque (esterno alla tabella) e funziona ma mettendo come destinazione il div che contiene linput type di tipo text non funziona ...
    (mistero:x)
    posto l'html generato dal php ...

    
    
    <html>
    <head>
    
    <script src="descrizione.js"></script>
    
    
    
    
    
    </head>
    <body>
    <form name=fattura method="post" action="crea_fattura.php">
    
    <------cut--------->>>>>
    
    
    <table width="100%" border="1" align="center">
      <tr>
        <th width="65%" class="big" scope="col"><div align="center">Descrizione</div>      <div align="center"></div></th>
        <th width="8%" class="big" scope="col"><div align="center">Quantita</div></th>
        <th width="8%" class="big" scope="col"><div align="center">Importo</div></th>
        <th width="8%" class="big" scope="col"><div align="center">Iva</div></th>
        <th width="11%" class="big" scope="col"><div align="center">Prezzo</div></th>
        </tr>
      <tr class="bodystyle">
        <td colspan="4"></td>
        </tr>
        <tr class="bodystyle">
        <td><div align="center">
          <select name="codice0" id="codice0" onchange="getprezzo(this.value)" >
                <option selected="selected" value="null">Scegli un articolo ....</option>
    
        
    
          <option value="1" >Articolo di Test
    
          <option value="2" >articolo 2
    
          <option value="3" >Articolo di test 3
    
          <option value="4" >Articolo di test 2
    
          <option value="5" >articolo 55
    
          <option value="88" >test</option>
          </select>
        </div>      <div align="center"></div></td>
        <td><div align="center">
          <input maxlength="4" size="4"  name="quantita0" >
        </div></td>
        <td><div align="center">
          <input maxlength="6" size="6" readonly="readonly" name="importo0" >
        </div></td>
        <td><div align="center">
          <input maxlength="2" size="4" readonly="readonly" name="iva0" >
        </div></td>
        <td><div align="center">
          <input maxlength="2" size="4" readonly="readonly" name="prezzo0" id="prezzo0" >
        </div></td>
        </tr>
        </table>
    <p align="center">
      <input type="submit" name="lanciaform" value="Inserisci Fattura">
    </p>
    </div>
    
    </form> 
    
    </body>
    </html>
    
    
    

    modificando per esempio descrizione.js in questo modo

    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("prezzo0").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;
    }
    
    

    troviamo l'errore !: 😛


  • User Attivo

    Secondo me il problema è che usando l'innerhtml sostituisci quello che c'è nel div... ma poi devi pure stamparle? perchè se le devi stampare potresti anche selezionare nei menu a tendina gli articoli e poi mandando l'invio si apre la fattura ben formattata, con gli articoli scritti come testo e non nel select e anche l'importo scritto come testo, selezionando dal database il prezzo in base all'articolo...

    Ad ogni modo prova a inviare con innerhtml non solo il prezzo, ma tutto l'elemento input, tag compresi...

    keiske


  • User Newbie

    @Privacy-Impresa said:

    Secondo me il problema è che usando l'innerhtml sostituisci quello che c'è nel div... ma poi devi pure stamparle? perchè se le devi stampare potresti anche selezionare nei menu a tendina gli articoli e poi mandando l'invio si apre la fattura ben formattata, con gli articoli scritti come testo e non nel select e anche l'importo scritto come testo, selezionando dal database il prezzo in base all'articolo...

    Ad ogni modo prova a inviare con innerhtml non solo il prezzo, ma tutto l'elemento input, tag compresi...

    keiske
    allora forse ho avuto l'illuminazione ma non riesco a farla funzionare :arrabbiato:
    ho modificato descrizione.php in questo modo

    
    <?
    include("connect.php");
    $db = mysql_connect($db_host, $db_user, $db_password);
    mysql_select_db($db_name, $db)
    or die ("Errore nella selezione del database. Verificare i parametri ");
    $q=$_GET["q"];
    $codice=$_GET["cod"];
    $sql="SELECT * FROM articoli WHERE codice = '".$q."'";
    
    $result = mysql_query($sql);
    while($row = mysql_fetch_array($result))
    {
     echo "
     <input maxlength=\"6\" size=\"6\" readonly=\"readonly\" name=\"importo" . $codice . "\" value=" . $row['importo'] . ">";
    }
    
    
    ?>
    

    e richiamandolo direttamente funziona... restituisce un input box con nome corretto ed importo corretto ...

    invece questo è un pezzo del file principale nuova_fattura.php ....

     
    <-------cut--------->
    <? for ($i=1;$i<8;$i++){?>
      <tr class="bodystyle">
        <td><div align="center">
          <select name="codice<?=$i;?>" id="codice<?=$i;?>" onchange="mostraarticolo('this.value', '<? print $i;?>')" >
                <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" id="riga<?=$i;?>">
          <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;?>" >
        </div></td>
        </tr>
        <? } ?>
    <-------cut--------->
    
    

    modificato per richiamare la funzione mostraarticolo passando il valore della select quindi il codice dell'articolo e in più il numero di riga ...

    la funzione javascript contenuta in descrizione.js invece l'ho modificata così

    var xmlHttp
    
    function mostraarticolo(str, codice)
    { 
    xmlHttp=GetXmlHttpObject()
    if (xmlHttp==null)
     {
     alert ("Browser does not support HTTP Request")
     return
     }
    var url="descrizione.php"
    url=url+"?q="+str+"&cod="+codice"
    xmlHttp.onreadystatechange=stateChanged 
    xmlHttp.open("GET",url,true)
    xmlHttp.send(null)
    }
    function stateChanged() 
    { 
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
     { 
     document.getElementById("test").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;
    }
    

    il problema è che sembra come se non venisse affatto richiamata (anche guardando i log del server ) e non succede niente ...

    ho provato anche a modificare la parte

    document.getElementById("test").innerHTML=xmlHttp.responseText 
    

    in ```
    document.getElementById("importo"+codice).innerHTML=xmlHttp.responseText

    ma non funziona ... 
    
    qualche idea dai guru ajax + javascript + php + mysql ! :x:x

  • User Newbie

    risolto 😛
    modificando descrizione.js
    function stateChanged()
    {
    if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
    {
    document.getElementById("prezzo"+riga).innerHTML=xmlHttp.responseText
    }
    }

    ora funziona tutto solo che non riesco a far aggiornare i totali della tabella ...

    ho provato onchange ma siccome sono + di un evento ho pensato di fare una funzione unica ...

    che aggiorna la singola riga ed i totali ...
    ma non funge ...

    ecco il codice

    
    <script type="text/javascript">
    function ricalcola(k){
    
    document.fattura.importo"+k+".value=(document.fattura.prezzo"+k+".value * document.fattura.quantita"+k+".value).toFixed(2)
    document.fattura.tot_imponibile.value=k;
    }
    </script>
    
    

    da notare che la seconda riga di test inserisce correttamente il valore della riga sul totale ...
    la funzione è richiamata da
    onChange="ricalcola(<?=$i;?>);"

    qualche idea ?
    grazie
    ❌x:x