Neuigkeiten:

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

Mobiles Hauptmenü

DoCmd.OutputTo - 2 Optionen

Begonnen von kingwambi, Juli 29, 2013, 14:04:53

⏪ vorheriges - nächstes ⏩

kingwambi

Hallo - ich verwende unten stehenden Code um ein Formular als PDF zu speichern - funktioniert gut, jedoch hakt es noch bei folgendem. Ich möchte zwei verschiedene Varianten
Was muss ich abändern, dass

Variante 1) nur der aktuell angezeigte Datensatz gespeichert wird
Variante 2) alle Datensätze - jedoch jeder Datensatz in ein eigenes PDF
(Vorgehensweise - Formular wird geöffnet, Button gedrückt)

----------------------------------------------------------------------------------------

Private Sub PDF_speichern_Click()

Dim Berichtsname As String
    Dim BerichtZusatz As String
    Dim BerichtZusatz2 As String
   
    Berichtsname = Me!Inventarnummer
    BerichtZusatz = Me!Kundennr2
    BerichtZusatz2 = Me!Prüfdatum
   
   
    DoCmd.OutputTo acOutputForm, "frm_Prüfprotokoll_DVE", acFormatPDF _
                 , "D:\" & Berichtsname & "_" & BerichtZusatz & "_" & Format(BerichtZusatz2, "yyyymmdd") & ".pdf", False
                 
End Sub

DF6GL

Hallo,

such mal hier im Forum nach "Bericht PDF" , da wirst Du dann das Prinzip finden, wie sowas gelöst werden kann:


V1):   Einer gespeicherten (Formular-)Abfrage per VBA deren Eigenschaft "SQL" einen mit dem passenden Kriterium  zusammengebauten SQL-String zuweisen und das Form mit Outputto "drucken"
V2: Wie V1, lediglich in einer Recordset-Schleife jeweils den Primärschlüsselwert als Kriterium zum SQL-String zusammenbauen und ausdrucken.

kingwambi

#2
Hallo - ich durchforste schon seit geraumer Zeit das Forum. Ich bin froh, dass ich den vorhandenen Code mithilfe des Forums erstellen konnte - 0 Vorwissen mit VBA.

Im Hintergrund habe ich Kriterien in der (Form)Abfrage. Nun erhalte ich aus Gesamt 2000 Datensätzen zb 20 Datensätze im Form angezeigt. Nun blättere ich zu Datensatz 7 - und nur diesen gerade angezeigten möchte ich speichern. (Wie Druckbefehl: DoCmd.RunCommand acCmdSelectRecord / DoCmd.PrintOut acSelection)

Version 2 erwähne ich noch mal nicht - bis ich das behirnt habe.

bahasu

Hi,

beim Wechsel eines Datensatzes bzw. beim Schließen eines Formulars wird der Datensatz bereits gespeichert.

Ansonsten kann gespeichert werden mit:
       DoCmd.RunCommand acCmdSaveRecord                    ' Eingaben speichern

Harald
Servus

kingwambi

Hallo - ich meine eigentlich nicht den normalen Speicher Befehl, das ist mir klar, sondern mit Befehl docmd.outputto speichern als PDF - nur den einen angezeigten Datensatz

ZitatPrivate Sub PDF_speichern_Click()

Dim Berichtsname As String
    Dim BerichtZusatz As String
    Dim BerichtZusatz2 As String
   
    Berichtsname = Me!Inventarnummer
    BerichtZusatz = Me!Kundennr2
    BerichtZusatz2 = Me!Prüfdatum
 
   
    DoCmd.OutputTo acOutputForm, "frm_Prüfprotokoll_DVE", acFormatPDF _
                 , "D:\" & Berichtsname & "_" & BerichtZusatz & "_" & Format(BerichtZusatz2, "yyyymmdd") & ".pdf", False

Im Prinzip die gleiche Vorgehensweise wie beim Druck (mit folgendem Befehl drucke ich ja auch nur das Blatt in der Ansicht) - eben nur als PDF speichern:
ZitatDoCmd.RunCommand acCmdSelectRecord / DoCmd.PrintOut acSelection

DF6GL

Hallo,

ja und nun?

Es wurde alles schon beantwortet..  Wo hängt es nun genau?


kingwambi

#6
Hallo - sorry - ich weiß aber mir sagt folgendes eben nichts - eben kein Access Gott - Anfänger.

ZitatEiner gespeicherten (Formular-)Abfrage per VBA deren Eigenschaft "SQL" einen mit dem passenden Kriterium  zusammengebauten SQL-String zuweisen

Eventuell reden wir auch von 2 untersch Dingen. Mit einer Abfrage mit Kriterien kann ich dies auch nicht lösen - Kriterien sind in der Formularabfrage schon hinterlegt - von den 2000 Datensätzen zeigt es mir eh nur 20 an - ich möchte jedoch nur den einen den ich angezeigt bekomme zb. Seite 7 wegspeichern. Eben ähnlich wie beim Druckbefehl "aktuellen Datensatz drucken"

bahasu

#7
Hi,

und hier haben wir ein Beispiel, dass Crossposting mehr schadet als nutzt:
Die eben von mir eingestellte Lösung habe ich wieder gelöscht, nachdem ich http://www.office-loesung.de/ftopic611504_0_0_asc.php gefunden hatte.

Harald
Servus

kingwambi

Hallo - Sorry - es war mir nicht bewusst dass dies nicht gerne gesehen wird - ich bin kein großer Poster. Ich wollte nur rasch zu einer Lösung kommen - ich Entschuldige mich dafür und werde dies in Zukunft lassen.

Eventuell würde sich trotz meines Verstoßes noch jemand zu einer Lösung bewegen lassen

bahasu

#9
ok,

neuer Versuch.

0) Ich setze voraus, Du hast eine eindeutige ID für den Datensatz. Falls nein, als auto-Feld in der Tabelle anlegen.

1) Im Modul (dessen Name ist beliebig) eine globale Variable deklarieren:
   Public Datensatz_id_fuer_Bericht As Long

2) Jetzt gilt es zu klären, wie festgelegt wird, ob nur EINER oder VIELE Datensätze zu drucken sind:
2a) Ist z.B. über einen Button lösbar. Dann dort im Ereignis "Bei Klicken" einfügen:
       Datensatz_id_fuer_Bericht = Me.Dein_id_Feld    ' bitte den von Dir bestimmten Namen verwenden
Zum Zurücksetzen dann noch einen Button anlegen und dort "Bei Klicken" eintragen:
       Datensatz_id_fuer_Bericht = 0

2b) Alternativ kann auch beim pdf-Druck-Button das Ereignis "Bei Mausbewegung" ausgenutzt werden:
   If Shift = 2 Then                         ' die strg-Taste wurde gedrückt beim Mausklicken
       Datensatz_id_fuer_Bericht = Me.Dein_id_Feld    
   Else
       Datensatz_id_fuer_Bericht = 0
   End If


3) Jetzt im Bericht, auf den die zu erstellenden pdf-Datei beruht, im Ereignis "Beim Öffnen" eintragen:
Private Sub Report_Open(Cancel As Integer)
   If Nz(Datensatz_id_fuer_Bericht, 0) > 0 Then
       Me.Filter = "Dein_id_Feld = " & Datensatz_id_fuer_Bericht
       Me.FilterOn = True
   Else
       Me.Filter = ""
       Me.FilterOn = False
   End If
End Sub


Falls das zu unverständlich ist, stell eine komprimierte und gezippte Datenbank mit wenigen Datensätzen im a2003-Format zur Verfügung.

Harald
Servus

kingwambi

Hallo - ich hab mich bemüht - schaut nicht so gut aus ???. Um dich nicht noch länger zu nerven hab ich alles wichtige rausgenommen und die Datenbank angehängt.
Öffne ich das Formular Blutsperre bekomme ich richtig 2 der 4 Datensätze angezeigt. Drücke ich im Formular auf den Button "PDF" erstellt er mir richtig das PDF auf "D:\" Jedoch beide Datensätze in ein PDF.
Ich würde jedoch gerne
1) einen Button haben in dem ich nur den aktuell angezeigten Datensatz speichere, jenen, den ich mir gerade ansehe - (Datensatz 1 von 2) und
2) einen Button mit dem ich auf Klick alle ausgewählten, in meinem Fall beide Datensätze, in je ein getrenntes PDF speichern kann - mit den hinterlegten docmd.outputto Kriterien.

Wenn du mir dies in einem Beispiel zeigen könntest - das wäre der Hammer ;D

[Anhang gelöscht durch Administrator]

bahasu

Hallo,

siehe Anhang.
Hinzugefügt wurde:
- Modul_Deklaration,
- zwei Buttons im Formular (habe sie im Kopf platziert, bitte an geeignete Stelle setzen)

Bei diesen Buttons gibt es das Klick.-Ereignis. Dort wird "Datensatz_id_fuer_Bericht" gesetzt und Deine Routine zum Drucken der pdf-Datei aufgerufen (call ...)

In der Routine zum pdf-Drucken wurden neue Zeilen hinzugefügt: Diese sind durch Kommentare ersichtlich.

Anmerkung:
Ich war davon ausgegangen, dass Du einen Bericht zur Vorlage der pdf-Datei verwendest. Das hätte den Vorteil, dass das Layout für den Ausdruck etwas "schöner" gestaltet werden kann und dass dort die zuvor bemerkten Zeilen (if nz(...) eingebaut werden können. Habe also das Setzen der Filter-Bedingung vor die "outout-Zeile gesetzt. Nach der out-put-Zeile wird der Filter wieder zurückgesetzt. Diese Variante wird allerdings Probleme geben, wenn Du selber Filter verwendest. Lösung ist ein eigener Bericht.

Wenn Du mehr als einen Datensatz als pdf-speicherst, bekommt er einen Namen, der auf nur einen Datensatz hindeutet. Soll das so bleiben?

Hoffe, es hat geholfen.

Harald

[Anhang gelöscht durch Administrator]
Servus

kingwambi

Hallo - erstmals vielen Dank!! Ich bin voll Happy  :D - das mit dem Einzeldruck funktioniert genau so wie ich es mir vorgestellt habe. Und wenn man es sieht versteht man es auch langsam - was mir sehr wichtig ist.

Jedoch wirft er beim Button "alle Datensätze" alle Datensätze in ein einziges PDF  - es sollten jedoch lauter einzelne werden. Wie ich im Forum herausgelesen habe - im Prinzip wie die Einzeldrucklösung mit einer Schleife oder so. Wäre es möglich für dich das noch einzubauen?

LG Jürgen

DF6GL

#13
Hallo,

versuch mal das :


Private Sub alle_Datensaetze_Click()

Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone

If Not (rs.BOF Or rs.EOF) Then
   rs.MoveFirst
   Do Until rs.EOF
       Datensatz_id_fuer_Bericht = rs!ID_Prüfprotokoll
       PDF_erstellen_Click
   rs.MoveNext
   Loop
End If

Set rs = Nothing

End Sub


(not checked)

kingwambi

Hallo

ich bekomm einen Laufzeitfehler 3420 - das Objekt ist ungültig oder es ist nicht mehr festgelegt. Gehe ich auf Debugger markiert er das Feld rs.MoveNext