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

Aus OBS Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Currently, marketing plays an natural part in making your products likeable among the target audience and in selling them. Among the various marketing tools us…“)
 
 
(15 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
Currently, marketing plays an natural part in making your products likeable among the target audience and in selling them. Among the various marketing tools used across the globe, promo codes are a popular and important one. These types of are becoming one of the leading tools to increase the event ticket sales. In line with the experts of the event industry, creating marketing codes for event ticketing can bring a stable stream of earnings several weeks before your event starts. Various modes of online marketing are gaining surface and using promo rules as a new addition to the list. Allow me to share 5 tips, which event organizers can use for increasing event ticketing sales by providing promotional code discounts. Promo codes are made to give you a price discount on selected entry pass of an event. Because an organizer, you have to decide how so when to set the requirements to influence your overall ticket sales. With the event registration software, you may easily generate your own promo codes when required. A competitive, intuitive, and user-friendly online ticketing system should have these tools integrated in them. That permits you maximize your marketing efforts and boosts your earnings rapidly. Interacting with the reporting features in your online ticket service provider, you can monitor the consumption of a specific code and the total earnings it is in a position to generate. Making use of this information, you can transform your life marketing strategies during the complete planning process and even after that. Promo codes are essentially suitable for the mass media so that it can assist you attract large-scale audience. You'll be able to promo code to a certain print ad, commercial, r / c spot, or partner website. Promo codes in the media can be of excellent help for increasing your pre-sales earnings and measuring your success with the networks, stations, or publications. A well-written ad, with an online address and simple promo code, is sure to reap maximum advantages from your opportunities. However, you require to create a code, which is not hard to remember.<br><br>Now-a-days, newspaper coupons are replaced by the internet promotional codes. In case you have virtually any questions concerning where by and also the way to work with [http://freecouponsonline.shutterfly.com/ discount promos], it is possible to contact us in our own web-page. In recent years, the print out advertisings are accompanied by a promotional code with a referral to your website. In this way, you can encourage your customer to buy products online at the best available price. This also allows you to get rid of the hassles associated with digesting paper coupons. It also helps organizers to build up a better database for future marketing campaigns. You have to start your promotional code campaign well in progress to boost your solution sales. Announce your discount rates as early as possible and little by little reduce the savings otherwise you event approaches. Organizers with limited marketing budgets are able to use sociable media to post their promo codes at relatively no cost. Moreover, the growing popularity of the social media helps making your promo code virus-like in no time, thus ensuring rapid boost in your ticket sales. Intended for instance, you can write on your event site, like "Use this code before it's too later part of the! ". This can be likely to enhance the chances of increasing sales for you and thus, maximize RETURN ON INVESTMENT. Buy to conserve in order to take good thing about the most attractive coupons. This kind of should not be a problem if you have to buy non-perishables such as toilet rolls, detergent etc. In the event the offer is on raw food then you should think two times because you might have to process them properly simply uses store them. One other option is to become another person to pool purchases with you so that you don't have to deal with a storage emergency. Get the latest information on all the codes available at anytime. Only then will you be capable to use them effectively. One way to find the right data is by 'liking' or 'following' a store on a social marketing site. The company will reward you by mailing you all its latest promo codes.
{{Makros und Scripting}}
'''TAuftrag''' leitet sich von [[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorgänge#Basis_TVorgang|TVorgang]] ab. Die in [[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorgänge#Basis_TVorgang|TVorgang]] beschriebenen [[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorgänge#Methoden|Methoden]], [[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorgänge#Variablen|Variabeln]] und [[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorgänge#Properties|Properties]] können hier ebenfalls verwendet werden.
=Basis TAuftrag=
==Variablen==
<syntaxhighlight lang="Delphi">
        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;
</syntaxhighlight>
==Methoden==
<syntaxhighlight lang="Delphi">
        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;
</syntaxhighlight>
 
=Basis TAuftragPos=
==Variablen==
<syntaxhighlight lang="Delphi">
        oAuftrag          : TAuftrag;
</syntaxhighlight>
==Methoden==
<syntaxhighlight lang="Delphi">
        constructor  Create (oxAuftrag:TAuftrag);  virtual;
        Destructor  Destroy ();  override;
 
        procedure FillKopie(Query: TxFQuery);
</syntaxhighlight>
=Allgemeine Konstanten=
<syntaxhighlight lang="Delphi">
const
    MODE_SETMD5  = 1;
    MODE_READUID  = 2;
</syntaxhighlight>
=Allgemeine Funktionen=
<syntaxhighlight lang="Delphi">
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;
</syntaxhighlight>
zu ''Auftrag_MaterMD5'' siehe [[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorgänge#TVB_MaterMode|TVB_MaterMode]]
 
=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:
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 [https://de.wikipedia.org/wiki/ISO-3166-1-Kodierliste ''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 [https://de.wikipedia.org/wiki/ISO-3166-1-Kodierliste ''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/Makros und Scripting/Anwendungsbereiche/Makrodateien|OBS-Makrodatei (''pmac'')]] könnte wie folgt gestaltet werden:
<syntaxhighlight lang="Delphi">
 
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;
 
</syntaxhighlight>
'''siehe auch:'''
*[http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TStringList TStringList]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#TMyDir.BuildPath|TMyDir.BuildPath]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Prozeduren#FindFile|FindFile]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Prozeduren#MyFreeAndNil|MyFreeAndNil]]
*[[OBS/Makros_und_Scripting/Allgemeines/Klassen/Importdatei/TxImportFile|TxImportFile]]
*[[OBS/Makros_und_Scripting/Allgemeines/Klassen/Vorg%C3%A4nge#Basis_TVorgang|TVorgang]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#TISO.CountryGetRefNo|TISO.CountryGetRefNo]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#AR_Exists|AR_Exists]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#CToD|CToD]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#fVal|fVal]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#Token|Token]]
*[[OBS/Makros_und_Scripting/Allgemeines/%C3%9Cbersicht_Funktionen#FindUstFromSatz|FindUstFromSatz]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Funktionen#UST_VK_Netto2Brutto|UST_VK_Netto2Brutto]]
*[[OBS/Makros_und_Scripting/Allgemeines/Übersicht_Globale_Variablen#oDB|oDB]]

Aktuelle Version vom 16. April 2019, 12:47 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;

zu Auftrag_MaterMD5 siehe TVB_MaterMode

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: