MwSt Änderung ab 01.07.2020

Allgemeine Diskussionen um die ERP Software AvERP

Moderator: SYNERPY

Antworten
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Hallo und guten Tag,

wird es zur zeitlichen Umstellung der Mehrwertsteuer vom 01.07.2020 . 31.12.2020 ein Script von Synerpy geben, um die Änderung in die DB zu übernehmen und die offenen Aufträge zum Stichtag umzustellen?
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
RWerner
Beiträge: 481
Registriert: Di Mai 18, 2004 8:42 pm
Wohnort: Pforzheim

Re: MwSt Änderung ab 01.07.2020

Beitrag von RWerner »

Hallo und guten Morgen,

Mir ist ein Gerücht zu Ohren gekommen das das Script etwa 1000€ pro Kunde kosten wird. Was genau damit gemeint oder getan wird ist mir nicht bekannt.

IN BFIRM kommt Mann in die Firmenstammdaten, mit BMAND in die Mandantenstammdaten. Dort kann man theoretisch den Mwst Schlüssel umstellen bzw einen Neuen erzeugen.
3.Artikel -> MwSt. und Mwst.Kz. 0%
der verringerte Mwst Satz habe ich erstmal nicht gefunden ist für mich auch nicht wichtig (hoffe ich)

BMWST verbirgt sich dahinter und dort das Utilitities FRUBMWST_NEU

Das bringt bei mir nach einigem Nachdenken dann eine Fehlermeldung...

Grüße ins Forum :mrgreen:
nach Aussage von Synerpy taucht die Utilities nix,(funkktioniert nicht) ist halt noch drin.
das einfache Ändern des MWst Satz in BFIRMA funktioniert, (mit WarnungSmeldung)
Allerdings gehen auch die Neuausdrucke alter Rechnungen dann mit dem neuen Mwst Satz.

Entweder Synerpy ranlassen und umfangreiche änderungen einspielen (kostenpflichtig) oder die Nachteile in Kauf nehmen. Davon (den Nachteilen) könnten noch mehr programmiert sein. Ok ich bin frustriert....
r :evil:
Lieblingsthema-> Dokumentation, das unbekannte Wesen

Ronald Werner
http://www.rws-automation.de

Averp lebensecht seit 13.08.2014 davor A.L.F. mit RWSFA seit 1991
Averp DB 2019.02 , EXE: 6.8.6.0 auf WinServer 2008
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Re: MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Hallo,
warum frustriert :?:

Aus dem Utilitie FRUBMWST_NEU wird die Prozedur P_BMWST_MWST_NEU aufgerufen und diese ändert dann das MwSt-Kz auf den neuen Wert.
Leider hat Synerpy da einen kleinen Fehler eingebaut :? Es wird nämlich versucht den MwSt-Satz von 0% auf den neuen Satz zu ändern, da das Feld BMWST_ID_KZ und nicht das richtige Feld BMWST_ID angesprochen wird.
Also diese Prozedure anpassen und dann sollte es laufen.

Zur Fehlermeldung
Wie lautet diese Fehlermeldung :?:
Falls es sich um den Fehler "Die Positionen sind nicht mehr komplett im Rueckstand" handelt, habe ich auch einen Tipp dafür.

Ich habe auf einer Kopie meiner DB die Umstellung ohne Probleme durchgeführt.

Die Prozedur läuft je nach Server ca. 5-10 min.

Schönes Wochenende :D
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
Thomas Rogge
Beiträge: 149
Registriert: Mi Mär 04, 2009 10:45 am

Re: MwSt Änderung ab 01.07.2020

Beitrag von Thomas Rogge »

Beschaffungsseitig muus man auch BLIEF, BSAL und die Eingangsrechnungsrückstände anpassen, das wird mit dem oberen Script nicht berücksichtigt.

Die Prozedur P_BMWST_MWST_NEU sieht so bei mir aus (die Änderung von festus ist auch bereits inkludiert):

Code: Alles auswählen

BEGIN
  /* LETZTER STAND 24.03.2014 13:59:36 MM */
  /* ERSTER STAND: 11.12.2007 18:18:41 AK */
  /* PROTOKOLLIEREN, DASS AKTION HIER DURCHGELAUFEN IST */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BMWST_MWST_NEU');
      
  /* Mehrwertsteuersatz ändern
     Außer Stammdaten wird der MwStSatz nur geändert, wenn
     die Positionen noch nicht geliefert wurden, da der Tag der Lieferung
     entscheidend ist. Sollte es trotzdem einmal anders sein, so kann der
     Benutzer in den Positionen den Steuersatz noch einmal ändern */

  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES (:SJA, :SNEIN);
  EXECUTE PROCEDURE P_BMAND_CHECK RETURNING_VALUES(:BMAND_ID);

  NEU_MWSTSATZ = NULL;


  IF ((COALESCE(NEU_BMWST_ID,0) = 0) OR
      (COALESCE(OLD_BMWST_ID,0) = 0) OR
      (NEU_BMWST_ID IS NOT DISTINCT FROM OLD_BMWST_ID)) THEN
    EXIT;

  SELECT PROZENT
  FROM BMWST
  WHERE ID = :NEU_BMWST_ID
  INTO :NEU_MWSTSATZ;

  UPDATE BFIRMA
  SET BMWST_ID_MWSTKENNZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKENNZ = :OLD_BMWST_ID;

  UPDATE BMAND
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;

  UPDATE BSA
  SET BMWST_ID_MWSTKZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKZ = :OLD_BMWST_ID;
  
  UPDATE BSABMAND
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
        BMAND_ID = :BMAND_ID;

  -- Rechnungsrückstande, die noch nicht geliefert worden sind
  UPDATE BAUFPO
  SET BMWST_ID_MWSTKZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKZ = :OLD_BMWST_ID AND
        LS_OFFEN > 0.0 AND
        RG_OFFEN > 0.0;

  -- Lieferanten
  UPDATE  BLIEF
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;

  -- Lieferanten Artikelstamm
  UPDATE  BSAL
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;

  -- Bestellpos.Rückstände
  UPDATE BBESP
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
      RE_OFFEN > 0.0;
END
Gruß
Thomas
Software-Version: 6.6.10.0
DB-Version: AVERP2018.03
Server: Windows 10 Pro Intel Xeon E3-1230v6 - 16GB RAM
50 User
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Re: MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Vielen Dank,
Lieferantenstamm, und Einkauf werde ich dementsprechend anpassen :D

Schönes Wochenende
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Re: MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Guten Morgen,

ich habe jetzt die Prozedur noch ein wenig erweitert in dem Sinne, dass jetzt bevor der neue MwSt-Satz in BSA aktualisiert wird, erst der neue MwSt-Satz in den Tabellen BARTG1FIBU(Warengruppe Verkauf) und BARTG2FIBU(Warengruppe Einkauf) eingefügt wird, falls noch nicht vorhanden.
Dadurch besteht die Möglichkeit ein anderes Sachkonto für diesen neuen MwSt-Satz anzugeben.

Falls der neue MwSt-Satz in den Tabellen schon vorhanden ist (bei Rückstellung von 16% wieder auf 19%), sind die vorherigen Einstellungen mit den dazugehörigen Konten wieder aktiv.

So sieht jetzt meine Prozedure P_BMWST_MWST_NEU_HVH(angepasste Kopie von P_BMWST_MWST_NEU) aus:

Code: Alles auswählen

