OBS/Makros und Scripting/Allgemeines/Klassen/Vorgänge/Auftrag: Unterschied zwischen den Versionen

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 89: Zeile 89:


procedure AutragAusFiliale(oFiliDB:TxDB;cBestNr:String;cKuNr:String);
procedure AutragAusFiliale(oFiliDB:TxDB;cBestNr:String;cKuNr:String);
function  Auftrag_MaterMD5(oDB:TxDB;Const cAuftNr:String;nMode:Integer;var cUIDs:String;var cAuftNrs:String):Boolean;
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(oMyDB:TxDB; cAuftNr:String;nNettoBetrag:Double):String;
Zeile 108: Zeile 108:
function  CopyAuftragDB(oMyDB : TxDB; oStdDB : TxDB; cUID : String; cFiliale : String = '') : Boolean;
function  CopyAuftragDB(oMyDB : TxDB; oStdDB : TxDB; cUID : String; cFiliale : String = '') : Boolean;
</syntaxhighlight>
</syntaxhighlight>
=Beispiel=
=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 '''f'''rei '''e'''rfundener '''A'''uftrags'''i'''mport). Die Datei hat folgenden Inhalt:
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 '''f'''rei '''e'''rfundener '''A'''uftrags'''i'''mport). Die Datei hat folgenden Inhalt:

Version vom 15. April 2019, 10:26 Uhr


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: