Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 12 su 12

Discussione: Riempimento form da DB

  1. #11
    Utente di HTML.it
    Registrato dal
    Dec 2002
    Messaggi
    53
    Rieccomi qua!
    Ho rivisto ancora una volta il codice e sono giunto a questa versione:
    codice:
    <SCRIPT language=JavaScript>
    var persone = new Array();
    persone[persone.length] = new Array("carloni","federico","1","328789065","19","05","2005","10","30",0); 
    persone[persone.length] = new Array("carloni","paolo","1","32833333","19","06","2006","10","30",0);
    persone[persone.length] = new Array("carletti","federico","1","328000005","17","02","2005","10","30",0);
    persone[persone.length] = new Array("De Luca","Marina","5","3402588954","","","","","",0); 
    persone[persone.length] = new Array("petria","valerio","2","3204544569","20","03","2006","14","12",1); 
    persone[persone.length] = new Array("rossi","mario","2","3288888888","","","","","",1); 
    
    
    var row_prec="", col_prec="";    // valori precedenti
    var pos_mat = 0;                 // posizione nella matrice
    var cont_prec="";                // contenuto precedente
    var cont_digit = '';             // contenuto digitato
    
    function completa(ogg) 
    {
      var rc = ogg.name.split(/_/);    // decodifica riga e col - Es: cogn autista
      var row = rc[1]; //ES: autista
      var col = rc[0]; //ES: cogn
      var cont = ogg.value; //ES: carloni
      //alert("riga: "+row+"  colonna: "+col); //stampa un promemoria della colonna che sta scandendo ES: autista cogn
    
      if(row != row_prec) // riga diversa: azzera i puntatori
      { 
        cont_prec = "";
        pos_mat = 0;
      }
    
    
      var agg = cont.substr(cont.length-1); // carattere aggiunto - Estrae i caratteri di ciò che è scritto nel textfield..
      cont_digit += agg; //..e li mette in cont_digit. ES: Scrivo "c" e cont_digit diventa "c", scrivo poi "a" e cont_digit="ca" ecc.
    
     switch (col) //NOTA: LA matrice. Diciamo: persone[record][campo] 
     {
       case 'cogn': 
        while((persone[pos_mat][0]).indexOf(cont_digit) < 0) 
    	//Scandisco la matrice sulla colonna relativa al cognome. Parto dalla prima riga e finchè non c'e' un matching tra le lettere
    	//digitate dall'utente nel textfield e quello che è scritto nella matrice, passo alla riga successiva
    	{
          pos_mat++;
        }
          if(pos_mat > persone.length) 
    	  {
          alert("non nell'elenco")//Se arrivo alla fine dell'array ovviamente sta digitando i dati di una persona ancora non registrata nel DB
    
          return false;
          }
    	  //SE invece riscontra un matching del 100% compila gli altri campi del form con i dati della riga in esame.
    	ogg.form.elements("cogn_"+row).value = persone[pos_mat][0];
        ogg.form.elements("nome_"+row).value = persone[pos_mat][1];
    	ogg.form.elements("gruppo_"+row).value = persone[pos_mat][2];//Attenzione: e' una select!
    	ogg.form.elements("tel_"+row).value = persone[pos_mat][3];
    	ogg.form.elements("ggFine_"+row).value = persone[pos_mat][4];
    	ogg.form.elements("mmFine_"+row).value = persone[pos_mat][5];
    	ogg.form.elements("aaFine_"+row).value = persone[pos_mat][6];
    	ogg.form.elements("oraFine_"+row).value = persone[pos_mat][7];
    	ogg.form.elements("minFine_"+row).value = persone[pos_mat][8];
    	if ( persone[pos_mat][9]==1 ) 
    	 ogg.form.elements("benefici_"+row).click();// Funziona così!
       
         break;
    
       case 'nome':
      
       while((persone[pos_mat][1]).indexOf(cont_digit) < 0) 
    	//Scandisco la matrice sulla colonna relativa al cognome. Parto dalla prima riga e finchè non c'e' un matching tra le lettere
    	//digitate dall'utente nel textfield e quello che è scritto nella matrice, passo alla riga successiva
    	{
          pos_mat++;
        }
          if(pos_mat > persone.length) 
    	  {
          alert("non nell'elenco")//Se arrivo alla fine dell'array ovviamente sta digitando i dati di una persona ancora non registrata nel DB
    
          return false;
          }
    	  //SE invece riscontra un matching del 100% compila gli altri campi del form con i dati della riga in esame.
    	ogg.form.elements("cogn_"+row).value = persone[pos_mat][0];
        ogg.form.elements("nome_"+row).value = persone[pos_mat][1];
    	ogg.form.elements("gruppo_"+row).value = persone[pos_mat][2];//Attenzione: e' una select!
    	ogg.form.elements("tel_"+row).value = persone[pos_mat][3];
    	ogg.form.elements("ggFine_"+row).value = persone[pos_mat][4];
    	ogg.form.elements("mmFine_"+row).value = persone[pos_mat][5];
    	ogg.form.elements("aaFine_"+row).value = persone[pos_mat][6];
    	ogg.form.elements("oraFine_"+row).value = persone[pos_mat][7];
    	ogg.form.elements("minFine_"+row).value = persone[pos_mat][8];
    	if ( persone[pos_mat][9]==1 ) 
    	 ogg.form.elements("benefici_"+row).click();// Funziona così? NO!!
       
        
        break;
      case 'gruppo':
      //Questa è una select? come gestirla?
      break;
      //Gli unici 3 campi che possono dare vita al completamento automatico sono Cognome Nome e Gruppo, in quanto
      //sono una chiave unique sul DB.
      default: return true;
      
     }//chiude switch
    }//chiude function
    </SCRIPT>
    lo script è pubblicato come al solito su http://www.bukowski-show.it/autocompletamento2.htm

    Purtroppo ci sono ancora un sacco di problemi che ho provato (invano ) a risolvere:
    1) Lo script funziona solo sull'autista mentre per le altre righe da' errore: Persone[...][0] è nullo o non è un oggetto
    2) Questo funzionamento non è affatto quello desiderato: dopo aver digitato la prima lettera del cognome riempie tutta la riga (i dati sono pure corretti!) ma non è possibile continuare con l'inserimento. Quindi se io volessi i dati di carloni paolo o carletti federico non potrei mai accedervi... Inoltre se la prima lettera che scrivo è "r" (per avere i dati di rossi mario) mi da' sempre quelli di carloni federico....
    Purtroppo essendo io una schiappa in JS posso solo fare supposizioni e la mia supposizione è la seguente (basata su del codice che avevo trovato per auto-completare un solo textfield prendendo i dati da un array): Mancano tutta una serie di funzioni che facciano apparire (selezionati in azzurro e quindi cancellabili continuando a digitare) i dati a video e ne permettano la modifica. infatti il codice che avevo è il seguente:

    codice:
    var isOpera = navigator.userAgent.indexOf('Opera') > -1;
    var isIE = navigator.userAgent.indexOf('MSIE') > 1 && !isOpera;
    var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0 && !isOpera;
    
    function textboxSelect (oTextbox, iStart, iEnd) {
    
       switch(arguments.length) {
           case 1:
               oTextbox.select();
               break;
    
           case 2:
               iEnd = oTextbox.value.length;
               /* falls through */
               
           case 3:          
               if (isIE) {
                   var oRange = oTextbox.createTextRange();
                   oRange.moveStart("character", iStart);
                   oRange.moveEnd("character", -oTextbox.value.length + iEnd);      
                   oRange.select();                                              
               } else if (isMoz){
                   oTextbox.setSelectionRange(iStart, iEnd);
               }                    
       }
    
       oTextbox.focus();
    }
    
    function textboxReplaceSelect (oTextbox, sText) {
    
       if (isIE) {
           var oRange = document.selection.createRange();
           oRange.text = sText;
           oRange.collapse(true);
           oRange.select();                                
       } else if (isMoz) {
           var iStart = oTextbox.selectionStart;
           oTextbox.value = oTextbox.value.substring(0, iStart) + sText + oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length);
           oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length);
       }
    
       oTextbox.focus();
    }
    
    function autocompleteMatch (sText, arrValues) {
    
       for (var i=0; i < arrValues.length; i++) {
           if (arrValues[i].indexOf(sText) == 0) {
               return arrValues[i];
           }
       }
    
       return null;
    
    }
    
    function autocomplete(oTextbox, oEvent, arrValues) {
    
       switch (oEvent.keyCode) {
           case 38: //up arrow  
           case 40: //down arrow
           case 37: //left arrow
           case 39: //right arrow
           case 33: //page up  
           case 34: //page down  
           case 36: //home  
           case 35: //end                  
           case 13: //enter  
           case 9: //tab  
           case 27: //esc  
           case 16: //shift  
           case 17: //ctrl  
           case 18: //alt  
           case 20: //caps lock
           case 8: //backspace  
           case 46: //delete
               return true;
               break;
    
           default:
               textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));
               var iLen = oTextbox.value.length;
    
               var sMatch = autocompleteMatch(oTextbox.value, arrValues);
    
               if (sMatch != null) {
                   oTextbox.value = sMatch;
                   textboxSelect(oTextbox, iLen, oTextbox.value.length);
               }  
               
               return false;
       }
    }
    dove arrValues era un array contenente i soli cognomi (o nomi o altre stinghe) che venivano autocompletati.

    nel form s'inseriva un:

    codice:
    onKeyPress="return autocomplete(this, event, arrValues)"
    forse bisognerebbe trovare una sorta di compromesso tra le 2 versioni credo...

    E' un gran casino farlo?

    Oppure c'e' una soluzione piu' semplice per rendere il codice che hai proposto tu funzionante?

    fammi sapere pls!
    a presto (spero)!

  2. #12
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Cerco di darti qualche risposta.

    Anzitutto devi mettere i nomi nella matrice in ordine alfabetico (altrimenti non puo` funzionare) - cioe` si potrebbe fargli fare la scansine di tutta la matrice ogni volta, ma credo che la cosa si complichi.
    Dato che i nomi verranno da un altroprogramma che e` in grado di ordinare, non vedo perche` fare lo sforzo in JS.
    carletti < carloni

    Lo script da te trovato e` fatto per qualche browser (utilizza istruzioni proprietarie): si puo` fare una cosa per tutti i browser, con un minimo di attenzione (evitando istruzioni proprietarie e l'uso delle frecce).

    Comunque a me in Mozilla 1.4 non funziona (e non so perche`).

    Forse potresti lasciar dentro qualche alert, in modo da verificare meglio dove si ferma.

    Il completamento sul nome e` una cosa leggermente diversa, che ancora non ho preso in considerazione a fondo (occorre tener conto del cognome gia` inserito).

    Ci sono problemi sul codice HTML.
    name="gruppo_navigatore" la seconda parte del nome non e` conforme alle convenzioni.
    <table width="95%" border="1"> <td width="10%"> e` meglio non usare formattazione dentro il codice HTML: per la formattazione si usano i CSS.
    value="2005"SELECTED> manca uno spazio

    Nel codice JS cura molto bene l'indentazione: e` un programma complesso, se sbagli ad indentare potresti non capire piu` i riferimenti.


    Per accedere ad una select:
    var ss = ...NOMESELECT;
    valore = ss.options[ss.selectedIndex].value

    confronti con select (per selezionare l'opzione che ha un certo value:
    codice:
    var ss = ...NOMESELECT;
    for(var i=0; i<ss.length; i++) {
      if(ss.options[i].value == VALORE) {
        ss.selectedIndex = i;
        break;
      }
    }

    Nella mia idea iniziale, il completamento avrebbe dovuto essere cosi`:
    uno batte c; nel database trova carloni (il primo che inizia per c) e lo scrive; se e` OK premendo tab si passa al campo successivo ed il cognome resta scritto. Se non va bene uno deve scrivere un nuovo carattere, ad esempio a (il campo non cambia), poi di seguito r - l - e; a questo punto non va piu` bene carloni, e viene trovato (proseguendo nella ricerca sul database) carletti che quindi viene scritto.

    Per editare il "carloni, cancellando "oni" per scrivere "e" occorre fare in modo che il valore di cont_digit venga modificato anche senza che siano digitate lettere nel campo, e questo non e` semplice (occorre verificare se sono digitati caratteri non stampabili (complesso e browser-dependent), o se viene usato il mouse (facile, si fa con onclick).

    Non so se sono riuscito a spiegarmi (la cosa obiettivamente non e` semplice) o se ho creato piu` confusione.

    Io poi non ci sono in rete fino a lunedi`; se hai voglia di andare avanti, sfrutta le tue conoscenze di programazione ed il reference: vedrai che anche JS e` comunque un linguaggio come altri (sequenziale, ad oggetti, strutturato).
    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.