BEGIN
  /* Letzter Stand: 20.06.2020 08:17:53 by KDP */
  /* Feld BMWST_ID_KZ auf BMWST_KZ geändert in BMAND  */
  /* IN BMWST_ID_KZ steht der Steuersatz von 0%!!! und sollte nicht geändert werden */
  /* Letzter Stand: 26.06.2020 08:06:02 by KDP */
  /* DS in Warengruppe Verkauf - Vorbelegung mit neuem MwSt-Satz anlegen, falls nicht vorhanden */
  /* Prozedure kopiert und umbenannt ..._HVH */
  /* LETZTER STAND 28.06.2018 08:53:43 JF */
  /* ERSTER STAND: 11.12.2007 18:18:41 AK */
  /* PROTOKOLLIEREN, DASS AKTION HIER DURCHGELAUFEN IST */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BMWST_MWST_NEU_HVH');
      
  /* Mehrwertsteuersatz ändern
     Außer Stammdaten wird der MwStSatz nur geändert, wenn
     die Positionen noch nicht geliefert wurden, da der Tag der Lieferung
     entscheidend ist. Sollte es trotzdem einmal anders sein, so kann der
     Benutzer in den Positionen den Steuersatz noch einmal ändern */

  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES (:SJA, :SNEIN);
  EXECUTE PROCEDURE P_BMAND_CHECK RETURNING_VALUES(:BMAND_ID);


  IF ((COALESCE(NEU_BMWST_ID,0) = 0) OR
      (COALESCE(OLD_BMWST_ID,0) = 0) OR
      (NEU_BMWST_ID IS NOT DISTINCT FROM OLD_BMWST_ID)) THEN
    EXIT;
  -- Warengruppe Verkauf durchlaufen und
  -- je einen DS in BARTG1FIBU für neuen MwST-Satz anlegen
  -- falls noch nicht vorhanden
  -- falls ikontovk angegeben dieses verwenden, ansonsten Konto aus Kopie aus alten MwSt-Satz
  FOR SELECT ID
  FROM BARTG1
  INTO
    :warengruppeid
  DO BEGIN
    IF (NOT EXISTS(SELECT ID FROM BARTG1FIBU WHERE BARTG1_ID_LINKKEY = :warengruppeid AND BMWST_ID = :NEU_BMWST_ID)) THEN BEGIN
      INSERT INTO BARTG1FIBU(
      BARTG1_ID_LINKKEY,
      BMWST_ID,
      BMAND_ID,
      BFIBUKTO_ID,
      BKST_ID
    )
    SELECT
        A.BARTG1_ID_LINKKEY,
        :NEU_BMWST_ID,
        A.BMAND_ID,
        CASE WHEN
          COALESCE(:ikontovk,0) = 0 THEN A.BFIBUKTO_ID
        ELSE
          :ikontovk
        END,
        A.BKST_ID
      FROM BARTG1FIBU A
      LEFT OUTER JOIN BMWST B ON B.ID = :NEU_BMWST_ID
      WHERE A.BARTG1_ID_LINKKEY = :warengruppeid AND A.BMWST_ID = :OLD_BMWST_ID
    ;
    END
  END

  -- Warengruppe Einkauf durchlaufen und
  -- je einen DS in BARTG2FIBU für neuen MwST-Satz anlegen
  -- falls noch nicht vorhanden
  FOR SELECT ID
  FROM BARTG2
  INTO
    :warengruppeid
  DO BEGIN
    IF (NOT EXISTS(SELECT ID FROM BARTG2FIBU WHERE BARTG2_ID_LINKKEY = :warengruppeid AND BMWST_ID = :NEU_BMWST_ID)) THEN BEGIN
      INSERT INTO BARTG2FIBU(
      BARTG2_ID_LINKKEY,
      BMWST_ID,
      BMAND_ID,
      BFIBUKTO_ID,
      BKST_ID
    )
    SELECT
        A.BARTG2_ID_LINKKEY,
        :NEU_BMWST_ID,
        A.BMAND_ID,
        CASE WHEN
          COALESCE(:ikontoek,0) = 0 THEN A.BFIBUKTO_ID
        ELSE
          :ikontoek
        END,
        A.BKST_ID
      FROM BARTG2FIBU A
      LEFT OUTER JOIN BMWST B ON B.ID = :NEU_BMWST_ID
      WHERE A.BARTG2_ID_LINKKEY = :warengruppeid AND A.BMWST_ID = :OLD_BMWST_ID
    ;
    END
  END

  UPDATE BFIRMA
  SET BMWST_ID_MWSTKENNZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKENNZ = :OLD_BMWST_ID;

  UPDATE BMAND
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;
  -- In BSAFIBUZW wird automatisch ein DS angelegt, falls noch nicht vorhanden
  UPDATE BSA
  SET BMWST_ID_MWSTKZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKZ = :OLD_BMWST_ID;
  
  UPDATE BSABMAND
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
        BMAND_ID = :BMAND_ID;

  -- Rechnungsrückstande, die noch nicht geliefert worden sind
  -- Nur Positionen ab dem Jahr 2020, da durch Update von AvERP2014 auf AvERP2020
  -- bei alten Aufträgen evtl. Fehler kommt Exception "Rueckstand"
  UPDATE BAUFPO
  SET BMWST_ID_MWSTKZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKZ = :OLD_BMWST_ID AND
        LS_OFFEN > 0.0 AND
        RG_OFFEN > 0.0 AND
        LLTERMIN_AN >= '01.01.2020';
  -- Lieferantenstamm
  UPDATE BLIEF
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
  KZ_MWST = :SJA;
  -- Artikelstamm Lieferanten
  UPDATE BSAL
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;
  -- Offene Bestellpositionen
  UPDATE BBESP
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
  RE_OFFEN > 0.0;

END
Das Utility im Artikelstamm wurde entsprechend der neuen Prozedur angepasst.

Falls jemand noch Verbesserungsvorschläge :idea: hat, immer her damit :D

So, das wars.

Schönen Restsonntag
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Re: MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Update am 30.06.2020
Die Prozedure habe ich nochmals überarbeitet.
Jetzt wird zuerst in der Tabelle BSAFIBUZW jeweils 1 Datensatz des alten MwSt-Satzes ausgelesen und dann als Kopie mit dem neuen MwSt-Satz eingefügt.
Danach werden die Datensätze in BARTG1FIBU und BARTG2FIBU angelegt.

Das Update der Tabelle BSA mit dem neuen MwSt-Satz ist mit Vorsicht auszuführen, da auch hier von Synerpy meines Erachtens nicht zu Ende gedacht hat.
Es wird nämlich im Trigger BSA_AU0 bei einem Update der MwSt die BSAFIBUZW neu aufgebaut und zwar mit den Vorbelegungen aus BARTG1FIBU bzw. BARTG2FIBU und somit werden alle selbst definierten Konten mit den Vorbelegungen überschrieben.

Hier der Quellcode zu den Prozeduren und den geänderten Trigger:
Das bezieht sich auf die Datenbank AVERP2020.01

Trigger BSA_AU0:

Code: Alles auswählen

SET SQL DIALECT 3;



SET TERM ^ ;



CREATE OR ALTER TRIGGER BSA_AU0 FOR BSA
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE nAusgangID TYPE OF COLUMN BVORLAGE.ID;
DECLARE nEingangID TYPE OF COLUMN BVORLAGE.ID;
DECLARE nFertEingID TYPE OF COLUMN BVORLAGE.ID;
DECLARE nFertAusgID TYPE OF COLUMN BVORLAGE.ID;
DECLARE BSAP_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE BFA_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE BMAND_ID_TEMP TYPE OF COLUMN BVORLAGE.ID;
DECLARE HK1_BER_SCHEMA TYPE OF COLUMN BMAND.HK1_BER_SCHEMA;
DECLARE BARTPH_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE F_EKMPREIS TYPE OF COLUMN BARTG1.F_EKMPREIS;
DECLARE F_EKHPREIS TYPE OF COLUMN BARTG1.F_EKHPREIS;
DECLARE F_EKVKMIN TYPE OF COLUMN BARTG1.F_EKVKMIN;
DECLARE BSAPE_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE BARTLH_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE GESAMTGUSS_GEW TYPE OF COLUMN BSAP.GESAMTGUSS_GEW;
DECLARE MENGE TYPE OF COLUMN BSAP.MINDSTCK;
DECLARE ANGUSSGEW TYPE OF COLUMN BSAP.ANGUSS_GEW;
DECLARE BLAGER_ID TYPE OF COLUMN BVORLAGE.ID; 
DECLARE BARTG2WF_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE BSAWEQU_ID TYPE OF COLUMN BVORLAGE.ID;    
DECLARE BSAS_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE FREIGABE TYPE OF COLUMN BSAS.PREISNEU_JN;     
DECLARE SYNERPY_KUNR TYPE OF COLUMN BFIRMA.SYNERPY_KUNR;

