Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

Ricerca di un record in un dynaset con due recorset aperti

  1. #1
    Roby46 non è in linea Novello
    In una Sub ho due recordset (DAO) aperti come Dynaset Rs1 (qryRettedaPagare) e Rs2 (TabRette).
    Leggo il primo record utile del recorset Rs1.
    Ora devo cercare sul recordset Rs2 il recordset che contiene lo stesso numero di retta.
    I campi interessati, tutti e due numerici integer senza decimali , sono txtTprNretta in Rs1 e txtTrNretta in Rs2
    Dopo l'apertura dei relativi recordset e posizionatomi sul primo recordset utile di Rs1 vado a riempire la stringa Criterio2 per fare la ricerca col metodo FindFirst del record sul recordset Rs2 che ha corrispondenza con il campo del recordset Rs1.

    Criterio2 = "'(Rs2!txtTrNretta)' = '" & Rs1("txtTprNretta") & "'"
    Rs2.FindFirst Criterio2

    In fase di run-time mi da errore 3070. Il motore database non riconosce Rs2!txtTprNretta come espressione o nome valido.
    Ho provato diverse soluzioni anche spostando la stringa direttamente in FindFirst ma senza esito.
    Utilizzo access 2019.
    Sicuramente la sintassi che uso nella creazione della stringa non è formalmente corretta.
    Un grazie anticipato a chi mi saprà indicare dove sbaglio.

  2. #2
    Qui
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    ... posizionatomi sul primo recordset utile di Rs1...
    e qui
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    ... cercare sul recordset Rs2 il recordset che contiene lo stesso numero di retta
    usi il termine recordset al posto di record ma in altri punti scrivi giusto quindi immagino che si tratti di refusi da digitazione.

    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    ...I campi interessati ... sono txtTprNretta in Rs1 e txtTrNretta in Rs2
    Mi auguro proprio che tu non abbia chiamato campi numerici con il prefisso txt, è una trappola in piena regola!
    Si tratta di un refuso o è giusto che uno si chiami txtTprNretta e un altro txtTrNretta? con una lettera diversa, la p?
    Forse sono i nomi dei controlli. Appurato se si tratta di controlli, associati o meno, o di campi, quanti integer conosci che hanno decimali?
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    ...e numerici integer senza decimali...
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    Sicuramente la sintassi che uso nella creazione della stringa non è formalmente corretta.
    esatto e qualcosa potrebbe anche dipendere dal fatto txtT* che forse è campo forse è controllo.
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    Ho provato diverse soluzioni
    quali sono? un paio almeno, dai, così circoscriviamo meglio il problema.
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    Criterio2 = "'(Rs2!txtTrNretta)' = '" & Rs1("txtTprNretta") & "'"
    
    Usa i tag code quando scrivi il codice.
    Come dovrebbe essere una stringa da passare a FindFirst? Scrivila per esteso, guarda quali sono le parti "fisse" e quali quelle da prendere dal recordset (o dai controlli)
    NB: sono andato un po' sul pesante, evidenziando parecchie cose che non sono strettamente lagate alla soluzione del tuo problema ma che sono segnali che qualcosa non va, in generale.

  3. #3
    Roby46 non è in linea Novello
    Ti ringrazio per le osservazioni giuste che mi fai e sicuramente ne terrò conto.
    Sinceramente non ti so dire come mai anche se il campo è numerico, nell'assegnargli un nome ho utilizzato il prefisso txt (che sarebbe bene usare per un campo alfanumerico).
    Ho usato questa convenzione: per i primi tre caratteri dei campi ho utilizzato il prefisso txt, per i combobox cbo, per i comandi cmd, ecc.; successivamente ho messo l'abbreviazione della tabella che contiene il campo( nel nostro caso Tr che stà per tabella rette e Tpr che stà per tabella pagamento rette) in fine un'abbreviazione del contenuto del campo.
    txtTrNretta è un campo numerico anche se io, sbagliando, l'ho inizializzato con txt e così la stessa cosa per il campo txtTprNretta. Detti campi fanno parte di due tabelle diverse:
    txtTrNretta è un campo della tabella Rette e txtTprNretta è un campo della tabella pagamento rette.
    In pratica devo cercare nel recordset Rs2 il record che ha nel campo txtTrNretta ha lo stesso valore cho ho nel campo txtTprNretta del record del recordset Rs1.
    Spero di essermi sufficientemente spiegato e non devi preoccuparti per quello che mi scrivi, sono un tipo che accetta volentieri le critiche e i suggerimenti, in quanto ritengo siano utili per migliorarsi.
    Di nuovo grazie. Roberto.

    Ho seguito il tuo suggerimento di guardare bene la stringa da passare a FindFirst e , seguendo il debug, penso di aver risolto il problema modificando il contenuto della stringa Criterio2 così:
    Criterio2 = "[txtTrNretta] = " & Rs1!txtTprNretta & ""
    Nuovamente grazie. Roberto.
    Ultima modifica di Roby46; 22-04-2021 11:06 

  4. #4
    Ho il sospetto sempre più fondato che tu utilizzi i termini campo e controllo (casella di testo, nello specifico) come sinonimi.
    Mi raccomando, fai attenzione: i campi sono in tabelle, query e recordset.
    Nella maschere ci sono i controlli, che possono essere associati a dati sottostanti ma sono comunque controlli, con caratteristiche diverse dai campi. Con la composizione guidata di default i controlli hanno lo stesso nome dei campi e il problema del nome giusto passa in secondo piano perché ci pensa VBA a cercare.
    Detto questo credo che molto si spieghi.
    Mostra come apri i recordset e togliamoci ogni dubbio.

  5. #5
    Roby46 non è in linea Novello
    Prima di tutto mi scuso se ti rispondo ora ma oggi ho avuto dei grossi problemi di ransomware su due NAS Qnap che ho in casa e non so ancora come potrò risolvere il problema.
    Quelli che utilizzo in questo caso sono campi. Di seguito ti mostro l'apertura dei due recordset.

    Set Db1 = DBEngine.Workspaces(0).Databases(0)
    Set Rs1 = Db1.OpenRecordset("qryRettedaPagare", DB_OPEN_DYNASET)
    Set Db2 = DBEngine.Workspaces(0).Databases(0)
    Set Rs2 = Db2.OpenRecordset("TabRette", DB_OPEN_DYNASET)

    Li ho aperti come Dynaset in quanto devo modificare il contenuto di entrambi i recordset.
    Ogni tuo parere o osservazione sono per me molto importanti.
    Grazie e buona serata. Roberto.

  6. #6
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    Quelli che utilizzo in questo caso sono campi.
    A costo di ripetermi fino alla nausea, quindi nella tabella "qryRettedaPagare" e nella tabella "TabRette" ci sono campi che si chiamano txtTrNretta e txtTprNretta. Se così non è salta tutto il ragionamento.
    Usa i tag CODE per il codice. Vedi la differenza quando scrivo io (anche quotando la tua parte in cui aggiungo i tag) rispetto ai tuoi interventi? E' dovuto all'uso dei tag CODE: https://masterdrive.it/microsoft-acc...ag-code-89022/
    Set Db1 = DBEngine.Workspaces(0).Databases(0)
    Set Rs1 = Db1.OpenRecordset("qryRettedaPagare", DB_OPEN_DYNASET)
    Set Db2 = DBEngine.Workspaces(0).Databases(0) '<=== inutile
    Set Rs2 = Db2.OpenRecordset("TabRette", DB_OPEN_DYNASET) '<=== da modificare con Db1 anziché Db2
    
    L'oggetto Db2 è inutile, hai già Db1 che è aperto sullo stesso database e sul quale puoi chiamare un altro OpenRecordset.

    Ops... preso dalla mia foga di correggere tutto ho dimenticato questo pezzetto, trascurabile
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    penso di aver risolto il problema modificando il contenuto della stringa Criterio2 così:
    Criterio2 = "[txtTrNretta] = " & Rs1!txtTprNretta & ""
    
    Pensi di aver risolto o hai risolto? A cosa servono gli ultimi due doppiapici con all'interno un carattere di spaziatura?

  7. #7
    Roby46 non è in linea Novello
    Se ho ben capito quando apro due o più recordset è inutile aprirne uno diverso per ogni recordset. Ragionando sembrava anche a me inutile e mi era venuto il dubbio e avevo delle ricerche sui libri e un poco in internet. Tu con una riga me lo hai spiegato molto bene e penso di aver afferrato il concetto.
    Ho risolto in quanto seguendo l'esecuzione della sub con il debug e poi controllando i risultati con le tabelle tutto è ok.
    Per essere sincero sulla formazione delle stringe da utilizzare in un comando ho ancora parecchie lacune per cui alla tua domanda a cosa servono i due doppi apici non so risponderti.
    La stringa di Criterio2 doveva essere, per correttezza sintattica, scritta così:
    Criterio2 = "[txtTrNretta] = " & Rs1!txtTprNretta &""
    
    Tante grazie e un saluto. Roberto

  8. #8
    Quote Originariamente inviato da Roby46 Visualizza il messaggio
    per cui alla tua domanda a cosa servono i due doppi apici non so risponderti.
    Lo dico io, allora? A niente. Di conseguenza Criterio2 si crea così
    Criterio2 = "[txtTrNretta] = " & Rs1!txtTprNretta
    
    Diverso sarebbe invece il caso di ricerca su un campo testo in cui anche la presenza dello spazio diventa importante, perché si tratta di un carattere come tutti gli altri. Cercare "Phil_Cattivocarattere" o "Phil_Cattivocarattere " non è la stessa cosa. Poi non sarebbe basto solo l'aggiunta dello spazio finale ma... è un'altra situazione.
    (hai usato i tag CODE. E' servito ricordarlo ancora ma non è stato inutile. Un punto a tuo favore, per distinguerti da chi prosegue imperterrito ignorando la cosa)

  9. #9
    Roby46 non è in linea Novello
    Un saluto e grazie. Roberto

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. [VBA | Access2003] Bookmark e Recorset ... apprendimento!
    Da gplele nel forum Microsoft Access
    Risposte: 4
    Ultimo Post: 28-02-2012, 11:37
  2. Risposte: 3
    Ultimo Post: 30-09-2009, 13:48
  3. [VB6] Nomi dei campi di un recorset
    Da BrandonHeat nel forum Visual Basic 6
    Risposte: 5
    Ultimo Post: 29-03-2007, 09:09
  4. eliminare recorset
    Da marinaio nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 10-06-2005, 07:20
  5. Aggiornare Recorset
    Da elios81 nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 28-10-2004, 04:06