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)!