Preislisten / Ek-Preise bei Intercompany Prozessen

Allgemeine Diskussionen um die ERP Software AvERP

Moderator: SYNERPY

Antworten
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Preislisten / Ek-Preise bei Intercompany Prozessen

Beitrag von miboe »

Hallo zusammen,

in einem System mit den Mandanten M1 (Lieferant) und M2 (Kunde) möchte ich, daß ein Preis für einen Artikel, welchen M1 in seiner VK-Preisliste einträgt automatisch als EK-Listenpreis für die Teile-Lieferantenbeziehung bei M2 hinterlegt wird.

Gibt es das schon fertig als Trigger / Prozedur / Utility oder muß ich mir da selbst was basteln?

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Nochmal hallo,

ich hab's gefunden, aber ich halte die Zuweisung von HK1 als Listenpreis im Einkauf für M2 für falsch.

Müßte in M2 nicht der VK-Preis aus der echten Preisliste von M1 stehen? Ich habe mir gerade ein Beispiel zusammengeschraubt, wo ich den gewünschten Preis mal eben einmal zuviel durch 100 dividiere, weil in der Preisliste die Basis 100 ist (also 5Euro pro 100), im Artikelstamm aber HK1 = 0,05Euro/stck?

Verstehe ich was falsch an der Prozedur P_BARTPH_BSAL_INTERCOMP???

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Wir werden uns das ansehen.
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Noch eine grundlegende Frage: gibt es eine Möglichkeit eine Preisliste so einzurichten, daß bei Anlage eines Artikelpreises für diese Preisliste AUTOMATISCH die Kundennummer des IC-Kunden eingetragen wird?

Konstellation etwa wie folgt, basierend auf obigen Beispiel:

M1 hat zwei Preislisten
--> BASIS für den "Normalfall"
--> ICBAS für den IC-Kunden (also Gruppeninterner Verkauf)

Ist es machbar, daß bei Anlage eines Datensatzes in BARTPH für M1 und Preisliste ICBAS das Kundennummerfeld direkt mit der Kundennummer von M2 belegt wird? Oder wäre das eine Anpassung ...

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Und noch eine Frage hinterher:

Bei M1 sollen die Preise sich aus dem Einstandspreis (eventuell auch aus dem Durchschnittspreis) automatisch ergeben. Automatisch bedeutet dabei, daß das System den neuen VK-Preis zwar selbst berechnet aber erst nach entsprechender Aufforderung.

Jetzt mein Problem: alles was ich in der Richtung bisher gefunden habe basiert auf dem Feld VK-Grundlage. Und genau dieses Feld ist aber eben NICHT mandantengetrennt. Wenn also bei M1 durch einen geänderten Listenpreis beim Lieferant anhand der in der VK-Warengruppe oder der VK-Preisstaffeln (die ja pro Mandant eingetragen werden können) sich die VK-Grundlage ändert, dann gilt das automatisch für BEIDE Mandanten. Und das ist ja falsch, zumindest in meinem Szenario hier ...

Die komplett Mandanten getrennte Version mit den Fachhandelspreisen funktioniert bei mir nicht, weil zu wenig Nachkommastellen. Wir reden von elektronischen Bauteilen, mit Stückpreisen von 0,55 Cent und teilweise weniger. Oder ist es irgendwo AUTOMATISCH machbar, daß die Fachhandelspreis-Berechnung mit höheren Werten für die Preisbasis (z.B. 100) rechnet.

Fragen über Fragen ...
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Ist es machbar, daß bei Anlage eines Datensatzes in BARTPH für M1 und Preisliste ICBAS das Kundennummerfeld direkt mit der Kundennummer von M2 belegt wird? Oder wäre das eine Anpassung ...
Welchen Vorteil hätte das? Der Preis wird doch über die Preisliste ermittelt, auch wenn das Kundennummernfeld nicht gefüllt ist.

