Zugriff auf Daten aus Abfrage

Yaslaw

n/a
Moderator
Alles klar. Nimm den WHERE wieder aus der Abfrage heraus.
Dann öffnest du im VBA die Abfrage als QueryDef und übergibst den Paramter.
Aus dem Querydef kannst du dann den Recordset öffnen und wie gewohnt damit weiterarbeiten

Hier ein Beispiel für die Abfrage myQuery und den Paramterwert 2
Visual Basic:
    Dim qry As QueryDef
    Dim rs As Recordset
    
    'Abfrage als QueryDef öffnen
    Set qry = CurrentDb.QueryDefs("myQuery")
    'Paramter übergeben
    qry.Parameters(0).value = 2
    'Recordset öffnen
    Set rs = qry.openRecordset
    
    '//TODO: Daten aus dem Recordset auswerten
    
    'Suaber abschliesen
    rs.Close
    qry.Close
 

Alex777

Mitglied
Okay, die Logik dahinter verstehe ich, es hängt glaube ich noch am Syntax.

Code:
Function fillVHP()
Dim appword As Word.Application
Dim doc As Word.Document
Dim Path As String
Dim rs As Recordset
Dim qry As QueryDef

Set qry = CurrentDb.QueryDefs("berichtkv")
qry.Parameters("KlientenNr").Value = "Me.KlientenNr"

Set rs = qry.OpenRecordset

So nimmt er es auf jeden Fall noch nicht :(

Könnt ihr mir hier eigentlich ein gutes Tutorial oder Buch für VBA empfehlen? Habe die Vorzüge entdeckt und das Thema wird für mich zunehmend interessanter.
 

Yaslaw

n/a
Moderator
Oh, ich kenne keine Bücher. ich hatte unter Access 2.0 mit der F1-Hilfe begonnen.

Aber du weisst dem Parameter einen String "Me.KlientenNr" zu und nicht den Wert des Feldes.
Probier es mal ohne die "
Visual Basic:
qry.Parameters("KlientenNr").Value = Me.KlientenNr
 

Alex777

Mitglied
Ne nimmt er leider nicht, er schreibt immer "Element in dieser Auflistung nicht gefunden" und markiert
Visual Basic:
qry.Parameters(KlientenNr).Value = Me.KlientenNr

habe auch schon:
Visual Basic:
qry.Parameters("KlientenNr").Value = Me.KlientenNr

versucht
 

Yaslaw

n/a
Moderator
Hast du KlientenNr als Paramter in der Abfrage definiert?
Ansonsten, da du nur ein Parameter hast, kannst du über den Index zugreifen
Visual Basic:
qry.Parameters(0).Value = Me.KlientenNr
 

Biber3

Erfahrenes Mitglied
Moin Yaslaw,

Hast du KlientenNr als Paramter in der Abfrage definiert?
An welcher Stelle deiner Schritt-für-Schritt Anleitung sollte er
a) das denn geahnt oder getan haben und
b) wo am Himmels Willen solte irgendein Parameter denn greifen, wenn dein vorletzter Tipp doch war "nimm die WHERE-Klausel raus" ;)

@Alex777
Wenn es bei dir jetzt eine gespeicherte Query "myQuery" gibt, dann muss in der ersten Zeile etwas stehen wie..
PARAMETERS KlientenNr as Long /* oder "as String" gemäß Datentyp */

Und es muss auch eine WHERE-Klausel geben, in der irgendein Tabellenfeld gegen den Wert dieses Parameters geprüft wird.

Es sei denn, ich bin im vollkommen falschen Film.

Grüße
Biber
 

Yaslaw

n/a
Moderator
Stimmt. Mein Fehler. Heute muss Montag sein...
natürlich brauchst du den WHERE
SQL:
PARAMETERS KlientenNr As Long;
SELECT ...
FROM ...
WHERE dbo_Kostentr.KostentrTypID=[KlientenNr];
 

Alex777

Mitglied
Also jetzt bin ich komplett verwirrt :D :D

Meine Query "Berichtkv" lautet weiterhin wie folgt:

SQL:
SELECT dbo_Klient.KlientenNr, dbo_Klient.Nachname, dbo_Klient.Vorname, dbo_Klient.Strasse, dbo_Klient.PLZ, dbo_Klient.Ort, dbo_Klient.VersichertenNr, dbo_Kostentr.Name1, dbo_Kostentr.Strasse, dbo_Kostentr.PLZ, dbo_Kostentr.Ort, dbo_Kostentr.KostentrTypID
FROM dbo_Kostentr INNER JOIN (dbo_Klient INNER JOIN dbo_KlientKostentr ON dbo_Klient.KlientID = dbo_KlientKostentr.KlientID) ON dbo_Kostentr.KostentrID = dbo_KlientKostentr.KostentrID
WHERE (((dbo_Kostentr.KostentrTypID)=2));

