• 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