Das mit der Preisbasis der Fachhandelspreise schauen wir uns an.
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Stimmt, die Preisermittlung wäre davon nicht beeinflusst, darum ging es mir auch nicht. Aber wenn sich das Kundennummerfeld automatisch füllt, dann würde auch der Preis direkt nach Anlage an den IC-Kunden übertragen.

So wie es jetzt ist, muß man zur Ausnutzung der Preisreplikation MANUELL nach Anlage eines neuen Artikels oder seines Preises die Kundennummer eintragen. Es ist also keine Korrektur sondern eine "Bequemlichkeits"-Hilfe

Wenn man alle drei Tage mal einen Artikel neu anlegt mag der Zusatzaufwand okay sein, aber wenn man bei Auftragsfertigung im Elektronikbereich bei einem neuen Kundenauftrag im Zweifelsfall mal eben einen Tag damit verbringt 50-100 Teile neu anzulegen, dann ist das schon hilfreich, wenn's automatisch gehen tun täte :)

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Und welchen Kunden trägt man ein, wenn es mehr als einen zur Preisliste gibt?
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Wenn es mehr als einen Intercompany-Kunden zu einer Preisliste gibt funktioniert das ganze Prinzip der Intercompany-Preisreplikation nicht mehr. weil man das Feld ja nur einmal hat.

Nochmal: es geht einzig und allein um Intercompany Kunden, also um solche Kunden, deren Kundennummer einem Mandanten zugeordnet ist. Grundlage meiner Idee war, daß es für JEDEN dieser IC-Kunden auch eine EIGENE Preisliste gibt, wobei es ja zunächst egal ist, ob diese Preislisten wirklich unterschiedliche Preise berechnen oder nicht. Konkret:

Drei Mandanten M1, M2, M3 ... M1 ist Lieferant, M2 und M3 sind Kunden von M1 per IC-Replikation. Mandant 1 hat drei Preislisten BASIS, M2 und M3. BASIS ist die Standardpreisliste für diesen Mandanten, die Preislisten M2 und M3 sind dem jeweiligen Kunden im Kundenstamm direkt UND im entsprechenden Unterprogramm (weil dort Mandantengetrennt) zugewiesen.

Wenn ich jetzt für den Artikel x4711 in M1 die VK-Preise (Berech-Schema 1) neu eintragen lasse, wäre der Ablauf optimalerweise wie folgt: Für alle Preislisten, die KEINEM Intercompany-Kunden zugewiesen sind, hier also BASIS, wird ein neutraler BARTPH-Datensatz angelegt, danach wird im zweiten Schritt für jede Preisliste, die einem IC-Kunden zugewiesen ist, ein kundenspezifischer Datensatz erstellt.

Das ist wie gesagt nur ein Denkansatz und da fehlt sicher noch die ein oder andere Detailüberlegung, aber so ein Mechnismus wäre schon eine ziemliche Erleichterung.

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Ich hatte schon verstanden, aber man hat ja nicht nur immer einen IC-Kunden.

Wenn es nur einen Kunden für eine Preisliste gibt, dann könnte man doch einfach in den BARTPH-Trigger eingereifen und das Feld vorbelegen.
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Alles nochmal auf Anfang: Derzeit ist es so, daß die Kundennummer belegt werden MUSS, damit überhaupt die Replikation angetickt wird, siehe Trigger in BARTPH. Hat man nur einen IC-Kunden ist das zunächst mal "nur" nervig, hat man mehrere ist man am Brett, weil man nur ein KdNr-Feld zur Verfügung hat und damit der gleiche VK-Preis nicht GLEICHZEITIG an mehrere IC-Kunden repliziert werden kann. Man bräuchte also mehrere Preislisten womit dann aber das manuelle Eintragen der Kundennummer endgültig unten durch ist ...

Hier die Lösungansätze: im Trigger für BARTPH (AI0 und AU0) wird dieser Code

Code: Alles auswählen

-- Intercompany - Mandanten mitpflegen, Kundenpreis = Einkaufspreis für anderen
IF (NEW.BKUNDE_ID IS NOT NULL) THEN
  EXECUTE PROCEDURE P_BARTPH_BSAL_INTERCOMP (NEW.BMAND_ID, NEW.ID);
durch diesen hier

Code: Alles auswählen

-- Intercompany - Mandanten mitpflegen, Kundenpreis = Einkaufspreis für anderen
IF (EXISTS (SELECT A.ID FROM BMAND A
            LEFT OUTER JOIN BKUNDE B ON B.ID = A.BKUNDE_ID
            LEFT OUTER JOIN BKUNDEPRL C ON C.BKUNDE_ID_LINKEY = B.ID
            WHERE C.BKUGRU_ID = NEW.BKUGRU_ID_KUGR AND C.BMAND_ID = NEW.BMAND_ID)) THEN
  EXECUTE PROCEDURE P_BARTPH_BSAL_INTERCOMP (NEW.BMAND_ID, NEW.ID);
ersetzt. Sprich: die Replikation wird nicht mehr gezielt dadurch ausgelöst, daß eine Kundennummer eingetragen wird, sondern dadurch, daß es (mindestens) einen Mandanten gibt, welchem im aktuellen (Lieferanten-) Mandant die gerade angelegte oder bearbeitete Preisliste zugewiesen ist. Anmerkung: wenn man's auf die Spitze treibt, kann man den Mandantenstamm um ein Feld "IC-Preise automatisch empfangen J/N" erweitern, um für jeden IC-Kunden diese Automatik einzeln an- und abzuschalten.

In P_BARTPH_BSAL_INTERCOMP wird

Code: Alles auswählen

/* Kundennummer suchen */
SELECT A.BSA_ID_LINKKEY,
       A.VK_WAEHRUNG,
       A.MENGE,
       A.PRBASIS,
       A.ZUSCHLAG,
       A.STAFFELNR,
       B.HK1,
       A.BKUNDE_ID
FROM BARTPH A
LEFT OUTER JOIN BSA B ON A.BSA_ID_LINKKEY = B.ID
WHERE A.ID = :BARTPH_ID
INTO :BSA_ID,
     :VK_WAEHRUNG,
     :MENGE,
     :PRBASIS,
     :ZUSCHLAG,
     :STAFFELNR,
     :HK1,
     :BKUNDE_ID;
ersetzt durch

Code: Alles auswählen

/* Kundennummer suchen */
SELECT A.BSA_ID_LINKKEY,
       A.VK_WAEHRUNG,
       A.MENGE,
       A.PRBASIS,
       A.ZUSCHLAG,
       A.STAFFELNR,
       B.HK1,
       A.BKUGRU_ID_KUGR
FROM BARTPH A
LEFT OUTER JOIN BSA B ON A.BSA_ID_LINKKEY = B.ID
WHERE A.ID = :BARTPH_ID
INTO :BSA_ID,
     :VK_WAEHRUNG,
     :MENGE,
     :PRBASIS,
     :ZUSCHLAG,
     :STAFFELNR,
     :HK1,
     :BKUGRU_ID;
wodurch nicht mehr eine einzelne Kunden-ID, sondern die ID der zuvor bearbeiteten Preisliste ermittelt wird.

Alles nach dieser Stelle wird dann in eine FOR SELECT Schleife gepackt, die sich aus der BKUNDEPRL, BKUNDE und BMAND alle betroffenen Kunden mit ihrem jeweiligen Mandanten-ID sucht. Hier könnte man dann auch die oben kursiv geschriebene Einzelprüfung unterbringen, indem man das in die WHERE Klausel der FOR SELECT mit einbaut.

Wäre das ein brauchbarer Lösungansatz?

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Da ich den Code ja sowieso fürs Posting schon fast fertig hatte, habe ich die paar Zeilen Umbau auf die Schleife in der Prozedur auch noch schnell gemacht und es funktioniert wie ich es mir vorstelle. Halt ohne diese "Feinsteuerung" für den einzelnen Mandanten, es gibt aber ja nur einen bei mir ... :)

