Newsgroup: it.comp.appl.access
Titolo: Convertire una query salvata in espressione SQL via codice VBA

Spiego il mio problema :
vorrei esportare in excel utilizzando
 DoCmd.OutputTo acOutputQuery, "miaQuery", acFormatXLS,
"c:\Esporta.xls", True
"miaQuery" è una query con paramtri derivanti da campi di una Maschera
 , nella maschera attrverso una ListBox lascio selezionare all'utente
una o più righe  che costituiscono un Filtro .
Attraverso un pulsante apro un report con origeine dati = MiaQuery e
applico il Filtro al report , fin qui tutto funziona .
Vorrei applicare Il Filtro anche alla miaQuery , per effettuare
l'esportazione dei dati in excel .
Quindi ho pensato a questa soluzione (forse contorta) :
Converto via VBA miaQuery in espressione SQL (ma non so come fare )
Poi aggiungo il Filtro (espressione SQL)
Ottengo una nuova espressione SQL
Converto la nuova espressione SQL in una query salvata
"miaQueryconFiltro"  (ma non so come fare )
applico
 DoCmd.OutputTo acOutputQuery, "miaQueryconFiltro", acFormatXLS,
"c:\Esporta.xls", True
O ci sono altre Soluzioni più immediate ?

 O ci sono altre Soluzioni più immediate ?
Non mi fiene in mente altro.
@Alex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Ringrazio  del suggerimento   ma probabilmente sbaglio qualcosa
 Dim NuovaSQL As QueryDef
 stSQL = CurrentDb.QueryDefs(stRSource).SQL  'stRSource  = miaQuery
 Set NuovaSQL = CurrentDb.CreateQueryDef("qryNuovaSQL", stSQL)
