# Makro Installation

1. Aktuelles Makro [Makro Parameter](https://help.logisth.ai/%22C:%5CUsers%5CGabrielaMilcheva%5COneDrive%20-%20XION%20IT%20SYSTEMS%20GmbH%5Cfeldmakro_v3.11.txt%22)

<p class="callout warning">**ACHTUNG!** Bitte beachten Sie, dass Sie das Makro als **Zip-Datei** (.ZIP) herunterladen und es **NICHT in Ihrem Browser** öffnen und kopieren sollten.</p>

2. In der Vorerfassung für einen beliebigen Klienten im Eingangs- oder Ausgangsrechnungsbuch auf einen bestehenden Datensatz im Bearbeitungsmodus gehen und mit der rechten Maustaste auf das blaue Kästchen klicken und anschließend Feldeigenschaften auswählen.

<p class="callout warning">**Achtung**: Berechtigung zum Erstellen/Ändern von Makros muss vorhanden sein.</p>

<figure class="center" id="bkmrk-">![](https://help.logisth.ai/media/live/makr01.png)</figure> 2.1 Wenn die Feldeigenschaften nicht sichtbar sind, überprüfen Sie bitte Ihre BMD-Rechte oder führen Sie folgende Schritte aus:

- In der Vorerfassung - rechte Seite der Maske, befinden sich 3 Punkte zur Feldauswahl.
- Wenn Sie diese auswählen, gelangen Sie zum Feldauswahlfenster.

<figure class="center" id="bkmrk--2">![](https://help.logisth.ai/media/live/makro2.png)</figure>- Wählen Sie die Bezeichnung "Lieferanten" aus, im unteren Teil befinden sich die Feldeigenschaften.

<figure class="center" id="bkmrk--4">![](https://help.logisth.ai/media/live/jovq2-h6ej0thzeqmbr34wcugnzy76swrw.jpg)</figure>3. Feldeigenschaften Feldmakro anlegen: **Doppelklick links neben der Checkbox "Makro"**

<figure class="center" id="bkmrk-checkbox-makro">![](https://help.logisth.ai/media/live/gnf8tjd5p8j4rbgy4-tie7iee7zirb4kqw.jpg)<figcaption>*Checkbox Makro* </figcaption></figure>4. Wenn Sie das Makro zum **ersten Mal** erstellen, gehen Sie bitte in den Makro-Editor, schalten Sie in den **Expertenmodus** und fügen Sie den Makrotext per Copy and Paste ein.
5. Optionen richtig einstellen ab ca. Zeile 20

<figure id="bkmrk--5">![](https://help.logisth.ai/media/live/tttt.png)</figure>6. Anschließend **kompilieren und speichern** Sie das Makro und es sollten keine Fehler auftreten.

### Makro Parameter

- **do\_show\_kdlf** steuert die Anzeige des Pop-ups bei der Neuanlage oder Änderung eines Kunden bzw. Lieferanten:
- **1:** anzeigen,
- **0:** nicht anzeigen
- **do\_auth** Aktivierung des Makros oder der kundenspezifischen Steuerung:
- **1:** Steuerung über das Frei Feld - FWF\_FREIFELDA01\_50,
- **0:** makro immer aktiv
- **do\_modify\_buchungstext** Buchungstext vom Kunden/Lieferanten übernehmen:
- **1:** buchungstext ändern auf Name des Lieferanten/Kunden
- **0:** keine buchungstext ändern auf Name des Lieferanten/Kunden

// ============================================== // Erstelldatum : 12.07.2019 01:50:36 // Ersteller : arewa // Eingerichtet von/am : AREWA // Beschreibung : Feldmakro Lieferant // Version 1.0 vom 12.07.2019 // Version 2.0 vom 12.07.2020 // Version 3.0 vom 12.10.2022 mit konditionen // Version 3.1 vom 20.01.2023 ohne FibuMacroObject für bmd.com + matchcode setzen bei kdlf // Version 3.2 vom 13.03.2023 no BMD\_CRLF // Version 3.3 vom 25.04.2023 do\_show\_kdlf geht wieder // Version 3.4 vom 10.05.2023 logging print dump\_logfile // Version 3.5 vom 30.08.2023 no exec\_sql // Version 3.6 vom 02.11.2023 import kdlf file handle + unique file + delete // Version 3.7 vom 23.11.2023 disable VorerfassenModel.SetValue('MCA\_VEB\_UIDNR', per\_uidnr); // Version 3.8 vom 08.12.2023 firmengruppen // Version 3.9 vom 01.02.2024 update person auch wenn iban, zahlsperre // Version 3.10 vom 21.11.2024 take lowest personenkreis // Version 3.11 vom 19.12.2022 kontoinhaber, zahlsperre2 // ============================================== Var FirmenNr :String; FibuNr :String; BS :String; kdlf\_string :String; vorerf\_typ: Integer; VorerfassenModel :MacroObject; do\_show\_kdlf: Integer; do\_modify\_buchungstext: Integer; do\_auth: Integer; created\_list: MacroObject; fh\_bmd\_log: TBMDInt; //------------------------------------------------------------------------------ // Parameter festlegen - Kunde/Lieferant nach Änderung anzeigen JA/NEIN //------------------------------------------------------------------------------ function initParams; begin do\_show\_kdlf := 1; // 1: anzeigen, 0: nicht anzeigen do\_auth := 0; // 1: Steuerung über FWF\_FREIFELDA01\_50, 0: makro immer aktiv do\_modify\_buchungstext := 1; // 1: buchungstext ändern auf Name des Lieferanten/Kunden end; // ================================================================================ // ================================================================================ function get\_auth (FirmenNr: String; FibuNr: String); begin Result := 15; if not do\_auth then begin exit; end; //BMD\_FirmenwerteFibu := FibuMacroObject.CreateFMacroFirmenwerteFibu('eindeutige FirmenwerteFibuObj-ID'); //BMD\_FirmenwerteFibu.Load(FirmenNr, FibuNr); //Result := BMD\_TEXTTONUMDEF (BMD\_FirmenwerteFibu.GetValue('MCA\_FWF\_FREIFELDA01\_50')) sqlText := 'SELECT FWF\_FREIFELDA01\_50 FROM FIBU.FWF\_FIRMENWERTEFIBU WHERE FWF\_FIRMENNR = :firmennr AND FWF\_FIBUNR = :fibunr'; iQuery := MacroObject.CreateMacroQuery('fetch\_fwf\_freifeld'); iQuery.setSQLText (sqlText); iQuery.setParamAsString('firmennr', FirmenNr); iQuery.setParamAsString('fibunr', FibuNr); iQuery.Open(); if (iQuery.RecordCount() &gt; 0) then begin Result := BMD\_TEXTTONUMDEF (iQuery.getAsString ('FWF\_FREIFELDA01\_50')); end; iQuery.close(); end; // ================================================================================ procedure fetch\_json (var json\_string, json\_learned, fibunr, name, zusatzname, addresse, ort, plz, land\_id, uid, uid\_status, iban1, iban2, iban3, uid\_datum, kondition, zahlsperre, account\_holder); begin json := MacroObject.CreateMacroJsonVal(); json.ParseJson(json\_string); if json.KeyExists ('N1') then begin name := json.GetValueAsString('N1'); end; if json.KeyExists ('N2') then begin zusatzname := json.GetValueAsString('N2'); end; if json.KeyExists ('A') then begin addresse := json.GetValueAsString('A'); end; if json.KeyExists ('H') then begin account\_holder := json.GetValueAsString('H'); end; if json.KeyExists ('C') then begin ort := json.GetValueAsString('C'); end; if json.KeyExists ('P') then begin plz := json.GetValueAsString('P'); end; if json.KeyExists ('CC') then begin land\_id := json.GetValueAsString('CC'); end; if json.KeyExists ('U') then begin uid\_status := json.GetValueAsString('U'); end; if json.KeyExists ('TS') then begin uid\_timestamp := json.GetValueAsString('TS'); end; if json.KeyExists ('I1') then begin iban1 := json.GetValueAsString('I1'); end; if json.KeyExists ('I2') then begin iban2 := json.GetValueAsString('I2'); end; if json.KeyExists ('I3') then begin iban3 := json.GetValueAsString('I3'); end; if json.KeyExists ('Z') then begin zahlsperre := json.GetValueAsString('Z'); end; if json.KeyExists ('KD') then begin kondition := json.GetValueAsString('KD'); end; else begin kondition := '0'; end; if (uid\_status = '1') then begin uid\_datum := uid\_timestamp; uid\_status := 'GÜLTIG, geprüft am ' + uid\_timestamp; end; else if (uid\_status = '4') then begin uid\_status := 'UNGÜLTIG'; end else if (BMD\_LEN (uid\_status) &gt; 0) then begin // nur wenn es einen status gibt uid\_status := 'NICHT GEPRÜFT'; end; json.ParseJson(json\_learned); if json.KeyExists ('U') then begin uid := json.GetValueAsString('U'); end; end; // ================================================================================ function show\_kdlf (FirmenNr: String; FibuNr: String; personenid: String); begin if do\_show\_kdlf = 1 then begin lParams := 'STP\_CUS\_COMPANYNO=' + FirmenNr + ',STP\_CUS\_CUSTOMERID=' + personenid; if vorerf\_typ = 3 then begin // ER lParams := lParams + ',KLI\_ISTLIEFERANT=1'; end; BMD\_STARTFUNCTION('MCS\_MDKUNDE\_EDIT\_CREATE',lParams); end; end; // ================================================================================ function get\_next\_free\_kdlf\_nummer (FirmenNr: String; buchsymbol: String; FibuNr: String); begin iQuery := MacroObject.CreateMacroQuery('fetch\_nummernkreis'); sqlText := 'SELECT PNK\_FIRMENKATEGORIELFDNR, PNK\_VONNR, PNK\_BISNR FROM BUERO.PNK\_PERSONNUMMERNKREIS INNER JOIN FIBU.VBV\_VORERFASSBUCH on VBV\_FIRMENNR = PNK\_FIRMENNR and VBV\_FIBUNR=:fibunr and VBV\_BUS\_BUCHSYMSYMBOL=:buchsymbol WHERE PNK\_FIRMENNR = :firmennr AND PNK\_PERSONKZNR = iif (VBV\_VORERFASSTYP = 4, 1, iif (VBV\_VORERFASSTYP = 3, 2, 99999)) ORDER BY PNK\_FIRMENKATEGORIELFDNR'; // WHERE PNK\_FIRMENKATEGORIELFDNR=1 iQuery := MacroObject.CreateMacroQuery('fetch\_kreise'); iQuery.setSQLText (sqlText); iQuery.setParamAsString('firmennr', Firmennr); iQuery.setParamAsString('fibunr', FibuNr); iQuery.setParamAsString('buchsymbol', buchsymbol); iQuery.Open(); if (iQuery.RecordCount() &gt; 0) then begin from\_konto := iQuery.getAsString('PNK\_VONNR'); to\_konto := iQuery.getAsString('PNK\_BISNR'); iQuery.close(); sqlText := 'SELECT min(P.PER\_PERSONENNR)+1 as MIN\_NR FROM BUERO.PER\_PERSON P WHERE P.PER\_PERSONENNR between :from and :to and not exists (select 1 from BUERO.PER\_PERSON C, BUERO.KLI\_KUNDE\_LIEFERANT A WHERE C.PER\_PERSONENNR = P.PER\_PERSONENNR+1 AND C.PER\_FIRMENNR in ( SELECT FIG\_FIRMENNR FROM BUERO.FIG\_FIRMENGRUPPENZU A WHERE A.FIG\_GRUPPE\_FIRMENNR = (select B.FIG\_GRUPPE\_FIRMENNR FROM BUERO.FIG\_FIRMENGRUPPENZU B WHERE B.FIG\_FIRMENNR = :firmennr) union select :firmennr ) AND C.PER\_PERSONENART = ''KL'' AND C.PER\_JAHR &gt;= 0 AND C.PER\_ISTAKTUELLUNTERNR &gt;= 1 AND A.KLI\_FIRMENNR = C.PER\_FIRMENNR AND A.KLI\_KLID = C.PER\_PERSONENID AND A.KLI\_KLUNTERNR = C.PER\_PERSONUNTERNR)'; iQuery := MacroObject.CreateMacroQuery('next\_nummer'); iQuery.setSQLText (sqlText); iQuery.setParamAsString('firmennr', Firmennr); iQuery.setParamAsString('from', from\_konto); iQuery.setParamAsString('to', to\_konto); iQuery.Open(); if (iQuery.RecordCount() &gt; 0) then begin next\_kdlf := iQuery.getAsString('MIN\_NR'); iQuery.close(); Result := next\_kdlf; end; end; end; // ================================================================================ procedure get\_KDLF (var personenid, kontonr, uid, uid\_datum, name, zusatzname, strasse, plz, land\_id, iban1,iban2,iban3, kondition, zahlsperre, account\_holder); begin Result := ''; personenid := ''; sqlText := 'SELECT PER\_NAME as NAME, isnull (PER\_ZUSATZNAME, '''') as ZUSATZNAME, isnull (PER\_UIDNR, '''') as VATREGNO, PER\_PERSONENID as PERSONENID, isnull (BAI\_IBAN, '''') as IBAN, isnull (BAI\_KONTOINHABER, '''') as account\_holder, isnull (ADR\_STRASSE, '''') as ADDRESSE, ADR\_PLZ as PLZ, isnull (KOD\_KONDLFDNR, 0) as KOND, isnull (LAN\_ISO\_CODE, ''AT'') as COUNTRY, isnull (iif (KTO\_KONTENGRUPPE = 2, iif (isnull (KLI\_HATZAHLSPERRE, 0) = 1, 1, PEK\_KUN\_ZAHLSPERRE), iif (isnull (KLI\_HATZAHLSPERRE, 0) = 1, 1, PEK\_LIE\_ZAHLSPERRE)), 0) as ZAHLSPERRE FROM FIBU.PEK\_PERSONENKONTO P1 INNER JOIN BUERO.KLI\_KUNDE\_LIEFERANT KL ON KL.KLI\_FIRMENNR = P1.PEK\_FIRMENNR AND KL.KLI\_KLID = P1.PEK\_KLID INNER JOIN BUERO.PER\_PERSON ON PER\_FIRMENNR = PEK\_FIRMENNR AND PER\_PERSONENID = P1.PEK\_KLID INNER JOIN FIBU.KTO\_KONTO ON KTO\_FIRMENNR = PEK\_FIRMENNR AND KTO\_FIBUNR = PEK\_FIBUNR AND KTO\_KONTONR = PEK\_KONTONR INNER JOIN BUERO.ADR\_ADRESSE ON ADR\_FIRMENNR = PEK\_FIRMENNR AND ADR\_ADRESSLFDNR = PER\_ADRESSLFDNR LEFT JOIN BUERO.BAI\_BANKINSTITUTIONSZU ON BAI\_BANKINSTLFDNR=PER\_SENDER\_BANKINSTLFDNR LEFT JOIN BUERO.KOD\_KONDITIONEN ON KOD\_KONDNR=KLI\_LIEF\_KONDNR LEFT JOIN BUERO.LAN\_LAND ON LAN\_LANDNR = PER\_LANDNR WHERE PEK\_FIRMENNR = :firmennr AND PEK\_FIBUNR = :fibunr AND PEK\_KONTONR = :kontonr'; //BMD\_SHOWMESSAGE ('get\_KDLF firmennr: ' + Firmennr + ' fibunr: ' + FibuNr + ' kontonr: ' + kontonr); iQuery := MacroObject.CreateMacroQuery('get\_person'); iQuery.setSQLText (sqlText); iQuery.setParamAsString('firmennr', Firmennr); iQuery.setParamAsString('kontonr', KontoNr); iQuery.setParamAsString('fibunr', FibuNr); iQuery.Open(); if (iQuery.RecordCount() &gt; 0) then begin uid := iQuery.getAsString('VATREGNO'); name := iQuery.getAsString('NAME'); zusatzname := iQuery.getAsString('ZUSATZNAME'); personenid := iQuery.getAsString('PERSONENID'); strasse := iQuery.getAsString('ADDRESSE'); iban1 := iQuery.getAsString('IBAN'); kondition := iQuery.getAsString('KOND'); zahlsperre := iQuery.getAsString('ZAHLSPERRE'); land\_id := iQuery.getAsString('COUNTRY'); plz := iQuery.getAsString('PLZ'); account\_holder := iQuery.getAsString('account\_holder'); end; iQuery.close(); end; // ================================================================================ //------------------------------------------------------------------------------ function dump\_logfile (logfile: String); begin Result := ''; if (BMD\_FILEEXISTS (logfile)) then begin BMD\_ASSIGNFILE (fh\_bmd\_log, logfile); BMD\_OPENFILE\_RESET (fh\_bmd\_log); while not BMD\_EOF (fh\_bmd\_log) do begin line := BMD\_READLN (fh\_bmd\_log); //BMD\_SHOWMESSAGE (line); Result := Result + line; end; BMD\_CLOSEFILE (fh\_bmd\_log); end; end; // ================================================================================ function import\_KDLF (kontonr: String; uid: String; uid\_datum: String; name: String; zusatzname: String; strasse: String; plz: String; land\_id: String; iban1: String; iban2: String; iban3: String; kondition: String; zahlsperre: String; kontoinhaber: String); begin //gFileName := 'kdlf\_import\_' + kontonr + '.csv'; sequence := BMD\_GETSEQID(); gFileName := 'kdlf\_import\_' + sequence + '.csv'; sql\_exists := 'SELECT count(1) as COUNT FROM FIBU.PEK\_PERSONENKONTO P1 INNER JOIN BUERO.KLI\_KUNDE\_LIEFERANT KL ON KL.KLI\_FIRMENNR = P1.PEK\_FIRMENNR AND KL.KLI\_KLID = P1.PEK\_KLID INNER JOIN BUERO.PER\_PERSON ON PER\_FIRMENNR = PEK\_FIRMENNR AND PER\_PERSONENID = P1.PEK\_KLID INNER JOIN FIBU.KTO\_KONTO ON KTO\_FIRMENNR = PEK\_FIRMENNR AND KTO\_FIBUNR = PEK\_FIBUNR AND KTO\_KONTONR = PEK\_KONTONR WHERE PEK\_FIRMENNR = :firmennr AND PEK\_FIBUNR = :fibunr AND PEK\_KONTONR = :kontonr'; temp:= BMD\_GETENVIRONMENTVAR('temp'); filename := temp +'\\'+ gFileName; //if (BMD\_FILEEXISTS(filename)) then begin // BMD\_DELETEFILE(filename); //DeleteFile //end; //BMD\_CREATEFILE(filename); lFileNr := 1; BMD\_ASSIGNFILE(lFileNr,filename,1,1,1,1200); // unicode //rc := BMD\_OPENFILE\_APPEND(lFileNr); //if (rc = '-1') then begin // BMD\_SHOWMESSAGE('Fehler open file ' + filename); // exit; //end; header\_line1 := 'NTCS\_CONSTID\_INFO%10%MCA\_KTO\_KONTONR%MCA\_PER\_NAME%MCA\_PER\_ZUSATZNAME%MCA\_ADR\_ORTSNAME%MCA\_ADR\_PLZ%MCA\_ADR\_STRASSE%MCA\_PER\_UIDNR%MCA\_PER\_LANDNR%MCA\_BAI\_IBAN%MCA\_PER\_UIDDATUM%MCA\_KLI\_KONDNR%MCA\_KLI\_HATZAHLSPERRE%MCA\_PEK\_LIE\_ZAHLSPERRE%MCA\_PER\_MATCHCODE%MCA\_BAI\_KONTOINHABER'; header\_line2 := 'kto-nr;Name;zusatzname;Ort;PLZ;Strasse;UID;Land;iban-nr;UID-Datum;kondition;zahlsperre1;zahlsperre2;matchcode;kontoinhaber'; //header\_line1 := 'NTCS\_CONSTID\_INFO%10%MCA\_KTO\_KONTONR%MCA\_PER\_NAME%MCA\_PER\_ZUSATZNAME%MCA\_ADR\_ORTSNAME%MCA\_ADR\_PLZ%MCA\_ADR\_STRASSE%MCA\_PER\_UIDNR%MCA\_PER\_LANDNR%MCA\_BAI\_IBAN%MCA\_PER\_UIDDATUM%MCA\_KLI\_KONDNR%MCA\_KLI\_HATZAHLSPERRE%MCA\_PER\_MATCHCODE'; //header\_line2 := 'kto-nr;Name;zusatzname;Ort;PLZ;Strasse;UID;Land;iban-nr;UID-Datum;kondition;zahlsperre;matchcode'; BMD\_WRITELN(lFileNr, header\_line1); BMD\_WRITELN(lFileNr, header\_line2); line:= kontonr + ';' + name + ';' + zusatzname + ';;' + +plz + ';' + strasse + ';' + uid + ';' + land\_id + ';' + iban1 + ';' + uid\_datum + ';' + kondition + ';' + zahlsperre + ';' + zahlsperre + ';' + BMD\_UPPER (name) + ';' + kontoinhaber; BMD\_WRITELN(lFileNr, line); BMD\_CLOSEFILE(lFileNr); if(BMD\_FILEEXISTS(filename))then begin if((FirmenNr&lt;&gt;'') AND (FibuNr&lt;&gt;'') AND (filename&lt;&gt;''))then begin //BMD\_SHOWMESSAGE (dump\_logfile (filename)); logfile := temp +'\\Kontenimport' + FirmenNr + '\_' + kontonr + '.log'; lParam := 'STP\_FIB\_COMPANYNO=' + FirmenNr + ',STP\_FIB\_FIBUNO=' + FibuNr + ',STP\_IMP\_FILENAME=' + filename + ',STP\_LOG\_FILENAME=' + logfile + ','; lParam := lParam + 'SILENT=1,'; lParam := lParam + 'STP\_IMP\_SEPARATOR=;,'; lParam := lParam + 'STP\_IMP\_ENCODING=3,'; lParam := lParam + 'STP\_USEFIXEDLENGTH=0,'; lParam := lParam + 'STP\_IGNORE\_FIRSTLINE=1'; BMD\_STARTFUNCTION('MCS\_FRMFIBUVARCSVPERSONENKONTENIMPEXP\_CREATE',lParam); //Start Var. Personenimport BMD\_DELETEFILE(filename); uid := ''; uid\_status := ''; uid\_timestamp := ''; name := ''; zusatzname := ''; addresse := ''; plz := ''; land\_id := ''; iban1 := ''; iban2 := ''; iban3 := ''; kondition := ''; personenid := ''; zahlsperre := ''; get\_KDLF (personenid, kontonr, uid, uid\_timestamp, name, zusatzname, addresse, plz, land\_id, iban1, iban2, iban3, kondition, zahlsperre, kontoinhaber); if personenid = '' then begin BMD\_SHOWMESSAGE('Fehler: Anlegen/Ändern Konto ' + kontonr + ' failed logfile: ' + dump\_logfile (logfile)); end; Result := personenid; end; end; VorerfassenModel.SetValue('MCA\_VEB\_KONTONR', kontonr); end; // ================================================================================ function store\_created\_kdlf (uid: String; name: String; vorerf\_typ: String; personenid: String); begin if uid = '' then begin // search for name search\_string := FirmenNr + ';' + FibuNr + ';' + vorerf\_typ + ';' + name; end; else begin search\_string := FirmenNr + ';' + FibuNr + ';' + vorerf\_typ + ';' + 'UID' + uid; end; created\_list.SetKeyValue (search\_string, personenid); end; // ================================================================================ // bei überspringen leeres feld --&gt; gibt es den lieferanten schon? // ================================================================================ function KDLF\_exists (search\_uid: String; search\_name: String; vorerf\_typ: String); begin sqlText := 'SELECT PEK\_KONTONR as KONTONR, PER\_NAME as NAME, PER\_ZUSATZNAME as ZUSATZNAME, PER\_UIDNR as VATREGNO, KTO\_KONTENGRUPPE FROM FIBU.PEK\_PERSONENKONTO P1 INNER JOIN BUERO.KLI\_KUNDE\_LIEFERANT KL ON KL.KLI\_FIRMENNR = P1.PEK\_FIRMENNR AND KL.KLI\_KLID = P1.PEK\_KLID INNER JOIN BUERO.PER\_PERSON ON PER\_FIRMENNR = PEK\_FIRMENNR AND PER\_PERSONENID = P1.PEK\_KLID INNER JOIN FIBU.KTO\_KONTO ON KTO\_FIRMENNR = PEK\_FIRMENNR AND KTO\_FIBUNR = PEK\_FIBUNR AND KTO\_KONTONR = PEK\_KONTONR WHERE PEK\_FIRMENNR = :firmennr AND PEK\_FIBUNR = :fibunr AND (LEN (:uid) &gt; 5 AND PER\_UIDNR = :uid or (isnull (:uid,'''') = '''' and PER\_NAME = :name)) AND (KTO\_KONTENGRUPPE = 4 OR (KTO\_KONTENGRUPPE = 3 and :vorerf\_typ = 3) OR (KTO\_KONTENGRUPPE = 2 and :vorerf\_typ = 4)) '; // Kontengruppe KUNDE=2, LIEFERANT=3, both = 4 // vorerf\_typ 4 = AR (Kunden), 3: ER (Lieferanten) Result := '0'; iQuery := MacroObject.CreateMacroQuery('get\_konto'); iQuery.setSQLText (sqlText); iQuery.setParamAsString('firmennr', Firmennr); iQuery.setParamAsString('fibunr', FibuNr); iQuery.setParamAsString('uid', search\_uid); iQuery.setParamAsString('name', search\_name); iQuery.setParamAsString('vorerf\_typ', vorerf\_typ); iQuery.Open(); if (iQuery.RecordCount() &gt; 0) then begin per\_kontonr := iQuery.getAsString('KONTONR'); per\_name := iQuery.getAsString('NAME'); per\_uidnr := iQuery.getAsString('VATREGNO'); per\_zusatzname := iQuery.getAsString('ZUSATZNAME'); kontengruppe := iQuery.getAsString('KTO\_KONTENGRUPPE'); rc := BMD\_ASKVALUEBOOL (kdlf\_string + 'nummer ' + per\_kontonr + bmd\_lineBreak() + bmd\_lineBreak() + 'Name: &lt;' + per\_name + '&gt;' + 'UID : &lt;' + per\_uidnr + '&gt;', kdlf\_string + ' übernehmen ?'); if (rc = 1) then begin VorerfassenModel.SetValue('MCA\_VEB\_KONTONR', per\_kontonr); Result := per\_kontonr; end else begin Result := '0'; end; end; else begin //BMD\_SHOWMESSAGE ('no kdlf firmennr: ' + Firmennr + ' fibunr: ' + FibuNr + ' vorerf\_typ: ' + vorerf\_typ + ' uid: ' + search\_uid + ' name: ' + search\_name + ' sql: ' + sqlText); end; end; // ================================================================================ //BMD\_SHOWMESSAGE ('start'); IF (BMD\_GETAPPLICATIONTYPE() &lt;&gt; 'BMDNTCS') THEN BEGIN exit; END; VorerfassenModel := MacroObject.CreateMacroModel('TBMDMDFibuVorerfassBuchungMgr'); //CreateMacroModel lkontobezeichnung := VorerfassenModel.GetValue('MCU\_VEB\_ADD\_KONTOBEZEICHNUNG'); //GetValue FibuNr := VorerfassenModel.GetValue('MCA\_VEB\_FIBUNR'); FirmenNr := VorerfassenModel.GetValue('MCA\_VEB\_FIRMENNR'); uid := VorerfassenModel.GetValue('MCA\_VEB\_UIDNR'); text := VorerfassenModel.GetValue('MCA\_VEB\_BUCHUNGSTEXT'); id := VorerfassenModel.GetValue('MCA\_VEB\_VORERFASSID'); rg\_file := VorerfassenModel.GetValue('MCA\_VEB\_FREIFELDA01\_20'); json := VorerfassenModel.GetValue('MCA\_VEB\_FREIFELDA03\_300'); json\_learned := VorerfassenModel.GetValue('MCA\_VEB\_FREIFELDA01\_50'); periode := VorerfassenModel.GetValue('MCA\_VEB\_PERIODE'); blind\_flag := VorerfassenModel.GetValue('MCA\_VEB\_FREIFELDN6\_10'); fh\_bmd\_log := 4; if (BMD\_LEN (text) &gt; 100) then begin if (BMD\_POS (text, ' ') &gt; 0) then begin text := BMD\_COPY (text, 1, 101); end else begin text := BMD\_COPY (text, 1, 100); end; end; personenid := VorerfassenModel.GetValue('MCA\_VEB\_PER\_PERSONENID'); // alte personenid BS := VorerfassenModel.GetValue('MCA\_VEB\_BUS\_BUCHSYMSYMBOL'); field\_input\_value := FIELD\_INPUT\_VALUE; field\_old\_value := FIELD\_OLD\_VALUE; KontoNr := field\_input\_value; KontoNr\_numeric := BMD\_TEXTTONUMDEF (field\_input\_value); field\_output\_value := field\_input\_value; per\_uidnr := ''; per\_name := ''; initParams; AUTH\_CRE\_KUNDEN := 1; AUTH\_UPD\_KUNDEN := 2; AUTH\_CRE\_LIEF := 4; AUTH\_UPD\_LIEF := 8; BMD\_VORERF\_TYP\_KUNDEN := '4'; BMD\_VORERF\_TYP\_LIEF := '3'; // Änderung Blindsätze unterbinden if (blind\_flag = '99') and (BMD\_LEN (field\_input\_value) &gt; 0) and (KontoNr\_numeric &gt; 0) then begin BMD\_SHOWMESSAGE ('Änderung bereits verbuchten Blindsatz nicht erlaubt - bitte löschen vor Import'); FIELD\_OUTPUT\_VALUE := ''; exit; end; vorerf\_typ := VorerfassenModel.GetValue('MCA\_VEB\_VBV\_VORERFASSTYP'); kdlf\_string := 'Lieferanten'; if ((vorerf\_typ &lt;&gt; BMD\_VORERF\_TYP\_LIEF) and (vorerf\_typ &lt;&gt; BMD\_VORERF\_TYP\_KUNDEN)) then begin // Kassa exit; end; else if (vorerf\_typ = BMD\_VORERF\_TYP\_KUNDEN) then begin kdlf\_string := 'Kunden'; end; auth := get\_auth (FirmenNr, FibuNr); auth\_create := 0; auth\_modify := 0; if (vorerf\_typ = BMD\_VORERF\_TYP\_KUNDEN) then begin if auth and AUTH\_CRE\_KUNDEN then begin auth\_create := 1; end; if auth and AUTH\_UPD\_KUNDEN then begin auth\_modify := 1; end; end; if (vorerf\_typ = BMD\_VORERF\_TYP\_LIEF) then begin if auth and AUTH\_CRE\_LIEF then begin auth\_create := 1; end; if auth and AUTH\_UPD\_LIEF then begin auth\_modify := 1; end; end; if (not auth\_create) and (not auth\_modify) then begin //BMD\_SHOWMESSAGE ('no auth'); exit; end; addresse := ''; ort := ''; plz := ''; land\_id := ''; uid\_status := ''; iban1 := ''; iban2 := ''; iban3 := ''; per\_adresse := ''; per\_zusatzname := ''; per\_iban1 := ''; per\_iban2 := ''; per\_iban3 := ''; uid\_datum := ''; name := ''; zusatzname := ''; kondition := ''; zahlsperre := ''; per\_zahlsperre := ''; kontoinhaber := ''; per\_kontoinhaber := ''; per\_plz := ''; per\_land\_id := ''; per\_kondition := ''; personenid := ''; uid\_timestamp := ''; done\_list := MacroObject.FindGlobalMacroStringList('Logisthai\_done'); if not done\_list then begin done\_list := MacroObject.CreateGlobalMacroStringList('Logisthai\_done'); end; created\_list := MacroObject.FindGlobalMacroStringList('Logisthai\_created'); if not created\_list then begin created\_list := MacroObject.CreateGlobalMacroStringList('Logisthai\_created'); end; fetch\_json (json, json\_learned, fibunr, name, zusatzname, addresse, ort, plz, land\_id, uid, uid\_status, iban1, iban2, iban3, uid\_datum, kondition, zahlsperre, kontoinhaber); if (BMD\_LEN (field\_input\_value) &gt; 0) and (KontoNr\_numeric &gt; 0) then begin if not auth\_modify then begin //BMD\_SHOWMESSAGE ('no auth'); exit; end; //BMD\_SHOWMESSAGE ('field changed'); // field update &amp;&amp; check update kundenstamm get\_KDLF (personenid, kontonr, per\_uidnr, uid\_timestamp, per\_name, per\_zusatzname, per\_adresse, per\_plz, per\_land\_id, per\_iban1, per\_iban2, per\_iban3, per\_kondition, per\_zahlsperre, per\_kontoinhaber); if (field\_input\_value &lt;&gt; field\_old\_value) then begin if do\_modify\_buchungstext then begin VorerfassenModel.SetValue('MCA\_VEB\_BUCHUNGSTEXT', per\_name); end; //VorerfassenModel.SetValue('MCA\_VEB\_UIDNR', per\_uidnr); VorerfassenModel.SetValue('MCA\_VEB\_FREIFELDNK2', 1); // set change id end if zahlsperre = '' then begin zahlsperre := per\_zahlsperre; end; if kondition = '' then begin kondition := per\_kondition; end; // update\_stamm if (((BMD\_LEN (uid) &gt; 0) or (BMD\_LEN (name) &gt; 0)) and (BMD\_LEN (name) &gt; 0) and ( (per\_uidnr &lt;&gt; uid) or (per\_name &lt;&gt; name) or (addresse &lt;&gt; per\_adresse) or (plz &lt;&gt; per\_plz) or (iban1 &lt;&gt; per\_iban1) or (land\_id &lt;&gt; per\_land\_id) or ((kondition &lt;&gt; per\_kondition) AND (kondition &lt;&gt; '')) or ((zahlsperre &lt;&gt; per\_zahlsperre) AND (zahlsperre &lt;&gt; '')) or ((kontoinhaber &lt;&gt; per\_kontoinhaber) AND (per\_kontoinhaber &lt;&gt; '')) )) then begin current\_date := BMD\_DATE(); // BMD\_SHOWMESSAGE('per\_uidnr: ' + per\_uidnr + ' uid: ' + uid + ' per\_name: ' + per\_name + ' name: ' + name + ' addresse: ' + addresse + ' per\_adresse: ' + per\_adresse + ' kondition: ' + kondition + ' per\_kondition: ' + per\_kondition); // wurde mit aktuellem tagesdatum + firmennr + fibunr + periode + kdlf + neuem updatewert schon einmal nach einem update gefragt? //done\_string := current\_date + ';' + FirmenNr + ';' + FibuNr + ';' + Periode + ';' + field\_input\_value + ';' + name; //done := BMD\_GETINTPARAMVALUE('LOGISTHAI\_KDLF',done\_string,''); //done := ''; // test only //BMD\_SHOWMESSAGE('per\_uidnr: ' + per\_uidnr + ' uid: ' + uid + ' per\_name: ' + per\_name + ' name: ' + name + ' addresse: ' + addresse + ' per\_adresse: ' + per\_adresse + ' kondition: ' + kondition + ' per\_kondition: ' + per\_kondition); done\_string := FirmenNr + ';' + FibuNr + ';' + Periode + ';' + field\_input\_value + ';' + name; done := done\_list.GetKeyValue (done\_string); if (done &lt;&gt; '') then begin //BMD\_SHOWMESSAGE('Schon mal gefragt und du wolltest nicht, Jetzt Pech'); end; else begin question := ''; if (per\_name &lt;&gt; name) then begin question := question + 'Name &lt;' + per\_name + '&gt; auf &lt;' + name + '&gt;' + bmd\_lineBreak(); end; if (per\_uidnr &lt;&gt; uid) then begin question := question + 'UID &lt;' + per\_uidnr + '&gt; auf &lt;' + uid + '&gt;' + bmd\_lineBreak(); end; if (addresse &lt;&gt; per\_adresse) then begin question := question + 'Adresse &lt;' + per\_adresse + '&gt; auf &lt;' + addresse + '&gt;' + bmd\_lineBreak(); end; if (plz &lt;&gt; per\_plz) then begin question := question + 'PLZ &lt;' + per\_plz + '&gt; auf &lt;' + plz + '&gt;' + bmd\_lineBreak(); end; if (iban1 &lt;&gt; per\_iban1) then begin question := question + 'IBAN &lt;' + per\_iban1 + '&gt; auf &lt;' + iban1 + '&gt;' + bmd\_lineBreak(); end; if (land\_id &lt;&gt; per\_land\_id) then begin question := question + 'Land &lt;' + per\_land\_id + '&gt; auf &lt;' + land\_id + '&gt;' + bmd\_lineBreak(); end; if ((kondition &lt;&gt; per\_kondition) AND (kondition &lt;&gt; '')) then begin question := question + 'Kondition &lt;' + per\_kondition + '&gt; auf &lt;' + kondition + '&gt;' + bmd\_lineBreak(); end; if ((zahlsperre &lt;&gt; per\_zahlsperre) AND (zahlsperre &lt;&gt; '')) then begin per\_zahlsperre\_string := 'Nein'; zahlsperre\_string := 'Nein'; if (per\_zahlsperre &lt;&gt; '0') then begin per\_zahlsperre\_string := 'Ja'; end; if (zahlsperre &lt;&gt; '0') then begin zahlsperre\_string := 'Ja'; end; question := question + 'Zahlsperre &lt;' + per\_zahlsperre\_string + '&gt; auf &lt;' + zahlsperre\_string + '&gt;' + bmd\_lineBreak(); end; if ((kontoinhaber &lt;&gt; per\_kontoinhaber) AND (kontoinhaber &lt;&gt; '')) then begin question := question + 'Kontoinhaber &lt;' + per\_kontoinhaber + '&gt; auf &lt;' + kontoinhaber + '&gt;' + bmd\_lineBreak(); end; rc := BMD\_ASKVALUEBOOL (question, 'Stammdatenupdate - ' + KontoNr + ' - ' + per\_name + ' ?'); done\_list.SetKeyValue (done\_string, '1'); if (rc = 1) then begin personenid := import\_KDLF (KontoNr, uid, uid\_datum, name, zusatzname, addresse, plz, land\_id, iban1, iban2, iban3, kondition, zahlsperre, kontoinhaber); if do\_modify\_buchungstext then begin VorerfassenModel.SetValue('MCA\_VEB\_BUCHUNGSTEXT', name); end; show\_kdlf (FirmenNr, FibuNr, personenid); end; FIELD\_KEEP\_FOCUS:=True; end; end; end; else if auth\_create then begin // feld leer --&gt;neuen kunden anlegen if (((BMD\_LEN (uid) &gt; 0) or (BMD\_LEN (plz) &gt; 0)) and (BMD\_LEN (name) &gt; 0)) then begin rc := KDLF\_exists (uid, text, vorerf\_typ); if (rc = '0') then begin next\_nummer := get\_next\_free\_kdlf\_nummer (FirmenNr, BS, FibuNr); if (next\_nummer &gt; 0) then begin text := name; if addresse &lt;&gt; '' then begin text := text + ' ' + addresse; end; if ort &lt;&gt; '' then begin text := text + ' ' + ort; end; if uid &lt;&gt; '' then begin text := text + ' UID ' + uid + ': ' + uid\_status; end; if iban1 &lt;&gt; '' then begin text := text + ' ' + iban1; end; text := text + ' Nummer:'; rc := BMD\_ASKVALUEBOOL (kdlf\_string + 'Nummer ' + next\_nummer + bmd\_lineBreak() + bmd\_lineBreak() + name + bmd\_lineBreak() + 'UID &lt;' + uid + '&gt;: ' + uid\_status + bmd\_lineBreak() + addresse + bmd\_lineBreak() + ort + bmd\_lineBreak() + 'IBAN: ' + iban1, kdlf\_string + ' anlegen ?'); if (rc = 1) then begin personenid := import\_KDLF (next\_nummer, uid, uid\_datum, name, zusatzname, addresse, plz, land\_id, iban1, iban2, iban3, kondition, zahlsperre, kontoinhaber); store\_created\_kdlf (uid, name, vorerf\_typ, personenid); field\_output\_value := next\_nummer; show\_kdlf (FirmenNr, FibuNr, personenid); end; end; else begin BMD\_SHOWMESSAGE ('Keine next free number'); end; end; else begin field\_output\_value := rc; end; FIELD\_KEEP\_FOCUS:=True; end; end; result := field\_output\_value; FIELD\_OUTPUT\_VALUE:=result;

```
TEST MAKRO
Zeile 1
Zeile 2
Zeile 3
```