DECLARE SJA TYPE OF COLUMN BFIRMA.JA;
DECLARE SNEIN TYPE OF COLUMN BFIRMA.NEIN;
BEGIN
  /* LETZTER STAND 20.11.2018 13:34:48 AS */

  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES(:sJa,:sNein);
  EXECUTE PROCEDURE P_BFIRMA_SYNERPY_KUNR RETURNING_VALUES (:SYNERPY_KUNR);

  IF (USER <> 'WORSTCASE') THEN
  BEGIN
    -- Wenn die Aktivität eines Artikels verändert wird, dann wird auch der Artikel in BFAM verändert
    IF (NEW.AKTIV_JN <> OLD.AKTIV_JN) THEN
      UPDATE BFAM
      SET BSA_AKTIV_JN = NEW.AKTIV_JN
      WHERE BSA_ID_MATNR = NEW.ID AND
            STATUS IN ('P','A') AND
            BSA_AKTIV_JN <> NEW.AKTIV_JN;

    -- Wenn die Mehrwertsteuer verändert wurde, diese ggf. in den Mandantendaten
    -- nachpflegen
    IF (NEW.BMWST_ID_MWSTKZ <> OLD.BMWST_ID_MWSTKZ) THEN
      UPDATE BSABMAND
      SET BMWST_ID = NEW.BMWST_ID_MWSTKZ
      WHERE BMWST_ID = OLD.BMWST_ID_MWSTKZ AND
            BSA_ID_LINKKEY = NEW.ID;

    -- Verkaufspreisdatensätze je Mandant erzeugen
    IF ((NEW.HK1 IS DISTINCT FROM OLD.HK1) AND (NEW.K_VK IN (sJa, 'K'))) THEN
    BEGIN     
      IF (NEW.HK1 = 0.0) THEN
      BEGIN
        -- automatische Kundenpreise löschen, die nicht für einen Kunden sind
        DELETE FROM BARTPH
        WHERE BSA_ID_LINKKEY = NEW.ID AND
              AUTOPREIS = :sJA AND
              BKUNDE_ID IS NULL;
      END
      ELSE
      BEGIN
        FOR SELECT B.ID, B.HK1_BER_SCHEMA
        FROM BMAND B
        WHERE B.ID >= 1
        INTO :BMAND_ID_TEMP, :HK1_BER_SCHEMA
        DO
        BEGIN
          IF (HK1_BER_SCHEMA = 0) THEN
            -- eine Preisliste pro Mandant
            EXECUTE PROCEDURE P_BSA_BARTPH_NEU(NEW.ID,3);
          ELSE IF (HK1_BER_SCHEMA = 1) THEN
            -- Margenpreisberechnung
            EXECUTE PROCEDURE P_VK_MARGE_BERECHNUNG(NEW.ID, :BMAND_ID_TEMP);
          ELSE IF (HK1_BER_SCHEMA = 2) THEN
            -- alle Preislisten
            EXECUTE PROCEDURE P_BSA_BARTPH_NEU(NEW.ID,1);
          ELSE IF (HK1_BER_SCHEMA = 3) THEN
            -- Alle Preise neu Berechnen. Prozente bei Staffelpreisen beachten.
            EXECUTE PROCEDURE P_BSA_BARTPH_NEU(NEW.ID,4);
        END
      END
    END

    IF (((NEW.K_LPFL <> OLD.K_LPFL) OR
         (NEW.K_DIENST <> OLD.K_LPFL) OR
         (NEW.BARTG6_ID_WGR6K <> OLD.BARTG6_ID_WGR6K)) AND
        (NEW.K_LPFL = sJA) AND (NEW.K_DIENST = sJA)) THEN
    BEGIN
      -- Standardlager erzeugen , wie Kz. Lagerpflegen steht wird in Procedure geprüft
      SELECT BLAGER_ID_FV_AL, BLAGER_ID_FV_EL
      FROM BFIRMA
      WHERE ID = 1
      INTO :nAusgangID, :nEingangID ;
    
      IF (nAusgangID IS NOT NULL) THEN
        EXECUTE PROCEDURE P_BARTLH_TEST(NEW.ID, :nAusgangID)
        RETURNING_VALUES (:BARTLH_ID);

      IF (nEingangID IS NOT NULL) THEN
        EXECUTE PROCEDURE P_BARTLH_TEST(NEW.ID, :nEingangID)
        RETURNING_VALUES (:BARTLH_ID);

      SELECT A.BLAGER_ID_IN, A.BLAGER_ID_VON
      FROM BARTG6 A
      WHERE ID = NEW.BARTG6_ID_WGR6K
      INTO :nFertAusgID, :nFertEingID;

      IF (nFertAusgID IS NOT NULL) THEN
        EXECUTE PROCEDURE P_BARTLH_TEST(NEW.ID, :nFertAusgID)
        RETURNING_VALUES (:BARTLH_ID);

      IF (nFertEingID IS NOT NULL) THEN
        EXECUTE PROCEDURE P_BARTLH_TEST(NEW.ID, :nFertEingID)
        RETURNING_VALUES (:BARTLH_ID);

      -- Bei LA01 das Projektlager anlegen
      IF ((SYNERPY_KUNR = 'LA01') AND (NEW.BARTG6_ID_WGR6K = 1)) THEN
        EXECUTE PROCEDURE P_BARTLH_TEST(NEW.ID, 5)
        RETURNING_VALUES(:BARTLH_ID);

      BARTLH_ID = BARTLH_ID;
    END

    -- Neuberechnung aller abhängigen Teile durchführen
    IF ((NEW.AKTIV_JN <> OLD.AKTIV_JN) AND (NEW.AKTIV_JN = 'A')) THEN
      UPDATE BARTLH
      SET BESTELLEN = :SNEIN,
          LMIND = 0.0
      WHERE BSA_ID_LINKKEY = NEW.ID AND
            ((BESTELLEN = :SJA) OR (LMIND <> 0.0));

    -- Änderung oder von Kennzeichen -> beeinflusst Bestellvorschläge
    IF ((NEW.K_LPFL <> OLD.K_LPFL) OR
        (NEW.KANBAN_JN <> OLD.KANBAN_JN) OR
        (NEW.K_DIENST <> OLD.K_DIENST) OR
        (NEW.BESTELLEN <> OLD.BESTELLEN) OR
        (NEW.BSAL_KZ <> OLD.BSAL_KZ)) THEN
      UPDATE BARTLH
      SET LLEBE = CURRENT_DATE,
          LLEBE_TIMESTAMP = CURRENT_TIMESTAMP
      WHERE BSA_ID_LINKKEY = NEW.ID;

    -- Neubestimmung der Kalkulationsgrundlage und der Wiederbeschaffungszeit
    IF ((NEW.FERTKZ <> OLD.FERTKZ) OR
        (NEW.LLZEIT <> OLD.LLZEIT)) THEN
      UPDATE BSAHK
      SET ID = ID
      WHERE BSA_ID_LINKKEY = OLD.ID;

    IF ((NEW.BARTG2_ID_WGR2K IS DISTINCT FROM OLD.BARTG2_ID_WGR2K) OR
        (NEW.BSAL_KZ <> OLD.BSAL_KZ)) THEN
    BEGIN
      -- Änderung des Lieferanten
      IF (NEW.BSAL_KZ <> OLD.BSAL_KZ) THEN
        EXECUTE PROCEDURE P_BSAL_ZU_BSA(NEW.ID, NULL);

      -- Zukauf Arb.Gang neu kalkulieren
      FOR SELECT ID
      FROM BSAPE
      WHERE BSA_ID = OLD.ID
      INTO :BSAPE_ID
      DO
        EXECUTE PROCEDURE P_BSAPE_KALKPREIS(:BSAPE_ID);
    END

    -- Wenn inaktiv, dann auch alle Lager und Lieferanten und Webshopartikel inaktiv machen
    IF ((NEW.AKTIV_JN = sNEIN) AND (OLD.AKTIV_JN <> sNEIN)) THEN
    BEGIN
      UPDATE BARTLH
      SET AKTIV_JN = :sNEIN
      WHERE BSA_ID_LINKKEY = NEW.ID AND
            AKTIV_JN = :SJA;

      UPDATE BSAL
      SET L_STATUS = :SNEIN
      WHERE BSA_ID_LINKKEY = NEW.ID AND
            L_STATUS <> :sNEIN;

      UPDATE BSAWS
      SET AKTIV_JN = :SNEIN
      WHERE BSA_ID_LINKKEY = NEW.ID AND
            AKTIV_JN <> :sNEIN;
    END

    -- Wenn sich Herstellerangaben ändern, dann auch in BSAL ändern
    IF ((NEW.HERSTARTBEZ IS DISTINCT FROM OLD.HERSTARTBEZ) OR
        (NEW.HERSTARTNR IS DISTINCT FROM OLD.HERSTARTNR) OR
        (NEW.BHERST_ID IS DISTINCT FROM NEW.BHERST_ID)) THEN
      UPDATE BSAL
      SET HERSTARTBEZ = NEW.HERSTARTBEZ,
          HERSTARTNR = NEW.HERSTARTNR,
          BHERST_ID = NEW.BHERST_ID
      WHERE BSA_ID_LINKKEY = NEW.ID AND
            ((HERSTARTBEZ IS DISTINCT FROM NEW.HERSTARTBEZ) OR
             (HERSTARTNR IS DISTINCT FROM NEW.HERSTARTNR) OR
             (BHERST_ID IS DISTINCT FROM NEW.BHERST_ID));

    -- Gewicht für Stückliste und Arbeitsplan - Materialposition berechnen
    IF ((NEW.GKLVE_E IS DISTINCT FROM OLD.GKLVE_E) OR
        (NEW.KLVE_E IS DISTINCT FROM OLD.KLVE_E) OR
        (NEW.KLVE_V IS DISTINCT FROM OLD.KLVE_V) OR
        (NEW.GEWICHT IS DISTINCT FROM OLD.GEWICHT) OR
        (NEW.BSAS_GEWICHT IS DISTINCT FROM OLD.BSAS_GEWICHT) OR
        (NEW.FAKTOR_LE IS DISTINCT FROM OLD.FAKTOR_LE) OR
        (NEW.FAKTOR_LF IS DISTINCT FROM OLD.FAKTOR_LF) OR
        (NEW.FAKTOR_LV IS DISTINCT FROM OLD.FAKTOR_LV)) THEN
    BEGIN
      -- MM: Wurde aus performancetechnischen Gründen in einen Job über Nacht ausgelagert
      IF (SYNERPY_KUNR = 'FL08') THEN
        INSERT INTO T_GKLVE_E (
          BSA_ID)
        VALUES (
          NEW.ID);
      ELSE
        EXECUTE PROCEDURE P_BSA_GEWICHT_CHANGE(NEW.ID, NEW.GKLVE_E, NEW.KLVE_E, NEW.BSAS_GEWICHT,
                                               NEW.GEWICHT, NEW.KLVE_V);
    END

    -- Arbeitsstammplan korrigieren
    IF (NEW.BMENG_ID_ME_F <> OLD.BMENG_ID_ME_F) THEN
    BEGIN
      UPDATE BSAPM
      SET BMENG_ID_MASSMENG = NEW.BMENG_ID_ME_F
      WHERE BSA_ID_ARTNR = OLD.ID AND
            BMENG_ID_MASSMENG <> NEW.BMENG_ID_ME_F;

      UPDATE BSAP
      SET BMENG_ID_ME_F = NEW.BMENG_ID_ME_F
      WHERE BSA_ID_ARTNR = OLD.ID AND
            BMENG_ID_ME_F <> NEW.BMENG_ID_ME_F;
    END
    
    IF (NEW.BMENG_ID_ME_L <> OLD.BMENG_ID_ME_L) THEN
      UPDATE BSEF
      SET BMENG_ID_ME_L = NEW.BMENG_ID_ME_L
      WHERE BSA_ID_ARTNR = NEW.ID AND
            BMENG_ID_ME_L <> NEW.BMENG_ID_ME_L;

    IF (NEW.BMENG_ID_PE_E <> OLD.BMENG_ID_PE_E) THEN
      UPDATE BSAPM
      SET BMENG_ID_PREISHEIT = NEW.BMENG_ID_PE_E
      WHERE BSA_ID_ARTNR = OLD.ID AND
            BMENG_ID_PREISHEIT <> NEW.BMENG_ID_PE_E;

    -- Änderung von Oberfläche/Farbe/WrGrp EK => Arbeitsplan sperren
    IF ((NEW.BOBERF_ID IS DISTINCT FROM OLD.BOBERF_ID) OR
        (NEW.BFARB_ID IS DISTINCT FROM OLD.BFARB_ID) OR
        (NEW.BARTG2_ID_WGR2K IS DISTINCT FROM OLD.BARTG2_ID_WGR2K)) THEN
    BEGIN
      -- Artikel ist Kopfartikel
      UPDATE BSAP
      SET PREISNEU_JN = :SJA
      WHERE BSA_ID_ARTNR = NEW.ID AND
            PREISNEU_JN IS DISTINCT FROM :SJA;

      -- Artikel ist Material
      FOR SELECT B.ID
      FROM BSAPM A
      LEFT OUTER JOIN BSAP B ON A.BSAP_ID_LINKKEY = B.ID
      WHERE A.BSA_ID_ARTNR = NEW.ID AND
            B.PREISNEU_JN IS DISTINCT FROM :SJA
      INTO :BSAP_ID
      DO
        UPDATE BSAP
        SET PREISNEU_JN = :SJA
        WHERE ID = :BSAP_ID;
    END         

    -- Lagervorbelegung für Warengruppe EK
    IF (NEW.BARTG2_ID_WGR2K IS DISTINCT FROM OLD.BARTG2_ID_WGR2K) THEN
    BEGIN
      -- Bestehende, nicht verwendete Lager löschen, die aus einer
      -- Einkaufswarengruppenvorbelegung stammen
      FOR SELECT BLAGER_ID
      FROM BARTG2LAG
      WHERE BARTG2_ID_LINKKEY = OLD.BARTG2_ID_WGR2K
      INTO :BLAGER_ID
      DO
        DELETE FROM BARTLH A
        WHERE A.BSA_ID_LINKKEY = NEW.ID AND
              A.BLAGER_ID_LAGERNR = :BLAGER_ID AND
              A.LIST = 0 AND
              A.LVERF = 0 AND
              A.LEIN = 0 AND
              A.LLEAB IS NULL AND
              A.LLEZU IS NULL AND
              NOT EXISTS (SELECT FIRST 1 W.ID
                          FROM BARTLHBUX W
                          WHERE W.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 X.ID
                          FROM BSAP X
                          WHERE X.BARTLH_ID_LAGERNR = A.ID) AND  
              NOT EXISTS (SELECT FIRST 1 Y.ID
                          FROM BSAS Y
                          WHERE Y.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 Z.ID
                          FROM BSAPM Z
                          WHERE Z.BARTLH_ID_LAGERNR = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 W.ID
                          FROM BBVOX W
                          WHERE W.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 U.ID
                          FROM BBVO U
                          WHERE U.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 V.ID
                          FROM BAUFPO V
                          WHERE V.BARTLH_ID_LAGERNR = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 T.ID
                          FROM BBESP T
                          WHERE T.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AA.ID
                          FROM BRRCP AA
                          WHERE AA.BARTLH_ID_LAGERNR = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AB.ID
                          FROM BRLSP AB
                          WHERE AB.BARTLH_ID_LAGERNR = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AC.ID
                          FROM BLLCP AC
                          WHERE AC.BARTLH_ID_LAGERNR = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AD.ID
                          FROM BLRCP AD
                          WHERE AD.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AE.ID
                          FROM BWALPO AE
                          WHERE AE.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AF.ID
                          FROM BKBTBESPO AF
                          WHERE AF.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AG.ID
                          FROM BKBTLLCP AG
                          WHERE AG.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AH.ID
                          FROM BLAGVE AH
                          WHERE ((AH.BARTLH_ID_INLAGER = A.ID) OR (AH.BARTLH_ID_VONLAGER = A.ID)) AND
              NOT EXISTS (SELECT FIRST 1 AI.ID
                          FROM BLINV AI
                          WHERE AI.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AJ.ID
                          FROM BINVRK AJ
                          WHERE AJ.BARTLH_ID = A.ID) AND
              NOT EXISTS (SELECT FIRST 1 AK.ID
                          FROM BLPINV AK
                          WHERE AK.BARTLH_ID = A.ID)) AND
              NOT EXISTS (SELECT FIRST 1 AK.ID
                          FROM BLPINV AK
                          WHERE AK.BARTLHPO_ID IN (SELECT X.ID
                                                   FROM BARTLHPO X
                                                   WHERE X.BARTLH_ID_LINKKEY = A.ID));

      -- Neue Lagervorbelegungen anlegen
      IF ((SYNERPY_KUNR NOT IN ('KH05', 'LM02')) OR
          ((SYNERPY_KUNR IN ('KH05', 'LM02')) AND
           (NOT EXISTS(SELECT FIRST 1 ID
                       FROM BARTLH
                       WHERE BSA_ID_LINKKEY = NEW.ID AND
                             AKTIV_JN = :SJA)))) THEN
          FOR SELECT BLAGER_ID
          FROM BARTG2LAG
          WHERE BARTG2_ID_LINKKEY = NEW.BARTG2_ID_WGR2K
          INTO :BLAGER_ID
          DO
            EXECUTE PROCEDURE P_BARTLH_TEST (NEW.ID, :BLAGER_ID)
            RETURNING_VALUES (:BARTLH_ID);
    END

    -- Bei Änderung der Fibukonten Zuweisung löschen und nach neuen Vorgaben
    -- anlegen
