Aus dem Layout archivieren (coresuite)
Die bisher beschriebenen Abläufe archivieren nach der Ausgabe: Der Beleg wird gedruckt, die Datei landet im Druckverzeichnis, ein Timer holt sie ab. Es geht auch anders herum – das Layout selbst stößt die Archivierung an, im selben Moment, in dem der Anwender druckt.
Dieser Weg führt über eine zweite Druckdefinition, die das Dokument als PDF erzeugt und ins Archiv gibt. Ein kleines Skript im coresuite-Layout entscheidet, wann sie aufgerufen wird.
Wann dieser Weg sinnvoll ist
| Timer-Weg | Layout-Weg | |
|---|---|---|
| Archiviert wird | nach dem Lauf des Timers | sofort beim Drucken |
| Entscheidung | zentral über Einstellungen | je Belegart im Layout |
| Voraussetzung | Druckverzeichnis, Dateiname mit Kennungen | coresuite-Layout und eine Druckdefinition |
Der Layout-Weg lohnt, wenn der Beleg genau so ins Archiv soll, wie der Anwender ihn gerade ausgegeben hat – mit allen Layout-Entscheidungen, die zur Laufzeit fallen.
Das Beispielskript
'
' DocuWare Archivierung
'
' PrintDef für Archiv-PDF-Druck
If Not Engine.IsDoublePass Then
Dim DocuWareExport = False
Dim PrintDefinition = "U0000196"
' Nur bei echter Ausgabe archivieren, nie in der Vorschau
' LD.Par.PrintMode: "N" = Druck oder Vorschau, "P" = PDF, "E" = E-Mail,
' "F" = Fax, "W" = Word, "X" = Excel
' LD.Par.Preview: "Y" = Vorschau, "N" = keine Vorschau
Dim PrintMode = GetData("LD.Par.PrintMode")
Dim IsPreview = (GetData("LD.Par.Preview") = "Y")
Dim ArchiveThisOutput = (PrintMode = "N" AndAlso Not IsPreview) _
OrElse PrintMode = "P" OrElse PrintMode = "E"
' Verkauf
If GetData("LD.Par.FormType") = "149" Then DocuWareExport = False ' Angebot
If GetData("LD.Par.FormType") = "139" Then DocuWareExport = True ' Auftrag
If GetData("LD.Par.FormType") = "140" Then DocuWareExport = True ' Lieferung
If GetData("LD.Par.FormType") = "180" Then DocuWareExport = True ' Retoure
If GetData("LD.Par.FormType") = "133" Then DocuWareExport = True ' Rechnung
If GetData("LD.Par.FormType") = "179" Then DocuWareExport = True ' Gutschrift
If GetData("LD.Par.FormType") = "60091" Then DocuWareExport = True ' Reserve-Rechnung (AR)
If GetData("LD.Par.FormType") = "137" Then DocuWareExport = True ' Korrekturrechnung
' Einkauf
If GetData("LD.Par.FormType") = "142" Then DocuWareExport = True ' Bestellung
If GetData("LD.Par.FormType") = "143" Then DocuWareExport = False ' Wareneingang Bestellung
If GetData("LD.Par.FormType") = "141" Then DocuWareExport = False ' Eingangsrechnung
If GetData("LD.Par.FormType") = "181" Then DocuWareExport = False ' Eingangsgutschrift
If GetData("LD.Par.FormType") = "182" Then DocuWareExport = False ' Warenrücksendung
If GetData("LD.Par.FormType") = "60092" Then DocuWareExport = False ' Reserve-Rechnung (AP)
' Archivierung über die DocuWare-Druckdefinition
If DocuWareExport AndAlso ArchiveThisOutput _
AndAlso GetData("LD.SysPar.PrintDefCode") <> PrintDefinition Then
LayoutOpener.ExecutePrintDef(PrintDefinition, LayoutOpener.OpenLayoutModes.PDF, _
"DocEntry", GetData("LD.Par.DocEntry"), "FormType", GetData("LD.Par.FormType"))
End If
End IfWas das Skript tut
Es prüft drei Dinge, und erst wenn alle drei zutreffen, wird archiviert.
1. Nur im ersten Durchlauf
If Not Engine.IsDoublePass Thencoresuite rechnet Layouts mit Gesamtsummen zweimal durch. Ohne diese Klammer liefe die Archivierung bei jedem solchen Beleg doppelt.
2. Nur bei echter Ausgabe
Dim ArchiveThisOutput = (PrintMode = "N" AndAlso Not IsPreview) _
OrElse PrintMode = "P" OrElse PrintMode = "E"Archiviert wird beim Druck, beim PDF und beim E-Mail-Versand – nicht in der Vorschau. Das ist der Punkt, der sonst am meisten Ärger macht: Wer sich einen Beleg dreimal ansieht, hätte ihn sonst dreimal im Archiv.
„N" heißt Druck oder Vorschau
Der Druckmodus "N" allein genügt nicht – er steht für beides. Erst zusammen mit LD.Par.Preview = "N" steht fest, dass wirklich gedruckt wurde. Deshalb die zusätzliche Prüfung.
3. Nur die gewünschten Belegarten
Die Liste schaltet je Formulartyp frei. Die Nummern sind die Formulartypen von SAP Business One:
| Nummer | Beleg | im Beispiel |
|---|---|---|
149 | Angebot | nein |
139 | Auftrag | ja |
140 | Lieferung | ja |
180 | Retoure | ja |
133 | Ausgangsrechnung | ja |
179 | Gutschrift | ja |
137 | Korrekturrechnung | ja |
60091 | Reserve-Rechnung (Verkauf) | ja |
142 | Bestellung | ja |
143 | Wareneingang Bestellung | nein |
141 | Eingangsrechnung | nein |
181 | Eingangsgutschrift | nein |
182 | Warenrücksendung | nein |
60092 | Reserve-Rechnung (Einkauf) | nein |
Die Einkaufsbelege stehen hier bewusst auf False: Eingangsrechnungen kommen in aller Regel über den Eingangsweg ins Archiv, nicht über den eigenen Druck.
Der Schutz vor der Endlosschleife
AndAlso GetData("LD.SysPar.PrintDefCode") <> PrintDefinitionDas ist die wichtigste Zeile des Skripts.
Die Archivierung ruft dieselbe Layout-Maschinerie erneut auf – und damit wieder dieses Skript. Ohne die Prüfung würde der Archivlauf einen weiteren Archivlauf starten, und so fort. Die Zeile fragt: Läuft gerade die Archiv-Druckdefinition selbst? Wenn ja, passiert nichts mehr.
Diese Prüfung nie entfernen
Sie sieht aus wie eine überflüssige Bedingung und ist die einzige Bremse. Ohne sie erzeugt ein einziger Druck so lange Archivläufe, bis der Client steht.
Was Sie anpassen müssen
| Stelle | Was dort hingehört |
|---|---|
PrintDefinition = "U0000196" | Der Code Ihrer eigenen Druckdefinition. Er ist je Installation verschieden – der Wert aus dem Beispiel passt bei Ihnen fast sicher nicht. |
| Die Belegartenliste | Welche Belege archiviert werden sollen |
Den Code der Druckdefinition finden Sie in SAP Business One bei den Druckdefinitionen; er beginnt mit U und einer laufenden Nummer.
Was schiefgehen kann
Der Beleg wird mehrfach archiviert
- Fehlt
If Not Engine.IsDoublePass Then? Dann archiviert jeder zweiseitig gerechnete Beleg doppelt. - Wird die Vorschau mitgezählt? Prüfen Sie
LD.Par.Preview. - Ist die Dublettenprüfung für diesen Weg wirkungslos? Sie greift beim Timer-Weg – hier entscheidet das Skript.
Der Client reagiert nicht mehr beim Drucken
Die Prüfung auf LD.SysPar.PrintDefCode fehlt oder vergleicht gegen den falschen Wert. Siehe oben.
Es wird gar nicht archiviert
- Steht die Belegart auf
True? - Stimmt der Code der Druckdefinition?
- Wurde wirklich gedruckt – oder nur die Vorschau geöffnet?
Archiviert wird, aber ohne Verknüpfung zum Beleg
DocEntry und FormType werden an die Druckdefinition übergeben. Fehlt einer der beiden Parameter, landet das Dokument ohne Bezug im Archiv.
