Sql select selezionare un record a partire da una posizione

di il
8 risposte

Sql select selezionare un record a partire da una posizione

Buon pomeriggio,

Ho necessità di selezionare un record, all'interno di un file.mdb, a partire da una data posizione (es.: cercare un record che soddisfi una certa condizione, a partire dall'undicesimo). 

Ritenevo che nella sintassi della select (Select … From … Where …) vi fosse un'istruzione per indicare da quale record iniziare a cercare, ma non sono riuscito a trovarlo. Qualcuno di voi lo conosce?

Grazie a tutti.  

8 Risposte

  • Re: Sql select selezionare un record a partire da una posizione

    Non esiste perché non ha senso parlare di undicesimo record. In un db non ha senso questa ‘numerazione’ .

    Dovrai indicare un criterio valido

  • Re: Sql select selezionare un record a partire da una posizione

    Spiego il mio problema. Da una tabella, devo selezionare tutti i record che soddisfano una certa condizione. Devo, però, visualizzarli uno ad uno, in modo da poter modificare i singoli campi.

    A tal fine, ho realizzato una maschera, in cui ho inserito le TextBox nelle quali visualizzare i campi record da modificare. Nella stessa, ho inserito anche una Label in cui memorizzare l’ID del record corrente e un pulsante (BtNext), col quale si attiva la seguente routine:

    Private Sub BtNext_Click()
      Set rs = db.OpenRecordset("SELECT * FROM … Where …")
      Do Until rs.EOF
         If (condizione=Vero) Then GoTo disp
         rs.MoveNext
      Loop
      MsgBox "Non vi sono altri record"
      Exit Sub
    
    disp:
      With rs
         … 'popola le textbox
         Label1 = .ID
      End With
      
    Exit Sub

    Come modificare le istruzioni affinché, cliccando nuovamente su BtNext, sia trovato e visualizzato il record successivo a quello indicato dall'ID memorizzato nella Label1?   

  • Re: Sql select selezionare un record a partire da una posizione

    Ho risolto e intendo condividere la soluzione con la comunità che ringrazio sempre.

    In pratica, ho inserito un valore multiplo nella condizione Where: trova il record che soddisfi la condizione (…) e il cui ID sia maggiore del valore indicato nella Label1.  In tal modo, al primo click (quando Label1="")  troverà il record che soddisfa la condizione e il cui l'ID è > 0: tale ID viene assegnato alla Label1. Al secondo click troverà un altro record che soddisfa la condizione e il cui l'ID è > del record trovato in precedenza, assegnato alla Label1 … e così via, fino alla fine.

    Buona domenica.

    
    Private Sub BtNext_Click()
    
      do
         cmdsql = "SELECT * FROM ... Where ... And Id > " & Val(Label1)  
         Set rs = db.OpenRecordset(cmdsql)
         if rs.Eof then Exit Do  
         If (condizione=Vero) Then GoTo disp
         Label1 = .ID
      Loop
      MsgBox "Non vi sono altri record"
      Exit Sub
    
    disp:
      With rs
         … 'popola le textbox
      End With
       
    Exit Sub
  • Re: Sql select selezionare un record a partire da una posizione

    Ciao

    L'idea e' buona, pero' per come lo hai scritto non funziona correttamente in quanto manca una “order by” sul campo Id.

    Pensa alla possibilita' di avere gli id 1, 2, 3, 4, 5, 6.

    Se fai la query come l'hai scritta tu (senza la order by), se il DB estrare come primo id il valore 3, ti perdi i dati identificati da 1 e 2.

    Magari nel 99% dei casi ti funziona bene, pero' senza una ORDER BY il risultato finale non e' garantito

  • Re: Sql select selezionare un record a partire da una posizione

    A parte che questo post dovrebbe  stare nella sezione dedicata ad access.

    Quello che stai facendo non ha senso. 

    Che significa iniziare la ricerca da una data posizione?

    Su un database con un milione di record, come fai a conoscere la posizione del record da cercare? E sopratutto a conosderne l id?

    Sopratutto che cosa è l id? Una chiave primaria? Se lo è, e fai compatta e ripristina database, access potrebbe cambiarne la numerazione, spostando anche i record, e buona notte al secchio. 

    Cosi facendo pensi di velocizzare le ricerche?

    Un codice come quello scritto da te, impiega circa 1000 volte di più rispetto al motore di access.

    Da quello che ho capito ti basta una maschera in visualizzazion  singola ed applicare un semplice filter sulla tabella .

  • Re: Sql select selezionare un record a partire da una posizione

    10/12/2022 - PiGi78 ha scritto:


    L'idea e' buona, pero' per come lo hai scritto non funziona correttamente in quanto manca una “order by” sul campo Id.

    Ciao PiGi78, voglio comprendere meglio il problema che hai evidenziato, perciò chiarisco innanzitutto che il mio progetto è realizzato in vb6 e usa un file.mdb come database (così rispondo anche a fratac!), nel quale sono registrati una serie di record con diversi campi, tra cui, naturalmente, il numeratore automatico (ID).

    Come ho precisato nel post, quando si clicca la prima volta sul pulsante [BtNext], sarà cercato il primo record che soddisfa la condizione assegnata e il cui l'ID è > 0; al secondo click sarà cercato un altro record che soddisfa la condizione e il cui l'ID è > del record trovato in precedenza, e così via.

    Ora mi chiedo (e ti chiedo): a cosa serve ordinare l’ID?

    Grazie per la risposta

  • Re: Sql select selezionare un record a partire da una posizione

    Due cose, in ordine

    Order by

    Supponi di avere una tabella PERSONE con questi campi:

    CampoTipo
    IDNumeratore
    NOMEStringa
    INDIRIZZOStringa

    Ora supponi contenga i seguenti dati:

    IDNOMEINDIRIZZO
    1RossiViale del tramonto
    2BianchiVia montanara
    3VerdiPiazza erbe
    4GialliVia del sole

    Scrivendo “SELECT ID, NOME, INDIRIZZO FROM PERSONE”, il sistema puo' estrarre i dati come li vedi nella tabella qui sopra. In questo caso, la procedura da te messa in piedi funzionerebbe.

    Non hai pero' chiesto al database di dare alcun ordine, per cui li estrae in base a come “gli torna piu' comodo in quel momento”. Puo' quindi capitare che in molti casi funzioni, pero' nessuno vieta che il DB torni:

    IDNOMEINDIRIZZO
    1RossiViale del tramonto
    3VerdiPiazza erbe
    2BianchiVia montanara
    4GialliVia del sole

    Quando questo capita, il tuo codice smette di funzionare correttamente, poiche' alcuni dati non vengono estratti. Nell'esempio sopra, la procedura ti estrae prima il record con ID pari ad 1, poi quello con ID pari a 3 (che e' maggiore di 1) ma a quel punto non estrarra' mail il record con ID pari a 2, poiche' e' minore di 3.

    Se vuoi obbligare il DB ad estrarre i record in ordine, allora devi usare la clausola order by

    Nell'esempio: SELECT ID, NOME, INDIRIZZO FROM PERSONE ORDER BY ID

    Soluzione da te scelta

    Ho dubbi anche sulla soluzione da te proposta. Se gli elementi della tabella sono pochi, secondo me ti conviene lavorare in modalita' disconnessa (se cerchi su Google questi termini dovresti trovare un sacco di esempi).

    In pratica la logica e' semplice: dalla tabella estrai tutti i dati (che sono limitati) e te li salvi in una collezione di oggetti in memoria. Quindi la tua videata la fai scorrere avanti/indietro sugli elementi di suddetta collezione.

    Ci sono diverse opzioni, penso Google ti faccia vedere le piu' usate

    Se invece i record sono molti, allora cerca sempre su Google come si possa gestire la paginazione (perche' e' quello che ti serve). Prendendo anche solo il modo in cui hai implementato tutto tu, gia' una clausola TOP 1 indicherebbe al motore di estrarre il primo record. Inutile preparare tutto il sistema per estrarre tanti dati se poi serve solo la prima riga… 

  • Re: Sql select selezionare un record a partire da una posizione

    Grazie, PiGi78, ritenevo che la Select, una volta spostato il puntatore sul primo record, selezionasse quelli successivi in ordine di ID. Le tue risposte, davvero utili, riaffermano la mia convinzione che bisogna chiedere anche quando si è convinti che la questione sia scontata (di ciò ne ho fatto da tempo un principio di vita: ascolta senza interrompere quello che gli altri dicono, imparerai cose che non sapevi). 

    Utilizzerò senz'altro la clausola order by.

    Buona giornata.

Devi accedere o registrarti per scrivere nel forum
8 risposte