Newsgroup: it.comp.appl.access
Titolo: parametro query da vba a runtime

ho creato una query che ad ogni iterazione di un ciclo for il parametro nel campo ID della query deve assumere il valore rs!id
 
ce un modo per settare da vba il parametro di una query ?
 
grazie a tutti.

mario rossi explained :

Se campo numerico:
SQL = "SELECT ... WHERE FieldName = " & RS!Id & " ... ;"
 
se stringa:
SQL = "SELECT ... WHERE FieldName = '" & RS!Id & "' ...;"
 
CurrentDB.Execute SQL


ti spiego meglio in pratica ho un report "reportpippo" a cui è associata una query "querypluto" con un parametro del tipo id=forms!miaform!campoid
 
al momento è cosi ma devo ad ogni iterazione del ciclo for aggiornare il campo 
forms!miaform!campoid prima di aprire il report "reportpippo" in questo modo
forms!miaform!campoid=rs!id
 
in questo modo apro visualizzando solo id corrente
mentre volevo modificare il parametro della query associata al report in modo dinamico da vba senza dover usare il campo della form.
 
fattibile?

mario rossi has brought this to us :

RS.MoveFirst ... wventualmente
Do Until RS.EOF
   SQL = "SELECT ... WHERE FieldName = " & RS!Id & " ... ;"
   CurrentDB.Execute SQL
   RS.MoveNext
Loop
 
Ho capito bene?
 
Bruno


forse non ho capito bene io provo a rispiegarmi
ad ogni interazione di un ciclo for devo generare un pdf del record corrente
 
 
allora ho creato un report associato a una query nella query ho messo un parametro ID=forms!miaform!campoid
 
quindi nel ciclo for dopo movenext assegno forms!miaform!campoid=rs!id
 
in questo modo quando lancio il comando docmd.... pdf.... 
il report è associato alla query il cui parametro id è quello corrente
 
vorrei evitare il campo della form e nella query fare riferimento ad un parametro ad esempio una variabile che modifico nel ciclo for oppure allo stesso rs!id anziche usare il campo "forms!miaform!campoid"
 
mi sono spiegato?


dovrei riuscire a fare qualcosa di questo tipo
 
Reports(NomeMioReport).RecordSource = "select * from " & nometabella & " where id=" & rs!Id


mi serve impostare l'origine record del report in modo dinamico perchè ad ogni iterazione del ciclo for la tabella e l'id cambiano
 
grazie a tutti.


Basta basare il REPORT su una Query.
Poi da codice si modifica il predicato SQL accessibile con la proprietà SQL dell'oggetto Queridef appartenente alla Collection QueryDefs:
 
DbEngine(0)(0).QueryDefs("NomeQuery").SQL="Nuovo predicato SQL"
 
@Alex


faccio un intervento a scopo di chiarimento personale
(consapevole che è sufficiente verificare quella che per me è diventata una curiosità operativa, dato che la questione prospettata può presentarsi comunemente...)
 
allora:
se si vuole lanciate in modo iterativo (ciclico) un report a cui si è assegnata come origine una query normalmente registrata
 
si può cambiare iterativamente il predicato SQL della query da codice
(proprietà SQL di QueryDefs) e lanciare quindi la sequenza dei reports ?
 
MA a questo punto è "SOLO" un'azione di STAMPA DIRETTA, perchè l'anteprima sarebbe continuamente sostituita ?

 ogni iterazione del ciclo for la tabella e l'id cambiano
 
Uso Access da oltre un quarto si secolo e non mi è mai capitato
di dover fare simili contorsioni.
 
1 - Ad ogni tablella corrisponde un proprio unico ID o la stessa
    tabella può apparire più volte con ID diversi?
2 - Tabelle e ID dove si vanno a pescare? da un Array?
 
Nella prima ipotesi del punto 1, questo è il cambiamento
del Record Source, che starà all'interno del Loop Tabelle:
====================
Private Sub Command7_Click()
Dim SQL As String, RS As Recordset, RN As String
Dim TN As String, FN As String, OF As String
 
'-- -  Definizioni  ---------------
TN = "LT_GroupTable"  ' TableName
FN = "[Anno]"         ' FieldName
RN = "rX_1"           ' ReportName
OF = "D:\AccessPDF_"  ' OutputFile
'----------------------------------
 
Set RS = CurrentDb.OpenRecordset(TN, dbOpenDynaset)
DoCmd.Echo False
 
Do Until RS.EOF
    SQL = "SELECT " & TN & ".* "
    SQL = SQL & "FROM " & TN & " "
    SQL = SQL & "WHERE (" & TN & "." & FN & "=" & RS(FN) & ");"
    DoCmd.OpenReport RN, acViewDesign, , , acHidden
    Reports(RN).RecordSource = SQL
    DoCmd.OutputTo acOutputReport, RN, acFormatPDF, OF & RS(FN) & 
".pdf"
    DoCmd.Close acReport, RN, acSaveNo
    RS.MoveNext
Loop
 
DoCmd.Echo True
 
End Sub
==========================
 
Bruno


Ottimo, volevo evitare di usare una query perchè sono molti report con molte tabelle diverse e quindi molte query da creare, per questo preferivo fare tutto da codice, ma anche questa soluzione mi sembra ottima
in questa riga dove c'è zero zero fra parentesi tonde cosa devo mettere?



anch'io usavo qualcosa di simile ma volevo evitare di aprire il report e poi chiuderlo perchè rallenta sicuramente il processo se i record sono molti, forse la cosa migliore è usare querydef come dicono, Alex e Giorgio

 forse la cosa migliore è usare querydef come dicono, Alex e Giorgio
 
Sì, in effetti sostituendo
 
    DoCmd.OpenReport RN, acViewDesign, , , acHidden
    Reports(RN).RecordSource = SQL
    DoCmd.OutputTo acOutputReport, RN, acFormatPDF, OF & RS(FN) & 
".pdf"
    DoCmd.Close acReport, RN, acSaveNo
 
 
con
 
    On Error Resume Next
    DoCmd.DeleteObject acQuery, "Query1"
    On Error GoTo 0
    Set qDef = CurrentDb.CreateQueryDef("Query1", SQL)
    DoCmd.OutputTo acOutputReport, RN, acFormatPDF, OF & RS(FN) & 
".pdf"
 
si passa da 17 secondi a 11 per 100 file PDF generati.
 
Bruno


fantastico! ci provo e ti faccio sapere com'è andata grazie.


se invece non elimino la query ma uso solo .SQL di querydef guadagno forse ancora tempo ?

mario rossi used his keyboard to write :

Perché non provi?
 
Bruno


Perchè ELIMINARE la Query se poi ti serve...? Non ti pare ILLOGICO...?
 
@Alex


Magari e' un maniaco del pulito
 


:D