Meine VBA Funktion lautet
Code:
Function fillVHP()
Dim appword As Word.Application
Dim doc As Word.Document
Dim Path As String
Dim rs As Recordset
Dim qry As QueryDef

Set qry = CurrentDb.QueryDefs("Berichtkv")
qry.Parameters(0).Value = Me.KlientenNr

Set rs = qry.OpenRecordset


On Error Resume Next
Error.Clear
Path = "Z:\01. Verwaltung\Neuaufnahme-Mappe\Vorlagen neue Patientenmappe\Antrag Verhinderungspflege_Stand_20171128.docx"
Set appword = GetObject(, "word.application")
If Err.Number <> 0 Then
Set appword = New Word.Application
appword.Visible = True
End If
Set doc = appword.Documents.Open(Path, , True)

With doc
    .Formfields("txtPK").Result = rs!Name1
    .Formfields("txtStrasse").Result = rs!Strasse
    .Formfields("txtPlz").Result = rs!PLZ
    .Formfields("txtOrt").Result = rs!Ort
End With
rs.Close
qry.Close

appword.Visible = True
appword.Activate
Set doc = Nothing
Set appword = Nothing
End Function

Muss die SQL Anweisung der eigentlichen Query geändert werden?
 

Biber3

Erfahrenes Mitglied
Moin Alex777,

ich hoffe, ich bringe jetzt nicht zuviel Chaos in diesen Thread... ich versuch mal von deinem Ur-SELECT auszugehen

SQL:
SELECT dbo_Klient.KlientenNr
     , dbo_Klient.Nachname
     , dbo_Klient.Vorname
     , dbo_Klient.Strasse
     , dbo_Klient.PLZ
     , dbo_Klient.Ort
     , dbo_Klient.VersichertenNr
     , dbo_Kostentr.Name1
     , dbo_Kostentr.Strasse
     , dbo_Kostentr.PLZ
     , dbo_Kostentr.Ort
     , dbo_Kostentr.KostentrTypID
FROM dbo_Kostentr
 INNER JOIN (dbo_Klient INNER JOIN dbo_KlientKostentr ON dbo_Klient.KlientID = dbo_KlientKostentr.KlientID)
   ON dbo_Kostentr.KostentrID = dbo_KlientKostentr.KostentrID
WHERE (((dbo_Kostentr.KostentrTypID)=2));

Zu diesem SELECT hatte ich sinngemäß geschrieben:
"Hey, da sind die Felder Strasse, Ort und PLZ doppelt, das ist nicht so schlau."

Andere Baustelle war die Idee von Yaslaw:
Da sollte auch noch ein Parameter namens "KlientenNr" rein , um auf einen bestimmten Klienten filtern zu können.

Beides zusammen würde (ungetestet) führen zu einer geänderten Query:

SQL:
PARAMETERS KlientenNr as Long;
SELECT dbo_Klient.KlientenNr
     , dbo_Klient.Nachname
     , dbo_Klient.Vorname
     , dbo_Klient.Strasse
     , dbo_Klient.PLZ
     , dbo_Klient.Ort
     , dbo_Klient.VersichertenNr
     , dbo_Kostentr.Name1
     , dbo_Kostentr.Strasse AS KostTR_Strasse
     , dbo_Kostentr.PLZ AS KostTr_PLZ
     , dbo_Kostentr.Ort AS KostTr_Ort
     , dbo_Kostentr.KostentrTypID
FROM dbo_Kostentr
 INNER JOIN (dbo_Klient INNER JOIN dbo_KlientKostentr ON dbo_Klient.KlientID = dbo_KlientKostentr.KlientID)
   ON dbo_Kostentr.KostentrID = dbo_KlientKostentr.KostentrID
WHERE dbo_Kostentr.KostentrTypID)=2
AND dbo_Klient.KlientenNr =[KlientenNr]

In deinem VBA ändert sich nix (so weit ich sehe), du kannst da wie Yaslaw schreiben:
qry.Parameters(0).Value = Me.KlientenNr ' (wie jetzt)

...oder, wie ich es schreiben würde
qry!KlientenNr = Me.KlientenNr

Und dann sollte es fliegen.

Grüße
Biber
 

Alex777

Mitglied
Ah okay, jetzt sehe ich wieder klarer :D

Bei
Code:
PARAMETERS KlientenNr AS Long;

sagt er immer "Syntaxfehler in PARAMETER-Klausel"

Zum Verständnis, am Ende wird ja auf KlientenNr abgefragt.. Wo ist in dieser Abfrage die Verbindung zu dem auf dem Formular gewählten Datensatz? Also wie bekommt die Variable KlientenNr den Wert aus dem Formular?
 
Zuletzt bearbeitet:

Neue Beiträge