OBS/Makros und Scripting/Anwendungsbereiche/Drucke
Drucke sind eine spezielle Form der Makros im OBS, da sie zusätzlich über Funktionalitäten für den Export in bestimmte Dateiformate (z. B. PDF) oder Ausdruck verfügen. Sie sind an der Endung .pax zu erkennen und befinden sich in der Verzeichnisstruktur vom OBS unter ..\data\druck und ..\data\druck\user. Der Unterschied zwischen den beiden Verzeichnissen ist klein, aber mit großer Wirkung. Alle Druck-Dateien, die standardmäßig im OBS enthalten sind, befinden sich im Verzeichnis ..\data\druck und werden dort auch bei jedem Update ersetzt. Wer vom Standard abweichen möchte, muss die "pax"-Datei im Verzeichnis ..\data\druck\user hinterlegen.
Besonderheiten
Vorgangsdrucke mit Methoden-Zeigern
Falscher (alter) Weg: Den Druck in den user-Ordner kopieren und in der Datei die entsprechenden Änderungen einbauen. Warum: Wenn Änderungen an den Standarddrucken durchgeführt werden (z.B. neue gesetzliche Vorgaben) wird der user-Druck nicht mit angepasst.
Richtiger Weg (ab Version 004094, 09.09.2022):
user-Druck anlegen in folgendem Stil (Beispiel rechnung.pax):
// Verlinkung des Standard-Drucks {$I .\data\druck\rechnung.pax} // Kopie der StartProc die dann die Standard-StartProc aufruft function StartProcCustom(cRechNr: String; nParCnt: Integer; lPrintModusi: Boolean; obj: TObject): Boolean; begin result := StartProc(cRechNr, nParCnt, lPrintModusi, obj); end;
Damit wird erstmal der Standard-Rechnungsdruck 1:1 ausgeführt. Jetzt kann ich über Custom-Methoden den Druck verändern.
Beispiel 1: Nutzung eines vorhandenen Methoden-Zeigers
Anforderung: Leerzeilen sollen immer zwei statt einer Zeile hoch sein.
Dafür existiert bereits ein Methoden-Zeiger den ich nutzen kann:
{$I .\data\druck\rechnung.pax}
// neue Custom-Methode
procedure LeerzeilePosCustom();
begin
y := y + 2;
end;
function StartProcCustom(cRechNr: String; nParCnt: Integer; lPrintModusi: Boolean; obj: TObject): Boolean;
begin
// Grund-Initialisierung der Zeiger, MUSS als erstes ausgeführt werden weil die Zeiger sonst während des Drucks neu gesetzt werden
InitMethodPointers(true);
// Zuweisung meiner Custom-Methode auf dem Methoden-Zeiger für den Leerzeilendruck
oMethodPointer.pLeerzeile := LeerzeilePosCustom;
result := StartProc(cRechNr, nParCnt, lPrintModusi, obj);
end;
Beispiel 2: Einrichtung eines neuen Methoden-Zeigers
Anforderung: Positionsmenge sollen im Druck nicht mit ausgegeben werden. Das ist kein sinnvolles Szenario und dient lediglich als Beispiel.
Dafür gibt es noch keinen Methoden-Zeiger, wir brauchen einen Neuen. Wie gehe ich vor:
1. Die Stelle im Code identifizieren die geändert werden soll.
In unserem Beispiel die Prozedur PosLineMengeEinheit() in PosReportFunktionen.inx
[...]
if ((not lEmpty) and (not lLiefNach) and (not lMultiSteuerPos)) then begin
qRep_SText(EZ,'menge' ,TStr(AZ_Query.A2F('az_menge'),12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y));
qRep_SText(EZ,'einheit',GetEinheit_Lan(oDB,cLanguage,AZ_Query.A2C('az_einheit'),'se_name'),qRep_YPos(EZ,y));
end else if (lLiefNach and lDruckNachgeliefert) then begin
WirdNachgeliefert();
end;
[...]
2. Für die Ausgabe der Menge lege ich nun einen neuen Methoden-Zeiger an:
Deklaration in PosReportPositionen.inx
TPosMethodPointer = record
public
pPosHeader : TPosMethod;
[...]
pPosLineMenge : TPosMethod; // <-- neuer Zeiger
end;
3. Statt der Ausführung des Codes setzte ich nun den Methoden-Zeiger ein:
[...]
if ((not lEmpty) and (not lLiefNach) and (not lMultiSteuerPos)) then begin
oMethodPointer.pPosLineMenge(); // <-- Methoden-Aufruf
qRep_SText(EZ,'einheit',GetEinheit_Lan(oDB,cLanguage,AZ_Query.A2C('az_einheit'),'se_name'),qRep_YPos(EZ,y));
end else if (lLiefNach and lDruckNachgeliefert) then begin
WirdNachgeliefert();
end;
[...]
4. Für den Standard baue ich eine neue Prozedur (in derselben Datei die auch den Zeiger aufruft):
procedure PosLineMengeDefault();
begin
qRep_SText(EZ,'menge' ,TStr(AZ_Query.A2F('az_menge'),12,StrToIntDef(PMode_Var(457),2)),qRep_YPos(EZ,y));
end;
5. Ich ergänze die Initialisierung der Methoden-Zeiger:
Deklaration in PosReportPositionen.inx
procedure InitMethodPointers(lPrintPreise : Boolean = true);
begin
oMethodPointer.pPosHeader := PosHeader;
[...]
oMethodPointer.pPosLineMenge := PosLineMengeDefault; // <-- das hier ist die neue Zeile
InitPosParams(lPrintPreise);
end;
6. Jetzt kann ich in meinem user-Druck den Zeiger benutzen:
procedure PosLineMengeCustom();
begin
// keine Menge ausgeben
end;
function StartProcCustom(cRechNr: String; nParCnt: Integer; lPrintModusi: Boolean; obj: TObject): Boolean;
begin
// Grund-Initialisierung der Zeiger, MUSS als erstes ausgeführt werden weil die Zeiger sonst während des Drucks neu gesetzt werden
InitMethodPointers(true);
// Setzten der neue Methode
oMethodPointer.pPosLineMenge := PosLineMengeCustom;
result := StartProc(cRechNr, nParCnt, lPrintModusi, obj);
end;