2013-05-15 8 views
25

Ho una query piuttosto ampia, che unisce più di una dozzina di tabelle e desidero ritirare i record in base a un campo ID (ad esempio: between nStartID and nEndID).È possibile passare i parametri a livello di programmazione in una query di aggiornamento di Microsoft Access?

Ho creato due parametri e li ho testati come criteri e funzionano bene.

Il problema è che ho bisogno di eseguire una query di inserimento da questa query principale, e ho bisogno dei parametri dove sono, nella query principale. Quindi, ho bisogno di passare i parametri ad esso a livello di programmazione.

Qualcuno ha idea di come questo può essere fatto?

Grazie.

+0

Ho una soluzione per il mio bisogno, ma non sono sicuro se è il migliore.Ho creato variabili globali per nStartID e nEndID, quindi creo una funzione per ciascuna, come in getStartID() e getEndID() che leggono quei valori. Quindi uso solo quelle funzioni nella clausola where della query originale. Non è la soluzione più elegante, ma funziona. L'ho lasciato aperto nel caso in cui qualcun altro abbia esperienza che vorrebbero condividere, a beneficio degli altri. Grazie per il tuo contributo utile. – Jav

risposta

47

Ho appena provato questo e funziona in Access 2010.

Diciamo che avete una query di selezione con i parametri:

PARAMETERS startID Long, endID Long; 
SELECT Members.* 
FROM Members 
WHERE (((Members.memberID) Between [startID] And [endID])); 

Si esegue la query in modo interattivo e vi verrà chiesto di [startID] e [ endID]. Funziona, quindi si salva quella query come [MemberSubset].

Ora si crea una query di aggiornamento basata su quella query:

UPDATE Members SET Members.age = [age]+1 
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset]))); 

Si esegue la query in modo interattivo e di nuovo viene richiesta [startID] e [endID] e funziona bene, quindi si salva come [MemberSubsetUpdate].

È possibile eseguire [MemberSubsetUpdate] dal codice VBA specificando i valori [startID] e [endID] come parametri su [MemberSubsetUpdate], anche se in realtà sono parametri di [MemberSubset]. Quei valori dei parametri "trickle down" per cui sono necessari, e la query non funzionano senza l'intervento umano:

Sub paramTest() 
    Dim qdf As DAO.QueryDef 
    Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate") 
    qdf!startID = 1 ' specify 
    qdf!endID = 2 '  parameters 
    qdf.Execute 
    Set qdf = Nothing 
End Sub 
+0

Grazie per la condivisione, ho trovato un codice simile, ma non ho spiegato nulla. – Jav

4

Molte grazie per le informazioni sull'utilizzo del QueryDefs! Mi sono chiesto questo per un po '.

Ho fatto un modo diverso, senza utilizzare VBA, utilizzando una tabella contenente i parametri di query.

Esempio: SELEZIONA a_table.a_field DA queryparameters, a_table DOVE a_table.a_field TRA QueryParameters.a_field_min E QueryParameters.a_field_max

Dove queryparameters è una tabella con due campi, a_field_min e a_field_max

Si può anche essere utilizzato con GROUP BY, se si includono i campi del parametro di query nella clausola GROUP BY e l'operatore FIRST nei campi dei parametri nella clausola HAVING.

16

Provare a utilizzare QueryDefs. Crea la query con i parametri. Quindi usa qualcosa del tipo:

Dim dbs As DAO.Database 
Dim qdf As DAO.QueryDef 

Set dbs = CurrentDb 
Set qdf = dbs.QueryDefs("Your Query Name") 

qdf.Parameters("Parameter 1").Value = "Parameter Value" 
qdf.Parameters("Parameter 2").Value = "Parameter Value" 
qdf.Execute 
qdf.Close 

Set qdf = Nothing 
Set dbs = Nothing 
+2

Penso che puoi anche riferirti a '.Parameters' per numero, come' qdf.Parameters (1) .Value = "Parameter Value" '. Non sono sicuro se è basato su zero. –

+1

Proprio così e confermo che è basato su zero. –

1

Puoi anche usare TempVars - nota '!' la sintassi è essenziale You can also use TempVars - note '!' syntax is essential

Problemi correlati