Zugriff auf Daten aus Abfrage

Alex777

Mitglied
Hallo zusammen,

leider habe ich trotz intensiver Suche nichts finden können :(

Bin ganz neu in dem Thema und baue für meine Firma eine Access Datenbank.
Nun möchte ich, dass wenn ein Button auf dem Formular gedrückt wird, Word geöffnet und mit Daten einer Abfrage gefüllt wird.
Ich habe das ganze bereits für ein anderes Word Dokument zum laufen bekommen. Da ist es aber so, dass die benötigten Daten auf dem aktuellen Formular Datensatz zu finden sind und ich dadurch mich "me.Feldname" arbeiten kann.

Für euch ist es wahrscheinlich ein Klacks.

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


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 = [I]berichtkv.Name1[/I]
    .Formfields("txtStrasse").Result = [I]berichtkv.Strasse[/I]
    .Formfields("txtPlz").Result = [I]berichtkv.PLZ[/I]
    .Formfields("txtOrt").Result = [I]berichtkv.Ort[/I]
End With
appword.Visible = True
appword.Activate
Set doc = Nothing
Set appword = Nothing
End Function

Aus der Abfrage "berichtkv" sollen die oben aufgeführten Felder verwendet werden. Bei Klick auf den Button bleiben die Textfelder in Word leider leer. Ersetze ich "berichtkv.Name1" durch "Hallo", öffnet sich Word auch mit "Hallo".
Also ist wahrscheinlich nur mein Syntax für den Zugriff falsch.

Kann mir jemand helfen?

Gruß
 
Ist das die Abfrage selber oder ein QueryDef oder Recordset Objekt in VBA?
Ich gehe mal vom ersteren aus.
Dann fehlt dir das folgende
Visual Basic:
Dim rs As Recordset
Dim sql As String

'Als Beispiel mit ein Filter auf die ID:
sql = "SELECT * FROM berichtkv WHERE id = " & mySelectedId
'Recordset öffnen
Set rs = CurrentDb.openRecordset(SQL)
rs.moveFirst

'Felder auslesen
.Formfields("txtPK").Result = rs!Name1

'Recordset schliessen
rs.Close
 
Vielen Dank für die schnelle Antwort!

Das ist die Abfrage selber, welche man in der normalen Access Oberfläche erstellt.
Die Abfrage liefert zur Zeit nur den Datensatz welcher die im Formular gewählte ID beinhaltet.

Ich habe den Code wie von dir vorgeschlagen angepasst.
Er meckert nun beim Ausführen wie folgt: "1 Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben" Markiert wird dabei die Zeile

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


sql = "Select * From berichtkv"
Set rs = CurrentDb.OpenRecordset(sql)
rs.MoveFirst

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

appword.Visible = True
appword.Activate
Set doc = Nothing
Set appword = Nothing
End Function
 
Klingt nach einem Klassiker
Wenn du deine Abfrage berichtkv von Hand öffnest. Kommt da die Frage nach einem Wert?
Ist das Formular, auf dass die Abfrage zugreift offen?

Grundsätzlich sollte man keine Abfragen machen, die auf Formularfelder zugreifen. Ist immer etwas wacklig.
 
Guten Morgen!

ja wenn ich die Abfrage von Hand öffne, fragt er nach einem Wert. Ich habe diese Bedingung jetzt entfernt und dafür in die SQL Abfrage eingefügt.
Leider bleibt die Problematik die gleiche. Wenn ich Die Funktion ohne Bedingung im SQL Teil ausführe, öffnet er Word mit den Daten des ersten Datensatzes der Abfrage. Wie kann ich nun abfragen dass er den Datensatz nimmt der im Formular gewählt wird? Weil folgendes funktioniert nicht:

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


sql = "Select * From berichtkv Where KlientenNr = Me.KlientenNr"
Set rs = CurrentDb.OpenRecordset(sql)
rs.MoveFirst

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

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

Gruß
 
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));
 
Moin Alex777,

du ziehst in deinem Resultset mehrere Felder mit gleichem Namen an (Strasse, PLZ, Ort jeweils aus zwei unterschiedlichen Tabellen).
Sorg dafür, dass jeder Feldalias nur 1x vorhanden ist, dann kann auch ein rs!Strasse oder Rs!ort eindeutig aufgelöst werden.

Also
SQL:
SELECT ...
     , dbo_Kostentr.Strasse as KostenTr_Str
     , dbo_Kostentr.PLZ as KostenTr_PLZ
     , dbo_Kostentr.Ort as KostenTr_Ort
...

Oder besser noch: hol dir nur die Felder, die du auch brauchst.

Grüße
Biber
 
Zurück