OBS/Makros und Scripting/Allgemeines/Klassen/Vorgänge/Auftrag

Aus OBS Wiki
Zur Navigation springen Zur Suche springen


TAuftrag leitet sich von TVorgang ab. Die in TVorgang beschriebenen Methoden, Variabeln und Properties können hier ebenfalls verwendet werden.

Basis TAuftrag

Variablen

        cAbKto            : String;
        cAnsprec          : string;
        cAnspZahl         : String;
        nAnzAbs           : Integer;
        nBPorto           : Double;
        nBVerpack         : Double;
        cDMSNr            : string;
        cEMail            : String;
        cFMPro            : string;
        cFreigabe         : String;
        cInroomDepartment : String;
        cInroomName       : String;
        cInroomTelf       : String;
        cIntern           : String;
        cKeinMaterAnlegen : String;
        cKommission       : String;
        cLagerverw        : String;
        cMaterMD5         : String;
        cMesse            : String;
        cMessenStand      : String;
        cMessenStandUID   : String;
        cMessentermin     : String;
        cMessenterminUID  : String;
        cOnline           : String;
        cPara13           : String;
        cRVNR             : String;
        cSamRech          : String;
        cShopBestID       : String;
        cShopNr           : String;
        cSMS              : String;
        cStatusL          : String;
        cStatusR          : String;
        cTR_Mail          : String;
        cStdSteuer        : String;
        cKommisionsbeleg  : String;

Methoden

        constructor  Create (oxDB: TxDB); overload; virtual;
        constructor  Create (oxDB: TxDB; cAuftNr: String; lPos: boolean=false); overload; virtual;
        Destructor   Destroy (); override;
        function  NeuePosition(): TAuftragPos;
        procedure FillPerson(cKdNr:String;lShop:Boolean=False);
        procedure FillVersand(cVaNrueber:String;lShop:Boolean=False); overload;
        procedure FillVersand(cVNr:String;cVPNr:String;lShop:Boolean=False); overload;
        procedure FillKopie(Query: TxFQuery;cTable:String='');
        function  SaveRecord(cUID: string = '';lAlleAnzeigen : Boolean = true): Boolean; override;
        function  UpdateRecord(cUid : string): Boolean;
        procedure CalcAddSub(cArtNr:String; nFaktor:Double);
        procedure Assign(oSrc: TAuftrag); reintroduce;

Basis TAuftragPos

Variablen

        oAuftrag          : TAuftrag;

Methoden

        constructor  Create (oxAuftrag:TAuftrag);   virtual;
        Destructor   Destroy ();  override;

        procedure FillKopie(Query: TxFQuery);

Allgemeine Konstanten

const
    MODE_SETMD5   = 1;
    MODE_READUID  = 2;

Allgemeine Funktionen

procedure UebernahmeMaterial(cAuftNr: String; lGebucht: Boolean=False;lEKManuell:Boolean=False);
procedure UebernahmeMaterialDB(oMyDB: TxDB; cAuftNr: String; lGebucht: Boolean=False;lEKManuell:Boolean=False);
procedure UbernahmeGeraetRepaDB(oMyDB:TxDB; const cRepaNr:String; const cAngNr:String);

procedure MateArtiGet(cKnr:String;qArtiQuery:TxFQuery;var qMaterData:TqSQL);

function  MakeNewAuftPos(cAuftNr : String) : String;
function  MakeNewAuftPosDB(oMyDB:TxDB;cAuftNr : String) : String;

function  MakeNewRaufPos(cRaufNr : String) : String;
function  MakeNewRaufPosDB(oMyDB:TxDB;cRaufNr : String) : String;

procedure AutragAusFiliale(oFiliDB:TxDB;cBestNr:String;cKuNr:String);
function  Auftrag_MaterMD5(oDB:TxDB;Const cAuftNr:String;nMode:TVB_MaterMode;var cUIDs:String;var cAuftNrs:String):Boolean;

function  Auftrag_Rohertrag(oMyDB:TxDB; cAuftNr:String;nNettoBetrag:Double):String;
function  Auftrag_Rohertrag_Ext(oMyDB:TxDB; const cAuftNr:String; nNettoBetrag:Double; lSollStunden:Boolean):String;

procedure SumSubGetPosText(    cArtNr       : String;
                               lBrutto      : Boolean;
                               nAddSub      : Double;
                               nNetto       : Double;
                               nBrutto      : Double;
                           var nNetNachlass : Double;
                           var nBrtNachlass : Double;
                           var cText        : String);

function  Auftrag_PositionsInfo(oMyDB:TxDB; const cAufNr:String; lMeldung:Boolean=True):String;
procedure Auftrag_PositionsInfoXLS(oMyDB:TxDB; cSQL:String);
function  Generate_StdAuftrag(oMyDB: TxDB; const cStdNr: String; const cKdNr: string): String;
function  CopyAuftragDB(oMyDB : TxDB; oStdDB : TxDB; cUID : String; cFiliale : String = '') : Boolean;

Beispiel

Nehmen wir an, wir bekommen Dateien und speichern diese für den Import in der OBS-Verzeichnisstruktur unter \data\Import\ in einem eigenen Verzeichnis AUimp. Nehmen wir zudem an die Dateien haben die Endung feai (für frei erfundener Auftragsimport). Die Datei hat folgenden Inhalt:

000=2019-04-11 14:12:53
001=23548641
002=113458
A00=
A01=Ernst Bergau GmbH
A02=
A03=
A04=Am Steinkamp 17
A05=21684
A06=Stade
A07=de
B00=
B01=Ernst Bergau GmbH
B02=
B03=
B04=Am Steinkamp 17
B05=21684
B06=Stade
B07=de
P00=0001/T1XYSW/Toner XY sw/1.00/89.70/0.19
P00=0002/T1XYMG/Toner XY magenta/1.00/106.78/0.19
P00=0003/T1XYCY/Toner XY cyan/1.00/106.78/0.19
P00=0004/T1XYYW/Toner XY yellow/1.00/106.78/0.19
P00=0005/K500P080/Karton Papier 80g 500 Blatt/5.00/8.67/0.19
P00=0006/K500P160/Karton Papier 160g 500 Blatt/1.00/15.36/0.19
S00=468.75
S01=89.06
S03=557.81

Der Inhalt dieser Datei soll als Auftrag im OBS erscheinen. Dafür müssen wir uns zunächst einmal anschauen, welche Daten wir haben. Für unser Beispiel kommen folgende Daten zusammen:

  • 000 bis 002
Kopfdaten mit Auftragsdatum (000), Referenz (001) und Kundennummer (002)
  • A00 bis A07
Anschrift des Auftraggebers mit Anrede (A00), drei Zeilen für den Namen (A01 bis A03), Straße (A04), PLZ (A05), Ort (A06) und Land im Format ISO 3166-1 Alpha-2 (A07)
  • B00 bis B07
Anschrift des Warenempfängers mit Anrede (A00), drei Zeilen für den Namen (A01 bis A03), Straße (A04), PLZ (A05), Ort (A06) und Land im Format ISO 3166-1 Alpha-2 (A07)
  • P00
Jeder Eintrag entspricht einer Position mit den Angaben Positionsnummer, Artikelnummer, Bezeichnung, Menge, Einzelpreis Netto und Steuersatz. Die Angaben sind mit Slash getrennt.
  • S00 bis S02
Summen für Netto (S00), Steuer (S01) und Brutto (S02)

Ein Import per OBS-Makrodatei (pmac) könnte wie folgt gestaltet werden:

procedure LeseZeile(const cZeile: string; var cTyp: string; var cWert: string);
begin
    //Teilt eine Zeile am Zeichen "="
    //000=2019-04-11 14:12:53
    //cTyp -> 000
    //cWert -> 2019-04-11 14:12:53
    cTyp  := Token(cZeile,'=',1);
    cWert := Token(cZeile,'=',2);
end;

//------------------------------------------------------------------------------

procedure LesePosition(const cDaten: string; var cNr: string; var cArtNr: string; var cBez: string; var nMenge: double; var nPreis: double; var nSteuersatz: double);
begin
    //Teilt die Daten am Zeichen "/"
    //0001/T1XYSW/Toner XY sw/1.00/89.70/0.19
    //cNr -> 0001
    //cArtNr -> T1XYSW
    //cBez -> Toner XY sw
    //nMenge -> 1
    //nPreis -> 89,70
    //nSteuersatz -> 0,19
    cNr         := Token(cDaten,'/',1);
    cArtNr      := Token(cDaten,'/',2);
    cBez        := Token(cDaten,'/',3);
    nMenge      := fVal(Token(cDaten,'/',4));
    nPreis      := fVal(Token(cDaten,'/',5));
    //Im OBS ist der Wert für den Steuersatz 19 % mit 19,00 angegeben.
    //Sollte 0,19 statt 19 in der Datei stehen, muss dies entsprechend umgerechnet werden
    nSteuersatz := fVal(Token(cDaten,'/',6))*100;
end;

//------------------------------------------------------------------------------

procedure ImportiereDatei(const cPfad: string);
var oDatei      : TxImportFile;
    oAuftrag    : TAuftrag;
    oPos        : TAuftragPos;
    i           : integer;
    cTyp        : string;
    cWert       : string;
    cNr         : string;
    cArtNr      : string;
    cBez        : string;
    nMenge      : double;
    nPreis      : double;
    nSteuersatz : double;
