Query parametrica con Querydef

di Anonimizzato25358 il
30 risposte
Ciao a tutti,

ho la seguente query nel mio db chiamata "Jobs user" (ovviamente senza le virgolette):

PARAMETERS [Inserire il nome della user] Text ( 255 );
SELECT u.USER, l.LAYER, p.PROGETTO, s.PERCORSO_DS, s.SEQUENCE, pe.PERIODICITA, s.ORA
FROM SEQUENCES AS s, PROGETTI AS p, PERIODICITA AS pe, USERS AS u, LAYERS AS l
WHERE u.USER Like "*" & [Inserire il nome della user] & "*"
AND p.ID_PROGETTO = s.ID_PROGETTO
AND s.ID_PERIODICITA = pe.ID_PERIODICITA
AND s.ID_USER = u.ID_USER
AND s.ID_LAYER = l.ID_LAYER
ORDER BY UCASE(p.PROGETTO), UCASE(s.SEQUENCE);

Se la eseguo con doppio click, funziona alla grande chiedendomi il parametro.

Se provo col seguente codice VBA mi va in errore di runtime sulla riga di valorizzazione del parametro

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim SQLText As String

Set db = CurrentDb
Set qfd = db.QueryDefs("Jobs user")

-->> qdf.Parameters(0) = Form_Avvio.TestoRicercaMasterSequence.Value <<--

Set rst = qdf.OpenRecordset()
MsgBox rst.Fields(1).Value

L'errore esatto è:
Variabile oggetto o variabile del blocco with non impostata

Cosa sto sbagliando?

GRAZIE!

30 Risposte

  • Impara a selezionare il codice VBA e poi cliccare su Code per circoscriverlo e farcelo vedere con i tipici caratteri monotype più familiari ai programmatori.

    Un errore sicuramente sta qui
    Dim qdf As DAO.QueryDef
    Set qfd = db.QueryDefs("Jobs user")
    

    Hai dichiarato una variabile qdf, ma poi hai assegnato qfd.
  • OsvaldoLaviosa ha scritto:


    Impara a selezionare il codice VBA e poi cliccare su Code per circoscriverlo e farcelo vedere con i tipici caratteri monotype più familiari ai programmatori.

    Un errore sicuramente sta qui
    Dim qdf As DAO.QueryDef
    Set qfd = db.QueryDefs("Jobs user")
    

    Hai dichiarato una variabile qdf, ma poi hai assegnato qfd.
    Punto 1: scusate

    Punto 2: che deficiente che sò!

    Ora l'errore ce l'ho su
    Set rst = qdf.OpenRecordset()
  • OsvaldoLaviosa ha scritto:


    Provando a leggere da qui
    https://www.iprogrammatori.it/forum-programmazione/access/query-parametrica-vba-t25337.html
    Intanto non capisco perché dichiari qdf.Parameters(0). Non serve mettere le parentesi con lo 0.
    Idem scrivi solo qdf.OpenRecordset
    Se tolgo (0) va in errore, e da quello che ricordo quando programmavo in vb, mi sembra corretto così

    Se scrivo solo qdf.OpenRecordset come referenzio poi il recordset?
  • rinh0wrz ha scritto:


    OsvaldoLaviosa ha scritto:


    Provando a leggere da qui
    https://www.iprogrammatori.it/forum-programmazione/access/query-parametrica-vba-t25337.html
    Intanto non capisco perché dichiari qdf.Parameters(0). Non serve mettere le parentesi con lo 0.
    Idem scrivi solo qdf.OpenRecordset
    Se tolgo (0) va in errore, e da quello che ricordo quando programmavo in vb, mi sembra corretto così

    Se scrivo solo qdf.OpenRecordset come referenzio poi il recordset?
    Apposto! Ho risolto!
  • Ho fatto bene a segnalarti il link, ma ho commesso qualche pasticcio anch'io. Tuttavia mostra l'intero codice corretto (come previsto da regolamento del forum).
  • Allora, ci sono quasi.

    Data la seguente query:
    PARAMETERS [Sequence] Text ( 255 );
    SELECT s.ID_SEQUENCE, u.User, l.LAYER, p.PROGETTO, s.PERCORSO_DS, s.SEQUENCE, pe.PERIODICITA, s.ORA
    FROM SEQUENCES AS s, PROGETTI AS p, PERIODICITA AS pe, USERS AS u, LAYERS AS l
    WHERE (((s.SEQUENCE) Like "*" & [Sequence] & "*") And ((p.ID_PROGETTO)=s.ID_PROGETTO) And ((s.ID_PERIODICITA)=pe.ID_PERIODICITA) And ((s.ID_USER)=u.ID_USER) And ((s.ID_LAYER)=l.ID_LAYER))
    ORDER BY UCase(p.PROGETTO), UCase(s.SEQUENCE);
    
    Se la lancio da doppio click, mi chiede il parametro, lo inserisco e funziona aprendomi la griglia coi risultati.

    Se provo da VBA, non so come aprire la griglia.
        Dim db As DAO.Database
        Dim qdf As DAO.QueryDef
        Dim rs As DAO.Recordset
        Dim SQLText As String
        
        Set db = CurrentDb
        Set qdf = db.QueryDefs("Ricerca Master Sequence")
        qdf.ReturnsRecords = True
        qdf.Parameters("Sequence") = Form_Avvio.TestoRicercaMasterSequence.Value
        Set rs = qdf.OpenRecordset(dbOpenSnapshot)
  • La prossima domanda sarà, una volta aperta la griglia (se mai riuscirò) una volta selezionato il record con un click, portare i valori su una maschera.
    Ma questo lo vedremo dopo...
  • OsvaldoLaviosa ha scritto:


    Leggi e segui bene qui come aprire una query parametrica
    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/database-openrecordset-method-dao

    Purtroppo avevo già letto, ma non ottengo quello che voglio.
    qdf.ReturnsRecords = True
    Non conosco questa istruzione. Sei sicuro che puoi scriverla prima di passargli il parametro e/o aprire il recordset della query?

    No, l'ho scopiazzata girando per google, ma ora la tolgo, tanto non cambia nulla.

    Indicaci anche cosa c'è scritto nel messaggio errore.
    Purtroppo non ho errori, ma non riesco ad aprire la griglia.
    Con un recordset devo per forza avere una maschera mia? Non posso utilizzare la griglia di default?
  • Di quale griglia stai parlando?
    Quando apri un recordset...questa operazione avviene (come dire) "di nascosto", l'utente non vede nulla sotto i propri occhi, mentre il codice VBA apre e ci lavora sopra.
  • OsvaldoLaviosa ha scritto:


    Di quale griglia stai parlando?
    Quando apri un recordset...questa operazione avviene (come dire) "di nascosto", l'utente non vede nulla sotto i propri occhi, mentre il codice VBA apre e ci lavora sopra.
    Per griglia intendo la classica griglia come se facessi doppio click su una query dentro access stesso.
  • Allora ti serve
    DoCmd.OpenQuery "Nome query"
    essendo poi la query parametrica, automaticamente vorrà sapere quale valore ci deve andare dentro il parametro. Tu hai la maschera aperta in quel momento e la query si eseguirà automaticamente mostrandoti il "recordset" (stavolta sotto i tuoi occhi).
  • OsvaldoLaviosa ha scritto:


    Allora ti serve
    DoCmd.OpenQuery "Nome query"
    essendo poi la query parametrica, automaticamente vorrà sapere quale valore ci deve andare dentro il parametro. Tu hai la maschera aperta in quel momento e la query si eseguirà automaticamente mostrandoti il "recordset" (stavolta sotto i tuoi occhi).
    OK, così andrebbe pure bene.
    Vorrei passargli il parametro da una maschera, senza utilizzare la casella brutta grigia di access, ma mi sa che non ho speranze. Nel senso volevo fare una cosa figa utilizzando il querydef e passando il parametro alla query da codice dopo averlo letto dalla mia maschera.
    Ma credo che questo non sia fattibile, perchè avendo la query un parametro, forse Access, mi proporrebbe comuqneu la sua popup grigia.

    Se non riesco a spiegarmi dimmelo che nel we provo a mettere qualche immagine per essere più chiaro.

    Grazie di tutto per ora!
Devi accedere o registrarti per scrivere nel forum
30 risposte