Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

gespeicherte Prozedur mit Parametern aus Formular ausführen

Begonnen von daniel.truniger, Oktober 16, 2017, 10:44:43

⏪ vorheriges - nächstes ⏩

daniel.truniger

Hallo,

Ich möchte über eine Pass-Through Abfrage eine gespeicherte Prozedur auf dem SQL-Server ausführen und das Resultat zurückerhalten. Dies funktioniert, solange ich keine Parameter in der gespeicherten Prozedur verwenden.

Nun möchte ich eine Abfrage mit Parameterwerten aus einem Formular an den Server übermitteln.

Die Pass-Through sieht folgendermassen aus:
EXEC dbo.abfrage_ueber_garantienummer @Garantie='100155582E446200 0001                          '

den Parameter @Garantie möchte ich aus dem Formular auslesen.

Gemäss meinen Internetrecherchen ist dies nur per VBA möglich.
Leider sind meine VBA Kenntnisse gleich null.

Kann mir Jemand bei diesem Problem weiterhelfen?

Dani

PhilS

Um den Parameterwert zu ändern, musst du den SQL-Text der Pass-Through-Abfrage, neu setzen.

Aus dem Gedächtnis und ungetestet, sieht das dann etwa so aus:
With CurrentDb.QueryDefs("deinePassThroughAbfrage")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & wertAusFormularfeld & "'"
   .Execute
End With
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Hallo,
Geht das nicht auch direkt in der Abfrage? EXEC dbo.abfrage_ueber_garantienummer @Garantie=Forms!DeinForm!DeinFeld

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

markusxy


PhilS

Zitat von: Beaker s.a. am Oktober 16, 2017, 10:53:33Geht das nicht auch direkt in der Abfrage?
Nein, nicht bei einer Pass-Through-Abfrage.
Deren SQL-Statement wird komplett und unverändert an das jeweilige Backend-System durchgereicht (->Pass-Through). - Das Backend hat keine Zugriffsmöglichkeit auf Formulare im Frontend.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

daniel.truniger

Zitat von: PhilS am Oktober 16, 2017, 10:50:56
Um den Parameterwert zu ändern, musst du den SQL-Text der Pass-Through-Abfrage, neu setzen.

Aus dem Gedächtnis und ungetestet, sieht das dann etwa so aus:
With CurrentDb.QueryDefs("deinePassThroughAbfrage")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & wertAusFormularfeld & "'"
   .Execute
End With


Hallo PhilS

Habe den Code folgendermassen ausprobiert:

Option Compare Database
Private Sub Befehl21_Click()

With CurrentDb.QueryDefs("Abfrage_stored_procedure")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & Text17 & "'"
   .Execute
End With

End Sub

Dieser Code ist "Beim Klicken" auf einem Button Hinterlegt.
"Text17" ist das Textfeld in diesem Formular wo ich den Wert eintrage.

Leider kommt folgende Fehlermeldung:

Laufzeitfehler '3065':
Eine Auswahlabfrage kann nicht ausgeführt werden.

was mache ich noch falsch ????

Dani





Lachtaube

Du musst den Abfragetyp der Abfrage auf Pass-Through festlegen.
Grüße von der (⌒▽⌒)

daniel.truniger

Zitat von: markus888 am Oktober 16, 2017, 11:00:12
Hier findest du eine Anleitung + Erklärung.

Hallo markus888,

So wie ich das sehe, wird mit diesem Code die Stored Procedure auf dem Server angepasst.
Dies ist ja nicht ziel meiner Abfragen.

Dani

PhilS

Zitat von: daniel.truniger am Oktober 16, 2017, 12:22:01
With CurrentDb.QueryDefs("Abfrage_stored_procedure")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & Text17 & "'"
   .Execute
End With

End Sub
[...]
Leider kommt folgende Fehlermeldung:

Laufzeitfehler '3065':
Eine Auswahlabfrage kann nicht ausgeführt werden.
Das ist korrekt. - Ich hatte den Teil "...und das Resultat zurückerhalten." in deiner Frage überlesen.

Das Resultat kommt vermutlich als Datensatzgruppe (Recordset) zurück. Dann nimmst du folgende Änderung vor, um das Recordset im Code einer Variablen zuzuweisen.

Dim rs As Dao.Recordset
With CurrentDb.QueryDefs("Abfrage_stored_procedure")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & Text17 & "'"
   Set rs = .OpenRecordset
End With


Die Recordsetvariable rs enthält nun die Ergebnisse der Stored Procedure. Du kannst sie entweder per VBA weiterverarbeiten oder dem Formular als Datenherkunft zuweisen (Schreibgeschützt!).

Set Me.Recordset = rs
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

Zitat von: daniel.truniger am Oktober 16, 2017, 12:38:01

So wie ich das sehe, wird mit diesem Code die Stored Procedure auf dem Server angepasst.
Dies ist ja nicht ziel meiner Abfragen.

Das liegt wohl daran, das SP in DAO nur mangelhaft integriert sind.
Auch die Tatsache, dass man das Ergebnis einer SP nicht bearbeiten kann, macht das für mich eher zu einer Notlösung.

Ganz anders sieht die Sache bei ADO aus. Da gibt es weniger Einschränkungen. Die Einarbeitung in ADO benötigt aber Zeit und idealerweise beherrscht man die Grundlagen des Programmierens und des Selbststudiums schon.

LG Markus

PhilS

Zitat von: daniel.truniger am Oktober 16, 2017, 12:38:01
Zitat von: markus888 am Oktober 16, 2017, 11:00:12
Hier findest du eine Anleitung + Erklärung.
So wie ich das sehe, wird mit diesem Code die Stored Procedure auf dem Server angepasst.
Das siehst du falsch. Der es wird nur die Abfragedefinition der Pass-Through-Abfrage im Access Frontend angepasst. - Genauso wie bei meinem Lösungsvorschlag.
Unterschied ist, dass ich vorschlage, dass Recordset aus der Abfrage direkt weiterzuverarbeiten, während in dem verlinkten Beispiel die geänderte Abfrage an ein Formular gebunden wird. - Etwa beides "gleich gut".

Wenn man meinen Lösungsvorschlag noch so erweitern würde, das er sich nicht auf einen bestehende PT-Abfrage bezieht, sondern eine neue, temporäre Abfrage erstellt, wäre dieser IMO vorzuziehen, da die Abhängigkeiten des Codes eliminiert wären.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

daniel.truniger

Zitat von: PhilS am Oktober 16, 2017, 12:54:06
Zitat von: daniel.truniger am Oktober 16, 2017, 12:22:01
With CurrentDb.QueryDefs("Abfrage_stored_procedure")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & Text17 & "'"
   .Execute
End With

End Sub
[...]
Leider kommt folgende Fehlermeldung:

Laufzeitfehler '3065':
Eine Auswahlabfrage kann nicht ausgeführt werden.
Das ist korrekt. - Ich hatte den Teil "...und das Resultat zurückerhalten." in deiner Frage überlesen.

Das Resultat kommt vermutlich als Datensatzgruppe (Recordset) zurück. Dann nimmst du folgende Änderung vor, um das Recordset im Code einer Variablen zuzuweisen.

Dim rs As Dao.Recordset
With CurrentDb.QueryDefs("Abfrage_stored_procedure")
   .SQL = "EXEC dbo.abfrage_ueber_garantienummer @Garantie='" & Text17 & "'"
   Set rs = .OpenRecordset
End With


Die Recordsetvariable rs enthält nun die Ergebnisse der Stored Procedure. Du kannst sie entweder per VBA weiterverarbeiten oder dem Formular als Datenherkunft zuweisen (Schreibgeschützt!).

Set Me.Recordset = rs

Der Code zeigt jetzt keine Fehler mehr an.
Ich möchten das Resultat im gleichen Formular als Unterformular/-bericht anzeigen.
Leider habe ich nirgends gefunden wie ich einem solchen Unterformular die Datenherkunft auf "Set Me.Recordset = rs" setzen kann?

Dani

PhilS

Zitat von: daniel.truniger am Oktober 16, 2017, 14:28:35Leider habe ich nirgends gefunden wie ich einem solchen Unterformular die Datenherkunft auf "Set Me.Recordset = rs" setzen kann?
Me bezieht sich auf das Formular, das den Code enthält. Also wahrscheinlich das Hauptformular.

Wenn die Abfrageergebnisse in einem Unterformular dargestellt werden sollen, musst du einen entsprechenden Bezug auf das Unterformular schreiben.
Beispiel:
Set Me!deinUnterformularSteuerelement.Form.Recordset = rs
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Hallo Phil,
Vielen Dank für deine Aufklärung.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

daniel.truniger

#14
Vielen Dank PhilS!
Habe es mittlerweile auch noch hingekriegt ;D.
Die Verknüpfung vom Unterformular zur Abfrage hat mir noch gefehlt.

Dani

Bitte keine vollständigen Beiträge zitieren. Ein Zitat macht hier ohnehin keinen Sinn, Du sprichst ja PhilS direkt an. Zitate verlängern die Beiträge und sind sparsam zu verwenden. Zitat entfernt. MzKlMu