Come richiamare una function da una query con piu parametri

di il
10 risposte

Come richiamare una function da una query con piu parametri

Dato che ho una Query che è diventata decisamente complessa ho deciso di spostate tutto in una function e poi passare alla query il valore calcolato, quindi per provare ho creato una

Public Function Ore_settimanali(strOre_previste As Integer) As Integer

Ore_settimanali = strOre_previste + 1

End Function
ed inserito nella query
Espr2: Ore_settimanali([Ore previste])
Funziona

poi ho aggiunto un secondo parametro da passare:
Public Function Ore_settimanali(strOre_previste As Integer, strore_extra As Integer) As Integer
Ore_settimanali = strOre_previste + strore_extra
End Function
e la query è diventata
Espr2: Ore_settimanali([Ore previste];[ore extra])
E qui non funziona, il risultato della query è errore. L'errore ho capito essere in Ore_settimanali([Ore previste];[ore extra]) ma non capisco qual'è la sintassi giusta...

10 Risposte

  • Re: Come richiamare una function da una query con piu parametri

    bean_bandit ha scritto:


    ...
    Espr2: Ore_settimanali([Ore previste];[ore extra])
    E qui non funziona
    Prova a sostituire il puntoevirgola con la virgola.
    Non far iniziare il nome delle variabili con "str" se sono Integer, è fuorviante.
    Attenzione! Entrambi i campi (visto che siamo in una query si devono chiamare così) non possono contenere Null.
  • Re: Come richiamare una function da una query con piu parametri

    Segui prima i suggerimenti di Phil_cattivocarattere...poi...non so...
    1. Siamo sicuri che i valori [Ore previste] e [ore extra] sono di tipo Integer?
    2. Prova a non dichiarare As Integer sia per strOre_previste che strore_extra. Che succede?

    Anch'io sono daccordo a non usare il prefisso str.
  • Re: Come richiamare una function da una query con piu parametri

    Innanzitutto grazie ad entrambi!

    Philcattivocarattere ha scritto:


    Prova a sostituire il puntoevirgola con la virgola.
    Non far iniziare il nome delle variabili con "str" se sono Integer, è fuorviante.
    Attenzione! Entrambi i campi (visto che siamo in una query si devono chiamare così) non possono contenere Null.
    Vuole il punto e virgola, il problema erano i valori null, risolto con NZ([ore extra]) ma non so se c'è un modo piu opportuno visto che avro circa una decine di campi da passare

    OsvaldoLaviosa ha scritto:


    Segui prima i suggerimenti di Phil_cattivocarattere...poi...non so...
    1. Siamo sicuri che i valori [Ore previste] e [ore extra] sono di tipo Integer?
    2. Prova a non dichiarare As Integer sia per strOre_previste che strore_extra. Che succede?

    Anch'io sono daccordo a non usare il prefisso str.
    In teoria se compilati i campi sono di tipo Integer, cosa suggerite di usare come suffisso? come notate dai nomi dei campi (spazi ecc) sono pessimi ma tutte le parti nuove sto cercando di metterli a posto...
  • Re: Come richiamare una function da una query con piu parametri

    bean_bandit ha scritto:


    Vuole il punto e virgola
    Sì, lo stavo provando proprio ora.

    bean_bandit ha scritto:


    cosa suggerite di usare come suffisso? ...
    Cerca informazioni sulla "Hungarian Notation", "Leszynski naming convention" e "The Reddick Naming Conventions" (l'ho scritto in inglese così hai molte più risultati e molto più completi)

    bean_bandit ha scritto:


    , il problema erano i valori null, risolto con NZ([ore extra])
    In un modo o nell'altro si dovrà usare quello, bisogna vedere dove.

    bean_bandit ha scritto:


    avro circa una decine di campi da passare.
    Il numero dei campi sarà fisso? A questo punto bisogna studiare bene la funzione.
  • Re: Come richiamare una function da una query con piu parametri

    Philcattivocarattere ha scritto:


    Cerca informazioni sulla "Hungarian Notation", "Leszynski naming convention" e "The Reddick Naming Conventions" (l'ho scritto in inglese così hai molte più risultati e molto più completi)
    Grazie 1000!

    Philcattivocarattere ha scritto:


    In un modo o nell'altro si dovrà usare quello, bisogna vedere dove. Il numero dei campi sarà fisso? A questo punto bisogna studiare bene la funzione.
    In realta le funzioni saranno diverse, la prima contiene 6 campi, la seconda (devo ancora vedere) dovrebbe contenerne almeno 10.
    Dalla query della prima passo questi campi:
    Ore_settimanali(((Nz([ore previste]));(Nz([ore extra]));(Nz([Ore interni]));(Nz([Ore Esterni]));(Nz([Sett_fine_att]));(NZ([Sett_inizio_att])))
    Se gia potessi fare un "NZ(tutti i campi)" sarebbe utile...
  • Re: Come richiamare una function da una query con piu parametri

    bean_bandit ha scritto:


    In teoria se compilati i campi sono di tipo Integer, cosa suggerite di usare come suffisso?
    Ricorda che il "prefisso" è solo una convenzione "visiva", quindi una comodità per i programmatori. Per Integer si usa "int".
  • Re: Come richiamare una function da una query con piu parametri

    bean_bandit ha scritto:


    Se gia potessi fare un "NZ(tutti i campi)" sarebbe utile...
    Una cosa del genere non esiste e non so se vale la pena "costruirla" considerando che con molta probabilità sarebbero presente anche campi non numerici o, se numerici, non necessariamente da inserire nella somma (penso alla presenza di un ID univoco numerico).

    bean_bandit ha scritto:


    ... In realta le funzioni saranno diverse, la prima contiene 6 campi, la seconda (devo ancora vedere) dovrebbe contenerne almeno 10.
    Considerato che una cosa del tipo "Somma tutti i campi" non si può fare (vedi sopra), in un modo o nell'altro i campi da sommare dovranno sempre essere elencati.
    Opzione 1: impostare tutti i campi numerici già a livello di tabella con Richiesto = Sì (oltre a valore predefinito 0), così il problema del Null sparisce fin dall'origine. Ovviamente prima è necessario agire con query di update per valorizzare tutti i campi attualmente a Null.
    Opzione 2: creare una funzione con un ParamArray, svincolandosi dal numero di campi e demandando alla funzione la verifica del Null.
    Una cosa del tipo
    Public Function SommaCampi(ParamArray varItems() As Variant) As Integer
         Dim intSomma As Integer
         Dim varItem As Variant
         For Each varItem In varItems
            intSomma = intSomma + CInt(Nz(varItem))
         Next varItem
         SommaCampi = intSomma
    End Function
    E' tutto fatto per valori Integer, anche il risultato della funzione. Da valutare se cambiare in Long.
    L'unica differenza, all'interno della query, consiste nel potersi dimenticare di Nz quando si sommano i vari campi.
    Invece di scrivere
    CampoSomma=Nz([Campo1]; 0) + Nz([Campo2]; 0) +  ... + Nz([CampoN], 0)
    sarà "solo"
    CampoSomma=SommaCampi([Campo1], [Campo2], ... , [CampoN])
    Da sottoporre all'attenzione di altri utenti del forum perché non l'ho mai vista usata da nessuna parte quindi potrebbe esserci di meglio, in giro.
  • Re: Come richiamare una function da una query con piu parametri

    Philcattivocarattere ha scritto:


    Considerato che una cosa del tipo "Somma tutti i campi" non si può fare (vedi sopra), in un modo o nell'altro i campi da sommare dovranno sempre essere elencati.
    Opzione 1: impostare tutti i campi numerici già a livello di tabella con Richiesto = Sì (oltre a valore predefinito 0), così il problema del Null sparisce fin dall'origine. Ovviamente prima è necessario agire con query di update per valorizzare tutti i campi attualmente a Null.
    Opzione 2: creare una funzione con un ParamArray, svincolandosi dal numero di campi e demandando alla funzione la verifica del Null.
    Una cosa del tipo
    Public Function SommaCampi(ParamArray varItems() As Variant) As Integer
         Dim intSomma As Integer
         Dim varItem As Variant
         For Each varItem In varItems
            intSomma = intSomma + CInt(Nz(varItem))
         Next varItem
         SommaCampi = intSomma
    End Function
    E' tutto fatto per valori Integer, anche il risultato della funzione. Da valutare se cambiare in Long.
    L'unica differenza, all'interno della query, consiste nel potersi dimenticare di Nz quando si sommano i vari campi.
    Tra le due opzioni ero propenso ad utilizzare la 1, tuttavia per questioni di formattazione report volevo evitare e ripiegare su somma(NZ([campo];0)) ma qualcosa non funziona, mi spiego meglio:

    ho superato la prima parte del problema, ho creato una function che mi calcola le ore\settimana ed un'altra che in funzione delle ore settimana mi popola i valori di una query a campi incrociati dicendomi in quali settimane devo sviluppare quelle ore.

    In un report ho poi una visualizzazione della suddetta query piu una visualizzazione raggruppata delle ore raggruppate per tipo di attività e qui ho i problemi, se nelle function popolo le tabelle con valore = 0 quando c'è null riesco a fare la somma, se invece lascio i campi vuoti e scrivo:
    S1: Somma(Nz([1];0))
    mi da errore, controllando S1: Nz([1];0) dove c'è null resta null, non viene forzato lo zero, perche? dipende dal fatto che prendo i valori da una query a campi incrociati?
  • Re: Come richiamare una function da una query con piu parametri

    bean_bandit ha scritto:


    .. di una query a campi incrociati dicendomi in quali settimane devo sviluppare quelle ore.
    In un report ho poi una visualizzazione della suddetta query piu una visualizzazione raggruppata
    Query a campi incrociati "variabili" e report non vanno molto d'accordo se non con attento uso del codice. Forse stiamo entrando in un altro argomento. Guarda questi link
    https://support.microsoft.com/en-us/help/328320/how-to-create-a-dynamic-crosstab-report-in-access-2002
    e la pagina dei report di SitoComune .
    Se hai bisogno però di altro aiuto credo sia opportuno aprire un nuovo thread, dove per prima cosa dovrai pubblicare anche SQL della query a campi incrociati.
    Finché invece il "problema" è quello della query (principale, non quella a campi incrociati) secondo me si può proseguire qui.
  • Re: Come richiamare una function da una query con piu parametri

    Philcattivocarattere ha scritto:


    Finché invece il "problema" è quello della query (principale, non quella a campi incrociati) secondo me si può proseguire qui.
    in realtà non c'è una query principale, fin da subito lavoravo su quella a campi incrociati. La seconda query è una query di selezione ma che pesca i valori da quella incrociata. Faccio qualche prova, poi nel caso apro una discussione, intanto grazie 1000
Devi accedere o registrarti per scrivere nel forum
10 risposte