2013-05-15 36 views
25

Mam dość duże zapytanie, łącząc kilkanaście tabel i chcę wycofać rekordy oparte na polu identyfikatora (, np.: between nStartID and nEndID).Czy jest możliwe przekazywanie parametrów programowo w kwerendzie aktualizacji programu Microsoft Access?

Stworzyłem dwa parametry i przetestowałem je jako kryteria i działają dobrze.

Problem polega na tym, że muszę uruchomić zapytanie wstawiające z tego głównego zapytania i potrzebuję parametrów w miejscu, w którym się znajdują, w głównym zapytaniu. Muszę więc programowo przekazać do niego parametry.

Ktoś ma pojęcie, jak to zrobić?

Dzięki.

+0

Mam rozwiązanie dla mojej potrzeby, ale nie jestem pewien, czy to jest najlepsze.Stworzyłem zmienne globalne dla nStartID i nEndID, a następnie utworzę dla nich funkcję, jak w getStartID() i getEndID(), które odczytują te wartości. Następnie używam tych funkcji w klauzuli where pierwszego zapytania. Nie jest to najbardziej elegancki z rozwiązań, ale działa. Pozostawię to otwarte w przypadku, gdy ktoś inny ma doświadczenie, które chciałby udostępnić, na korzyść innych. Dziękuję za pomocne informacje. – Jav

Odpowiedz

47

Właśnie przetestowane i działa w programie Access 2010.

Say masz SELECT zapytania z parametrami:

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

uruchomić tę kwerendę interaktywnie i monituje o [startID] i [ endID]. To działa, więc zapisujesz to zapytanie jako [MemberSubset].

Teraz utworzyć kwerendę aktualizującą na podstawie tego zapytania:

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

uruchomieniu tego zapytania interaktywnie i ponownie pojawi się monit [startID] i [endID] i to działa dobrze, więc go zapisać jako [MemberSubsetUpdate].

Można uruchomić [MemberSubsetUpdate] z kodu VBA, określając [wartość parametru startID] i wartość [endID] jako parametry parametru [MemberSubsetUpdate], mimo że są to w rzeczywistości parametry parametru [MemberSubset]. Te wartości parametrów „spływa” do miejsca, gdzie są one potrzebne, a kwerenda może działać bez interwencji człowieka:

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

Dzięki za udostępnienie, znalazłem podobny kod, ale nic nie zostało wyjaśnione. – Jav

4

Wielkie dzięki za informacje na temat korzystania z kolekcji QueryDefs! Zastanawiam się nad tym przez chwilę.

Zrobiłem to inaczej, bez użycia VBA, używając tabeli zawierającej parametry zapytania.

Np SELECT a_table.a_field OD QueryParameters, a_table GDZIE a_table.a_field MIĘDZY QueryParameters.a_field_min I QueryParameters.a_field_max

Gdzie QueryParameters jest stół z dwoma polami, a_field_min i a_field_max

może on nawet być używane z GROUP BY, jeśli uwzględnisz pola parametrów zapytania w klauzuli GROUP BY, a operator FIRST w polach parametru w klauzuli HAVING.

16

Spróbuj użyć QueryDefs. Utwórz zapytanie z parametrami. Następnie użyj czegoś takiego:

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

Myślę, że możesz również odnieść się do '.Parameters' według numeru, np.' Qdf.Parameters (1) .Value = "Wartość parametru" '. Nie jestem pewien, czy jest to zero. –

+1

Zgadza się i potwierdzam, że jest to zero. –

1

Możesz także użyć TempVars - uwaga '!' niezbędna jest składnia: You can also use TempVars - note '!' syntax is essential