Neuigkeiten:

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

Mobiles Hauptmenü

Bericht als PDF speichern (mit WHERE CONDITION)

Begonnen von cyberchris, Dezember 21, 2011, 13:51:26

⏪ vorheriges - nächstes ⏩

cyberchris

Hallo,

ich benötige mal wieder Hilfe.

Ein Bericht soll als PDF gespeichert werden.
Würde meinerseits auch funktionieren, wenn ich keine WHERE CONDITION Bedingung verwenden würde. Mit bekomme ich das leider nicht hin:

Analog zu Drucken soll der Bericht auch gespeichert werden können (auch ohne Drucken):
DoCmd.OpenReport "PMDB-Auszug_XS", acViewNormal, , Filter
DoCmd.Close acReport, "PMDB-Auszug_XS", acSaveNo

Mein Versuch:
DoCmd.OpenReport "PMDB-Auszug_XS", acPreview, , Filter, acHidden
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4
DoCmd.Close acReport, "VRDB-Auszug_XS", acSaveNo

Vielen Dank
Gruß Christoph

DF6GL

HAllo,

erstelle den SQL-String mit angehängter Where-Condition und weise den der Berichtsabfrage zu. Sodann kannst Du Outputto benutzen, um den Bericht als PDF-Datei zu speichern:
.
.
.
Currentdb.Querydefs("BerichtsAbfrage").SQL = "Select * from tblTabelle where [ID] =" & Me!ID
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4
.
.

cyberchris

Hallo,

muss ich dann erst noch eine Abfrage erstellen?
Was muss denn dann da rein? Ist das so umständlich?

CurrentDb.QueryDefs("BerichtsAbfrage").SQL = "Select * from PMDB where " & Filter
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4

Danke
gruß Christoph

DF6GL

#3
Hallo,

hast Du nicht schon eine Abfrage für den Bericht  ("BerichtsAbfrage") ?  Kopier deren SQL-Ansicht  in den VBA-Editor als SQL-String (wie im einfachen Beispiel) , pass ihn syntaktisch an und entferne evtl. Where-Condition (wie auch Sortierungen und Gruppierungen, die werden im Bericht selber behandelt) und fertig.

Was ist da umständlich?

Zitat"Was muss denn dann da rein"

In die Abfrage?   Na , die Tabellen und Verknüpfungen, aus denen Du die Felder (Daten)  für den Bericht entnehmen willst...





ZitatCurrentDb.QueryDefs("BerichtsAbfrage").SQL = "Select * from PMDB where " & Filter


Was ist PMDB?

"Filter" ist keine gute Wahl für eine(n) Variable(nnamen), wenn es denn eine(r) ist.


cyberchris

Hallo,

ich habe hierfür keine Abfrage.
In einem Formular filtere ich die erforderlichen Daten und lege diese in den String "Filter"
Damit öffne ich den Bericht "PMDB-Auszug_XS" und übergebe den Filter mit OpenArgs.
Den Bericht kann ich so ausdrucken oder per E-Mail verschicken und das ohne einer Abfrage, aber speichern bekomme ich eben nicht hin.

PMDB ist die Tabelle mit den Datensätzen...

Gruß Christoph

DF6GL

Hallo,


dann mach doch eine Abfrage mit Namen "Berichtsabfrage" (egal, welche Tabelle dafür verwendet wird. Sinnvoll wäre natürlich, die Tabelle "PMDB"  hinzufügen und das Sternchen in eine Abfragespalte zu ziehen) und weise die der Datenherkunft des Berichtes zu.  Die Openargs-Übergabe im Bericht-Open-Ereignis kannst Du Dir dann sparen.


Wie gesagt, benenne "Filter" in z. B. "strFilter" um...

Zeige mal den Inhalt dieser String-Variablen...

cyberchris

Hallo,

Die Abfrage "Berichtsabfrage" habe ich erstellt mit der Tabelle "PMDB"
Filter ist der Formularfilter

Beispiel des Inhalts Filter: VorgangID = '88H'
Habe es auch alternativ versucht aber immer mit der Fehlermeldung: Syntaxfehler (fehlender Operator in Abfrageausruck '[VorgangID]=88H'

In der Tabelle PMDB gibt es die Spalte "VorgangID"

Hier der Versuch:
CurrentDb.QueryDefs("Berichtsabfrage").SQL = "Select * from PMDB where [VorgangID] =" & Me!cmbVorgangID
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4

Gruß Christoph

DF6GL

Hallo,

wennn ""88H" eine gültige Filterbedingung ist, dann handelt es sich um Datentyp TEXT (des Tabellenfeldes "VorgangID") und die SQL muss so lauten:

CurrentDb.QueryDefs("Berichtsabfrage").SQL = "Select * from PMDB where [VorgangID] ='" & Me!cmbVorgangID & "'"

(Irgendwie glaube ich das aber nicht..)

cyberchris

Hi,

was glaubst du nicht. im "cmbVorgang" ist die Spalte "VorgangID" aus der Tabelle "PMDB".

Leider funktioniert dein Codeschnipsel nicht. Er versucht immer die kompletten Datensätze in ein PDF zu speichern.

Wie ist da überhaupt die Verbindung von der Abfrage und der Speichern Funktion?
Die Abfrage läuft über die Berichtsbfrage und der Report über PMDB-Auszug_XL - wie soll das funktionieren?

verz4 = verz2 & "\Anf " & txtKurzzeichen.Value & " " & dateGER & " " & Lieferant.Column(2) & " " & Lieferscheinnummer.Column(1) & ".pdf"
CurrentDb.QueryDefs("Berichtsabfrage").SQL = "Select * from PMDB where [VorgangID] ='" & Me!cmbVorgangID & "'"
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4


Danke & Gruß Christoph

database

Hallo,

ich lese diesen Thread seit Beginn mit.
Dabei sind mir ein paar Dinge aufgefallen:
Zitat
Mein Versuch:
DoCmd.OpenReport "PMDB-Auszug_XS", acPreview, , Filter, acHidden
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4
DoCmd.Close acReport, "VRDB-Auszug_XS", acSaveNo
Du öffnest hier einen Bericht, möchtest diesen im *.PDF - Format ausgeben und schließt im Anschluß daran einen ganz anderen Bericht  ???

ZitatIn der Tabelle PMDB gibt es die Spalte "VorgangID"
Und welche Daten entält diese Spalte - als mit ...ID bezeichnet sollte man davon ausgehen, dass diese ein Zahl vom Typ LongInteger zum Inhalt hat.
Wenn du ein Kombi in Verwendung hast, dem du einen Wert zur Filterung entnimmst, sollte das Kombi so eingestellt sein, dass die GEBUNDENE Spalte mit einer Spaltenbreite von 0 an der ersten Stelle steht
und ein ein anzuzeigender TEXT in der nachflolgenden mit entsprechender Spaltenbreite.
Somit wird dann '88H' angezeigt aber bei der Zuweisung durch ...
where [VorgangID] =" & Me!cmbVorgangID
... nicht der angezeigte Text sondern der Inhalt der gebundenen Spalte übergeben - also die LongInteger-Zahl.
Die Funktionalität dieser WHERE-Klausel ist natürlich vom Inhalt des Tabellenfeldes '[VorgangID]' stark abhängig - als FK, sollte es sich um die n-Seite einer 1:n Bezeihung handeln
bzw. als PK in einer Primärtabelle sollte dieses entsprechend ebenfalls ein LongInteger-Feld sein und somit dem Inhalt des Kombis entsprechen.

Daher empfehle ich dir erst mal den Code schrittweise zu durchlaufen und durch Überfahren von 'Me!cmbVorgangID' mit dem Mauscursor zu überprüfen WAS da wirklich 'rüberkommt.
Dem Ergebnis dieser Recherche entsprechend kannst du dann deinen Code so belasssen oder folgst den Empfehlungen ...
Zitatwennn ""88H" eine gültige Filterbedingung ist, dann handelt es sich um Datentyp TEXT ...
... von DF6GL.

In JEDEM Fall aber solltest du dann anhand der Erkenntnisse diesen SQL-String in einem Abfrageentwurf testen um zu sehen ob die richtigen (erwarteten) Datensätze duch diesen SQL-String lieferbar sind.

Mit dieser Anweisung ...
CurrentDb.QueryDefs("Berichtsabfrage").SQL = "Select * from PMDB where [VorgangID] ='" & Me!cmbVorgangID & "'"
... wird der Abfrage 'Berichtsabfrage' den NEUER, aktualisierter SQL-String zugeteilt.
Somit mußt du natürlich Sorge dahingehend tragen, dass dein Bericht (PMDB-Auszug_XS) - also jener, den du als *.PDF ausgeben willst - DIESE Abfrage ('Berichtsabfrage') als Datenherkunft besitzt.

Wenn dieses so realisiert ist, du auf deinem Formular die Auswahl getroffen hast und statt dieser Zeile ...
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS", acFormatPDF, verz4
jene einbaust (obige kannst du auskommentieren)
DoCmd.OpenReport "PMDB-Auszug_XS", acViewPreview
... dann MÜSSTE dieser Bericht genau jene Datensätze anzeigen, die du durch die Abfrage im Vorfeld angezeigt bekommen hast.
Ist das so, dann kannst du die 'Preview'-Zeile löschen und den Kommentar bei deiner Zeie wieder entfernen.

Zitat....Er versucht immer die kompletten Datensätze in ein PDF zu speichern....
Dass nach oben angegebenem Vorgang der Bericht als *.PDF andere Daten als die im 'Preview' gesehenen ausgibt ist dnn aber m.E. eher als weihnachtliche Zauberei zu bezeichnen.

Zitat(Irgendwie glaube ich das aber nicht..)
Somit schließe ich mich 1:1 dieser, von Franz geäußten Befürchtung an - ich vermute nämlich auch ...
ZitatDie Abfrage läuft über die Berichtsbfrage und der Report über PMDB-Auszug_XL - wie soll das funktionieren?
... dass dein Bericht NICHT die richtige Datenherkunft aufweist oder ganz einfach
eine nicht richtig eingestellte Abfrage als Datenherkunft besitzt.
Worst Case ... die Felddefinitionen der beteiligten Tabelle(n) entsprechen nicht jenen einer relationalen DB.

HTH

....und weihnachtliche Grüße aus dem verregneten Niederösterreich

cyberchris

Hallo,

den ersten Code hatte ich falsch zusammenkopiert...stimmt.

Die VorgangID ist ein String

bisher öffne ich den Bericht der ausgesuchte Spalten der Tabelle PMDB enthält. Der Bericht zeigt ohne die Filterübergabe alle Datensätze an.
Wenn ich den Bericht ändern würde, könnte ich diesen ja nicht mehr so wie gewohnt verwenden. Daran liegt auch der Fehler.

Mit OpenArgs wird der Filter übergeben. Der Bericht wird dann per PDF in eine E-Mail gehängt.

Dachte, dass man diesen Bericht einfach (ohne separate Abfrage) speichern kann. Dem ist wohl nicht so.

database

#11
Hallo,

ZitatDachte, dass man diesen Bericht einfach (ohne separate Abfrage) speichern kann. Dem ist wohl nicht so

Was meinst du bitte mit separater Abfrage - die ist nicht separat, die ist die Datenherkunft deines Berichts!
Und wird je nach Auswahl in deinem Kombi geändert und somit DYNAMISCH gestaltet.
Hast du meine Empfehlung ausprobiert?

ZitatWenn ich den Bericht ändern würde, könnte ich diesen ja nicht mehr so wie gewohnt verwenden
na dann kopierst halt den Bericht und die Abfrage und nimmst die Kopien für die Versuche mit der Ausgabe

Du weißt aber schon, dass ein Bericht eine Datenherkunft hat, die man ändern kann OHNE dass man am Berichtslayout oder
der Felderliste selbst herumzuschrauben braucht um das Ausgabeergebnis zu ändern.
Was spricht dagegen, meinen Vorschlag umzusetzen und so einen dynamischen Bericht zu erhalten,
nach der Ausgabe kannst du ja ohne weiteres die SQL des Berichts wieder auf 'ohne WHERE-Klausel zurückstellen'
das ist der gleiche Vorgang nur halt ohne Ausgabe.


cyberchris

Hi,

Danke für deine Antwort.

Aber nochmal: Ich habe keine separate Abfrage als Access-Objekt für den Bericht!
Weiterhin möchte ich möglichst die Dateigröße der Datenbank nicht weiter aufblähen. Habe schon als mde-Version über 12 MB.
Hätte dann ja wieder 2 weitere Objekte.

Ich probiere aber mal dein Vorschlag aus da ich ja dankbar bin, dass mein für mein Problem eine Lösung gesucht wird.

Danke
gruß Christoph

DF6GL

HAllo,


"Ich habe keine separate Abfrage als Access-Objekt für den Bericht!"


dann mach eine...

"Weiterhin möchte ich möglichst die Dateigröße der Datenbank nicht weiter aufblähen. Habe schon als mde-Version über 12 MB.
Hätte dann ja wieder 2 weitere Objekte."


Na und?  12 MB sind doch nicht bedenklich..    Die Größe kommt nicht von ein paar Abfragen...  Entwender hast massenhaft praktisch gleiche Abfragen (oder auch gleichartige Formulare) mit nur unterschiedlichen Filter-Kriterien und/oder es sind Bilder in Tabellen als OLE-Objekte eingebunden und/oder es sind Bilder auf Formularen oder sonstwo eingebaut.


Und Du solltest die DB über Reparieren/Komprimieren verkleinern (was bei der MDE-Erstellung allerdings schon passiert)




cyberchris

Hallo,

ich habe jetzt eine ganz einfache Lösung gefunden wie es wunderbar und ohne eine Abfrage funktioniert:

DoCmd.OpenReport "PMDB-Auszug_XS_P", acViewPreview, , Filter
DoCmd.OutputTo acOutputReport, "PMDB-Auszug_XS_P", acFormatPDF, verz4
DoCmd.Close acReport, "PMDB-Auszug_XS", acSaveNo

Trotzdem Vielen Dank & und noch nachträglich ein gutes, neues Jahr
Gruß Christoph