2016-05-02 9 views
0

Ich habe Zugang Frontend, die von SQL Server in Backend mit Strom versorgt wird.Pass Through-Abfrage mit userinput in Form Zugang

habe ich eine Form, die eine Benutzereingabe erfordert, basierend auf dem Eingang es einen Durchlauf durch Abfrage ausführen soll und im Unterformular führt anzuzeigen. Ich habe im Internet gelesen, dass dies nicht durch SQL-Befehl getan werden kann und es erfordert SQL-Codierung in VBA-Codierung verpackt werden.

Ich habe einen Code, um dies wie folgt aus:

Private Sub id_AfterUpdate() 
Dim MyDb As Database, MyQry As QueryDef 
Set MyDb = CurrentDb() 
Set MyQry = MyDb.CreateQueryDef("") 

MyQry.Connect = "ODBC;DSN=mikecollections;UID=***;PWD=****;DATABASE=mikecollections;" 
MyQry.SQL = "select currency.tb_coins.id,documenttype,documentsubtype,documentname" & _ 
      "from currency.tb_coins" & _ 
      "inner join collectibles.tb_documents on tb_coins.id=collectibles.tb_documents.prodid" & _ 
      "where currency.tb_coins.id=[forms]![test_form]![id]" 

End Sub 

Dieser Code sollte feuern, nachdem ich Wert im ID-Feld in das Formular ein, aber nichts passiert. Ich weiß nicht, wie ich diesen Code zum Laufen bringen kann. Ich bin neu in SQL und VBA, bitte helfen!

+0

Ich habe die Zeile hinzugefügt und F5 gedrückt, es öffnet sich mit Makro-Box, ich sehe keine MsgBox. – Mike

+0

Sie haben Recht, änderte ich den Namen von „id“ auf „Benutzereingabe“, jetzt, wenn ich das Feld aktualisieren, ich ein Popup-Fenster mit dem „wählen currency.tb_coins.id erhalten, Dokumente des, documentsubtype, Document & _ aus currency.tb_coins & _ Exklusionsverknüpfung collectibles.tb_documents auf tb_coins.id = collectibles.tb_documents.prodid & _ wo currency.tb_coins.id = [Formen]! [test_form]! [id], das ist im Grunde die Abfrage ohne Anführungszeichen – Mike

+0

Vielen Dank, Zugriff/VBA konvertiert "[forms]! [Test_form]! [Userinput]" nicht in einen Wert, sondern übergibt den gesamten Code an sql server. Was sollte ein besserer Code in VBA sein, der Eingaben annehmen kann? bilden? – Mike

Antwort

1

Sie können logisch beziehen sich nicht auf ein Access-Objekt in einer passthru Abfrage.
Sie sollten also die value des Steuerelements übergeben, anstatt auf das Steuerelement selbst zu verweisen.
Wenn id ist ein long:

MyQry.SQL = "select currency.tb_coins.id,documenttype,documentsubtype,documentname" & _ 
      "from currency.tb_coins" & _ 
      "inner join collectibles.tb_documents on tb_coins.id=collectibles.tb_documents.prodid" & _ 
      "where currency.tb_coins.id= " & [forms]![test_form]![id] 

Dann müssen Sie den Code hinzufügen, querydef einen recordset, um es zu lesen zuzuweisen. Etwas wie:

set rs = myQry.OpenRecordset 

Wenn Sie bevorzugen, können Sie auch Ihr queryDef nennen. es wird dann wie jede andere Abfrage zur Verfügung:

Set MyQry = MyDb.CreateQueryDef("someName") 
'''specify all properties here... 
doCmd.OpenQuery "someName" 
+0

Danke, wie kann ich den Zugriff machen zu SQL Server zu übergeben Eingang? Wenn ich die Abfrage alleine laufe einige, indem sie Wert für die ID es funktioniert gut. – Mike

+0

@Mike siehe bearbeiten. –

+0

Vielen Dank, ich habe RS, jetzt, wie das Formular-ID-Feld zu Recordset zuordnen? – Mike

1

I erstellt StoredProcedure in SQL Server und Parameter in Zugangs- und ging in SQL Server erstellt und habe es funktioniert. Danke Hansup und iDevlop für die Hilfe.

Private Sub userinput_AfterUpdate() 
Dim qrypass As DAO.QueryDef 
Dim rst As DAO.Recordset 

Set qrypass = CurrentDb.QueryDefs("qu_test") 
qrypass.SQL = "exec collectibles.sp_coinsvsdocuments" & " " & "@userinput" &  "=" & Forms!test_form!userinput 

End Sub 
+0

Das ist ausgezeichnet. Sie können dafür auch eine SQL Server-Tabellenwertfunktion verwenden. –