Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di ivy_76
    Registrato dal
    Dec 2004
    Messaggi
    1,822

    Jquery, fare una query dentro ad un ciclo

    Ciao

    come gia detto sono alle prime armi e sono ancora inesperto e confuso.
    Mi imbatto di continuo in nuovi problemi e ora sono alle prese con la realizzazione di query parametriche all'interno di un ciclo.

    Prima spiego in italiano poi posto il codice. Ho una tabella che memorizza le timbrature che un utente fa giornalmente. Poi devo farle vedere, tutto qui.
    So gia che non sto facendo le cose esattamente come dovrei (discorso normalizzazione tabelle ecc ecc) ma per ora va bene cosi. Tanto è solo un test.

    La prima query prende il primo giorno che trova in tabella. Poi in base a quello estraggo, con la seconda query, i quattro record relativi (timbro al mattino, pausa pranzo, rientro dalla pausa, e uscita serale) e li voglio mostrare a video. Il problema è qui.
    Il problema è che ho messo la seconda query in un ciclo. Ma il ciclo e la query hanno due vite separate. Il ciclo "cicla" x i fatti suoi e poi quando ha finito, esegue la query che è al suo interno passandole però l'ultimo valore. Per cui mi ritrovo con una select cosi:

    SELECT ingresso, uscita FROM ORARIO where giorno ='24-1-13'
    SELECT ingresso, uscita FROM ORARIO where giorno ='24-1-13'
    SELECT ingresso, uscita FROM ORARIO where giorno ='24-1-13'


    anziche

    SELECT ingresso, uscita FROM ORARIO where giorno ='21-1-13'
    SELECT ingresso, uscita FROM ORARIO where giorno ='22-1-13'
    SELECT ingresso, uscita FROM ORARIO where giorno ='23-1-13'


    in queto modo chiaramente, leggo sempre e solo i dati relativi all'ultimo giorno. Ho provato ad ovviare a questo problema ma non ci riesco.


    Vi posto un estratto di codice per cui lasciamo perdere eventuali parentesi mancanti , punti e virgola e altre dimenticanze

    codice:
    db.transaction (function(tx)
    		{						
    			
    			tx.executeSql ("SELECT DISTINCT(giorno) FROM ORARIO ORDER BY id", [], function (tx,results)		
    			{		
    				// Faccio le query in base al giorno	 
    				var num_record = results.rows.length;  // restituisce il numero dei record presenti
    				
    				for (var i = 0; i < num_record ; i ++)
    				{
    					// per ogni giorno mi tiro fuori le timbrature
    					
    					var oggetto  = results.rows.item(i);
    					var giorno   = oggetto.giorno;								
    					 
    					giorni[i] = giorno;
    				}
    				
    				lunghezza = giorni.length;   // numero giorni coinvolti nella tabella							
    				
    				
    					db.transaction (function(tx2)
    					{
    						
    						for (var x = 0 ; x < lunghezza ; x ++ )
    						{	
    											 
    							
    							sql = "SELECT DISTINCT(giorno) FROM ORARIO WHERE giorno ='" + giorni[x] + "'";
    							 
    							tx2.executeSql (sql, [], function (tx,results)		
    							{
    							
    								alert(sql);
    							});
    							
    							 
    								
    						}
    					});
    TORTA DI RISO .. F I N I T A !!

    Da M.C.S.A. a impiegato pubblico :-(

  2. #2
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,134
    Problema di di query = lato server non jquery

    P.S. quando si è alla prime armi si fanno test semplici
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  3. #3
    Utente di HTML.it L'avatar di ivy_76
    Registrato dal
    Dec 2004
    Messaggi
    1,822
    Si andrea hai ragione ,però non riesco a studiare una cosa se non faccio qualcosa di "serio".

    Pero come risolvo? Ci sono molte applicazioni per telefonino che lavorano cosi e una architettura client - server, in questo caso, è impensabile !
    TORTA DI RISO .. F I N I T A !!

    Da M.C.S.A. a impiegato pubblico :-(

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    ma sei sicuro di quello che dici? l'alert piazzato dentro la callback non ha senso, è ovvio che in quel momento l'alert ti mostrerà sepre l'ultima select ma questo non vuol dire che sia stata eseguita sempre l'ultima. Invece di stampare l'sql stampa il risultato(results) è vedi se è corretto.

  5. #5
    Utente di HTML.it L'avatar di ivy_76
    Registrato dal
    Dec 2004
    Messaggi
    1,822
    L'alert stampato li dentro dovrebbe, e dico dovrebbe perché non conosco bene questo linguaggio, stampare uno a uno tutti gli elementi dell'array proprio perché sono in un ciclo for e la query è parametrizzata con l'array reso dinamico dalla presenza dell'indice del for.
    Questo codice se lo converti in qualsiasi altro linguaggio funziona di sicuro. L'avrò fatto 1 miliardo di volte.

    L'alert cosi non ha senso, certo, voglio solo vedere cosa stampa. Allo stato attuale delle cose, mettendo un alert prima del ciclo e uno dentro ottengo che stampa 4 volte di fila quello FUORI dal ciclo (e la cosa "a naso" non ha senso) per poi entrare nel ciclo e stampare l'ultimo.

    La query è se vedi è dentro ad un ciclo.

    A proposito di results, io non so interpretare il risultato.

    Mettendo questo codice

    alert(results.message);

    dentro al ciclo dove prima stampavo la sql, l'alert dice "undefined"
    TORTA DI RISO .. F I N I T A !!

    Da M.C.S.A. a impiegato pubblico :-(

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    non è assolutamente vero quello che dici, quando dico che quell'alert non ha senso è proprio per una questione di logica, non importa che lo hai messo solo per fare un test. Se non ti stampasse sempre l'ultima query allora si che ci sarebbe qualcosa di strano. E' invece corretto che ti stampi sempre l'ultima query, è una questione di asincronismo. Io sono convinto che il codice sia già a posto cosi, devi solo capire come interpretare il result.

  7. #7
    Utente di HTML.it L'avatar di ivy_76
    Registrato dal
    Dec 2004
    Messaggi
    1,822
    ah !! Ok !! Certo !!!! Non ci eravamo capiti allora ! :-))

    Rifaccio la domanda. Come faccio a farlo funzionare in modo sincrono ? Cosa devo studiare per risolvere questo problema? O quanto meno come devo modificare il mio codice per far si che funzioni, e che mi faccia comparire i dati in modo "corretto"?

    Come ho gia detto sono un novellino di questo linguaggio ed ad ogni "stupidata" mi fermo ! E di asincronicità proprio non ne so niente
    TORTA DI RISO .. F I N I T A !!

    Da M.C.S.A. a impiegato pubblico :-(

  8. #8
    Utente di HTML.it L'avatar di ivy_76
    Registrato dal
    Dec 2004
    Messaggi
    1,822
    Gia che ci siamo, se ti va, scendiamo più nel dettaglio

    la callback non ha senso, è ovvio che in quel momento l'alert ti mostrerà sepre l'ultima select ma questo non vuol dire che sia stata eseguita sempre l'ultima
    Lo so che qui c'è un problema di asincronismo. Ma perché? Per quale motivo la query che è dentro ad un ciclo, viene saltata? Perché il ciclo ha la precedenza e solo quando ha finito viene processata la query ?

    E' chiaro, che come detto, ho semplificato all'osso il mio codice e che cosi il mio codice non serve a niente. Ok? Avevo gia fatto tutto il codice in stile PHP ma poi ho tolto tutto per capire come proseguire.
    TORTA DI RISO .. F I N I T A !!

    Da M.C.S.A. a impiegato pubblico :-(

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    vediamo se riesco a farmi capire, questo è il flusso dello script:

    - la variabile sql viene valorizzata con x=0
    - viene eseguita la query sql con x=0
    - la variabile sql viene valorizzata con x=1
    - viene eseguita la query sql con x=1
    ...
    - la variabile sql viene valorizzata con x=length-1
    - viene eseguita la query sql con x=length-1

    Mettiamo che il tempo per elaborare queste operazioni sia di 1 secondo (tempo puramente casuale), le query invece per essere processate ci mettono 2 secondi, quindi il ciclo è già terminato.

    Dopo 2 secondi:

    - viene eseguito l'alert della prima query, la variabile sql è valorizzata con x=length-1 e viene mostrata
    - viene eseguito l'alert della seconda query, la variabile sql è valorizzata con x=length-1 e viene mostrata
    ...
    - viene eseguito l'alert della ultima query, la variabile sql è valorizzata sempre con x=length-1 e viene mostrata

    Quindi l'alert ti mostrerà sempre l'ultima query, ma in realtà sono state eseguite tutte. In poche parole il test che stai facendo è fuorviante, ti fa credere che ci sia un errore, mentre è tutto corretto cosi com'è, il concetto è che la funzione di callback viene richiamata in modo asincrono e tu non ha modo di sapere quando.

    codice:
    tx2.executeSql (sql, [], function (tx,results)		
    							{
    //qui ci entra solo quando l' esecuzione della select è terminata, 
    //nel frattempo lo script ha proseguito le sue operazioni
    								alert(sql);
    							});
    Questo dovrebbe chiarirti tutte le tue domande, le query che sono dentro al ciclo non vengono saltate, il ciclo non ha nessuna precedenza sulle query e non devi preoccuparti di rendere sincrona l'operazione ne di studiare alcunche è già tutto corretto.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.