Gruß und jetzt aber schönes Wochenende
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Ich komme nicht weiter und hoffe, daß jemand anderes auf Anhieb meinen Denkfehler findet. Der folgende Code zeigt meinen aktuellen Stand der IC-Preisprozedur.

Code: Alles auswählen

CREATE OR ALTER PROCEDURE P_BARTPH_BSAL_INTERCOMP(
    BMAND_ID INTEGER,
    BARTPH_ID INTEGER)
AS
DECLARE VARIABLE BSA_ID INTEGER;
DECLARE VARIABLE BSA_ID_MAND INTEGER;
DECLARE VARIABLE BKUGRU_ID INTEGER;
DECLARE VARIABLE BMAND_ID_KUNDE INTEGER;
DECLARE VARIABLE BLIEF_ID INTEGER;
DECLARE VARIABLE BSAL_ID INTEGER;      
DECLARE VARIABLE BSALP_ID INTEGER;
DECLARE VARIABLE HK1 NUMERIC(15,4);
DECLARE VARIABLE VK_WAEHRUNG NUMERIC(15,4);  
DECLARE VARIABLE ZUSCHLAG NUMERIC(15,4);     
DECLARE VARIABLE MENGE NUMERIC(15,4);
DECLARE VARIABLE STAFFELNR INTEGER;      
DECLARE VARIABLE PRBASIS INTEGER;
DECLARE VARIABLE BWAER_ID_WAERUNGK INTEGER;
BEGIN
  /* LETZTER STAND 09.12.2007 19:09:47 HB */
  /****************************************************************************/
  /* Versionshistorie                                                         */
  /* Datum       Name Beschreibung                                            */
  /* 08.12.2010  MBo  Fehlerkorrektur bei Neuanlage, war falsche Mandanten-ID */
  /* 21.12.2010  MBo  Umstellung auf Schleife für Auswahl der anzulengenden   */
  /*                  Datensätze in BSAL wegen geändertem Aufruf in BARTPH    */
  /****************************************************************************/
  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BARTPH_BSAL_INTERCOMP '||:BMAND_ID||' '||:BARTPH_ID);

  /* Lieferantennummer des Mandanten suchen */
  BLIEF_ID = NULL;
  SELECT A.BLIEF_ID
  FROM BMAND A
  WHERE A.ID = :BMAND_ID
  INTO :BLIEF_ID;

  IF (BLIEF_ID IS NULL) THEN EXIT;

  /* Währung des Lieferanten holen */
  SELECT A.BWAER_ID_WAERUNGK
  FROM BLIEF A
  WHERE A.ID = :BLIEF_ID
  INTO :BWAER_ID_WAERUNGK;

  /* Preislistendaten suchen */
  SELECT A.BSA_ID_LINKKEY,
         A.VK_WAEHRUNG,
         A.MENGE,
         A.PRBASIS,
         A.ZUSCHLAG,
         A.STAFFELNR,
         B.HK1,
         A.BKUGRU_ID_KUGR
  FROM BARTPH A
  LEFT OUTER JOIN BSA B ON A.BSA_ID_LINKKEY = B.ID
  WHERE A.ID = :BARTPH_ID
  INTO :BSA_ID,
       :VK_WAEHRUNG,
       :MENGE,
       :PRBASIS,
       :ZUSCHLAG,
       :STAFFELNR,
       :HK1,
       :BKUGRU_ID;

  /* Schleife durch die betroffenen Kunden */
  FOR SELECT A.ID FROM BMAND A
  LEFT OUTER JOIN BKUNDE B ON B.ID = A.BKUNDE_ID
  LEFT OUTER JOIN BKUNDEPRL C ON C.BKUNDE_ID_LINKEY = B.ID
  WHERE C.BKUGRU_ID = :BKUGRU_ID AND C.BMAND_ID = :BMAND_ID
  INTO :BMAND_ID_KUNDE
  DO BEGIN
    /* Mandantenspezifische Artikelnummer suchen */
    BSA_ID_MAND = NULL;
    EXECUTE PROCEDURE P_BMAND_BSASPEZ(:BMAND_ID, :BSA_ID)
    RETURNING_VALUES (:BSA_ID_MAND);

    /* Gibt es die Zuordnung schon, wenn ja, dann anpassen, sonst neu anlegen */
    BSAL_ID = NULL;
    SELECT A.ID
    FROM BSAL A
    WHERE A.BLIEF_ID_LIEFNR = :BLIEF_ID AND
          A.BSA_ID_LINKKEY = :BSA_ID_MAND
    INTO :BSAL_ID;

    IF (BSAL_ID IS NOT NULL) THEN
    BEGIN
      IF (STAFFELNR = 1) THEN
        /* Kein Staffelpreis */
        UPDATE BSAL A
        SET A.LISTPREIS = :VK_WAEHRUNG, /*:HK1,*/
            A.GPRABATT = 0 - :ZUSCHLAG,
            A.PRBASIS = :PRBASIS,
            A.GPNRABATT = :VK_WAEHRUNG
        WHERE A.ID = :BSAL_ID;
      ELSE
      BEGIN
        /* Staffelpreis */
        /* Gibt es die Zuordnung schon, wenn ja, dann anpassen, sonst neu anlegen */
        BSALP_ID = NULL;
        SELECT A.ID
        FROM BSALP A
        WHERE A.BSAL_ID_LINKKEY = :BSAL_ID AND
              F_LRTRIM(A.MASKENKEY) = :STAFFELNR
        INTO :BSALP_ID;

        IF (BSALP_ID IS NOT NULL) THEN
          UPDATE BSALP
          SET ABMENGE = :MENGE,
              EPREIS = :VK_WAEHRUNG,
              GPRABATT = 0 - :ZUSCHLAG
          WHERE ID = :BSALP_ID;
        ELSE
          INSERT INTO BSALP(
            ABMENGE,
            EKDATUM,
            GPRABATT,
            BSAL_ID_LINKKEY,
            PRBASIS,
            EPREIS)
          VALUES (
              :MENGE,
              CURRENT_DATE,
              0 - :ZUSCHLAG,
              :BSAL_ID,
              :PRBASIS,
              :VK_WAEHRUNG);
      END
    END
    ELSE BEGIN
      /* Neue Zuordnung anlegen - muss Staffel 1 sein, außer, wenn nachträgliche
         Zuordnung des Kunden zu einem Mandanten, aber dann Abgleich an anderer
         Stelle starten, nicht hier */
      INSERT INTO BSAL(
        BSA_ID_LINKKEY,
        BLIEF_ID_LIEFNR,
        BWAER_ID_WAERUNGKB,
        GPRABATT,
        LIEFARTBEZ,
        LIEFARTNR,
        LISTPREIS,
        PRBASIS,
        GPNRABATT,
        BLAND_ID,
        BMAND_ID)
        SELECT
          :BSA_ID_MAND,
          :BLIEF_ID,
          :BWAER_ID_WAERUNGK,
          0 - A.ZUSCHLAG,
          C.ARTBEZ,
          C.MASKENKEY,
          A.VK_WAEHRUNG,
          A.PRBASIS,
          A.VK_WAEHRUNG,
          C.BLAND_ID_URSPLAND,
          :BMAND_ID_KUNDE
        FROM BARTPH A , BLIEF B
        LEFT OUTER JOIN BSA C ON A.BSA_ID_LINKKEY = C.ID
        WHERE A.ID = :BARTPH_ID AND
              B.ID = :BLIEF_ID;
    END
  END
END
Der Aufruf erfolgt gemäß dem kleinen Stückchen Code weiter oben im Thread aus dem Trigger für BARTPH. Jetzt aber mein Problem:
Wenn ich die Prozedur im IBexpert aufrufe, läuft sie beim ersten Mal (in der Regel) sauber durch, der Eintrag in BSAL im zweiten Mandant wird angelegt. Wenn ich dann für den nächsten Datensatz in BARTPH den Aufruf mache, verschießt das Ding zwei ID's in BSAL legt aber KEINEN Datensatz an, das ganze ohne Fehlermeldung. Rufe ich direkt danach für den gleichen Datensatz die Prozedur mit unveränderten Parametern nochmal auf, wird der Datensatz sauber gechrieben. Bei jedm weiteren Datensatz das gleiche Spiel. Erstaufruf verschießt zwei ID, Zweitaufruf legt Datensatz an

Irgendjemand ne Idee?

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
NPLADMIN
Beiträge: 163
Registriert: Di Okt 07, 2008 7:54 am
Wohnort: Oxbüll / Wees

Beitrag von NPLADMIN »

Hallo Miboe,

was mir spontan auffällt:

Code: Alles auswählen

CREATE OR ALTER PROCEDURE P_BARTPH_BSAL_INTERCOMP(
    BMAND_ID INTEGER,
    BARTPH_ID INTEGER)
AS
DECLARE VARIABLE BSA_ID INTEGER;
DECLARE VARIABLE BSA_ID_MAND INTEGER;
DECLARE VARIABLE BKUGRU_ID INTEGER;
DECLARE VARIABLE BMAND_ID_KUNDE INTEGER;
DECLARE VARIABLE BLIEF_ID INTEGER;
DECLARE VARIABLE BSAL_ID INTEGER;     
DECLARE VARIABLE BSALP_ID INTEGER;
DECLARE VARIABLE HK1 NUMERIC(15,4);
DECLARE VARIABLE VK_WAEHRUNG NUMERIC(15,4); 
DECLARE VARIABLE ZUSCHLAG NUMERIC(15,4);     
DECLARE VARIABLE MENGE NUMERIC(15,4);
DECLARE VARIABLE STAFFELNR INTEGER;     
DECLARE VARIABLE PRBASIS INTEGER;
DECLARE VARIABLE BWAER_ID_WAERUNGK INTEGER;
BEGIN
  /* LETZTER STAND 09.12.2007 19:09:47 HB */
  /****************************************************************************/
  /* Versionshistorie                                                         */
  /* Datum       Name Beschreibung                                            */
  /* 08.12.2010  MBo  Fehlerkorrektur bei Neuanlage, war falsche Mandanten-ID */
  /* 21.12.2010  MBo  Umstellung auf Schleife für Auswahl der anzulengenden   */
  /*                  Datensätze in BSAL wegen geändertem Aufruf in BARTPH    */
  /****************************************************************************/
  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_BARTPH_BSAL_INTERCOMP '||:BMAND_ID||' '||:BARTPH_ID);

  /* Lieferantennummer des Mandanten suchen */
  BLIEF_ID = NULL;
  SELECT A.BLIEF_ID
  FROM BMAND A
  WHERE A.ID = :BMAND_ID
  INTO :BLIEF_ID;

  IF (BLIEF_ID IS NULL) THEN EXIT;

  /* Währung des Lieferanten holen */
  SELECT A.BWAER_ID_WAERUNGK
  FROM BLIEF A
  WHERE A.ID = :BLIEF_ID
  INTO :BWAER_ID_WAERUNGK;

  /* Preislistendaten suchen */
  SELECT A.BSA_ID_LINKKEY,
         A.VK_WAEHRUNG,
         A.MENGE,
         A.PRBASIS,
         A.ZUSCHLAG,
         A.STAFFELNR,
         B.HK1,
         A.BKUGRU_ID_KUGR
  FROM BARTPH A
  LEFT OUTER JOIN BSA B ON A.BSA_ID_LINKKEY = B.ID
  WHERE A.ID = :BARTPH_ID
  INTO :BSA_ID,
       :VK_WAEHRUNG,
       :MENGE,
       :PRBASIS,
       :ZUSCHLAG,
       :STAFFELNR,
       :HK1,
       :BKUGRU_ID;

  /* Schleife durch die betroffenen Kunden */
  FOR SELECT A.ID FROM BMAND A
  LEFT OUTER JOIN BKUNDE B ON B.ID = A.BKUNDE_ID
  LEFT OUTER JOIN BKUNDEPRL C ON C.BKUNDE_ID_LINKEY = B.ID
  WHERE C.BKUGRU_ID = :BKUGRU_ID AND C.BMAND_ID = :BMAND_ID
  INTO :BMAND_ID_KUNDE
  DO BEGIN
    /* Mandantenspezifische Artikelnummer suchen */
    BSA_ID_MAND = NULL;
