OBS/Makros und Scripting/Anwendungsbereiche/Customize OpenTRANS
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;