-- Letzter Stand: 30.06.2020 14:55:52 by KDP
-- Was hat Synerpy sich dabei gedacht, bei einem wechsel der MwSt die
-- komplette BSAFIBUZW neu aufzubauen
-- alle eigenen Anpassung werden durch die Vorlage überschrieben
    IF ((NEW.BARTG1_ID_WGR1K IS DISTINCT FROM OLD.BARTG1_ID_WGR1K) OR
        (NEW.BARTG2_ID_WGR2K IS DISTINCT FROM OLD.BARTG2_ID_WGR2K) OR
        (NEW.BFIBUKTO_ID_VK IS DISTINCT FROM OLD.BFIBUKTO_ID_VK) OR
        (NEW.BFIBUKTO_ID_EK IS DISTINCT FROM OLD.BFIBUKTO_ID_EK)) THEN -- OR
--        (NEW.BMWST_ID_MWSTKZ IS DISTINCT FROM OLD.BMWST_ID_MWSTKZ)) THEN
      EXECUTE PROCEDURE P_BSA_BSAFIBUZW(NEW.ID);

    -- Gussgewicht in Fertigungsauftrag und Arbeitsstammplan neu durchrechnen
    IF ((NEW.BWERK_ID_WERKSTOFF <> OLD.BWERK_ID_WERKSTOFF) OR
        ((NEW.BWERK_ID_WERKSTOFF IS NOT NULL) AND (OLD.BWERK_ID_WERKSTOFF IS NULL)) OR
        (NEW.VOLK_E <> OLD.VOLK_E) OR
        ((NEW.VOLK_E IS NOT NULL) AND (OLD.VOLK_E IS NULL)) OR
        (NEW.GEWICHT <> OLD.GEWICHT) OR
        ((NEW.GEWICHT IS NOT NULL) AND (OLD.GEWICHT IS NULL))) THEN
    BEGIN
      -- Arbeitsstammplan
      FOR SELECT A.ID, A.MINDSTCK, A.ANGUSS_GEW
      FROM BSAP A
      WHERE A.BSA_ID_ARTNR = NEW.ID AND
            NEW.AKTIV_JN = :SJA AND
            A.BMAND_ID IN (SELECT ID
                           FROM BMAND
                           WHERE ID >= 1 AND
                                 GUSSGEW_BERECH = :SJA)
      INTO :BSAP_ID, :MENGE, :ANGUSSGEW
      DO
      BEGIN
        EXECUTE PROCEDURE P_BFA_BSAP_GUSS_NEU(:BSAP_ID, 'BSAP', :ANGUSSGEW, :MENGE)
        RETURNING_VALUES(:GESAMTGUSS_GEW);

        UPDATE BSAP
        SET GESAMTGUSS_GEW = :GESAMTGUSS_GEW
        WHERE ID = :BSAP_ID AND
              GESAMTGUSS_GEW <> :GESAMTGUSS_GEW;
      END

      -- Fertigungsauftrag
      FOR SELECT A.ID, A.STUECKZAHL, A.ANGUSS_GEW
      FROM BFA A
      WHERE A.BSA_ID_ARTNR = NEW.ID AND
            NEW.AKTIV_JN = :SJA AND
            A.BMAND_ID IN (SELECT ID
                           FROM BMAND
                           WHERE ID >= 1 AND
                                 GUSSGEW_BERECH = :SJA)
      INTO :BFA_ID, :MENGE, :ANGUSSGEW
      DO
      BEGIN
        EXECUTE PROCEDURE P_BFA_BSAP_GUSS_NEU(:BFA_ID,'BFA', :ANGUSSGEW, :MENGE)
        RETURNING_VALUES(:GESAMTGUSS_GEW);

        UPDATE BFA
        SET GESAMTGUSS_GEW = :GESAMTGUSS_GEW
        WHERE ID = :BFA_ID AND
              GESAMTGUSS_GEW <> :GESAMTGUSS_GEW AND
              STATUS IN ('P', 'A', 'I');
      END
    END
    -- Kundenpreislisten durchlaufen
    FOR SELECT A.ID
    FROM BARTPH A
    LEFT OUTER JOIN BARTPHFHPR B ON B.BARTPH_ID_LINKKEY = A.ID
    WHERE A.BSA_ID_LINKKEY = NEW.ID AND
          B.ID IS NOT NULL
    INTO :BARTPH_ID
    DO
    BEGIN
      -- Kalkulationsfaktoren aus Verkaufswarengruppe berücksichtigen
      IF (NEW.BARTG1_ID_WGR1K IS DISTINCT FROM OLD.BARTG1_ID_WGR1K AND
          NEW.BARTG1_ID_WGR1K IS NOT NULL) THEN
      BEGIN
        SELECT COALESCE(B.F_EKMPREIS, 0.00),
               COALESCE(B.F_EKHPREIS, 0.00),
               COALESCE(B.F_EKVKMIN, 0.00)
        FROM BARTG1 B
        WHERE B.ID = NEW.BARTG1_ID_WGR1K
        INTO :F_EKMPREIS,
             :F_EKHPREIS,
             :F_EKVKMIN;
  
        -- Faktoren eintragen
        UPDATE BARTPHFHPR
        SET F_EK_HPREIS = :F_EKHPREIS,
            F_EK_MPREIS = :F_EKMPREIS,
            F_EK_VKMIN = :F_EKVKMIN
        WHERE BARTPH_ID_LINKKEY = :BARTPH_ID AND
              PREISAKT = :SJA;
      END
  
      -- DurchEK in Fachhandel neuberechnen
      IF (NEW.DURCHEK IS DISTINCT FROM OLD.DURCHEK AND
          NEW.DURCHEK IS NOT NULL) THEN
        UPDATE BARTPHFHPR
        SET BSA_EK = NEW.DURCHEK
        WHERE BARTPH_ID_LINKKEY = :BARTPH_ID AND
              PREISAKT = :SJA AND
              KALK_NACH = 'D' AND
              BSA_EK <> NEW.DURCHEK;
    END

    -- WE Qual. anlegen -> Vorbelegung aus WrGrp.Einkauf
    IF (NEW.BARTG2_ID_WGR2K IS DISTINCT FROM OLD.BARTG2_ID_WGR2K AND
        NEW.BARTG2_ID_WGR2K IS NOT NULL) THEN
    BEGIN
      -- WE Qual. anlegen, wenn noch keine vorhanden waren
      IF (NOT EXISTS (SELECT FIRST 1 ID
                      FROM BSAWEQU
                      WHERE BSA_ID_LINKKEY = NEW.ID) AND
          EXISTS (SELECT FIRST 1 ID
                  FROM BARTG2WF
                  WHERE BARTG2_ID_LINKKEY = NEW.BARTG2_ID_WGR2K)) THEN
      BEGIN
        FOR SELECT ID
        FROM BARTG2WF
        WHERE BARTG2_ID_LINKKEY = NEW.BARTG2_ID_WGR2K
        INTO :BARTG2WF_ID
        DO
        BEGIN
          BSAWEQU_ID = NULL;
          INSERT INTO BSAWEQU (
            BSA_ID_LINKKEY,
            BMAND_ID,
            STATUS,  
            AKTIV,
            VERWENDUNG,
            BPROPT_ID,
            BEMERKUNG,
            DATEI,
            TEXT,
            BUCHUNGSART)
          SELECT
            NEW.ID,
            BMAND_ID,
            STATUS,
            :sJA,
            VERWENDUNG,
            BPROPT_ID,
            BEMERKUNG,
            DATEI,
            TEXT,
            BUCHUNGSART
          FROM BARTG2WF
          WHERE ID = :BARTG2WF_ID
          RETURNING ID
          INTO :BSAWEQU_ID;
  
          INSERT INTO BSAWEQULU(
            BSAWEQU_ID_LINKKEY,
            BLAGER_ID_ZIEL)
          SELECT
            :BSAWEQU_ID,
            BLAGER_ID_ZIEL
          FROM BARTG2WFLU
          WHERE BARTG2WF_ID_LINKKEY = :BARTG2WF_ID;
        END
      END
    END

    IF ((NEW.AKTIV_JN <> OLD.AKTIV_JN) AND (NEW.AKTIV_JN = 'A')) THEN
      UPDATE BSAL A
      SET A.L_STATUS = :SNEIN
      WHERE A.BSA_ID_LINKKEY = NEW.ID AND
            A.L_STATUS IS DISTINCT FROM :SNEIN;

    IF (NEW.BZEI_ID IS NULL) THEN
    BEGIN
      -- die Änderung an der Zeichung nur weiter reichen, wenn diese nicht mit der
      -- CAD-Zeichnungsverwaltung verknüpft ist
      IF (((OLD.ZEICHNR IS DISTINCT FROM NEW.ZEICHNR) OR
           (OLD.EPLANNR IS DISTINCT FROM NEW.EPLANNR) OR
           (OLD.ZEICHNR_BLATT IS DISTINCT FROM NEW.ZEICHNR_BLATT) OR
           (OLD.ZEICHNR_POS IS DISTINCT FROM NEW.ZEICHNR_POS) OR
           (OLD.ZEICHNR_REV IS DISTINCT FROM NEW.ZEICHNR_REV) OR
           (OLD.KZEICHNR IS DISTINCT FROM NEW.KZEICHNR) OR
           (OLD.KZEICHNR_BLATT IS DISTINCT FROM NEW.KZEICHNR_BLATT) OR
           (OLD.KZEICHNR_POS IS DISTINCT FROM NEW.KZEICHNR_POS) OR
           (OLD.KZEICHNR_REV IS DISTINCT FROM NEW.KZEICHNR_REV)) AND
          (SYNERPY_KUNR IS DISTINCT FROM 'ES14'))THEN
        EXECUTE PROCEDURE P_BSA_ZEICHNR_UPDATE_ALLE(NEW.ID, NEW.BZEI_ID, NEW.BZEIAE_ID,
                                                    NEW.ZEICHNR,NEW.ZEICHNR_BLATT,
                                                    NEW.ZEICHNR_POS,NEW.ZEICHNR_REV,NEW.KZEICHNR,
                                                    NEW.KZEICHNR_BLATT,NEW.KZEICHNR_POS,
                                                    NEW.KZEICHNR_REV, NEW.EPLANNR,
                                                    NEW.BWERK_ID_WERKSTOFF, 1, :SJA, :SJA);
    END

    -- KL06 spezifisch das Kennzeichen EK-Preis skontierbar übertragen
    IF (COALESCE(SYNERPY_KUNR,'') IS NOT DISTINCT FROM 'KL06') THEN
      UPDATE BSAL
      SET SKONTO_EK_JN = NEW.SKONTO_EK_JN
      WHERE BSA_ID_LINKKEY = NEW.ID AND
            SKONTO_EK_JN IS DISTINCT FROM NEW.SKONTO_EK_JN;

    IF (SYNERPY_KUNR = 'ZE05') THEN
    BEGIN
      IF (NEW.BPROPT_ID IS DISTINCT FROM OLD.BPROPT_ID) THEN
      BEGIN
        UPDATE BSAS
        SET BPROPT_ID = NEW.BPROPT_ID
        WHERE BSA_ID_LINKKEY = NEW.ID AND
              BPROPT_ID IS DISTINCT FROM NEW.BPROPT_ID;
      END
    END

    -- Ändert sich die Zeichnungsnummer bei PS10, soll diese in alle Stücklistenpositionen übernommen werden
    -- Ändert sich das Werkstoff.Kz. bei PS10, soll dieses auch in alle Stücklistenpositionen übernommen werden
    IF ((SYNERPY_KUNR = 'PS10') AND ((NEW.ZEICHNR IS DISTINCT FROM OLD.ZEICHNR) OR
                                     (NEW.BWERK_ID_WERKSTOFF IS DISTINCT FROM OLD.BWERK_ID_WERKSTOFF))) THEN
    BEGIN
      -- Änderung Zeichnungsnummer sperrt den Stücklistenkopf
      FOR SELECT A.ID, A.PREISNEU_JN
      FROM BSAS A
      WHERE EXISTS (SELECT FIRST 1 B.ID
                    FROM BSASTL B
                    WHERE B.BSAS_ID_LINKKEY = A.ID AND
                          B.BSA_ID_ARTNR = NEW.ID)
      INTO :BSAS_ID, :FREIGABE
      DO
      BEGIN

        IF (NEW.ZEICHNR IS DISTINCT FROM OLD.ZEICHNR) THEN
          UPDATE BSASTL
          SET ZEICHNR = NEW.ZEICHNR
          WHERE BSAS_ID_LINKKEY = :BSAS_ID AND
                BSA_ID_ARTNR = NEW.ID;

        IF (NEW.BWERK_ID_WERKSTOFF IS DISTINCT FROM OLD.BWERK_ID_WERKSTOFF) THEN
          UPDATE BSASTL
          SET BWERK_ID = NEW.BWERK_ID_WERKSTOFF
          WHERE BSAS_ID_LINKKEY = :BSAS_ID AND
                BSA_ID_ARTNR = NEW.ID;

        UPDATE BSAS
        SET PREISNEU_JN = :FREIGABE
        WHERE ID = :BSAS_ID AND
              PREISNEU_JN IS DISTINCT FROM :FREIGABE;
      END
    END

    -- Energiemanagement aus der Produktfamilie vorbelegen
    IF ((OLD.BSAFAM_ID IS NULL) AND (NEW.BSAFAM_ID IS NOT NULL)) THEN
      INSERT INTO BSAEA(
        BSA_ID_LINKKEY,
        BENART_ID,
        PRO_MENGE,
        VERBRAUCH_PLAN,
        VERBRAUCH_IST)
        SELECT
          NEW.ID,
          BENART_ID,
          1,
          VERBRAUCH_PLAN,
          0
        FROM BSAFAMEA
        WHERE BSAFAM_ID_LINKKEY = NEW.BSAFAM_ID;

    IF ((OLD.BZEI_ID IS NULL) AND
        (NEW.BZEI_ID IS NOT NULL) AND
         EXISTS(SELECT FIRST 1 B.ID
                FROM BZEI A
                LEFT OUTER JOIN BZEIVERWKAT B ON A.BZEIVERWKAT_ID = B.ID
                WHERE A.ID = NEW.BZEI_ID AND
                      B.ARTIKELBEZUG = :SJA)) THEN
      UPDATE BZEI
      SET BSA_ID_ARTNR = NEW.ID
      WHERE ID = NEW.BZEI_ID AND
            BSA_ID_ARTNR IS NULL;
  END
