2012-08-04 10 views
5

Jestem nowy w Access i pochodzę z C#, SQL Server & .Net. Jest projekt, który przyszedł po mojej myśli i muszę ukończyć niektóre części.W jaki sposób można ustawić wartości parametrów INSERT SQL za pośrednictwem VBA w programie Microsoft Access?

Scenariusz może być opisany jako:

  1. formularz dostępowym podformularzu
  2. kwerend Access, który jest źródłem danych wspomnianego podformularzu z dwóch parametrów, wyświetlany jako: Parametername1 String(255),Parametername2 String(255).
  3. moduł kodu VBA (s)

Mój plan jest ustawienie wartości wyżej wymienionych parametrów kwerendy w ramach procedury w moim module kodu VBA. Wierzę, że powinno to odświeżyć mój subform jako kwerendy jest źródłem danych dla podformularza.

Problem polega na tym, że nie wiem, jak wdrożyć ten plan.

Chcę użyć kwerendy, ponieważ nie chcę zepsuć mój kod VBA z wbudowanym SQL.

używam dostęp 2010.

+0

Inline SQL w module VBA jest złym pomysłem nie tylko dla celów czytelności, ale także dlatego, że może powodować nieoczekiwane błędy i stanowić [zagrożenie bezpieczeństwa] (http://xkcd.com/327/). – StockB

Odpowiedz

6

miałem dokładnie to pytanie, chciałem wykorzystać tę samą kwerendę aktualizującą „przechowywane”, ale wykonanie go z dwóch różnych form tak chciał przekazać parametr do kwerendy w czasie wykonywania. To co znalazłem (na innym forum), że robi dokładnie to, co chcę:

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

Jak wygląda "qry_YourQuery"? Czy wstawiasz '?', Gdzie powinna iść wartość parametru? – StockB

+0

Czy masz link do forum, na którym znalazłeś ten fragment? Szukałem, ale wszystko, co mogłem znaleźć, to odniesienia do tego posta. – StockB

+1

Dla tych z was, którzy się zastanawiają. "qry_YourQyery" to nazwa zapisanego zapytania, które masz na liście zapytań w bazie danych dostępu, np. qryUpdateSalary. "yourParam" to nazwa parametru, który masz w zapytaniu, tj. Aktualizuj tblSalary set Salary = pay * workrs, gdzie PersonId = [person]. W tym przypadku parametrem jest osoba, więc powyższy przykład będzie wyglądał tak: 'kod z CurrentDb.QueryDefs (" qryUpdateSalary ") .Parameters (" person ") = personID 'ta zmienna pochodzi z innego kroku w kodzie VBA .Execute End Z ' – kuklei

2

Sensem podformularzu jest to, że jest sterowany przez źródło nagrywania i łącza dziecka i pól mistrzowskich. Powiedzmy forma jest Spółka oraz podformularzu jest zatrudnionych, źródło rekord podformularzu może być:

SELECT EmployeeID, CompanyID, Position, Etc FROM Employees 

Link dziecko i mistrzowskie pola byłyby CompanyID. Podczas przechodzenia przez formularz główny będą wyświetlane tylko te wpisy, które odnoszą się do bieżącej firmy. Powiedzmy, że potem chcesz wyświetlić tylko tych pracowników, którzy są w stanie technicznym, można zmienić źródło nagrywania w czasie wykonywania:

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

lub jeśli jest to zawsze będzie filtr na formularzu, dodać combobox, powiedzmy, do głównego formularza i użyć jej jako drugiego Link Master dziedzinie, więc trzeba:

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

Wreszcie, można po prostu ustawić właściwość filtra od głównego formularza:

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

ja Jeśli nie o to Ci chodzi, dodaj uwagi do swojego pytania.

EDIT

można dostarczać parametry zapytania poprzez odniesienie do kontroli na formularzu:

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

można całkowicie zmienić SQL kwerendy i można korzystać z ADO jednak, zmiana języka SQL jest podobna do ustawienia źródła rekordu, ponieważ kod SQL zmienia się w kodzie, a użycie ADO zwykle nie jest najlepszym wyborem dla formularzy.

Nie można zmienić parametru i "przykleić" go do formularza lub podformularza.

Na przykład:

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 dzięki. To na pewno pomoże. Ale nie chcę używać filtra. Mam już zapytanie, które jest źródłem zapisu dla podformularza. Muszę wiedzieć, czy istnieje, dzięki czemu mogę zmienić/ustawić parametry zapytania w ramach kodu VBA. Szukam rozwiązania na liniach przy użyciu procedura składowana na serwerze SQL i przy użyciu klasy SqlCommand (System.data.sqlclient) w .NET. Nie wiem nawet, czy to możliwe. W przeciwnym razie po prostu osadzę mój sql w moim kodzie VBA i użyję SQL stateemnt jako moje źródło danych/rekordów i zacznę z życiem. Dostęp jest inny! – Romi24

+0

Dostęp jest inny, a główną różnicą jest to, że możesz zrobić dużo bez żadnego kodu, co często zapominamy. W takim przypadku parametry zapytania powinny pochodzić z formularza i wskazywałem, w jaki sposób może to się zdarzyć. Są inne opcje, które przegapiłem i dodam je. – Fionnuala

+0

Jeszcze raz dziękuję Remou ... Myślę, że jesteśmy blisko rozwiązania. jedyną rzeczą jest to, że nie chcę, aby aplikacja pytała o parametr zdefiniowany w zapytaniu. Chcę ustawić wartość parametru w moim kodzie VBA .... Podejmując swój przykład - gdzie pozycja = "Technical", chcę podać wartość "Technical" w moim kodzie VBA – Romi24

1

Można by utworzyć funkcję i używać tej funkcji (zamiast zwykłego parametr) w kwerendzie źródłowej nagrać formularza.

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 

Kwerenda źródło rekord:

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; 

Później, gdy chcesz wyświetlić inny zestaw wierszy w podformularzu zmienić wartość przypisaną do PositionParam() i Requery podformularzu.

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

To może działać. Dla mnie, myślę, że wolałbym uzyskać parametry zapytania z formularza, jak sugerował Remou. Ponieważ jednak wydaje się, że nie chcesz tego robić w ten sposób, jest to inny sposób. – HansUp

0

Formularz sub jest zobowiązany do zapytania i że kwerenda nie powinien mieć żadnych parametrów w ogóle.

Oczywiście można przechowywać SQL dla podformularza w zapytaniu i to eliminuje wbudowany sql, ale następnie odwracanie i pisanie WHACKS kodu, aby obejść ten problem, nie ma sensu w ogóle to robi?

Jak już wspomniano, filtrowanie i wyświetlanie przekodowanych podtrybów jest automatyczne i występuje bez kodu, jeśli konfigurujesz łącze główne i ustawienia podrzędne kontrolera. Prawdopodobnie NIE potrzebujesz tutaj ŻADNEGO kodu.

Jednak jeśli z jakiegoś realnego powodu trzeba napisać kod lub chcą więcej rozliczanych godzin można użyć tego kodu:

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 

więc nie trzeba żadnych parametrów w SQL, ale wystarczy użyć bieżącego i Kwerenda SAME, na której oparty jest formularz podrzędny. Poza tym, jeśli dodasz parametry, to ciężko zakodujesz 2 wartości w zapytaniu, a następnie zapytanie nie będzie mogło być użyte dla innych kodów i zadań, chyba że podasz 2 SAME parametry zakodowane na sztywno (więc daje to niewielką, jeśli jakąkolwiek elastyczność w używaniu tego zapytania w innym miejscu z różnymi opcjami).

Zostaw więc parametry poza zapytaniem oraz te same pieniądze i czas oraz płatne godziny pracy.

Jest to prosta sprawa, aby przeciągnąć zapytanie SQL zgodnie z powyższym i dodać kryteria do SQL. Jeśli jednak chcesz wstawić dane do formularza podrzędnego, możesz użyć podformularza danych źródłowych i ponownie ustawić wartość reocrdset. np:

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 
Powiązane problemy