2012-08-04 7 views
5

Sono nuovo ad Access e vengo da C#, SQL Server & .Net. C'è un progetto che è venuto a modo mio e devo completare alcune parti.Come è possibile impostare i valori dei parametri di una query SQL INSERT tramite VBA in Microsoft Access?

Lo scenario può essere descritto come:

  1. Un modulo di accesso con una sottomaschera
  2. Una query Access che è la fonte di dati della sottomaschera suddetto, con due parametri, visualizzati come: Parametername1 String(255),Parametername2 String(255).
  3. modulo di codice VBA (s)

Il mio piano è quello di impostare i valori dei parametri di query di cui sopra entro un procedimento nel mio modulo di codice VBA. Credo che questo dovrebbe aggiornare la mia sottomaschera come la query è l'origine dati per la sottomaschera.

Il problema è che non so come implementare questo piano.

Voglio utilizzare una query perché non voglio rovinare il mio codice VBA con inline SQL.

Sto usando l'accesso 2010.

+0

Inline SQL in un modulo VBA è una cattiva idea, non solo per scopi di leggibilità, ma anche perché potrebbe gettare errori imprevisti e rappresentano una [minaccia alla sicurezza] (http://xkcd.com/327/). – StockB

risposta

6

Ho avuto esattamente questa domanda, ho voluto utilizzare la stessa domanda dell'aggiornamento 'memorizzato' ma eseguirlo da due forme differenti in modo voluto passare il parametro alla query in fase di esecuzione. Questo è quello che ho trovato (in un altro forum) che fa esattamente quello che voglio:

With CurrentDb.QueryDefs("qry_YourQuery") 
    .Parameters("yourParam") = yourVBAvar 
    .Execute 
End With 
+0

Che aspetto ha "qry_YourQuery"? Metti semplicemente "?" Dove dovrebbe andare il valore del parametro? – StockB

+0

Hai un link al forum in cui hai trovato questo snippet? Ho cercato, ma tutto quello che ho potuto trovare erano i riferimenti a questo post. – StockB

+1

Per quelli di voi che si stanno chiedendo. "qry_YourQyery" è il nome della query salvata presente nell'elenco di query nel database di accesso, ad esempio qryUpdateSalary. "yourParam" è il nome del parametro che hai nella tua query, ovvero Aggiorna tblSalary set Salary = wage * workhrs dove PersonId = [person]. In questo caso il parametro è person, quindi l'esempio precedente somiglierebbe al codice 'Con CurrentDb.QueryDefs (" qryUpdateSalary ") .Parameters (" person ") = personID 'questa variabile proviene da un altro passaggio nel codice VBA .Esecuzione Fine Con ' – kuklei

2

Il punto centrale di una sottomaschera è che è controllata dal origine record e il bambino di collegamento e campi di master. Diciamo la forma è la società e la sottomaschera è dipendenti, l'origine record per la sottomaschera potrebbe essere:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees 

Il bambino collegamento e master campi sarebbero CompanyID. Mentre si spostava il modulo principale, venivano visualizzati solo i record pertinenti alla società corrente. Diciamo poi si desidera visualizzare solo i dipendenti che si trovano in una posizione tecnica, è possibile modificare l'origine record in fase di esecuzione:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees 
WHERE Position = "Technical" 

o se questo è sempre quello di essere un filtro sul modulo, aggiungere un combobox, per esempio, per la forma principale e utilizzare che come un secondo campo Master Link, in modo da avere:

Link Master Fields: CompanyID; cboPosition 
Link Child Fields : CompanyID; Position 

Infine, si può semplicemente impostare la proprietà del filtro dalla maschera principale:

Me.Employees_subform.Form.Filter = "Position=""Tecnical""" 
Me.Employees_subform.Form.FilterOn = True 

io Se questo non è quello che hai in mente, per favore aggiungi alcune note alla tua domanda.

EDIT

È possibile fornire i parametri a una query facendo riferimento a un controllo in un form:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees 
WHERE Position = Forms!MyMainForm!cboPosition 

È possibile modificare completamente l'SQL di una query ed è possibile utilizzare ADO, tuttavia, la modifica di SQL è simile all'impostazione dell'origine record in quanto l'SQL viene modificato nel codice e l'utilizzo di ADO non è in genere la scelta migliore per i moduli.

Ciò che non si può fare è modificare un parametro e farlo "incollare" con un modulo o una sottomaschera.

Ad esempio:

DoCmd.SetParameter "@SomeID", "1" 
' This works 
DoCmd.OpenQuery ("Queryx") 

' This will give a prompt for @SomeID and then run 
Me.SomeSubform.Form.RecordSource = "Queryx" 
+0

Remou, grazie. Questo aiuterà di sicuro. Ma non voglio usare un filtro. Ho già una query che è l'origine record per il modulo secondario. Ho bisogno di sapere se c'è comunque con cui posso modificare/impostare i parametri della query all'interno del codice VBA. Sto cercando una soluzione sulle linee di utilizzo di una stored procedure nel server SQL e utilizzando la classe SqlCommand (System.data.sqlclient) in .net. Non so nemmeno se sia possibile. Altrimenti incorporerò semplicemente il mio sql nel mio codice VBA e useremo lo stato SQL come mia fonte di record/dati e andrò avanti con la vita. L'accesso è diverso !! – Romi24

+0

L'accesso è diverso e la differenza principale è che si può fare molto senza alcun codice, il che è qualcosa che le persone spesso dimenticano. In questo caso, i parametri per la tua query dovrebbero provenire da un modulo, e stavo sottolineando come questo potrebbe accadere. Ci sono altre opzioni che ho perso e le aggiungerò. – Fionnuala

+0

grazie ancora Remou ... penso che siamo vicini a una soluzione. l'unica cosa è che non voglio che l'applicazione richieda il parametro definito nella query. Voglio impostare il valore del parametro nel mio codice VBA .... Riprendendo il tuo esempio - dove posizione = "Tecnico", voglio fornire il valore di "Tecnico" nel mio codice VBA – Romi24

1

Si potrebbe creare una funzione e l'uso che la funzione (invece di un parametro regolare) in query di origine record di modulo.

Public Function PositionParam(Optional ByVal P1 As Variant) As Variant 
    Static varP As Variant 

    If Not IsMissing(P1) Then 
     If IsNull(P1) Then 
      varP = Null 
     Else 
      varP = CStr(P1) 
     End If 
    ElseIf VarType(varP) = vbEmpty Then 
     varP = Null 
    End If 
    PositionParam = varP 
End Function 

La query origine record:

SELECT y.id_fld, y.another_fld, y.position_fld 
FROM YourTable AS y 
WHERE 
     y.position_fld = PositionParam() 
    OR PositionParam() Is Null 
ORDER BY y.id_fld, y.another_fld; 

Più tardi, quando si desidera visualizzare un diverso insieme di righe nella sottomaschera, modificare il valore assegnato a PositionParam() e Requery la sottomaschera.

PositionParam "technician" 
Forms("YourForm").Requery 
+0

Questo potrebbe funzionare. Per quanto mi riguarda, penso che preferirei ottenere i parametri della query da un modulo come suggeriva Remou. Tuttavia, dal momento che non sembra volerlo fare in questo modo, questo è un altro modo. – HansUp

0

La forma secondaria è legata a una query e che query non dovrebbe avere alcun parametro a tutti.

È possibile archiviare l'SQL per il modulo secondario in una query e questo elimina SQL in linea, ma poi girarsi e scrivere WHACK di codice per aggirare questo problema non ha alcun senso?

Come indicato, il filtraggio e la visualizzazione dei ricodifica di sottomoduli è automatica e avviene senza codice se si imposta il collegamento principale e le impostazioni figlio del sottosistema dal controllo. Probabilmente non hai bisogno di NESSUN codice qui.

Tuttavia, se per qualche motivo reale è necessario scrivere codice o vogliono più ore fatturabili quindi è possibile utilizzare questo codice:

Dim strSql  As String 

strSql = Split(CurrentDb.QueryDefs("name of query").SQL, ";")(0) 

strSql = strSql & "where Field1 = " & "'your p1 value'" & _ 
        " and Field2 = " & "' your p2 value'" 

Me.custChild.Form.RecordSource = strSql 

Quindi non è necessario alcun parametro in SQL, ma basta usare la corrente e la Query SAME su cui si basa il modulo secondario. Inoltre se si aggiungono i parametri, è difficile codificare i 2 valori nella query e quindi la query non può essere utilizzata per altri codici e attività a meno che non si forniscano i 2 parametri SAME hard codificati (quindi questo fornisce poca o nessuna flessibilità nell'usare quella query altrove con diverse scelte).

Quindi, lasciare i parametri fuori dalla query e gli stessi soldi, tempo e ore fatturabili.

È semplice inserire la query SQL come sopra e aggiungere criteri all'SQL. Tuttavia, se si desidera inserire dati nel modulo secondario, è possibile utilizzare direttamente l'origine dati della sottomaschera e reocrdset. ad esempio:

Dim rst  As DAO.Recordset 

    Set rst = Me.custChild.Form.RecordsetClone 

    rst.AddNew 
    rst!SomeField = "some valjue" 
    rst!SomeField2 = "some value" 
    rst.Update 

    Me.custChild.Requery