--    EXECUTE PROCEDURE P_BMAND_BSASPEZ(:BMAND_ID, :BSA_ID)
    EXECUTE PROCEDURE P_BMAND_BSASPEZ(:BMAND_ID_KUNDE, :BSA_ID) -- Wäre korrekter, oder? -KTS
    RETURNING_VALUES (:BSA_ID_MAND);

    /* Gibt es die Zuordnung schon, wenn ja, dann anpassen, sonst neu anlegen */
    BSAL_ID = NULL;
    SELECT A.ID
    FROM BSAL A
    WHERE A.BLIEF_ID_LIEFNR = :BLIEF_ID AND
          A.BSA_ID_LINKKEY = :BSA_ID_MAND
    INTO :BSAL_ID;

    IF (BSAL_ID IS NOT NULL) THEN
    BEGIN
      IF (STAFFELNR = 1) THEN
        /* Kein Staffelpreis */
        UPDATE BSAL A
        SET A.LISTPREIS = :VK_WAEHRUNG, /*:HK1,*/
            A.GPRABATT = 0 - :ZUSCHLAG,
            A.PRBASIS = :PRBASIS,
            A.GPNRABATT = :VK_WAEHRUNG
        WHERE A.ID = :BSAL_ID;
      ELSE
      BEGIN
        /* Staffelpreis */
        /* Gibt es die Zuordnung schon, wenn ja, dann anpassen, sonst neu anlegen */
        BSALP_ID = NULL;
        SELECT A.ID
        FROM BSALP A
        WHERE A.BSAL_ID_LINKKEY = :BSAL_ID AND
              F_LRTRIM(A.MASKENKEY) = :STAFFELNR
        INTO :BSALP_ID;

        IF (BSALP_ID IS NOT NULL) THEN
        BEGIN -- IMMER BESSER mit BEGIN / END - KTS
          UPDATE BSALP
          SET ABMENGE = :MENGE,
              EPREIS = :VK_WAEHRUNG,
              GPRABATT = 0 - :ZUSCHLAG
          WHERE ID = :BSALP_ID;
        END
        ELSE
        BEGIN  -- IMMER BESSER mit BEGIN / END - KTS
         INSERT INTO BSALP(
           ABMENGE,
           EKDATUM,
           GPRABATT,
           BSAL_ID_LINKKEY,
           PRBASIS,
           EPREIS)
         VALUES (
             :MENGE,
             CURRENT_DATE,
             0 - :ZUSCHLAG,
             :BSAL_ID,
             :PRBASIS,
             :VK_WAEHRUNG);
        END
      END
    END
    ELSE BEGIN
      /* Neue Zuordnung anlegen - muss Staffel 1 sein, außer, wenn nachträgliche
         Zuordnung des Kunden zu einem Mandanten, aber dann Abgleich an anderer
         Stelle starten, nicht hier */
      INSERT INTO BSAL(
        BSA_ID_LINKKEY,
        BLIEF_ID_LIEFNR,
        BWAER_ID_WAERUNGKB,
        GPRABATT,
        LIEFARTBEZ,
        LIEFARTNR,
        LISTPREIS,
        PRBASIS,
        GPNRABATT,
        BLAND_ID,
        BMAND_ID)
        SELECT
          :BSA_ID_MAND,
          :BLIEF_ID,
          :BWAER_ID_WAERUNGK,
          0 - A.ZUSCHLAG,
          C.ARTBEZ,
          C.MASKENKEY,
          A.VK_WAEHRUNG,
          A.PRBASIS,
          A.VK_WAEHRUNG,
          C.BLAND_ID_URSPLAND,
          :BMAND_ID_KUNDE
        FROM BARTPH A , BLIEF B
        LEFT OUTER JOIN BSA C ON A.BSA_ID_LINKKEY = C.ID
        WHERE A.ID = :BARTPH_ID AND
              B.ID = :BLIEF_ID;
    END
  END