END
^

SET TERM ; ^

Prozedur PROCEDURE P_BSAFIBUZW_BMWST_NEU wird von Prozedur P_BSAFIBUZW_BMWST_NEU aufgerufen

Code: Alles auswählen

SET TERM ^ ;

CREATE OR ALTER PROCEDURE P_BSAFIBUZW_BMWST_NEU (
    OLD_MWST INTEGER,
    NEW_MWST INTEGER)
AS
DECLARE VARIABLE BSAIDLINKKEY INTEGER;
DECLARE VARIABLE BMANDID INTEGER;
DECLARE VARIABLE BKSTIDVERK INTEGER;
DECLARE VARIABLE BKSTIDEINK INTEGER;
DECLARE VARIABLE BFIBUKTOIDVERK INTEGER;
DECLARE VARIABLE BFIBUKTOIDEINK INTEGER;
begin
  /* Erster Stand: 30.06.2020 13:34:57 by KDP */
  /* Kopie von DS mit altem MwSt-Satz mit neuem MwSt-Satz anlegen */
  FOR SELECT
    BSA_ID_LINKKEY,
    BMAND_ID,
    BKST_ID_VERK,
    BKST_ID_EINK,
    BFIBUKTO_ID_VK,
    BFIBUKTO_ID_EK
  FROM BSAFIBUZW
  WHERE BMWST_ID = :old_mwst
  INTO
    :bsaidlinkkey,
    :bmandid,
    :bkstidverk,
    :bkstideink,
    :bfibuktoidverk,
    :bfibuktoideink
  DO BEGIN
    UPDATE OR INSERT INTO BSAFIBUZW(
      BSA_ID_LINKKEY,
      BMAND_ID,
      BKST_ID_VERK,
      BKST_ID_EINK,
      BFIBUKTO_ID_VK,
      BFIBUKTO_ID_EK,
      BMWST_ID
    )
    VALUES(
      :bsaidlinkkey,
      :bmandid,
      :bkstidverk,
      :bkstideink,
      :bfibuktoidverk,
      :bfibuktoideink,
      :new_mwst
    ) matching(bsa_id_linkkey, bmwst_id);
  END


end
^

SET TERM ; ^

/* Folgende GRANT Anweisungen werden automatisch generiert */

GRANT SELECT,INSERT,UPDATE ON BSAFIBUZW TO PROCEDURE P_BSAFIBUZW_BMWST_NEU;

/* Aktuelle Priviligien auf dieser Prozedur */

GRANT EXECUTE ON PROCEDURE P_BSAFIBUZW_BMWST_NEU TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT EXECUTE ON PROCEDURE P_BSAFIBUZW_BMWST_NEU TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE P_BSAFIBUZW_BMWST_NEU TO SYSDBA;
Prozedur P_BSAFIBUZW_BMWST_NEU_HVH

Code: Alles auswählen

SET TERM ^ ;

CREATE OR ALTER PROCEDURE P_BMWST_MWST_NEU_HVH (
    NEU_BMWST_ID TYPE OF COLUMN BVORLAGE.ID,
    OLD_BMWST_ID TYPE OF COLUMN BVORLAGE.ID,
    IKONTOVK TYPE OF COLUMN BVORLAGE.ID,
    IKONTOEK TYPE OF COLUMN BVORLAGE.ID)
AS
DECLARE VARIABLE MYID TYPE OF COLUMN BVORLAGE.ID;
DECLARE VARIABLE BMAND_ID TYPE OF COLUMN BVORLAGE.ID;
DECLARE VARIABLE SJA TYPE OF COLUMN BFIRMA.JA;
DECLARE VARIABLE SNEIN TYPE OF COLUMN BFIRMA.NEIN;
DECLARE VARIABLE WARENGRUPPEID TYPE OF COLUMN BVORLAGE.ID;
BEGIN
  /* Letzter Stand: 20.06.2020 08:17:53 by KDP */
  /* Feld BMWST_ID_KZ auf BMWST_KZ geändert in BMAND  */
  /* IN BMWST_ID_KZ steht der Steuersatz von 0%!!! und sollte nicht geändert werden */
  /* Letzter Stand: 26.06.2020 08:06:02 by KDP */
  /* DS in Warengruppe Verkauf - Vorbelegung mit neuem MwSt-Satz anlegen, falls nicht vorhanden */
  /* Prozedure kopiert und umbenannt ..._HVH */
  /* LETZTER STAND 28.06.2018 08:53:43 JF */
  /* ERSTER STAND: 11.12.2007 18:18:41 AK */
  /* PROTOKOLLIEREN, DASS AKTION HIER DURCHGELAUFEN IST */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BMWST_MWST_NEU_HVH');
      
  /* Mehrwertsteuersatz ändern
     Außer Stammdaten wird der MwStSatz nur geändert, wenn
     die Positionen noch nicht geliefert wurden, da der Tag der Lieferung
     entscheidend ist. Sollte es trotzdem einmal anders sein, so kann der
     Benutzer in den Positionen den Steuersatz noch einmal ändern */

  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES (:SJA, :SNEIN);
  EXECUTE PROCEDURE P_BMAND_CHECK RETURNING_VALUES(:BMAND_ID);


  IF ((COALESCE(NEU_BMWST_ID,0) = 0) OR
      (COALESCE(OLD_BMWST_ID,0) = 0) OR
      (NEU_BMWST_ID IS NOT DISTINCT FROM OLD_BMWST_ID)) THEN
    EXIT;
  -- Einen neuen DS in BSAFIBUZW anlegen aus Kopie alter MwSt-Satz
  EXECUTE PROCEDURE P_BSAFIBUZW_BMWST_NEU(:old_bmwst_id,:neu_BMWST_ID);
  -- Warengruppe Verkauf durchlaufen und
  -- je einen DS in BARTG1FIBU für neuen MwST-Satz anlegen
  -- falls noch nicht vorhanden
  -- falls ikontovk angegeben dieses verwenden, ansonsten Konto aus Kopie aus alten MwSt-Satz
  FOR SELECT ID
  FROM BARTG1
  INTO
    :warengruppeid
  DO BEGIN
    IF (NOT EXISTS(SELECT ID FROM BARTG1FIBU WHERE BARTG1_ID_LINKKEY = :warengruppeid AND BMWST_ID = :NEU_BMWST_ID)) THEN BEGIN
      INSERT INTO BARTG1FIBU(
      BARTG1_ID_LINKKEY,
      BMWST_ID,
      BMAND_ID,
      BFIBUKTO_ID,
      BKST_ID
    )
    SELECT
        A.BARTG1_ID_LINKKEY,
        :NEU_BMWST_ID,
        A.BMAND_ID,
        CASE WHEN
          COALESCE(:ikontovk,0) = 0 THEN A.BFIBUKTO_ID
        ELSE
          :ikontovk
        END,
        A.BKST_ID
      FROM BARTG1FIBU A
      LEFT OUTER JOIN BMWST B ON B.ID = :NEU_BMWST_ID
      WHERE A.BARTG1_ID_LINKKEY = :warengruppeid AND A.BMWST_ID = :OLD_BMWST_ID
    ;
    END
  END

  -- Warengruppe Einkauf durchlaufen und
  -- je einen DS in BARTG2FIBU für neuen MwST-Satz anlegen
  -- falls noch nicht vorhanden
  FOR SELECT ID
  FROM BARTG2
  INTO
    :warengruppeid
  DO BEGIN
    IF (NOT EXISTS(SELECT ID FROM BARTG2FIBU WHERE BARTG2_ID_LINKKEY = :warengruppeid AND BMWST_ID = :NEU_BMWST_ID)) THEN BEGIN
      INSERT INTO BARTG2FIBU(
      BARTG2_ID_LINKKEY,
      BMWST_ID,
      BMAND_ID,
      BFIBUKTO_ID,
      BKST_ID
    )
    SELECT
        A.BARTG2_ID_LINKKEY,
        :NEU_BMWST_ID,
        A.BMAND_ID,
        CASE WHEN
          COALESCE(:ikontoek,0) = 0 THEN A.BFIBUKTO_ID
        ELSE
          :ikontoek
        END,
        A.BKST_ID
      FROM BARTG2FIBU A
      LEFT OUTER JOIN BMWST B ON B.ID = :NEU_BMWST_ID
      WHERE A.BARTG2_ID_LINKKEY = :warengruppeid AND A.BMWST_ID = :OLD_BMWST_ID
    ;
    END
  END

  UPDATE BFIRMA
  SET BMWST_ID_MWSTKENNZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKENNZ = :OLD_BMWST_ID;

  UPDATE BMAND
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;
  -- In BSAFIBUZW wird automatisch ein DS angelegt, falls noch nicht vorhanden
  UPDATE BSA
  SET BMWST_ID_MWSTKZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKZ = :OLD_BMWST_ID;
  
  UPDATE BSABMAND
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
        BMAND_ID = :BMAND_ID;

  -- Rechnungsrückstande, die noch nicht geliefert worden sind
  -- Nur Positionen ab dem Jahr 2020, da durch Update von AvERP2014 auf AvERP2020
  -- bei alten Aufträgen evtl. Fehler kommt Exception "Rueckstand"
  UPDATE BAUFPO
  SET BMWST_ID_MWSTKZ = :NEU_BMWST_ID
  WHERE BMWST_ID_MWSTKZ = :OLD_BMWST_ID AND
        LS_OFFEN > 0.0 AND
        RG_OFFEN > 0.0 AND
        LLTERMIN_AN >= '01.01.2020';
  -- Lieferantenstamm
  UPDATE BLIEF
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
  KZ_MWST = :SJA;
  -- Artikelstamm Lieferanten
  UPDATE BSAL
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID;
  -- Offene Bestellpositionen
  UPDATE BBESP
  SET BMWST_ID = :NEU_BMWST_ID
  WHERE BMWST_ID = :OLD_BMWST_ID AND
  RE_OFFEN > 0.0;

