Toon posts:

[access] Word-merge en subformulier

Pagina: 1
Acties:

Verwijderd

Topicstarter
ok, de wanhoop nabij!

De volgende formulieren:
frm_factuur - hoofdgegevens van een factuur (klant, factuurnummer, etc)
sub_factuur - details van de factuur (regels met aantal, prijs, enzovoorts)

Ik wil (ivm layout) samenvoegen naar een Word-document, dat regel ik met een knopje en de volgende code: (ik heb wat Dim's en andere ellende weggelaten ivm leesbaarheid)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   Set prps = pappWord.ActiveDocument.CustomDocumentProperties
   prps.Item("datum").Value = Nz(Me![datum])
   prps.Item("bedrijfsnaam").Value = Nz(Me![bedrijfsnaam])
   prps.Item("adres").Value = Nz(Me![adres1])
   prps.Item("PCW").Value = Nz(Me![postcode]) & " " & Nz(Me![woonplaats])
   prps.Item("factuurnummer").Value = Nz(Me![factuurnummer])
   prps.Item("betreft").Value = Nz(Me![ovv])
   
   With pappWord
      .Visible = True
      .Selection.WholeStory
      .Selection.Fields.Update
      .Activate
      .Selection.EndKey Unit:=wdStory
   End With


En it works like a charm! Máár, ik wil dus op diezelfde factuur (uiteraard) ook de regels van sub_factuur opnemen. Ik heb gezocht om een WHILE loopje te maken, met iets van recordcount of iets van dien aard, maar het werkt allemaal niet. Wie kan me op weg helpen?

[ Voor 15% gewijzigd door Verwijderd op 20-12-2004 14:59 ]


Verwijderd

Topicstarter
Inmiddels al een link geprobeer en Helen Feddema's erop nageslagen, maar kom er niet uit. Wie heeft een hint?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:44

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op maandag 20 december 2004 @ 17:28:
Inmiddels al een link geprobeer en Helen Feddema's erop nageslagen, maar kom er niet uit. Wie heeft een hint?
Als je iets toe wilt voegen aan je post dan kan je ook de edit knop gebruiken. Dit scheelt weer het onnodig kicken van je topic (wat eigenlijk pas na 24 uur is toegestaan ;) ).

Overigens: het werkt niet? Wat werkt er niet? Krijg je een foutmelding?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Je m'excuse.

Het mergen van de data met het Word-document van de gegevens op het hoofdformulier werkt als een trein. De gegevens komen prima op hun plek terecht en het ziet er zelf nog wel een beetje gelikt uit. Maar dat is dan ook een eitje, want er is voor iedere veldnaam maar één gegeven (d.w.z één bedrijfsnaam, één factuurnummer enzovoorts).

Ik ben dus op zoek naar een methode om de gegevens van het subformulier in het worddocument te verwerken. Met een Access report is dat uiteraard een eitje (daar is het dan ook voor gemaakt), maar ik heb werkelijk niet één nuttige lead kunnen vinden om dit met Word te doen.

Voor de duidelijkheid: het moet dus in Word vanwege layout-issues.

  • JJvG
  • Registratie: Juli 2003
  • Laatst online: 27-04 16:49
Een aantal tips:
- Maak een query met als parameter het factuurID in je hoofdformulier
- Haal het resultaat van de query in je VB code als recordset
- Definieer in je Word document een bookmark (om eenvoudig via vb naar de juiste plek te komen)
- Ga in je VB code naar de bookmark (bijv in een tabel) en zet je recordset weg op die plek

Binnen Word zit ook nog functionaliteit om door recordsets te lopen, maar omdat je niet weet hoeveel records er in je recordset hebt, kun je die niet gebruiken.

Mocht je voorbeeldcode nodig hebben, dan kun je me ook effe mailen.

Verwijderd

Topicstarter
Met de duw van JJvG in de rug heb ik inmiddels wat progressie gemaakt. Ik heb de volgende code geknutseld:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Dim rstDetails As New ADODB.Recordset

rstDetails.Open "factuur_detail", CurrentProject.Connection
If rstDetails.RecordCount = 0 Then
MsgBox "Er zijn geen details voor deze factuur ingevoerd"
Exit Sub


Else
Dim appWord As New Word.Application

With appWord
.Documents.Add "c:\wgi_factuur.dot"
.ActiveDocument.ShowSpellingErrors = False
.Selection.GoTo wdGoToBookmark, Name:="omschrijving"
.Visible = True
End With

Do Until rstDetails.EOF
appWord.Selection.TypeText rstDetails!omschrijving & " "
rstDetails.MoveNext
Loop
End If

End Sub


en dit werkt. Tenminste, als ik een query bouw die niet van een formulier afhankelijk is. (SELECT * zegmaar), maar de query die ik wil gebruiken, selecteerd aan de hand van het factuurnummer, de items die op de factuur komen te staan (met hoeveelheid, omschrijving, prijs enzovoorts). Die query heeft dus WHERE factuurnummer = Form![facturen]![factuurnummer].
Deze query doet het prima, maar als ik met bovenstaande code naar die query verwijs, dan krijg ik:
Invalid SQL Statement, expected SELECT, INSERT, enzovoorts.

Wat doe ik fout?

  • JJvG
  • Registratie: Juli 2003
  • Laatst online: 27-04 16:49
Je doet niets fout, alleen wanneer je hoofdformulier meerdere records heeft, zal de query dus ook meerdere records (met bijbehorende detailrecords) teruggeven. Wat je het beste kunt doen is op je hoofdformulier, bij de button die de functie aanroept als parameter het huidige ID meegeven. Je krijgt dan iets van:

pseudocode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Public Sub cmdMerge_Click(events...)
Dim intID as Integer
intID = NaamVanIDVeld.Value
'Optioneel: validatie?
Call NaamVanJeMergeFunctie(intID)

End Sub
'----------
'Aparte module voor je functie (bijv: modWord)
Public Function NaamVanJeMergeFunctie(ByVal ID as Integer)
' zie *
End Function


* De volgende zaken moet je dan nog doen in je functie:
- Query aanpassen in een query ZONDER Where statement
- SQL van de query uitlezen (via Querydefs.sql)
- SQL aanvullen met je eigen WHERE statement (met ID-parameter)
- SQL uitvoeren en in een recordset stoppen (via adodb.connection execute geloof ik)

Edited:
En dan nu de echte code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
'Uitlezen van je Database doe je zo:
'-----------------------------------
    Dim strSQL As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    strSQL = "SELECT * " & _
                "FROM qrymodWord_FUNCTIENAAM " & _
                "WHERE Kolom=""" & ID & """"
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
    
    'Indien er geen records zijn, zal een leeg resultaat worden teruggegeven.
    If rs.EOF Then
        'Foutafhandeling
    Else
        'Je dingen doen
    End If

'Naar een bookmark en je data wegzetten doe je zo:
'------------------------------------------------
    objWordDoc.Content.Bookmarks("BOOKMARKNAAM").Select
    Do While Not rs.EOF
        objWordApp.Selection.TypeText rs("KOLOMNAAM").Value
        rs.MoveNext
        If Not rs.EOF Then
            objWordApp.Selection.TypeParagraph
        End If
    Loop

[ Voor 35% gewijzigd door JJvG op 21-12-2004 18:10 ]


Verwijderd

Topicstarter
Met de bovenstaande code (met een kleine wijziging; de intID moest in de query niet tussen "'s komen te staan), heb ik e.e.a. nu aan de gang. Mijn dank is groot!

[ Voor 154% gewijzigd door Verwijderd op 22-12-2004 10:34 ]

Pagina: 1