Gestione Recordset con VBA

di il
22 risposte

Gestione Recordset con VBA

Buon pomeriggio, avrei la necessità di creare un registro con cui gestire degli affidamenti diretti, lavori piuttosto che forniture.

In buona sostanza ho la necessità di verificare alcuni parametri, relativi a Operatore Economico, Cat. Merceologica e SOA, limitando pero il confronto solo all’ultimo ed il penultimo record inserito. Se la verifica è coerente con la norma procedo ad affidare.

Attualmente il registro creato utilizza una query ed una serie di altre funzioni, quali dcount e dlookup, per verificare le diverse condizioni.

Ho rilevato leggendo nel forum, che in più occasioni, viene suggerito l’utilizzo del VBA, piuttosto che funzioni quali  dlookup, dcount,ecc.ecc.., in particolare poi, dovendo porre a confronto sempre gli ultimi 2 record immessi, risulta evidente il vantaggio nell’ utilizzare il VBA nell’ambito del recordset.

Non avendo alcuna esperienza con VBA, ho provato comunque a scrivere alcune righe di codice, ma senza successo.

Dim Rst As DAO.Recordset
           Set Rst = CurrentDb.OpenRecordset("TblAffidi", dbOpenTable)
           Rst.MoveLast
           Rst.MovePrevious
           If Rst.Fields("idfornitore") <> Rst.Fields("idfornitore") Then
               Me.CHKAffido = True
           Else
           End If
           Rst.Close
           Set Rst = Nothing

Chiedo se vi siano degli esempi da poter utilizzare e/o articoli che mi permettano di eseguire tale verifica utilizzando il VBA .

Grazie in anticipo a quanti potranno darmi una mano.

22 Risposte

  • Re: Gestione Recordset con VBA

    Non capisco cosa devi verificare. In questo momento stai soltanto verificando se una chiave primaria (almeno suppongo si una chiave primaria) sia uguale a se stessa.

  • Re: Gestione Recordset con VBA

    Anzi mi correggo… se  diversa da se stessa.

  • Re: Gestione Recordset con VBA

    Come disse lo stitico: la vedo dura.

    Secondo me, se funziona è meglio che lasci stare tutto come sta.

    Non hai ancora le competenze e le conoscenze per usare il VBA.

    Trasformare in vba la gestione dei controlli che attualmente funzionano con altri sistemi, non è cosa agevole, nemmeno per un programmatore di media esperienza.

    Se poi fai le prove con un database già esistente e carico di dati, si rischia di corrompere inevitabilmente tutto.

    Secondo me ti conviene creare un nuovo database per gli esercirzi, studiare e fare per pratica per almeno 5 mesi e poi se ne riparla.

    Il codice che hai scritto non ha un senso logico, segno che non conosci l'approccio per la gestione di un recorset in vba, e nemmeno la conoscenza dei comandi in vba.

    Solitamente, quando si inzia con il vba, i primi codici che si scrivono riguardano cose piccole, tipo
    msgbox “ciao”.

  • Re: Gestione Recordset con VBA

    Grazie a tutti del prezioso quanto indispensabile aiuto…

  • Re: Gestione Recordset con VBA

    Chiedi un aiuto per fare cosa? Chiedo a tutti gli utenti del forum cosa avete capito della domanda posta. Perdonatemi ma non ho capito cosa bisogna verificare?

  • Re: Gestione Recordset con VBA

    13/07/2023 - fratac ha scritto:


    Come disse lo stitico: la vedo dura.

    ;-))

    14/07/2023 - Antony73 ha scritto:


    Chiedi un aiuto per fare cosa? Chiedo a tutti gli utenti del forum cosa avete capito della domanda posta. Perdonatemi ma non ho capito cosa bisogna verificare?

    Pure io ho capito poco o nulla… sembra che si voglia controllare una Fields negli ultimi due records di una tabella.
    Daiiii …. diciamo che anch'io ogni due per tre lo faccio quasi tutti i giorni. ;-)
    Ma seriamente parlando (…scrivendo) è un pò sfuggente la logica e non saprei il campo di applicazioni quale possa essere.


    13/07/2023 - MGf ha scritto:


    Chiedo se vi siano degli esempi da poter utilizzare e/o articoli che mi permettano di eseguire tale verifica utilizzando il VBA .

    Non penso tu possa trovare documentazioni o esempi in merito… 
    Ad ogni modo se vuoi leggere i due ultimi records inseriti in una tabella, diciamo che ci sei quasi andato vicino, ma in quel modo non si fa.

    -- dichiarare due variabili dove salvare il valore delle Fields da confrontare, una per l'ultimo record e l'altra
    -- per il penultimo record (nella dichiarazione delle variabili io ho usato il tipo Variant come esempio, quindi utilizzare
    -- il tipo coerente ai dati da confrontare... se sono di tipo stringa, numerico, booleano, data, etc etc etc)
     
    Dim varUltimo As Variant
    Dim varPultimo As Variant
    
    ' Apertura Tabella in sola lettura 	-- magari usa DbEngine che più performante 
    									-- devi assicurati che sia nell'ordine di inserimento record altrimenti cosa succede ?
    									-- per esempio puoi inserire un Order By sulla Chiave Primaria della Tabella per avere 
    									-- la certezza di leggere i records voluti.
    Dim Rst As DAO.Recordset
    Set Rst = DBEngine(0)(0).OpenRecordset("SELECT * FROM TuaTabellaDaLeggere ORDER BY TuaIdKeyPrimaria", dbReadOnly)
    
    ' Verificare che la tabella contenga dei records, altrimenti non eseguire il confronto
    If Not Rst.EOF Then
        ' Spostarsi dull'ultimo record e salvare il valore della Fields da confrontare
        Rst.MoveLast
        varUltimo = Rst.Fields("Tuo nome campo").Value
        
        ' Spostarsi sul record precedente (il penultimo) e salvare il valore della Fields da confrontare
        Rst.MovePrevious
        varPultimo = Rst.Fields("Tuo nome campo").Value
        
        ' Effettuare il confronto per i due records
        If varUltimo <> varPultimo Then Me.CHKAffido = True Else Me.CHKAffido = False
    End If
    ' Close recordset
    Rst.Close
    Set Rst = Nothing

    N.B. vanno inseriti alcuni controlli … per esempio se non esiste il penultimo record, in quanto nella tabella esiste solo un record, allora non si deve andare avanti a fare il confronto, etc etc etc 

    Mah…. ;-) 

    P.S. nei manuali non se trovano stè cose, garantito.

  • Re: Gestione Recordset con VBA

    13/07/2023 - MGf ha scritto:


    Chiedo se vi siano degli esempi da poter utilizzare e/o articoli che mi permettano di eseguire tale verifica utilizzando il VBA

    Ti lascio i Link degli argomenti trattati

    Recordset methods (DAO) | Microsoft Learn
    DBEngine object reference (DAO) | Microsoft Learn
    Recordset.EOF property (DAO) | Microsoft Learn
    Extract data from a record in a DAO Recordset | Microsoft Learn

  • Re: Gestione Recordset con VBA

    Buongiorno e grazie Franco per l'aiuto, in poche righe hai sintetizzato il problema, dimostrando quindi che il quesito da me posto non era impossibile da comprendere.

    Rispondo poi anche agli altri gentili utenti, dicendo che:

    1) all'ultimo capoverso del mio post dico chiaramente che non conosco il VBA;

    2) quantunque maldestro, il mio tentativo nella scrittura del codice, va nella direzione del regolamento del forum; “no pappa pronta”

    3) se il contributo alla soluzione ha questo tipo di approccio, che comprendo, ma non condivido, c'è necessità di rivedere il regolamento, esplicitando chiaramente il grado di “competenze” che deve possedere il singolo per poter interloquire con gli altri utenti.   

     Cordialità

  • Re: Gestione Recordset con VBA

    Scusa MFg, ma sul terzo punto non sono d'accordo, perché sempre più partecipanti stanno equivocando.

    Un certo grado di competenza e conoscenza degli strumenti che usi, non il regolamento ma il “buon senso” dice che si dovrebbe possedere.

    Altrimenti chi fa la domanda non può farla in maniera “appropriata” per farsi capire in un forum tecnico (la “buona volontà” nel fare sforzi di interpretaazione da parte dei partecipanti è buona cosa ma non è prevista né obbligatoria).

    Purtroppo queste scritture

    If Rst.Fields("idfornitore") <> Rst.Fields("idfornitore") ...

    prima di tutto non hanno alcun senso logico, a prescindere dalle tue conoscenze tecniche. E' come se scrivessi

    se zero è diverso da zero

    Buttarla lì attendendo correzioni così di base da parte del forum non deve essere scritto nel regolamento dato non ha senso.

    E comunque chi risponde deve essere libero di farlo secondo un “linguaggio tecnico” appropriato alla situazione, senza doversi preoccupare di spiegare prima l'abc delle questioni di base. Se tu pensi che sia tutto a posto premettendo che “non conosci il VBA” non va bene perché metti in difficoltà chi ti risponde che ti potrebbe dire semplicemente “studialo e poi torna” perchè le alternative sarebbero “farti un corso di base da zero” o “darti la pappa pronta”.

    Se tu chiedi come costruire un balcone in un palazzo, ti devi attendere risposte tecniche sulle metodologie di costruzione di tali parti, non ti puoi aspettare che ti si spieghi prima cosa è il cemento armato e come si usa. 

  • Re: Gestione Recordset con VBA

    14/07/2023 - By65Franco ha scritto:


    P.S. nei manuali non se trovano stè cose, garantito

    Sicuramente non lo trovi sui manuali di nessun linguaggio, se ordini la tabella per indice, hai tre opzioni:

    1) la tabella è vuota

    2) la tabella ha solo un record (non ha senso andare all'ultimo record e cercare il precedente)

    3) la tabella ha n record e sicuramente, per non avere violazione di chiave, l'ultimo record ha la chiave maggiore del penultimo.

    Ma tu (mgf) non te ne sei accorto neppure leggendo i commenti al codice.

    questa è logica ma neanche sulla logica hai sollevato obiezioni.

    Concordo con oregon, serve il minimo sindacale di conoscenza, sia sul linguaggio che nella logica di programmazione.

  • Re: Gestione Recordset con VBA

    Hai scritto codice completamente inutile e concettualmente errato su basi tecniche inesistenti, non consideriamo poi quello che per te è il senso tecnico di  ULTIMO e PENULTIMO… 

    Quel codice va cestinato.

    Detto questo, noto purtroppo un netto peggiormaneto del livello tecnico in generale… sarei dell'idea di chiudere tutti i 3D che non hanno un minimo di “decenza tecnica”, ed eviterei di alimentarli in partenza.

  • Re: Gestione Recordset con VBA

    17/07/2023 - MGf ha scritto:


    Buongiorno e grazie Franco per l'aiuto, in poche righe hai sintetizzato il problema, dimostrando quindi che il quesito da me posto non era impossibile da comprendere.

    Rispondo poi anche agli altri gentili utenti, dicendo che:

    1) all'ultimo capoverso del mio post dico chiaramente che non conosco il VBA;

    2) quantunque maldestro, il mio tentativo nella scrittura del codice, va nella direzione del regolamento del forum; “no pappa pronta”

    3) se il contributo alla soluzione ha questo tipo di approccio, che comprendo, ma non condivido, c'è necessità di rivedere il regolamento, esplicitando chiaramente il grado di “competenze” che deve possedere il singolo per poter interloquire con gli altri utenti.   

     Cordialità

    Ciao,

    ma guarda, il post non è chiaro e io ho cercato di interpretare sperando di prenderci ;-)

    Ma poco male, eventualmente uno fa qualche precisazione ed è tutto a posto.

    - 1) come ti avevo detto ci sei andato vicino ma anche molto lontano ;)  e per questo ho tagliato corto nel darti una traccia più o meno verosimile di come trattare il recordset 
    Rimangono molte perplessità di come stai gestendo i dati, ma non entro in merito. 

    -2) diciamo si e no … ma dipende appunto dalla non conoscenza del Vba … imparerai se ti impegni, ci vuole tempo e dedizione.

    -3) si predilige il confronto sugli argomenti trattati… il forum ovviamente non è una softwarehouse che rilascia la “pappa pronta” 
    Capisco che chi è alle prime armi troverà difficoltà, ed è per questo che se vuoi confrontarti con gli altri devi metterci del tuo. Diversamente non sarebbe un confronto. 

    Però non te la devi prendere, si cresce e si riesce nei propri progetti anche solo guardando cosa fanno gli altri. Poi un giorno sicuramente anche tu avrai delle competenze come gli altri se non di più. Ci vuole solo tempo, passione, studio ed esperienze.

    Ma non sarei critico nei confronti del Forum, è fatto bene e tratta tanti argomenti con una certa profondità e professionalità.

    Studiati i link che ti ho lasciato in precedenza… ti permettono di capire perchè il tuo approccio non andava bene. 
    Ma se guardi bene nel Supporto Microsoft trovi una guida infinita di come lavorare con Access e con il Vba, è molto importante, ti fai da una parte e pian piano saprai padroneggiare anche il linguaggio.
    Per esempio puoi partire da qui: Guida e formazione su Access (microsoft.com) e ti crei delle buone basi. Gli argomenti sono tanti e sono trattati bene. Ricorda che la prima cosa più importante è conoscere bene il Database, come funziona e come deve essere strutturato….Tabelle, Chiavi, Relazioni, Indici, etc etc etc Informazioni sulla struttura di un database di Access - Supporto tecnico Microsoft

    ;-) 

  • Re: Gestione Recordset con VBA

    17/07/2023 - @Alex ha scritto:


    Hai scritto codice completamente inutile e concettualmente errato su basi tecniche inesistenti, non consideriamo poi quello che per te è il senso tecnico di  ULTIMO e PENULTIMO… 

    Quel codice va cestinato.

    Detto questo, noto purtroppo un netto peggiormaneto del livello tecnico in generale… sarei dell'idea di chiudere tutti i 3D che non hanno un minimo di “decenza tecnica”, ed eviterei di alimentarli in partenza.

    Come ho già suggerito in precedenza, istituite il numero chiuso, la laurea in gastroenterologia vedo che è già contemplata.

  • Re: Gestione Recordset con VBA

    17/07/2023 - MGf ha scritto:


    Come ho già suggerito in precedenza, istituite il numero chiuso, la laurea in gastroenterologia vedo che è già contemplata.

    Vedi, finisce sempre che ci si comincia ad offendere inutilmente. 

    Ecco perché certi thread andrebbero chiusi.

Devi accedere o registrarti per scrivere nel forum
22 risposte