END
^

SET TERM ; ^

/* Folgende GRANT Anweisungen werden automatisch generiert */

GRANT USAGE ON SEQUENCE GEN_ENTWICKLUNG TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT INSERT ON A_WASMACHTIB TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT EXECUTE ON PROCEDURE P_BFIRMA_JANEIN TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT EXECUTE ON PROCEDURE P_BMAND_CHECK TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT EXECUTE ON PROCEDURE P_BSAFIBUZW_BMWST_NEU TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT ON BARTG1 TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,INSERT ON BARTG1FIBU TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT ON BMWST TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT ON BARTG2 TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,INSERT ON BARTG2FIBU TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BFIRMA TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BMAND TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BSA TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BSABMAND TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BAUFPO TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BLIEF TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BSAL TO PROCEDURE P_BMWST_MWST_NEU_HVH;
GRANT SELECT,UPDATE ON BBESP TO PROCEDURE P_BMWST_MWST_NEU_HVH;

/* Aktuelle Priviligien auf dieser Prozedur */

GRANT EXECUTE ON PROCEDURE P_BMWST_MWST_NEU_HVH TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE P_BMWST_MWST_NEU_HVH TO SYSDBA;
Ich hoffe, ich konnte ein wenig Licht ins Dunkle bringen :idea:
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
wlueck
Beiträge: 73
Registriert: Fr Jan 12, 2018 6:50 pm