begin
    //Erstellt eine Instanz für die Daten der Datei
    oDatei := TxImportFile.Create();
    //Auslesen der Datei
    if (oDatei.LoadFromFile(cPfad)) then begin
        //Auslesen war erfolgreich
        //Erstelle eine Instanz für den Auftragsanlage
        oAuftrag := TAuftrag.Create(oDB);
        //Positionsnummerierung bis zu sechs Stellen
        //G=Gewerk
        //T=Titel
        //P=Position
        //Beispiele:
        //PPP = 001
        //GTPPP = 1.1.001
        oAuftrag.cPosFormat := 'PPPP';
        //Gehe Zeile für Zeile der Datei durch
        for i:=0 to oDatei.Data.Count-1 do begin
            LeseZeile(oDatei.Data[i],cTyp,cWert);
            if          (cTyp = '000') then begin
                oAuftrag.dVorgDat := CToD(cWert);
            end else if (cTyp = '001') then begin
                oAuftrag.cAuftNrKd := cWert;
            end else if (cTyp = '002') then begin
                //Übernahme der Kundendaten aus dem Personenstamm
                oAuftrag.FillPerson(cWert);
            end else if (cTyp = 'A00') then begin
                oAuftrag.cAuftNrKd := cWert;
            end else if (cTyp = 'A01') then begin
                oAuftrag.cName := cWert;
            end else if (cTyp = 'A02') then begin
                oAuftrag.cZusatz1 := cWert;
            end else if (cTyp = 'A03') then begin
                oAuftrag.cZusatz2 := cWert;
            end else if (cTyp = 'A04') then begin
                oAuftrag.cStrasse := cWert;
            end else if (cTyp = 'A05') then begin
                oAuftrag.cPLZ := cWert;
            end else if (cTyp = 'A06') then begin
                oAuftrag.cOrt := cWert;
            end else if (cTyp = 'A07') then begin
                //OBS-Referenznummer für Land setzen
                oAuftrag.cLK := TISO.CountryGetRefNo(oDB,iso3166_Alpha2,cWert);
            end else if (cTyp = 'B00') then begin
                //Keien Anrede in Versandanschriften
            end else if (cTyp = 'B01') then begin
                oAuftrag.cVName1 := cWert;
            end else if (cTyp = 'B02') then begin
                oAuftrag.cVName2 := cWert;
            end else if (cTyp = 'B03') then begin
                oAuftrag.cVZusatz := cWert;
            end else if (cTyp = 'B04') then begin
                oAuftrag.cVStrasse := cWert;
            end else if (cTyp = 'B05') then begin
                oAuftrag.cVPLZ := cWert;
            end else if (cTyp = 'B06') then begin
                oAuftrag.cVOrt := cWert;
            end else if (cTyp = 'B07') then begin
                //OBS-Referenznummer für Land setzen
                oAuftrag.cVLK := TISO.CountryGetRefNo(oDB,iso3166_Alpha2,cWert);
            end else if (cTyp = 'P00') then begin
                LesePosition(cWert,cNr,cArtNr,cBez,nMenge,nPreis,nSteuersatz);

                oPos := oAuftrag.NeuePosition();
                oPos.SetPosNr(iVal(cNr));

                //Wenn der Artikel unter der Nummer im OBS vorhanden ist,
                //dann Artikeldaten aus dem Artikelstamm übernehmen
                if (AR_Exists(oDB,cArtNr)) then begin
                    //Artikeldaten in Position übernehmen
                    oPos.FillArtikel(cArtNr);
                end else begin
                    oPos.cBezeichnung1 := 'Artikelnummer ' + cArtNr + ' nicht gefunden!';
                    oPos.cBezeichnung2 := cBez;
                end;
                oPos.PcMWSTSch := FindUstFromSatz(oDB,nSteuersatz);
                oPos.nMenge := nMenge;
                oPos.nEPreis := nPreis;
                oPos.nBEPreis := UST_VK_Netto2Brutto(nPreis,nSteuersatz);
                //an dieser Stelle könnten aktuelle OBS-Preise gezogen werden:
                //oPos.Preisfindung();
                oPos.KalkPos();
            end;
        end;

        //sämtliche Summen bereichnen
        oAuftrag.KalkAll();
        //Auftrag speichern
        oAuftrag.SaveRecord();
        MyFreeAndNil(oAuftrag);

    end;
    MyFreeAndNil(oDatei);
end;

//------------------------------------------------------------------------------

procedure Starten();
var cRoot       : string;
    oDateiListe : TStringList;
    i           : integer;
begin
    //Schreibt in die Variable cRoot den Pfad zum Verzeichnis, in dem die Dateien 
    //liegen und durch die Bedingung wissen wir, dass das Verzeichnis auch existiert
    if (TMyDir.BuildPath(TObsPath.GetImportDir(),['AUimp'],cRoot)) then begin
        //Erstellt eine Liste, in der die Dateien des Verzeichnisses aufgelistet werden können
        oDateiListe := TStringList.Create();
        //Schreibt alle im Verzeichnis enthaltenen Dateien mit der Dateiendung "feai" in die Liste
        FindFile(cRoot,'*.feai',oDateiListe,False);
        //Geht die Liste durch und importiert eine Datei nach der anderen
        for i:=0 to oDateiListe.Count-1 do begin
            ImportiereDatei(oDateiListe[i]);
        end;
        MyFreeAndNil(oDateiListe);
    end;
end;

//------------------------------------------------------------------------------

function StartProc():Boolean;
begin
    Starten();
end;

siehe auch: