Query parametrica con Querydef

di il
30 risposte

30 Risposte - Pagina 2

  • Re: Query parametrica con Querydef

    Attualmente nella query hai il parametro che si chiama così
    [Sequence]
    Devi cambiarlo scrivendoci dentro
    [Forms]![NomeMaschera]![NomeCampo]
  • Re: Query parametrica con Querydef

    OsvaldoLaviosa ha scritto:


    Attualmente nella query hai il parametro che si chiama così
    [Sequence]
    Devi cambiarlo scrivendoci dentro
    [Forms]![NomeMaschera]![NomeCampo]
    Così?
    PARAMETERS [Forms]![Avvio]![TestoRicercaMasterSequence] 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 "*" & [Forms]![Avvio]![TestoRicercaMasterSequence] & "*") 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);
    Ora però il mio codice non va più, come va modificato?
        Set db = CurrentDb
        Set qdf = db.QueryDefs("Ricerca Master Sequence")
        qdf.Parameters("Sequence") = Form_Avvio.TestoRicercaMasterSequence.Value
        Set rs = qdf.OpenRecordset
  • Re: Query parametrica con Querydef

    Io non ho capito se tu vuoi vedere il risultato della query sotto i tuoi occhi oppure no.
  • Re: Query parametrica con Querydef

    OsvaldoLaviosa ha scritto:


    Io non ho capito se tu vuoi vedere il risultato della query sotto i tuoi occhi oppure no.
    Provo a fare chiarezza...

    Prendiamo la mia query salvata dentro access come oggetto query ok?
    Togliamo momentaneamente la prima riga, se ci facciamo doppio click sopra, access apre la sua bella mascherina grigia in cui mi chiede il parametro (sostituiamo momentaneamente [Forms]![Avvio]![TestoRicercaMasterSequence] con pippo)
    Inserisco un valore nella casella e mi viene aperta la griglia dei risultati
    PARAMETERS [Forms]![Avvio]![TestoRicercaMasterSequence] 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 "*" & [Forms]![Avvio]![TestoRicercaMasterSequence] & "*") 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);
    Bene, quello che mi piacerebbe fare (se possibile) è replicare quest passi da codice, evitando di far aprire la casella di dialogo, ma sfruttando come parametro il valore di una casella di testo presente in una maschera.
    Se ciò non è possibile, non vedo altre soluzioni che scrivere l'sql nel codice...
  • Re: Query parametrica con Querydef

    Quindi tu vuoi VEDERE il risultato della query.
    1. Io ti consiglio di dare un nome alla tua query, la chiamerò QueryPippo.
    2. Questa query è parametrica, ossia nel suo SQL devi correggere il primo rigo così:
    PARAMETERS [Forms!Avvio!TestoRicercaMasterSequence] Text ( 255 );
    3. Si presuppone che tu, quando avvii la QueryPippo, devi avere la maschera Avvio aperta.
    4. Il codice VBA che devi implementare è solo
    DoCmd.OpenQuery "QueryPippo"
    5. La QueryPippo si aprirà mostrandoti DIRETTAMENTE il recordset filtrato in base al valore di TestoRicercaMasterSequence che appare in quel momento nella maschera Avvio
  • Re: Query parametrica con Querydef

    Tutto chiarissimo, ma nei tuoi punti non manca l'applicazione del filtro alla query?
    Nel senso, va bene il parametro, ma non va inserito anche nell'sql della query?
  • Re: Query parametrica con Querydef

    Tutto il resto del SQL che hai scritto va bene. Non mi chiedere perché si scrive 2 volte, so solo che va dichiarato in testa in corrispondenza di PARAMETERS e poi di nuovo in corrispondenza di WHERE.
  • Re: Query parametrica con Querydef

    ALLELUJA! DEO GRATIAS!

    Ce l'ho fatta!!!!!!!!!!

    Questa è la query:
    PARAMETERS [Forms]!Avvio![TestoRicercaMasterSequence] 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 "*" & Forms!Avvio!TestoRicercaMasterSequence & "*") 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);
    
    Questo è il codice:
    DoCmd.OpenQuery "Ricerca Master Sequence"
    Ora domanda, è possibile recuperare i dati della griglia visualizzata. Nel senso a valle di un rigo cliccato, io vorrei recuperare i valori per poi utilizzarli nel codice e fare altre azioni.
  • Re: Query parametrica con Querydef

    Devi specificare cosa.
    A) Se sono valori "ulteriormente calcolabili", ti basterebbe un'altra query
    B) Se devi puntare su un valore "arbitrario" che dici tu in quel momento, ti suggerirei di far poggiare la tua QueryPippo su una (magari omonima) maschera (che so anche in visualizzazione foglio dati). In questo modo diventa facile "riacciuffare" il valore di Forms!QueryPippo!CampoDaTeScelto
  • Re: Query parametrica con Querydef

    OsvaldoLaviosa ha scritto:


    Devi specificare cosa.
    A) Se sono valori "ulteriormente calcolabili", ti basterebbe un'altra query
    B) Se devi puntare su un valore "arbitrario" che dici tu in quel momento, ti suggerirei di far poggiare la tua QueryPippo su una (magari omonima) maschera (che so anche in visualizzazione foglio dati). In questo modo diventa facile "riacciuffare" il valore di Forms!QueryPippo!CampoDaTeScelto
    Diciamo che volevo fare una cosa caruccia, senza utilizzare una ulteriore maschera, ma non credo ci siano altre soluzioni.
    Tanta fatica per nulla vabbè, ho imparato una cosa nuova.
  • Re: Query parametrica con Querydef

    Volendo fare una maschera con i risultati e volendola fare simile alla griglia che propone il motore access quando esegui una query con doppio click, non mi pare di trovare un controllo simile alla griglia stessa. Se confermi che non esiste, qual è solitamente la tecnica più comune per replicarla?
    Grazie!
  • Re: Query parametrica con Querydef

    1. Crea una maschera che poggia su QueryPippo. Imposti come "Visualizzazione predefinita" = Foglio dati.
    2. A questo punto se vuoi eseguire QueryPippo (maschera) da VBA, dovrai scrivere invece di DoCmd.OpenQuery
    DoCmd.OpenForm "QueryPippo", acFormDS
    sebbene la maschera QueryPippo è in foglio dati come visualizzazione predefinita, in VBA devi specificarlo comunque, altrimenti la apre come acNormal per default, leggi qui
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.openform

    Osservazioni:
    Finora tu hai parlato di una "query parametrica" e io ti ho risposto in quella direzione.
    Se leggi bene il link che ti ho proposto DoCmd.OpenForm noterai che il 4° argomento espone la WHERE Condition...che risulta molto comoda da usare. Se intendi usarla, ti accorgerai che la query può tornare normale (senza filtri/criteri/parametri) e puoi aprire la maschera filtrando con la WHERE.
    Se quest'ultimo discorso che ti ho fatto ti confonde le idee, torna sui tuoi passi con la query parametrica.

    N.B.: La discussione rischia di allontanarsi dal titolo principale, ti consiglio di aprire una nuova discussione. Se il tuo discorso ha forti legami/affinità con una discussione precedente, indicane il link corrispondente.
  • Re: Query parametrica con Querydef

    OsvaldoLaviosa ha scritto:


    1. Crea una maschera che poggia su QueryPippo. Imposti come "Visualizzazione predefinita" = Foglio dati.
    2. A questo punto se vuoi eseguire QueryPippo (maschera) da VBA, dovrai scrivere invece di DoCmd.OpenQuery
    DoCmd.OpenForm "QueryPippo", acFormDS
    sebbene la maschera QueryPippo è in foglio dati come visualizzazione predefinita, in VBA devi specificarlo comunque, altrimenti la apre come acNormal per default, leggi qui
    https://docs.microsoft.com/en-us/office/vba/api/access.docmd.openform

    Osservazioni:
    Finora tu hai parlato di una "query parametrica" e io ti ho risposto in quella direzione.
    Se leggi bene il link che ti ho proposto DoCmd.OpenForm noterai che il 4° argomento espone la WHERE Condition...che risulta molto comoda da usare. Se intendi usarla, ti accorgerai che la query può tornare normale (senza filtri/criteri/parametri) e puoi aprire la maschera filtrando con la WHERE.
    Se quest'ultimo discorso che ti ho fatto ti confonde le idee, torna sui tuoi passi con la query parametrica.

    N.B.: La discussione rischia di allontanarsi dal titolo principale, ti consiglio di aprire una nuova discussione. Se il tuo discorso ha forti legami/affinità con una discussione precedente, indicane il link corrispondente.
    Hai ragione, non voglio andare fuori post.
    L'idea del parametro WHERE non è male, provo a vedere come si usa giraovagando per il web, se avessi o mi scrivessi un esempio banale (magari sempre pescando il valore da una maschera) te ne sarei veramente grato.
  • Re: Query parametrica con Querydef

    Considera che WHERE è un "concetto" più da SQL che da VBA. Per tanto soffre della sintassi appropriata caso per caso. Ti cito solo un caso che capita spesso, ossia filtrare un valore di CampoID da maschera
    DoCmd.OpenForm "NomeMaschera", , , "[CampoID] = " & Me![CampoID]
    Ti consiglio di dare un'occhiata qui per tutte le casistiche dei vari tipi di campo
    https://www.fontstuff.com/access/acctut15.ht
  • Re: Query parametrica con Querydef

    OsvaldoLaviosa ha scritto:


    Considera che WHERE è un "concetto" più da SQL che da VBA. Per tanto soffre della sintassi appropriata caso per caso. Ti cito solo un caso che capita spesso, ossia filtrare un valore di CampoID da maschera
    DoCmd.OpenForm "NomeMaschera", , , "[CampoID] = " & Me![CampoID]
    Ti consiglio di dare un'occhiata qui per tutte le casistiche dei vari tipi di campo
    https://www.fontstuff.com/access/acctut15.ht
    La query parametrica, resta la stessa?
    PARAMETERS [Forms]!Avvio![TestoRicercaMasterSequence] Text ( 255 );
    SELECT s.ID_SEQUENCE, u.User, l.LAYER, p.PROGETTO, s.PERCORSO_DS, s.SEQUENCE, pe.PERIODICITA, s.ORA, s.LOOP
    FROM SEQUENCES AS s, PROGETTI AS p, PERIODICITA AS pe, USERS AS u, LAYERS AS l
    WHERE (((s.SEQUENCE) Like "*" & Forms!Avvio!TestoRicercaMasterSequence & "*") 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);
Devi accedere o registrarti per scrivere nel forum
30 risposte