Autore Topic: sqlite posizionarsi su un record  (Letto 1699 volte)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
sqlite posizionarsi su un record
« il: 03 Dicembre 2009, 21:00:51 »
ciao raga

ho un problemino stupido e sicuramente la soluzione è banale, ma non riesco a venirne a capo.

devo aprire un database (e qui ci siamo), poi posizionarmi su un record specifico

io apro il database in questo modo:
Codice: [Seleziona]
DIM sqlr AS String 
 DIM MyRSR AS Result  

sqlr = "SELECT * FROM documenti order by iddocumento"      
     
MyRSR = MODMain.MyConn.Exec(sqlr)  

MyRSR.MoveNext


normalmente dopo l'apertura il recordset si posiziona sul primo record, oppure sull'ultimo con il comando movenext che ho aggiunto.

ma se io volessi posizionarmi su un record specifico? tipo ho 250 record voglio posizionarmi sul 130.

attenzione non mi serve una query con WHERE e  LIKE in quanto questo mi troverebbe il record, ma solo quello, io invece voglio che tutta la tabella rimanga caricata.

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #1 il: 03 Dicembre 2009, 21:04:07 »
MyRSR.MoveTo(129)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #2 il: 03 Dicembre 2009, 22:37:52 »
grazie milio

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #3 il: 03 Dicembre 2009, 23:25:40 »
prego  :-)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #4 il: 04 Dicembre 2009, 21:42:59 »
altro piccolo problema
moveto funziona solo per gli id in modalità integer.

e se io volessi posizionarmi su un testo?
tipo apro il database in questo modo

Codice: [Seleziona]
sqlr = "SELECT * FROM documenti order by idcognome"


e poi posizionarmi su un cognome tipo "rossi".

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #5 il: 04 Dicembre 2009, 22:08:43 »
ma perchè tenere in memoria un intero recordset e usarlo poi per ricercare dei dati all' interno?

secondo me è molto + pratico e veloce interrogare direttamente il db con una query di ricerca + selettiva.

non credo che quello che vuoi fare tu si possa :)

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #6 il: 04 Dicembre 2009, 22:19:52 »
PRIVATE MyRSR AS Result

PRIVATE SUB CaricaRec()
DIM sqlr as String
DIM NumeroRec as Integer

  sqlr = "SELECT * FROM documenti order by idcognome"    
     
  MyRSR = MODMain.MyConn.Exec(sqlr)

  NumeroRec = TrovoRecCognome("Rossi")

END

PRIVATE FUNCTION TrovoRecCognome(Cognome as String) AS Integer
DIM Nx AS Integer

  DO UNTIL MyRSR["Cognome"] = "Rossi"
    INC Nx
    TRY MyRSR.Moveto(Nx-1)
      IF ERROR THEN RETURN -1
  LOOP

  RETURN Nx - 1

END

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #7 il: 07 Dicembre 2009, 22:03:01 »
Citazione

fsurfing ha scritto:
ma perchè tenere in memoria un intero recordset e usarlo poi per ricercare dei dati all' interno?

secondo me è molto + pratico e veloce interrogare direttamente il db con una query di ricerca + selettiva.

non credo che quello che vuoi fare tu si possa :)


a volte è necessario, pensa se cerchi un cognome che per errore è stato inserito male, tipo da lancillotti a lancellotti, con una query difficilmente lo trovi, dovresti provare tutte le varianti, oppure molti cognomi simili ma con date di nascita diversi.

si, potrebbe far caricare in una griglia i cognomi simili o uguali, ma per semplicità meglio tenere tutto il recordset (tanto con le cpu e le ram moderne non si avverte nemmeno)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: sqlite posizionarsi su un record
« Risposta #8 il: 07 Dicembre 2009, 22:15:36 »
Avvertenza:

moveto non agisce sugli indici ma sull'index.
a prima vista sembra che non cambi nulla, ma c'è un'enorme differenza.

se create un database inserendo sempre nuovi record e non ne cancellate mai nessuno, noterete che moveto si posiziona sempre sul record successivo, basta fare un - 1 e risolve.

ma cosa succede se cominciate a cancellare qualche record? il caos.

la differenza sta nel fatto che l'id viene assegnato in modo incrementale ad ogni nuovo record, si comincia da 1 a salire, immaginate di avere nel database 30 record da 1  a 30, poi ne cancellate 2, i 28 che restano conserveranno i loro id.

l'index è diverso parte da 0 fino alla somma dei record, in questo caso avrete index massimo 27 e se cercherete di far caricare il record 30 moveto punterà sul nulla.

la soluzione? usare due variabili, una per gli id in modo da poter modificare sempre e solo il record che vorrete, l'altra per gli index, in moda da far muovere il database al record giusto.

tipo:
Codice: [Seleziona]
Dim MyId as string ' per le modifiche o l eliminazione record
Dim MyIndex as integer  'per muovere il recordset al record giusto

MyId = MRsR!idcliente
MyIndex = MrsR.index

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: sqlite posizionarsi su un record
« Risposta #9 il: 08 Dicembre 2009, 01:35:53 »
Grazie maestro