OBS/Makros und Scripting/Allgemeines/Klassen/Vorgänge/Auftrag
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;
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: