Skip to content

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-WegLayout-Weg
Archiviert wirdnach dem Lauf des Timerssofort beim Drucken
Entscheidungzentral über Einstellungenje Belegart im Layout
VoraussetzungDruckverzeichnis, Dateiname mit Kennungencoresuite-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 ​

vb
'
' 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 If

Was das Skript tut ​

Es prüft drei Dinge, und erst wenn alle drei zutreffen, wird archiviert.

1. Nur im ersten Durchlauf ​

vb
If Not Engine.IsDoublePass Then

coresuite rechnet Layouts mit Gesamtsummen zweimal durch. Ohne diese Klammer liefe die Archivierung bei jedem solchen Beleg doppelt.

2. Nur bei echter Ausgabe ​

vb
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:

NummerBelegim Beispiel
149Angebotnein
139Auftragja
140Lieferungja
180Retoureja
133Ausgangsrechnungja
179Gutschriftja
137Korrekturrechnungja
60091Reserve-Rechnung (Verkauf)ja
142Bestellungja
143Wareneingang Bestellungnein
141Eingangsrechnungnein
181Eingangsgutschriftnein
182Warenrücksendungnein
60092Reserve-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 ​

vb
AndAlso GetData("LD.SysPar.PrintDefCode") <> PrintDefinition

Das 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 ​

StelleWas 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 BelegartenlisteWelche 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 ​

  1. Fehlt If Not Engine.IsDoublePass Then? Dann archiviert jeder zweiseitig gerechnete Beleg doppelt.
  2. Wird die Vorschau mitgezählt? Prüfen Sie LD.Par.Preview.
  3. 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 ​

  1. Steht die Belegart auf True?
  2. Stimmt der Code der Druckdefinition?
  3. 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.

Dokumentation – NC-Solutions