Report basato su query con campo parametrico

di
Anonimizzato11465
il
16 risposte

Report basato su query con campo parametrico

Buongiorno,

ho un report basato su una query che contiene un campo parametrico [Scadenza] che uso a runtime per filtrare i risultati.

Uso il seguente codice per assegnare questo valore da una textbox compilata dall'utente:

WhereCond = "Scadenza='" & TxtDataScadenza.Value & "'"
DoCmd.OpenReport "Solleciti_Pagamento", acViewPreview, , WhereCond
Ma quando si avvia il report mi compare comunque la richiesta di inserire un valore per il campo Scadenza

Qualcuno può indicarmi la sintassi corretta per passare questo campo al report ?

Grazie in anticipo a tutti.
P.

16 Risposte

  • Re: Report basato su query con campo parametrico

    Forse non va bene il WhereCond scritto alla fine di OpenReport...
    Potresti raccontare meglio tutti gli oggetti che entrano in gioco con tutti i nomi dei controlli?
    Perchè fai passare il parametro da una TextBox? Non è sufficiente la digitazione del parametro della query?
  • Re: Report basato su query con campo parametrico

    Ho una form che si chiama "Solleciti_Pagamento" al cui interno vi è una TextBox che si chiama "TxtDataScadenza".

    L'utente deve digitare una data di riferimento in questo campo e successivamente viene lanciato un report (Solleciti_Pagamento) basato su una query (Q_Insoluti_NoEmail) che ha un campo parametrico che si chiama "Scadenza".

    In pratica devo lanciare un report dando la possibilità all'utente di selezionare una data di riferimento.

    Spero di aver fornito tutte le info necessarie.

    grazie
    P.
  • Re: Report basato su query con campo parametrico

    La sintassi del Metodo OPENREPORT è corretta, ivi compreso il posto del [WhereCondition] come specifica la guida.

    L'errore a mio avviso potrebbe derivare dall'eventuale Formattazione del campo [Scadenza].
    E' possibile che la data così come inserita non sia interpretata in modo corretto.

    Le date si formattano in questi modi:
    1° Metodo
    
    [Scadenza]=#" & Format$(Me!NomeControlloData.Value,"mm/dd/yyyy") & "#"
    2° Metodo(Se non servono hh:mm:ss)
    
    [Scadenza]=" & Clng(Me!NomeControlloData.Value)
    3° Metodo(questo potrebbe averti ingannato)
    
    [Scadenza]=’" & CDate(Me!NomeControlloData.Value) & “’”
  • Re: Report basato su query con campo parametrico

    Ma alla TxtDataScadenza non gli si può imporre un formato Data convenevole tra le sue proprietà?
    Insieme a questa mia supposizione, perchè far passare attraverso una query con parametro? Non si può filtrare direttamente la WHERE:
    [Forms]![Solleciti_Pagamento]![TxtDataScadenza] ???
  • Re: Report basato su query con campo parametrico

    Osvaldo, lui parla di Query Parametrica, ma il codice che riporta esclude sia coerente... non ha nulla a che vedere con Query Parametriche...!

    Quello che attua è semplicemente un'applicazione della WHERECONDITION che va a valorizzare la proprietà FILTER del Report.

    In tal senso, la formattazione della data deve essere gestita come ho suggerito in forma ESPLICITITA.

    L'opzione della forma IMPLICITA
    
    [Scadenza]=[Forms]![Solleciti_Pagamento]![TxtDataScadenza]
    è da ritenersi non conveniente in quanto non scalabile prima di tutto e rallenta l'esecuzione nell'applicazione del FILTRO in quanto viene riproposta la VALUTAZIONE di JET su quel riferimento alla Form ad ogni Record.
  • Re: Report basato su query con campo parametrico

    Il campo su cui applicare il filtro è una data ma in realtà viene gestito come una stringa nel seguente formato: yyyymmdd

    Ho provato ad utilizzare le seguenti istruzioni:
    WhereCond = "[Scadenza]=" & Format(TxtDataScadenza.Value, "yyyymmdd")
    DoCmd.OpenReport "Solleciti_Pagamento", acViewPreview, , WhereCond
    
    Ma mi appare sempre la finestra di input per il campo scadenza
  • Re: Report basato su query con campo parametrico

    Il formato di cui parli è una Data Formato ISO, ciò non toglie che devi spiegare come sia impostato il Campo in Tabella...!

    Se il campo in tabella è una Stringa servono gli APICETTI anche se Formatti
    
    WhereCond = "[Scadenza]='" & Format(TxtDataScadenza.Value, "yyyymmdd") & "'"
    Se il campo in Tabella è di tipo Data... servono i suggerimenti di prima...
  • Re: Report basato su query con campo parametrico

    Il campo è di tipo stringa.

    Ho provato a riportare l'istruzione da te indicata (che avevo anche già provato in precedenza in una delle miriadi di prove che ho fatto) ma continua a chiedermi a runtime di inserire il campo scadenza.
  • Re: Report basato su query con campo parametrico

    Mi auguro che nella Query tu non abbia inserito un altro Parametro nel campo [Scadenza]...!
    Apri la Query di origine e se questa ti pone la stessa domanda... mi pare evidente dove sia il problema.
  • Re: Report basato su query con campo parametrico

    Si, infatti il post si intitola "Report basato su query con campo parametrico"

    Nella query, è presente il campo scadenza che viene richiesto a runtime se viene lanciata la query manualmente.

    Volevo soltanto sapere se, e come, è possibile passare da VBA il parametro di questa query.

    Mi sembra di capire che invece debba essere tolto dalla query.
  • Re: Report basato su query con campo parametrico

    Il titolo sarà pure quello... ma siccome poi segui un metodo completamente diverso che va nella stessa direzione... non è semplice intuire quale delle 2 cose sia quella sbagliata rispetto all'altra...

    Togli il parametro nella query ed usa quello che ti è stato suggerito.
  • Re: Report basato su query con campo parametrico

    Ti ringrazio per le info.

    Mi confermi quindi che, se c'è un parametro nella query (Scadenza), non c'è verso di passarglielo nel report senza che venga lo stesso richiesto ?

    Ti chiedo questo perchè la stessa query la uso invece, in altre parti dell'applicazione, con queste istruzioni:
        
    Set qdf = db.QueryDefs("Q_Insoluti_NoEmail")
    qdf.Parameters!Scadenza = Format(TxtDataScadenza.Value, "yyyymmdd")
    Set rs = qdf.OpenRecordset(dbOpenDynaset)
    
    Chiaramente se devo togliere il parametro Scadenza devo modificare anche tutte le altre parti.


    Grazie.
  • Re: Report basato su query con campo parametrico

    Il Problema non è passare via VBA un Parametro, cosa decisamente fattibile e banale come hai indicato, quanto al fatto che, i Report, contrariamente a tutti gli Oggetti DataBound come Form/ListBox/Combo, non supportano l'assegnazione del Recordset.

    Ne consegue che questo metodo, pur Funzionale alla fine di avere un RS da Query Parametrica, non è funzionale per popolare un Report.

    Cosa te ne fai di un RS se poi non lo puoi usare...

    Quindi in realtà ci sono 2 soluzioni, una te l'ho indicata e sfrutta la proprietà FILTER dell'Oggetto Report passata tramite il WHERE Parameter del metodo OpenReport.

    La 2° forse più funzionale è scrivere il Predicato SQL della Query con il Parametro VALUTATO in modo ESPLICITO... e mi spiego.

    Supponi che il tuo Report sia basato sulla Query Q1.
    
    Dim qdf As DAO.QueryDef
    Set qdf=DbEngine(0)(0).QueryDefs("Q1")
    qdf.SQL="SELECT * FROM T1 WHERE [Scadenza]='" & Format(TxtDataScadenza.Value, "yyyymmdd") & "'"
    Ora hai il predicato SQL modificato, e puoi aprire il Report senza nemmeno usare il Where.
  • Re: Report basato su query con campo parametrico

    Ti ringrazio.

    La query purtroppo è piuttosto articolata:
        Set qdf = DBEngine(0)(0).QueryDefs("Q_Insoluti_NoEmail")
        qdf.SQL = "SELECT Q_Clienti.ID_CliFor, Q_Clienti.Denominazione, DettaglioScadenze.DataScadenza, DettaglioScadenze.Importo, DettaglioScadenze.ImportoSaldato, [DettaglioScadenze].[Importo]-[DettaglioScadenze].[ImportoSaldato] AS SALDO, " _
                & "TestataScadenze.NrDocumento, TestataScadenze.DataDocumento, TestataScadenze.Importo, DettaglioScadenze.ID_Pagamento, Q_Clienti.ID_Agente, Q_Clienti.EMail, Q_Clienti.Denominazione2, Q_Clienti.Indirizzo, Q_Clienti.CAP, " _
                & "Q_Clienti.Comune, Q_Clienti.SiglaProvincia, Q_Clienti.Fax " _
                & "FROM (TestataScadenze RIGHT JOIN DettaglioScadenze ON TestataScadenze.ID_DocCount = DettaglioScadenze.ID_DocCount) LEFT JOIN Q_Clienti ON TestataScadenze.ID_CliFor = Q_Clienti.ID_CliFor" _
                & "WHERE (((([DettaglioScadenze].[Importo] - [DettaglioScadenze].[ImportoSaldato]) > 0) And ((DettaglioScadenze.ID_Pagamento) = 'RD' Or (DettaglioScadenze.ID_Pagamento) = 'BO') And ((Q_Clienti.EMail) Is Null Or " _
                & "(Q_Clienti.EMail) = ' ') And ((TestataScadenze.TipoCliFor) = 1)) And [DataScadenza]<='" & Format(TxtDataScadenza.Value, "yyyymmdd") & "')" _
                & "ORDER BY Q_Clienti.ID_CliFor"
        DoCmd.OpenReport "Solleciti_Pagamento", acViewPreview
    
    e stranamente mi da errore se la eseguo tramite vba (err 3296 Espressione Join non supportata), mentre funziona se la eseguo normalmente dal pannello.

    Ma quindi, ad un report che si basa su una query con un parametro, non è possibile in nessun modo passargli il valore di questo parametro ?

    Diversamente devo duplicare le query (una senza il campo parametrico e l'altra invece con) in modo da poter usare, per il report, quella senza campo parametrico, per le restanti funzioni invece quella con il campo parametrico.

    Non mi sembra molto elegante ma piuttosto che diventare scemo con la sintassi della mia query SQL, forse faccio prima.
Devi accedere o registrarti per scrivere nel forum
16 risposte