Re: MwSt Änderung ab 01.07.2020

Beitrag von wlueck »

Hallo,
was ist letztlich zu tun? Ich habe die Codes als SQL-Scripts abgespeichert. Den Trigger kann ich ohne Fehlermeldung dann laufen lassen, am Mehrwertsteuerstamm hat sich danach aber nichts geändert. Wenn ich P_BSAFIBUZW_BMWST_NEU_HVH laufen lasse, findet das Script P_BSAFIBUZW_BMWST_NEU nicht, welches im gleichen Ordner liegt. Was mache ich falsch?
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Re: MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Hallo,
mit welcher DB-Version arbeiten Sie?

Die Prozedur P_BSAFIBUZW_BMWST_NEU sollte in der DB vorhanden sein. Das ist die Standard-Prozedur von Synerpy.

Die Prozedur P_BSAFIBUZW_BMWST_NEU_HVH muss in die DB eingespielt werden.
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
wlueck
Beiträge: 73
Registriert: Fr Jan 12, 2018 6:50 pm

Re: MwSt Änderung ab 01.07.2020

Beitrag von wlueck »

Hallo,
die Datenbank müßte noch 2019-1 sein. Ich dachte, die Version sei aktueller. Dann liegen die Probleme wohl daran. Wo kann ich denn die genaue Version sehen? Sowohl bei meiner aktuellen Datenbank als auch bei meiner alten 2017-4-Datenbank wird als Datenbankversion WI-V2.5.8.27089 angegeben.
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Re: MwSt Änderung ab 01.07.2020

Beitrag von festus01 »

Hallo,

dazu Averp aufrufen und auf den Menüpunkt Analyse/System wechseln. Von da aus den Button "Eigene Verbindung" klicken.

Dann erscheint folgendes Fenster:

Bild
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.
denis robel
Beiträge: 203
Registriert: Fr Jul 01, 2005 6:33 pm
Wohnort: Leipzig

Re: MwSt Änderung ab 01.07.2020

Beitrag von denis robel »

Hallo,

ich habe das Problem anders gelöst:

für den Verkauf ein Utility für den Auftrag, das die Steuersätze pro Auftrag, Position und Unterposition umschreibt

Dazu hab ich eine Prozedure geschrieben, die folgendes macht
Vorgang Auftrag oder
19 -> 16
7 -> 5

und in die Gegegenrichtung...

Und das gleiche hab ich für den Rechnungseingang beim Einkauf gemacht...

Damit kann ich beliebig hin und her schalten zwischen den Steuersätzen und muss nicht alles in einem Ruck umstellen.
Mann muss nur darauf achten, dass vor RG-Erzeugung oder RG-Eingang der Auftrag per Utility angepasst wird.
Die Steuerschlüssel müssen aber in BMWST vorhanden sein.
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
Antworten