Alternativa a Dlookup per molti controlli

di eddy1973 il
14 risposte
Buonasera,
sono certo che per voi sia una banalità ma non riesco a capire come procedere:
Devo assegnare dei valori corrispondenti a diversi velori di uno stesso campo a dei controlli.
La prima cosa che viene in mente è quella di usare la funzione dlookup ma per molti record non è la cosa migliore. Per eseguire singola assegnazione posso usare il seguente codice (con N_ID variabile tipo public):
Dim rst As DAO.Recordset

Set DBCorrente = CurrentDb

Set rst = DBCorrente.OpenRecordset("Valore_Analisi", dbOpenDynaset)
rst.FindFirst ("ID_Assegnazione=" & N_ID)
Do While Not rst.NoMatch
Form_Ins_Comb.cbo_asp.Value = rst.Fields("Valore_Analisi")
rst.FindNext ("Valore_Analisi")
Loop

rst.Close
DBCorrente.Close
I valori da assegnare ad tutti i controlli devo soddisfare queste condizioni: tutti dovranno avere la stessa ID_Assegnazione, ma valore campi ID_Analisi_Campione diversi come si potrebbe fare utilizzando la funzione dlookup:
Dim Form As Form
Set Form = Form_Ins_Comb
With Form
.cbo_asp = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=46")
.cbo_colASTM = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=21")
.txt_visc40 = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=2")
.txt_ppoint = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=8")
.txt_cpoint = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=9")
.txt_fpoint = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=5")
.cbo_reazH2O = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=36")
.txt_ridvolH2O = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=35")
.txt_demul25 = DLookup("[Valore_Analisi]", "Valore_Analisi", "ID_Assegnazione =" & N_ID & " and ID_Analisi_Campione=32")
End With
Come potrei modificare il primo codice?
Grazie.

14 Risposte

  • Dal momento che ID_Assegnazione non cambia invece di aprire la tabella intera apri SOLO i records con ID_Assegnazione=N_ID... e dentro questo recordset usi il findfirst pern cercare i vari ID_Analisi_Campione=46/2/4/7 ecc...
    Se tu poi avessi chiamato i controlli come i nomi dei campi sarebbe stato ancora più semplice...
  • Intendi qualcosa del genere?
    Dim DBCorrente As DAO.Database
    Dim rst As DAO.Recordset, strsql As String
    
    Set DBCorrente = CurrentDb
    strsql = "SELECT Valori_Analisi FROM Valori_Analisi WHERE ID_Assegnazione=" & N_ID
    Set rst = DBCorrente.OpenRecordset(strsql)
    If Not rst.BOF And Not rst.EOF Then
    Form_Ins_Comb.cbo_asp.Value = rst.FindFirst("ID_Valore_Analisi= 46")
    Form_Ins_Comb.cbo_colASTM.Value = rst.FindFirst("ID_Valore_Analisi= 21")
    End If
    rst.Close
    DBCorrente.Close
  • Se funziona si, metterei in ordine crescente il predicato SQL per ID_Analisi_Campione e di.conseguenza i numeri per non fare andare avanti indietro il bookmark ma solo avanti riducendo molto i tempi.
  • Scusami, un'altra cosa:
    Se tu poi avessi chiamato i controlli come i nomi dei campi sarebbe stato ancora più semplice...
    cosa intendi?
  • No nel tuo caso non è indicativa in effetti... non fai riferimento a Controlli con nomi assimilabili ma a Valori specifici quindi va bene cosi.
  • Ho scritto il codice utilizzando FindFirst senza provarlo. Mi da errore. Probabilmente non posso utilizzare il metodo in questo modo. Esiste una alternativa che accetta un criterio?
  • DAO (seek)
    ADO (Find)
  • Comunque sia FindFirst che FindNext accettano un criterio ...
  • Certo che accettano un criterio. Infatti chiedevo un metodo che pur accettando un criterio possa fare qualcosa del genere:
    Form_Ins_Comb.cbo_asp.Value = rst.FindFirst("ID_Valore_Analisi= 46")
    ma utilizzando FinfFirst non si può fare a quanto pare.
  • eddy1973 ha scritto:


    Ho scritto il codice utilizzando FindFirst senza provarlo. Mi da errore. Probabilmente non posso utilizzare il metodo in questo modo. Esiste una alternativa che accetta un criterio?
    Hai 136 messaggi all'attivo, magari se ci dici qual'è l'errore evitiamo di andare a tentoni!
  • eddy1973 ha scritto:


    Certo che accettano un criterio. Infatti chiedevo un metodo che pur accettando un criterio possa fare qualcosa del genere:
    Form_Ins_Comb.cbo_asp.Value = rst.FindFirst("ID_Valore_Analisi= 46")
    ma utilizzando FinfFirst non si può fare a quanto pare.
    La sintassi non è corretta, si scrive così:
    
    rst.FindFirst("ID_Valore_Analisi= 46")
    If NOT rs.NoMatch then 
        Form_Ins_Comb.cbo_asp.Value = rst!NomeCampodaRestituire
    End If
    
  • Non ho detto che FindFirst non accetta criteri… altrimenti non avrei scritto:
    rst.FindFirst("ID_Valore_Analisi= 46")
    dove "ID_Valore_Analisi = 46" è un criterio.
  • Si ma quello che hai scritto è completamente sbagliato poi vedi tu.
Devi accedere o registrarti per scrivere nel forum
14 risposte