OBS/Makros und Scripting/Anwendungsbereiche/Customize OpenTRANS: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 58: Zeile 58:
</syntaxhighlight>
</syntaxhighlight>
===GetXMLCDataValue===
===GetXMLCDataValue===
Unter Umständen sind die Daten in einem CDATA (<![CDATA[]]>) angegeben. Um an den eigentlichen Wert als Text zu kommen, kann diese Funktion verwendet werden.
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">
<syntaxhighlight lang="Delphi">
// Parameter:
// Parameter:
Zeile 70: Zeile 70:
</syntaxhighlight>
</syntaxhighlight>
=Beispiel=
=Beispiel=
Das folgende Beispiel soll veranschaulichen, wie aus benutzerdefinierten OpenTRANS-Feldern für Frachtkosten und Versicherungspauschale Artikelpositionen im Auftrag werden.
<syntaxhighlight lang="Delphi">
<syntaxhighlight lang="Delphi">
//OpenTRANS_Order_Import_Shop
//OpenTRANS_Order_Import_Shop
Zeile 81: Zeile 82:
function LeseXML(cXML: string; cElement: string; var cWert: string): boolean;
function LeseXML(cXML: string; cElement: string; var cWert: string): boolean;
begin
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);
     GetXMLToken(cXML, cElement, cWert);
    //Entfernt aus dem Wert cWert die CDATA-Syntax
     GetXMLCDataValue(AllTrim(cWert), cWert);
     GetXMLCDataValue(AllTrim(cWert), cWert);
     Result := True;
     Result := True;
Zeile 90: Zeile 94:
function ReadHeader(oMyDB: TxDB; cOrderHeaderXML: string): boolean;
function ReadHeader(oMyDB: TxDB; cOrderHeaderXML: string): boolean;
begin
begin
     //insert customize code here
     //Auslesen der Daten aus der XML-Datei
     LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_FRACHT' , cKosten_Fracht );
     LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_FRACHT' , cKosten_Fracht );
     LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_VERSICH', cKosten_Versich);
     LeseXML(cOrderHeaderXML, 'UDX.KOSTEN_VERSICH', cKosten_Versich);
Zeile 147: Zeile 151:
     Result := True;
     Result := True;


    //Wenn Frachtenkosten ungleich 0 Euro angegeben sind, diese als Position übernehmen
     if (not Empty(fVal(cKosten_Fracht))) then begin
     if (not Empty(fVal(cKosten_Fracht))) then begin
         oAuftPos          := oAuftrag.NeuePosition('OTSHP00002');
         oAuftPos          := oAuftrag.NeuePosition('OTSHP00002');
Zeile 166: Zeile 171:
     end;
     end;


    //Wenn eine Versicherungspauschale berechnet wird (ungleich 0 Euro), dann eine Position anlegen
     if (not Empty(fVal(cKosten_Versich))) then begin
     if (not Empty(fVal(cKosten_Versich))) then begin
         oAuftPos          := oAuftrag.NeuePosition('OTSHP00003');
         oAuftPos          := oAuftrag.NeuePosition('OTSHP00003');

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;