Form per query pass-trough dinamica

di il
9 risposte

Form per query pass-trough dinamica

Salve, ho creato una query pass-trough il cui testo sql viene modificato leggendo a scelta un file ".sql";
la query viene lanciata cn il comando "DoCmd.OpenQuery";
come posso far cambiare dinamicamente i campi di un report/maschera associato alla query? E' come creare con la procedura guidata una maschera o report associato alla query, ma devo farlo da VBA per poter cambiare i campi che di volta in volta saranno diversi;
lo scopo del gioco è quello di far scegliere all'utente tra una lista di query (elencate dai file .sql presenti in una cartella) e:
- visualizzare il risultato in una griglia di una maschera (che ha la possibilità di filtrare le colonne come excel);
- esportare in un file excel
- esportare in pdf
- inviare un pdf o excel via email
al momento la query viene eseguita dopo aver letto il contenuto del file .sql; il problema è che se associo una maschera o un report, i controlli restano sempre gli stessi mentre a me occorre che cambino al cambiare della query
Grazie

9 Risposte

  • Re: Form per query pass-trough dinamica

    Premetto che non conosco le query pass/through. Se un utente più esperto ha compreso meglio il tuo problema, cedo volentieri la palla.
    Per quello che mi riguarda...intuisco...fiuto che c'è qualcosa di progettuale non adeguato/ottimale. Oppure hai fatto più domande/richieste che andrebbero affrontare su più threads separati.
    Boh!

    Ti suggerisco di fornire:
    - nomi propri delle tabelle
    - nomi propri di tutti i campi con indicazione della chiave primaria
    - le relazioni
    - l'SQL di almeno una query
    - rispiega tutto usando i nomi propri
  • Re: Form per query pass-trough dinamica

    Ciao Osvaldo, grazie per la risposta;

    ho spiegato in dettaglio il progetto perchè magari il problema può essere risolto impostando il tutto diversamente;
    in pratica la domanda è la seguente: da codice vba (o con una macro) posso creare una maschera come da funzione access "Creazione guidata maschera"?
    Cerco di rendere più chiaro il progetto:

    - query pass-trough (oggetto query tipo questa ;
    - maschera "Main" con una pulsante che all'evento "click" esegue questo codice
    
    Private Sub BtnQuery_Click()
        Dim SQL As String, qdf As DAO.QueryDef 
        Set qdf = CurrentDb.QueryDefs("querytesto")
        
        Dim strSQL As String
        strSQL = ""
        Dim hnd As Integer
        hnd = FreeFile
        Open Application.CurrentProject.Path & "\" & "dichiarazioni.sql" For Input As hnd
        Dim row As String
        Do Until EOF(hnd)
            Line Input #hnd, row
            strSQL = strSQL & row & vbNewLine
        Loop
        Close #hnd
    
        qdf.SQL = strSQL
        DoCmd.OpenQuery "querytesto", acViewPivotChart
    End Sub
    
    il codice legge la query da un file di testo denominato "dichiarazioni.sql" e lo inserisce nella proprietà "sql" dell'oggetto "qdf" che sarebbe la query pass-trough creata in precedenza;
    poi tramite il comando DoCmd.OpenQuery si mostra il risultato della query;
    se creo una maschera, tramite la "Creazione guidata di maschera", e la associo alla query con il suo testo iniziale (prima che venga modificato dal codice sopra), i controlli della maschera verranno creati in base ai campi dell'attuale testo della query associata.

    Esempio:
    creazione query pass-trough "MiaQuery"
    testo query: "select * from ordini"

    creazione maschera "Main": maschera vuota

    creazione guidata maschera "Risultato": crea una maschera con i campi NumOrdine, DataOrdine, NumCliente, NomeCliente
    (all'apertura della maschera vengono mostrati i dati della query "select * from ordini")

    creazione pulsante "Lancio Query": sulla maschera "Main" creo questo pulsante alla cui pressione viene modificato il testo della query "MiaQuery" con il seguente "select * from utenti"

    se apro a questo punto la maschera "Risultato" nella griglia non saranno visualizzati i risultati poichè i controlli si aspettano ancora di trovare i campi NumOrdine, DataOrdine, NumCliente, NomeCliente, mentre la query lanciata ha i campi IdUtente, NomeUtente, DataCreazione

    Spero di essere stato esaustivo
  • Re: Form per query pass-trough dinamica

    Scusa ma è una Query SELECT...?
    Se si a cosa serve aprirla con OpenQuery...? A NULLA nel tuo caso o meglio vedi i dati ma di fatto non riguarda la domanda perchè poi il REPORT/FORM non si basa sulla Query aperta in visualizzazione...!!!

    Quindi se poi hai Form e Report associati alla Q_PT, devi preoccuparti di riassegnare da codice il ControlSource dei Controlli, leggendo la Collection FIELDS del Recordset nel caso delle Maschere, ma nel caso dei Report lo devi aprire in qunato non espongono il Recordset.

    Chiaramente devi avere SEMPRE lo stesso numero di Campi... e l'ordine di assegnazione deve essere ininfluente.
    Se invece hai dei Target allora devi mappare le cose e si complica tutto.

    Siamo sicuri sia una Query PT...?

    PEr il resto non ho capito molto...
  • Re: Form per query pass-trough dinamica

    X Alex: la query PT mi occorre perchè le tabelle sono su sql server 2005 ed Access non supporta tutti i comandi del sql di MSSQL e purtroppo ho query abbastanza complesse (ricorsioni, formattazioni, elaborazioni testuali campi) di cui mi occorre che il testo sql sia unico;
    in effetti hai risposto alla mia domanda, ovvero riassegnare la proprietà ControlSource dei controlli sulla maschera e crearne di nuovi a seconda del numero di campi indicati nella query;
    per evitare questo mi chiedevo se fosse possibile simulare la creazione guidata di una maschera, in modo che, dopo aver impostato la il testo della query, in automatico avrebbe creato tutti i controlli necessari
    Grazie comunque
  • Re: Form per query pass-trough dinamica

    X Alex: questa è una delle query, fa l'estrazione ricorsiva della distinta base degli articoli presenti sugli ordini di vendita generando un campo che con il segno meno mostra il livello di indentazione dell'articolo
    
    with 
    articoli as (
    	select distinct mvcodart, sum(mvqtamov-mvqtaeva)mvqta
    	from groupdoc_dett t1
    	left join groupdoc_mast t2 on t1.mvserial=t2.mvserial
    	where 1=1
    		--and mvnumdoc=220 and mvcodese=2016
    		and isnull(mvflevas,'')='' and mvtiprig<>'d'
    		and mvcladoc='or' and mvflveac='v' and mvqtamov>mvqtaeva
    		and mvcodcon <> '000000000000001'
    		and mvdateva between '2016-01-06' and '2016-31-12'
    	group by mvcodart
    )
    ,diba (cproword,cocodart, level, ordinamento, counimis, qta, qta_tot, qta_ord) as (
    	select t1.cproword,t1.cocodart,1 as level
    		,cast(rtrim(t1.corifdis) + ' | ' + replicate('0',5-len(t1.cproword)) + cast(t1.cproword as varchar(4)) + ' | ' +rtrim(t1.cocodart) as varchar(300))ordinamento
    		,t1.counimis
    		,cast(t1.cocoeimp as money)qta 
    		,cast(t1.cocoeimp as money)qta_tot
    		,(select cast(mvqta as money) from articoli where mvcodart=t1.corifdis)qta_ord
    	from groupdis_comp as t1
    	where t1.coatttec <= getdate() and t1.codistec > getdate()
    		and t1.corifdis in (select distinct mvcodart from articoli)
    	
    	union all
    
    	select t2.cproword,t2.cocodart,level + 1
    		,cast(ordinamento + ' | ' + replicate('0',5-len(t2.cproword)) + cast(t2.cproword as varchar(4)) + ' | ' +rtrim(t2.cocodart) as varchar(300))
    		,t2.counimis
    		,cast(t2.cocoeimp as money)
    		,cast(t2.cocoeimp * qta_tot as money)
    		,cast(t2.cocoeimp * qta_tot * qta_ord as money)
    	from groupdis_comp as t2
    	inner join diba as d on t2.corifdis= d.cocodart
    	where t2.coatttec <= getdate() and t2.codistec > getdate()
    )
    
    select distinct 
    	replicate(' - ',level) + rtrim(t1.cocodart)treeview
    	,rtrim(t1.cocodart)codart, ardesart desart
    	,t1.cproword riga
    	,level lvl
    	,arpropre prov
    	,ordinamento
    	,counimis UM, qta qta_uni, qta_tot, qta_ord
    	,(select cast(isnull(sum(oltqtodl-oltqtobf-oltqtoev),0) as money)
    		from groupodl_mast
    		where oltcoart=t1.cocodart
    			and oltstato='l'
    			and oltprove='i')qta_odl_lan
    	,(select cast(sum(slqtaper) as money)
    		from groupsaldiart
    		where slcodart=t1.cocodart
    			and slcodvar='')saldi_tutti_mag
    from diba t1
    left join groupart_icol t2 on t2.arcodart=t1.cocodart
    order by ordinamento
    
  • Re: Form per query pass-trough dinamica

    Ti ribadisco che la OPENQUERY non serve.

    Ma i controlli non si creano a Runtime... devi passare per la modalità STRUTTURA quindi considera che non potrai MAI lavorare in MDE/ACCDE.
    Per il resto direi che è abbastanza banale fare quello che hai chiesto.
    Apri la Form in modalità acDesign sapendo che è associata al RecordSource già adatto apri un RS basato sul RecordSource di Maschera e lo sfrutti per fare un cliclo sulla collection FIELDS per creare i Controlli...
    
    Function CreateControl(FormName As String, _
                  ControlType As AcControlType, _
                  [Section As AcSection = acDetail], _
                  [Parent], [ColumnName], [Left], [Top], [Width], [Height]) As Control
        Membro di Access.Application
    Attento che i controlli vengono creati con un Nome Automatico, quindi io fossi in te mi farei uno standard... e lo devi modificare dopo averlo creato...

    Finito il Ciclo salvi e chiudi la Maschera.
  • Re: Form per query pass-trough dinamica

    Ok grazie, solo non capisco perchè dici che non occorre la query PT, ad esempio la sola istruzione getdate() di sql server cambia in Access con la funzione date(), per questo sono obbligato ad usare le query PT
  • Re: Form per query pass-trough dinamica

    Non ho detto non serva la QPT, ma non serve OPENQUERY.
    Vorrei che capissi che una Query SELECT viene eseguita quando la lanci.
    Cosa significa LANCI...?
    
    Dim RS As DAO.Recordset
    Set RS=DbEngine(0)(0).OpenRecordset("NomeQUERYPT")
    Aprendo un Recordset la lanci... e verrà restituito il Recordset derivante anche se non vedi i contenuti.
    A cosa serve OPENQUERY...?
    Ad aprire un'interfaccia GRAFICA che mostra il risultato del lancio della QUERY, non consolida i dati in esecuzione della QUERY...!
    Diverso sarebbe se fosse una Query ACTION, ma poi non potresti usarla per popolare una Form...!

    Quindi non confondere lo strumento di VISUALIZZAZIONE dall'oggetto del Database.
  • Re: Form per query pass-trough dinamica

    Ah ok scusami, giusto; apro direttamente la maschera o il report collegato
    grazie

    ciao
Devi accedere o registrarti per scrivere nel forum
9 risposte