Preislisten / Ek-Preise bei Intercompany Prozessen
Moderator: SYNERPY
-
miboe
- Beiträge: 1295
- Registriert: Fr Jul 28, 2006 9:13 am
Preislisten / Ek-Preise bei Intercompany Prozessen
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
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
--
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
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
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
--
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
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
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
--
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
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
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
--
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
Welchen Vorteil hätte das? Der Preis wird doch über die Preisliste ermittelt, auch wenn das Kundennummernfeld nicht gefüllt ist.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 ...
Das mit der Preisbasis der Fachhandelspreise schauen wir uns an.
-
miboe
- Beiträge: 1295
- Registriert: Fr Jul 28, 2006 9:13 am
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
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
--
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
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
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
--
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
-
miboe
- Beiträge: 1295
- Registriert: Fr Jul 28, 2006 9:13 am
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 Codedurch diesen hierersetzt. 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 wirdersetzt durchwodurch 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
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);
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);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;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;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
--
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
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
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
--
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
Ich komme nicht weiter und hoffe, daß jemand anderes auf Anhieb meinen Denkfehler findet. Der folgende Code zeigt meinen aktuellen Stand der IC-Preisprozedur.
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
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
ENDWenn 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
--
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
Hallo Miboe,
was mir spontan auffällt:
..und ich würde Integer mit "= 0" initialisieren und nicht mit "= NULL", ist aber wohl Geschmackssache. 
Mehr fällt mir momentan nicht auf, aber ich schaue es mir nochmal genauer an.
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
ENDMehr 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.
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
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:Deswegen ja auch das getrennte Ermitteln der Lieferantenwährung weiter vorne...
Also: erledigt
Michael
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;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
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3