ottengo la  query "qryNuovaSQL" che in visualizzazione SQL è la
seguente
SELECT tblMatricola.IdMatricola, tblMatricola.CostoAcquisto,
tblMatricola.IdCatAM1, tblMatricola.IdCatAM2, tblMatricola.IdUtilizzo,
tblInterventoManutenzione.IdInterventoManutenzione,
tblInterventoManutenzione.Responsabile,
tblInterventoManutenzione.DataIM, tblInterventoManutenzione.ContaOre,
tblInterventoManutenzione.[FMacchina(h)], tblCausa.DesCausa,
tblGravità.Gravità, tblRigheIntervento.IdRigheIntervento,
tblRigheIntervento.Descrizione, tblRigheIntervento.IdFornitori,
tblRigheIntervento.Offerta, tblRigheIntervento.Costo,
tblRigheIntervento.[MDOInt(h)], tblRigheIntervento.[MDOEst(h)],
tblRigheIntervento.StatoIntervento, tblRigheIntervento.Eseguito,
tblStoricoCO.CO, tblStoricoCO.DallaData, tblStoricoCO.AllaData,
tblStoricoCMDO.CMDO, tblStoricoCMDO.DallaData, tblStoricoCMDO.AllaData,
tblStoricoStati.IdStati, tblStoricoStati.AllaData, tblStati.Stato,
tblMatricola.Cespite, sqryCostoRicambiCorrettivi.TotRic
FROM (((((((tblInterventoManutenzione INNER JOIN tblMatricola ON
tblInterventoManutenzione.IdMatricola = tblMatricola.IdMatricola) INNER
JOIN tblCausa ON tblInterventoManutenzione.IdCausa = tblCausa.IdCausa)
INNER JOIN tblGravità ON tblInterventoManutenzione.IdGravità =
tblGravità.IdGravità) INNER JOIN tblStoricoCMDO ON
tblMatricola.IdMatricola = tblStoricoCMDO.IdMatricola) INNER JOIN
tblStoricoCO ON tblMatricola.IdMatricola = tblStoricoCO.IdMatricola)
INNER JOIN tblRigheIntervento ON
tblInterventoManutenzione.IdInterventoManutenzione =
tblRigheIntervento.IdInterventoManutenzione) LEFT JOIN
sqryCostoRicambiCorrettivi ON tblRigheIntervento.IdRigheIntervento =
sqryCostoRicambiCorrettivi.IdRigheIntervento) INNER JOIN
(tblStoricoStati INNER JOIN tblStati ON tblStoricoStati.IdStati =
tblStati.IdStati) ON tblMatricola.IdMatricola =
tblStoricoStati.IdMatricola
GROUP BY tblMatricola.IdMatricola, tblMatricola.CostoAcquisto,
tblMatricola.IdCatAM1, tblMatricola.IdCatAM2, tblMatricola.IdUtilizzo,
tblInterventoManutenzione.IdInterventoManutenzione,
tblInterventoManutenzione.Responsabile,
tblInterventoManutenzione.DataIM, tblInterventoManutenzione.ContaOre,
tblInterventoManutenzione.[FMacchina(h)], tblCausa.DesCausa,
tblGravità.Gravità, tblRigheIntervento.IdRigheIntervento,
tblRigheIntervento.Descrizione, tblRigheIntervento.IdFornitori,
tblRigheIntervento.Offerta, tblRigheIntervento.Costo,
tblRigheIntervento.[MDOInt(h)], tblRigheIntervento.[MDOEst(h)],
tblRigheIntervento.StatoIntervento, tblRigheIntervento.Eseguito,
tblStoricoCO.CO, tblStoricoCO.DallaData, tblStoricoCO.AllaData,
tblStoricoCMDO.CMDO, tblStoricoCMDO.DallaData, tblStoricoCMDO.AllaData,
tblStoricoStati.IdStati, tblStoricoStati.AllaData, tblStati.Stato,
tblMatricola.Cespite, sqryCostoRicambiCorrettivi.TotRic
HAVING (((tblMatricola.IdCatAM1) Like
ConvertNulls([Forms]![frmSelMacchina]![cbxCAM1],"*")) AND
((tblMatricola.IdCatAM2) Like
ConvertNulls([Forms]![frmSelMacchina]![cbxCAM2],"*")) AND
((tblMatricola.IdUtilizzo) Like [Forms]![frmSelMacchina]![cbxUtilizzo])
AND ((tblInterventoManutenzione.DataIM) Between
ConvertNulls([Forms]![frmSelMacchina]![DallaData],#1/1/1981#) And
ConvertNulls([Forms]![frmSelMacchina]![AllaData],#12/31/2020#)) AND
((tblStoricoCO.DallaData)<=[DataIM]) AND
((tblStoricoCO.AllaData)>=[DataIM]) AND
((tblStoricoCMDO.DallaData)<=[DataIM]) AND
((tblStoricoCMDO.AllaData)>=[DataIM]) AND ((tblStoricoStati.IdStati)
Like ConvertNulls([Forms]![frmSelMacchina]![cbxStato],"*")) AND
((tblStoricoStati.AllaData) Is Null));
Se  ora  anche  applico il filtro
stSQL = CurrentDb.QueryDefs(stRSource).SQL
stSQL = stSQL & " WHERE " & strFiltro  ' dove strFiltro è ad esempio
  IdMatricola =  'Dry1Teg' OR IdMatricola =  'Dry2Teg'
Set NuovaSQL = CurrentDb.CreateQueryDef("qryNuovaSQL", stSQL)
Ottengo  l'errore "Caratteri non previsti dopo la fine dell'istruzione
SQL"  3142
Sbaglio Qualcosa ??
Grazie

 Grazie
Con la Query che hai è decisamente un problema, poichè usa Having
come Clausola di Criterio, quindi dovresti aggiungerti in AND
alla fine della Clausola.


Ringrazio e  chiedo una precisazione ....
Se ho capito bene dovrei  inserirla all'interno di HAVING ...
tolgo dall'esppressione  SQL  gli ultimi caratteri    ");"
aggiungo " AND " & strFiltro & ");"


togli solo il ";" ed aggiungi  " AND (" & StrFiltro  & ")"
bye.

Grazie a Enrico per il suggerimento  ma non è corretto.
Ho comunque risolto il problema  e qui  riporto la soluzione  perchè
possa essere di aiuto ad altri....
Partendo dall'inizio  ho una query salvata (1) denominata
"qryrptInterventoManutenzione(Filtro)"





(2) Creo una nuova query  in cui l'origine è la query di cui sopra
"qryrptInterventoManutenzione(Filtro)"
SELECT *
FROM [qryrptInterventoManutenzione(Filtro)];
la salvo per mia comodità col nome
"qryrptInterventoManutenzioneFiltro"
(3)
Dim qdfTemp As QueryDef
Dim stRSource As String, stSQL As String
stSQL = CurrentDb.QueryDefs(stRSource).SQL
stSQL = Left(stSQL, Len(stSQL) - 3)
stSQL = stSQL & " WHERE (" & strFiltro & ");"
Set qdfTemp = CurrentDb.CreateQueryDef("qryTempSQL", stSQL)  ' crea una
qry salvata temporanea  (grazie Alessandro B)
   stRSource = "qryTempSQL"
                  DoCmd.OutputTo acOutputQuery, stRSource, acFormatXLS,
"c:\Esporta.xls", True ' esporta in excel
CurrentDb.QueryDefs.Delete stRsource ' elimina la query Temporanea
salvata
Così funziona !