Passare variabile ad un query

di il
11 risposte

Passare variabile ad un query

Ho una query a campi incrociati, in uno dei campi vorrei impostare un criterio per filtrare i risultati che recupero da una function:

Public Function Seleziona()

Select Case Screen.ActiveControl.Name
    Case "Bt_rmp"
        Seleziona= 9
    Case "Bt_ns"
        Seleziona = 3 & " Or " & 4
        Debug.Print Seleziona
End Select

End Function
Se seleziona = 9 tutto bene, se invece è Seleziona = 3 & " Or " & 4 non va, eppure Debug.Print mi da 3 Or 4 che è quello che scrivo se imposto il filtro a mano, perche non va? passando il valore da una function la sintassi è diversa? devo passare per forza tutta la stringa SQL?

11 Risposte

  • Re: Passare variabile ad un query

    Ci sono diverse considerazioni da fare... almeno 3:
    1) definisci VARIANT la funzione...? Mi pare sia doveroso definire che restituisca uno String.
    2) Cosa rappresenta per te [3 OR 4] un Criterio...? Puoi spiegarcelo... perchè non lo è, hai provato in una Query normale ad inserire nel QueryBuilder 2 criteri in OR ed a leggere come il QBE costruisce il Criterio...? Prova..!
    3) Se in una CrossTabQuery introduci dei Criteri, devi definire il Parametro, altrimenti non funziona.
  • Re: Passare variabile ad un query

    1) la function non è definita, ma anche definendola string nel momento in cui passo anche "Or" la query mi risulta vuota

    2) Si certo, diventa WHERE ((([nome tabella].[nome campo])=3 Or ([nome tabella].[nome campo].ID)=4)) ma andando ad inserire la function nel campo "criteri", credevo di dover passare come parametro una stringa uguale a quella che avrei scritto nella visualizzazione struttura.
    Ho anche provato a passare una string tipo [nome tabella].[nome campo])=3 ma nulla oppure "Bt_carico_Filler"

    3) Non ho capito, se passo un solo parametro funziona se ne passo due no, che intendi con definire il parametro?
  • Re: Passare variabile ad un query

    bean_bandit ha scritto:


    1) la function non è definita, ma anche definendola string nel momento in cui passo anche "Or" la query mi risulta vuota
    Comprendi che sono 2 Punti distinti, come ti ho fatto notare con la numerazione, e che questo in particolare esula dal concetto di Costruzione corretta della sintassi ma ha invece a che fare con l'aspetto tecnico del codice...?

    bean_bandit ha scritto:


    2) Si certo, diventa WHERE ((([nome tabella].[nome campo])=3 Or ([nome tabella].[nome campo].ID)=4)) ma andando ad inserire la function nel campo "criteri", credevo di dover passare come parametro una stringa uguale a quella che avrei scritto nella visualizzazione struttura.
    Ho anche provato a passare una string tipo [nome tabella].[nome campo])=3 ma nulla oppure "Bt_carico_Filler"
    Già il fatto ti sia accorto che sono 2 Sintassi completamente diverse è un buon punto di partenza... ora che sai quale è quella giusta devi fare in modo che quella funzione la ricostruisca... serve una modifica... al concetto che usi... oppure servono 2 PARAMETRI.
    Quali valori può assumere il tuo [nome campo]...?

    bean_bandit ha scritto:


    3) Non ho capito, se passo un solo parametro funziona se ne passo due no, che intendi con definire il parametro?
    https://www.iprogrammatori.it/forum-programmazione/access/query-campi-incrociati-condizione-where-t31869.html
  • Re: Passare variabile ad un query

    Allora vediamo, la function è richiamata dalla query con:

    Seleziona("macchina1")

    1) Quindi scrivo Public Function Seleziona(Tipo1 As String) As String

    2) il Where dell'sql è: (([20 Macchine].[Macchina in Fornitura])=Seleziona(macchina))
    per tanto se passando selezione=2 funziona vuol dire che devo arrivare ad avere una sintassi del tipo:
    Where (([20 Macchine].[Macchina in Fornitura])=2) OR (([20 Macchine].[Macchina in Fornitura])=3)

    quindi seleziona deve restiuire 2,3 e qui non ho capito come perche ho provato a fargli restituire la stringa completa [nome tabella].[nome campo]=2 or [nome tabella].[nome campo]=3
    oppure 2,3
    oppure 2 or 3

    sicuramente la sintassi è sbagliata, il mio [nome campo] puo assumere solo valori di tipo numerico, per ora sono 24 ma sicuramente cresceranno


    3) Ho definito il parametro ma praticamente mi appare una finestra di dialogo che mi chiede un inserimento manuale, come se non Seleziona fosse vuota
  • Re: Passare variabile ad un query

    Ovviamente non riuscirai mai a creare una cosa simile... per questo ti ho accennato a 2 Parametri... oppure devi usare un metodo diverso se le combinazioni sono varie...
    
    WHERE Campo IN(Valore1,Valore2...ValoreN)
    Se non la valorizzi da Codice ma hai la RIsoluziune del Valore da Function non serve il PARAMETERS.

    Ti ho chiesto quanti valori poteva assumere quel Campo in quanto altra alternativa poteva essere <4 ma non so se 0-1-2 siano valori coerenti... e quindi non può andare.

    Altra soluzione è prendere la Query SQL e modificarla da codice nel predicato...!
    Esempio, ipotizziamo Q1 la query in questione:
    
    Dim strSQL As String
    strSQL="SELECT * FROM T1 "
    Select Case Screen.ActiveControl.Name
        Case "Bt_rmp"
            strSQL=strSQL & "NomeCampo=" & 9 & " "
        Case "Bt_ns"
            strSQL=strSQL & "NomeCampo=" & 3 & " OR NomeCampo=" & 4 & " "
    End Select
    strSQL=strSQL & "Altri pezzi SQL come ORDER ecc..."
    DbEngine(0)(0).QueryDefs("Q1").SQL=strSQL
  • Re: Passare variabile ad un query

    Attualmente utilizzo una soluzione del tipo Criterio = Seleziona1() or Seleziona2() or seleziona3() or seleziona4() e poi mediante il pulsante che ho premuto riesco a filtrare gia le 24 combinazioni ed ottenere un valore univoco a seleziona1(), ...2() ecc

    Come soluzione pure se funzionante non mi piace neppure un po.
    Credevo che passando un risultato "3 Or 4" Access capisse che era una doppia condizione analogamente a quando lo scrivo in visualizzazione struttura, a questo punto credo cambiero il mio approccio, lascio perdere la query a campi incrociati che si rivela anche abbastanza lenta e passo ad una tabella di appoggio che compilo di volta in volta con una function ed eventualmente li filtro o in scrittura o in lettura.

    Intanto ti ringrazio per il supporto!
  • Re: Passare variabile ad un query

    bean_bandit ha scritto:


    Attualmente utilizzo una soluzione del tipo Criterio = Seleziona1() or Seleziona2() or seleziona3() or seleziona4() e poi mediante il pulsante che ho premuto riesco a filtrare gia le 24 combinazioni ed ottenere un valore univoco a seleziona1(), ...2() ecc

    Come soluzione pure se funzionante non mi piace neppure un po.
    Credevo che passando un risultato "3 Or 4" Access capisse che era una doppia condizione analogamente a quando lo scrivo in visualizzazione struttura,
    Spiega questa ultima AFFERMAZIONE, perchè quel criterio lo capisci solo tu così come lo dici.
    Access in qualsiasi modo lo vuoi girare NON LO CAPISCE perchè è errato.
    L'unico linguaggio in cui prende un senso plausibile è se scritto in nella Logica Booleana... in cui 3 OR 4 = 7 che si usa per sommare Opzioni in Parametri...(con 3 hai gli ultimi 2Bit=1 ed il 4 è il 3°Bit=1 quindi 111=7) ma di certo NON per concatenare Criteri.
    Come ti ho spiegato l'unico metodo è usare IN(elenco Opzioni).

    bean_bandit ha scritto:


    a questo punto credo cambiero il mio approccio, lascio perdere la query a campi incrociati che si rivela anche abbastanza lenta e passo ad una tabella di appoggio che compilo di volta in volta con una function ed eventualmente li filtro o in scrittura o in lettura.
    Intanto ti ringrazio per il supporto!
    Non capisco questa scelta... se l'esigenza è di avere una CrossQuery cosa c'entra una tabella di appoggio...?
    Boh... secondo me qualche cosa in qualche punto deciamente manca.
  • Re: Passare variabile ad un query

    Ho fatto una cosa cosi:
    Cattura.JPG
    Cattura.JPG

    e richiamo sel1, 2, 3...

    la tabella a campi incrociati la usavo mettendo in valore il calcolo delle ore ed in tabella le settimane e poi pescavo i dati da piu tabelle, adesso voglio copiare direttamente i dati che mi servono in una tabella unica e calcolare le ore mentre faccio l'accodamento
  • Re: Passare variabile ad un query

    Se il Criterio risultante è 3 OR 4 non va bene, non so come altro fartelo capire, se invece è
    
    NomeCampo=3 OR NomeCampo=4
    è evidente che va bene...
  • Re: Passare variabile ad un query

    Forse non ci stiamo capendo, tu dici il risultato non puo essere "3 Or 4", chiaro, ma se scrivo 2 function separate e le unisco con Or perche non dovrebbe funzionare? quando la query viene eseguita diventa appunto NomeCampo=3 OR NomeCampo=4.
    Altrimenti non capisco che stai cercando di dirmi
  • Re: Passare variabile ad un query

    bean_bandit ha scritto:


    Forse non ci stiamo capendo, tu dici il risultato non puo essere "3 Or 4", chiaro, ma se scrivo 2 function separate e le unisco con Or perche non dovrebbe funzionare? quando la query viene eseguita diventa appunto NomeCampo=3 OR NomeCampo=4.
    Altrimenti non capisco che stai cercando di dirmi
    Riporto il mio precedente:

    @Alex ha scritto:


    Se il Criterio risultante è 3 OR 4 non va bene, non so come altro fartelo capire, se invece è
    
    NomeCampo=3 OR NomeCampo=4
    è evidente che va bene...
    Mi pare di aver detto esattamente quello... non ti pare...?
    Siccome la tua prima Funzione Restituiva 3 OR 4... e siccome non ho capito se e come l'hai modificata... ho precisato.
Devi accedere o registrarti per scrivere nel forum
11 risposte