END
..und ich würde Integer mit "= 0" initialisieren und nicht mit "= NULL", ist aber wohl Geschmackssache. :D

Mehr fällt mir momentan nicht auf, aber ich schaue es mir nochmal genauer an.
Gruß
KTS

AvERP-Exe: 4.2.1.6
Datenbank: AvERP2009-A.01
_________________________
Suchen heißt finden und je mehr man sucht um so mehr findet man. ;-)
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Hallo NPLADMIN,

danke für die Tips, hier die Kommentare: der Aufruf der BSA_BMANDSPEZ erschien mir auch seltsam, nach Blick in die entsprechende Prozedur scheint es aber so richtig zu sein wie es da steht. Das mit den BEGIN--END für IF-Anweisungen mache ich selbst normal auch so, weil das übersichtlicher ist. Die Stellen waren aber so schon im Originalcode und wurden deswegen nicht geändert.

Der wirkliche Fehler steckt in der allerletzten INSERT .. SELECT Anweisung. Wenn man die nämlich im IBExpert direkt im SQL-Editor ausführt und dabei manuell Werte für die Variablennamen eingibt, kommt eine völlig irre Fehlermeldung, die ich so noch nicht gesehen habe. IBexpert behauptet nämlich, er könnte den Datensatz nicht lesen, weil der Cursor weder auf einer Zeile (ROW) noch eine Spalte (Column) steht. Probier es mal aus und DU wirst DIch wundern.

Ich hatte auch die Prozedur wegen Ablenkung nicht vollständig überarbeitet, denn ich wollte ja aus dieser Anweisung den BLIEF B rausholen, habs aber vergessen. Wenn man das rausnimmt funktioniert alles prima. Sowohl im SQL-Editor als auch als komplette Prozedur. Die letzte INSERT-Anweisung sieht also im Endausbau SO aus:

Code: Alles auswählen

      INSERT INTO BSAL(
        BSA_ID_LINKKEY,
        BLIEF_ID_LIEFNR,
        BWAER_ID_WAERUNGKB,
        GPRABATT,
        LIEFARTBEZ,
        LIEFARTNR,
        LISTPREIS,
        PRBASIS,
        GPNRABATT,
        BLAND_ID,
        BMAND_ID)
        SELECT
          :BSA_ID_MAND,
          :BLIEF_ID,
          :BWAER_ID_WAERUNGK,
          0 - A.ZUSCHLAG,
          C.ARTBEZ,
          C.MASKENKEY,
          A.VK_WAEHRUNG,
          A.PRBASIS,
          A.VK_WAEHRUNG,
          C.BLAND_ID_URSPLAND,
          :BMAND_ID_KUNDE
        FROM BARTPH A
        LEFT OUTER JOIN BSA C ON A.BSA_ID_LINKKEY = C.ID
        WHERE A.ID = :BARTPH_ID;
Deswegen ja auch das getrennte Ermitteln der Lieferantenwährung weiter vorne...

Also: erledigt
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
Antworten