OBS/Makros und Scripting/Anwendungsbereiche/Customize OpenTRANS: Unterschied zwischen den Versionen
Böhrer (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „Hello, dear friend! I am Williams. I am happy that I could unify to the whole world. I live in France, in the south region. I dream to visit the various nation…“) |
Nimz (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Makros und Scripting}} | |||
Der Import von OpenTRANS-Dateien findet sich besonders in Shop-Schnittsellen. Mehrere Shop-Schnittstelle unterstützen den Import von Auftragsdateien (OpenTRANS-Order). Neben besonderem Verhalten für bestimmte Aufträge können per Customize auch Daten aus benutzerdefinierten Datenfeldern (UDX) übernommen werden. | |||
=Macro= | |||
==Anlage== | |||
Öffnen Sie die [[OBS/Makros_und_Scripting/Allgemeines/Script_Library|Script-Bibliothek]]. Diese finden Sie über das Menü ''System'' unter ''J Sonderprogramme'' Punkt ''SB - Script-Biliothek''. Legen Sie hier ein Script mit dem Namen '''OpenTRANS_Order_Import''' an. Ist das Makro für den Import über eine Shop-Schnittstelle gedacht, muss die Nummer der Schnittstelle mit angegeben werden (z. B. Shop-Schnittstelle 001 ergibt '''OpenTRANS_Order_Import_Shop001'''). | |||
==Funktionen== | |||
Die folgenden Funktionen beschreiben die Funktionen, welche im Import aufgerufen werden, sofern im Makro definiert, und Ihnen die Möglichkeit geben die Daten, die letztlich in den Auftrag geschrieben werden zu beeinflussen. | |||
===Funktion: ReadHeader=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// oMyDB = Datenbank über die der Import läuft | |||
// cOrderHeaderXML = Enthält den vollständigen Inhalt des Kopfteils der Datei (ORDER_HEADER) | |||
function ReadHeader(oMyDB: TxDB; cOrderHeaderXML: string): boolean; | |||
</syntaxhighlight> | |||
===Funktion: WriteHeader=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// oMyDB = Datenbank über die der Import läuft | |||
// oAuftrag = Auftragsobjekt | |||
function WriteHeader(oMyDB: TxDB; oAuftrag: TAuftrag): boolean; | |||
===Funktion: ReadItem=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// oMyDB = Datenbank über die der Import läuft | |||
// cOrderItemXML = Enthält den vollständigen Inhalt der jeweiligen Position aus der Datei (ORDER_ITEM) | |||
function ReadItem(oMyDB: TxDB; cOrderItemXML: string): boolean; | |||
</syntaxhighlight> | |||
===Funktion: WriteItem=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// oMyDB = Datenbank über die der Import läuft | |||
// oAuftrag = Auftragsobjekt, enthält die bisher für den Auftrag übernommenen Daten | |||
// oAuftPos = Positionsobjekt, enthält die bisher für die Position übernommenen Daten | |||
function WriteItem(oMyDB: TxDB; oAuftrag: TAuftrag; oAuftPos : TAuftragPos): boolean; | |||
</syntaxhighlight> | |||
===Funktion: ReadSummary=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// oMyDB = Datenbank über die der Import läuft | |||
// cOrderSummaryXML = Enthält den vollständigen Inhalt der Zusammenfassung/Summe der Positionen aus der Datei (ORDER_SUMMARY) | |||
function ReadSummary(oMyDB: TxDB; cOrderSummaryXML: string): boolean; | |||
</syntaxhighlight> | |||
===Funktion: WriteSummary=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// oMyDB = Datenbank über die der Import läuft | |||
// oAuftrag = Auftragsobjekt | |||
function WriteSummary(oMyDB: TxDB; oAuftrag: TAuftrag): boolean; | |||
</syntaxhighlight> | |||
==Interessante Funktionen für die Verwendung im Makro== | |||
===GetXMLToken=== | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// cXML = XML-Struktur, au sder ausgelesen werden soll | |||
// cElement = Name des XML-Elements, dessen Wert ausgelesen werden soll | |||
// cWert = Enthält nach Ausführung den Wert aus dem Element | |||
function GetXMLToken(cXML: string; cElement: string; var cWert: string): boolean; | |||
</syntaxhighlight> | |||
===GetXMLCDataValue=== | |||
Unter Umständen sind die Daten in einem [https://de.wikipedia.org/wiki/CDATA CDATA] (<![CDATA[]]>; kurz für ''character data'') angegeben. Um an den eigentlichen Wert als Text zu kommen, kann diese Funktion verwendet werden. | |||
<syntaxhighlight lang="Delphi"> | |||
// Parameter: | |||
// cWert = XML-Struktur, au sder ausgelesen werden soll | |||
// cWertNeu = Name des XML-Elements, dessen Wert ausgelesen werden soll | |||
// Beispiel: | |||
// cWert := '<![CDATA[Beispiel Text]]>'; | |||
// GetXMLCDataValue(cWert, cWertNeu); | |||
// cWertNeu -> 'Beispiel Text' | |||
function GetXMLCDataValue(cWert: string; var cWertNeu: string): boolean; | |||
</syntaxhighlight> | |||
=Beispiel= | |||
Das folgende Beispiel soll veranschaulichen, wie aus benutzerdefinierten OpenTRANS-Feldern für Frachtkosten und Versicherungspauschale Artikelpositionen im Auftrag werden. | |||
<syntaxhighlight lang="Delphi"> | |||
//OpenTRANS_Order_Import_Shop | |||
var cKosten_Fracht : string; | |||
cKosten_Versich : string; | |||
cZusatznotiz : string; | |||
//------------------------------------------------------------------------------ | |||
function LeseXML(cXML: string; cElement: string; var cWert: string): boolean; | |||
begin | |||
//Liest den Wert für das Element cElement aus der XML-Struktur cXML aus | |||
//und gibt diesen in cWert zurück | |||
GetXMLToken(cXML, cElement, cWert); | |||
//Entfernt aus dem Wert cWert die CDATA-Syntax | |||
GetXMLCDataValue(AllTrim(cWert), cWert); | |||
Result := True; | |||
end; | |||
//------------------------------------------------------------------------------ | |||
function ReadHeader(oMyDB: TxDB; cOrderHeaderXML: string): boolean; | |||
begin | |||
//Auslesen der Daten aus der XML-Datei | |||
LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_FRACHT' , cKosten_Fracht ); | |||
LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_VERSICH', cKosten_Versich); | |||
LeseXML(cOrderHeaderXML, 'UDX.ZUSATZNOTIZ' , cZusatznotiz ); | |||
Result := True; | |||
end; | |||
//------------------------------------------------------------------------------ | |||
function WriteHeader(oMyDB: TxDB; oAuftrag: TAuftrag): boolean; | |||
begin | |||
//insert customize code here | |||
if (not Empty(cZusatznotiz)) then begin | |||
//Notizen als Auftragstext übernehmen | |||
oAuftPos := oAuftrag.NeuePosition('OTSHP00001'); | |||
oAuftPos.cKundNr := oAuftrag.cKdNr; | |||
oAuftPos.cTyp := '1'; //Auftragstext | |||
oAuftPos.PcMemofeld := cZusatznotiz; | |||
oAuftPos.cAusdruckJN := '1'; //Drucken=Nein | |||
cZusatznotiz := ''; | |||
end; | |||
Result := True; | |||
end; | |||
//------------------------------------------------------------------------------ | |||
function ReadItem(oMyDB: TxDB; cOrderItemXML: string): boolean; | |||
begin | |||
//insert customize code here | |||
Result := True; | |||
end; | |||
//------------------------------------------------------------------------------ | |||
function WriteItem(oMyDB: TxDB; oAuftrag: TAuftrag; oAuftPos : TAuftragPos): boolean; | |||
begin | |||
//insert customize code here | |||
Result := True; | |||
end; | |||
//------------------------------------------------------------------------------ | |||
function ReadSummary(oMyDB: TxDB; cOrderSummaryXML: string): boolean; | |||
begin | |||
//insert customize code here | |||
Result := True; | |||
end; | |||
//------------------------------------------------------------------------------ | |||
function WriteSummary(oMyDB: TxDB; oAuftrag: TAuftrag): boolean; | |||
var oAuftPos : TAuftragPos; | |||
begin | |||
Result := True; | |||
//Wenn Frachtenkosten ungleich 0 Euro angegeben sind, diese als Position übernehmen | |||
if (not Empty(fVal(cKosten_Fracht))) then begin | |||
oAuftPos := oAuftrag.NeuePosition('OTSHP00002'); | |||
oAuftPos.SetPosNr(999); | |||
oAuftPos.lNeuNum := True; | |||
//hier die Artikelnummer des Artikels als Parameter mitgeben | |||
//Wer Leistungen statt Artikel verwendet, kann statt FillArtikel mit FillLeistung | |||
//Parameter ist dann die Leistungsnummer | |||
oAuftPos.FillArtikel('FRACHTKOSTEN'); | |||
oAuftPos.nMenge := 1; | |||
oAuftPos.nEPreis := fVal(cKosten_Fracht); | |||
oAuftPos.nGPreis := oAuftPos.nEPreis; | |||
oAuftPos.nRabatt := 0; | |||
oAuftPos.cStatus := 'V000'; | |||
cKosten_Fracht := ''; | |||
end; | |||
//Wenn eine Versicherungspauschale berechnet wird (ungleich 0 Euro), dann eine Position anlegen | |||
if (not Empty(fVal(cKosten_Versich))) then begin | |||
oAuftPos := oAuftrag.NeuePosition('OTSHP00003'); | |||
oAuftPos.SetPosNr(999); | |||
oAuftPos.lNeuNum := True; | |||
//hier die Artikelnummer des Artikels als Parameter mitgeben | |||
//Wer Leistungen statt Artikel verwendet, kann statt FillArtikel mit FillLeistung | |||
//Parameter ist dann die Leistungsnummer | |||
oAuftPos.FillArtikel('VERSICHERUNG'); | |||
oAuftPos.nMenge := 1; | |||
oAuftPos.nEPreis := fVal(cKosten_Versich); | |||
oAuftPos.nGPreis := oAuftPos.nEPreis; | |||
oAuftPos.nRabatt := 0; | |||
oAuftPos.cStatus := 'V000'; | |||
cKosten_Versich := ''; | |||
end; | |||
end; | |||
</syntaxhighlight> |
Aktuelle Version vom 29. Juni 2022, 15:17 Uhr
Der Import von OpenTRANS-Dateien findet sich besonders in Shop-Schnittsellen. Mehrere Shop-Schnittstelle unterstützen den Import von Auftragsdateien (OpenTRANS-Order). Neben besonderem Verhalten für bestimmte Aufträge können per Customize auch Daten aus benutzerdefinierten Datenfeldern (UDX) übernommen werden.
Macro
Anlage
Öffnen Sie die Script-Bibliothek. Diese finden Sie über das Menü System unter J Sonderprogramme Punkt SB - Script-Biliothek. Legen Sie hier ein Script mit dem Namen OpenTRANS_Order_Import an. Ist das Makro für den Import über eine Shop-Schnittstelle gedacht, muss die Nummer der Schnittstelle mit angegeben werden (z. B. Shop-Schnittstelle 001 ergibt OpenTRANS_Order_Import_Shop001).
Funktionen
Die folgenden Funktionen beschreiben die Funktionen, welche im Import aufgerufen werden, sofern im Makro definiert, und Ihnen die Möglichkeit geben die Daten, die letztlich in den Auftrag geschrieben werden zu beeinflussen.
Funktion: ReadHeader
// Parameter:
// oMyDB = Datenbank über die der Import läuft
// cOrderHeaderXML = Enthält den vollständigen Inhalt des Kopfteils der Datei (ORDER_HEADER)
function ReadHeader(oMyDB: TxDB; cOrderHeaderXML: string): boolean;
Funktion: WriteHeader
// Parameter:
// oMyDB = Datenbank über die der Import läuft
// oAuftrag = Auftragsobjekt
function WriteHeader(oMyDB: TxDB; oAuftrag: TAuftrag): boolean;
===Funktion: ReadItem===
<syntaxhighlight lang="Delphi">
// Parameter:
// oMyDB = Datenbank über die der Import läuft
// cOrderItemXML = Enthält den vollständigen Inhalt der jeweiligen Position aus der Datei (ORDER_ITEM)
function ReadItem(oMyDB: TxDB; cOrderItemXML: string): boolean;
Funktion: WriteItem
// Parameter:
// oMyDB = Datenbank über die der Import läuft
// oAuftrag = Auftragsobjekt, enthält die bisher für den Auftrag übernommenen Daten
// oAuftPos = Positionsobjekt, enthält die bisher für die Position übernommenen Daten
function WriteItem(oMyDB: TxDB; oAuftrag: TAuftrag; oAuftPos : TAuftragPos): boolean;
Funktion: ReadSummary
// Parameter:
// oMyDB = Datenbank über die der Import läuft
// cOrderSummaryXML = Enthält den vollständigen Inhalt der Zusammenfassung/Summe der Positionen aus der Datei (ORDER_SUMMARY)
function ReadSummary(oMyDB: TxDB; cOrderSummaryXML: string): boolean;
Funktion: WriteSummary
// Parameter:
// oMyDB = Datenbank über die der Import läuft
// oAuftrag = Auftragsobjekt
function WriteSummary(oMyDB: TxDB; oAuftrag: TAuftrag): boolean;
Interessante Funktionen für die Verwendung im Makro
GetXMLToken
// Parameter:
// cXML = XML-Struktur, au sder ausgelesen werden soll
// cElement = Name des XML-Elements, dessen Wert ausgelesen werden soll
// cWert = Enthält nach Ausführung den Wert aus dem Element
function GetXMLToken(cXML: string; cElement: string; var cWert: string): boolean;
GetXMLCDataValue
Unter Umständen sind die Daten in einem CDATA (<![CDATA[]]>; kurz für character data) angegeben. Um an den eigentlichen Wert als Text zu kommen, kann diese Funktion verwendet werden.
// Parameter:
// cWert = XML-Struktur, au sder ausgelesen werden soll
// cWertNeu = Name des XML-Elements, dessen Wert ausgelesen werden soll
// Beispiel:
// cWert := '<![CDATA[Beispiel Text]]>';
// GetXMLCDataValue(cWert, cWertNeu);
// cWertNeu -> 'Beispiel Text'
function GetXMLCDataValue(cWert: string; var cWertNeu: string): boolean;
Beispiel
Das folgende Beispiel soll veranschaulichen, wie aus benutzerdefinierten OpenTRANS-Feldern für Frachtkosten und Versicherungspauschale Artikelpositionen im Auftrag werden.
//OpenTRANS_Order_Import_Shop
var cKosten_Fracht : string;
cKosten_Versich : string;
cZusatznotiz : string;
//------------------------------------------------------------------------------
function LeseXML(cXML: string; cElement: string; var cWert: string): boolean;
begin
//Liest den Wert für das Element cElement aus der XML-Struktur cXML aus
//und gibt diesen in cWert zurück
GetXMLToken(cXML, cElement, cWert);
//Entfernt aus dem Wert cWert die CDATA-Syntax
GetXMLCDataValue(AllTrim(cWert), cWert);
Result := True;
end;
//------------------------------------------------------------------------------
function ReadHeader(oMyDB: TxDB; cOrderHeaderXML: string): boolean;
begin
//Auslesen der Daten aus der XML-Datei
LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_FRACHT' , cKosten_Fracht );
LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_VERSICH', cKosten_Versich);
LeseXML(cOrderHeaderXML, 'UDX.ZUSATZNOTIZ' , cZusatznotiz );
Result := True;
end;
//------------------------------------------------------------------------------
function WriteHeader(oMyDB: TxDB; oAuftrag: TAuftrag): boolean;
begin
//insert customize code here
if (not Empty(cZusatznotiz)) then begin
//Notizen als Auftragstext übernehmen
oAuftPos := oAuftrag.NeuePosition('OTSHP00001');
oAuftPos.cKundNr := oAuftrag.cKdNr;
oAuftPos.cTyp := '1'; //Auftragstext
oAuftPos.PcMemofeld := cZusatznotiz;
oAuftPos.cAusdruckJN := '1'; //Drucken=Nein
cZusatznotiz := '';
end;
Result := True;
end;
//------------------------------------------------------------------------------
function ReadItem(oMyDB: TxDB; cOrderItemXML: string): boolean;
begin
//insert customize code here
Result := True;
end;
//------------------------------------------------------------------------------
function WriteItem(oMyDB: TxDB; oAuftrag: TAuftrag; oAuftPos : TAuftragPos): boolean;
begin
//insert customize code here
Result := True;
end;
//------------------------------------------------------------------------------
function ReadSummary(oMyDB: TxDB; cOrderSummaryXML: string): boolean;
begin
//insert customize code here
Result := True;
end;
//------------------------------------------------------------------------------
function WriteSummary(oMyDB: TxDB; oAuftrag: TAuftrag): boolean;
var oAuftPos : TAuftragPos;
begin
Result := True;
//Wenn Frachtenkosten ungleich 0 Euro angegeben sind, diese als Position übernehmen
if (not Empty(fVal(cKosten_Fracht))) then begin
oAuftPos := oAuftrag.NeuePosition('OTSHP00002');
oAuftPos.SetPosNr(999);
oAuftPos.lNeuNum := True;
//hier die Artikelnummer des Artikels als Parameter mitgeben
//Wer Leistungen statt Artikel verwendet, kann statt FillArtikel mit FillLeistung
//Parameter ist dann die Leistungsnummer
oAuftPos.FillArtikel('FRACHTKOSTEN');
oAuftPos.nMenge := 1;
oAuftPos.nEPreis := fVal(cKosten_Fracht);
oAuftPos.nGPreis := oAuftPos.nEPreis;
oAuftPos.nRabatt := 0;
oAuftPos.cStatus := 'V000';
cKosten_Fracht := '';
end;
//Wenn eine Versicherungspauschale berechnet wird (ungleich 0 Euro), dann eine Position anlegen
if (not Empty(fVal(cKosten_Versich))) then begin
oAuftPos := oAuftrag.NeuePosition('OTSHP00003');
oAuftPos.SetPosNr(999);
oAuftPos.lNeuNum := True;
//hier die Artikelnummer des Artikels als Parameter mitgeben
//Wer Leistungen statt Artikel verwendet, kann statt FillArtikel mit FillLeistung
//Parameter ist dann die Leistungsnummer
oAuftPos.FillArtikel('VERSICHERUNG');
oAuftPos.nMenge := 1;
oAuftPos.nEPreis := fVal(cKosten_Versich);
oAuftPos.nGPreis := oAuftPos.nEPreis;
oAuftPos.nRabatt := 0;
oAuftPos.cStatus := 'V000';
cKosten_Versich := '';
end;
end;