Firebird 2.1 - Wir haben es getan

Erprobte Lösungen von Anwendern, die anderen Anwendern helfen, werden hier bereit gestellt

Moderator: SYNERPY

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

Firebird 2.1 - Wir haben es getan

Beitrag von festus01 »

Hallo,

wir haben es gewagt und getan :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

:D :D :D :D :D :D :D :D :D :D
AvERP läuft jetzt auf einem Dual-Quad Core System mit 8 GB Hauptspeicher unter UBUNTU 8.04 LTS
und der finalen Firebird Version 2.1 mit der FreeAdhocUDF Version 20080303.

:D :D :D :D :D :D :D :D :D :D

Mit einer Vorbereitungszeit von ca. 6 Monaten verlief die Umstellung am Wochenende problemlos.
Auch der darauffolgende Montag verläuft im Moment ziemlich ruhig.

Die Datenbank beruht auf die Version AvERP2005.A.1, die nach und nach mit den aktuellen Versionen erweitert
und an unsere Bedürfnisse angepasst wurde.

Einige Daten zu unserer Datenbank:

BRRC : 26000 Datensätze
BRRCP : 315000 Datensätze
BRLS: 40000 Datensätze
BAUF: 31000 Datensätze
BAUFPO: 300000 Datensätze
BARTLHBUX: 115000 Datensätze

Die Größe beträgt zur Zeit ca. 360MB wobei zwischen 30-35 User gleichzeitig arbeiten (angemeldet :wink:).

Ich möchte hier noch einmal ein dickes Lob an SynERPy aussprechen, die mit ihrer Entwicklung der Datenbank großes geleistet haben.
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

Beitrag von denis robel »

Hallo,

bei mir läuft nun auch 2.1.1 unter Mandriva 2008.1.

Ich habe aber eine Frage: welche Server-Version wird eingesetzt Classic oder Superserver wegen der SMP unterstützung?

Meines Wissens soll ja für SMP-Prozessor der Classic-Server besser geeignet sein.

Schöne Grüße aus Leipzig

Denis
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hallo Denis,
denis robel hat geschrieben:Hallo,

bei mir läuft nun auch 2.1.1 unter Mandriva 2008.1.

Ich habe aber eine Frage: welche Server-Version wird eingesetzt Classic oder Superserver wegen der SMP unterstützung?

Meines Wissens soll ja für SMP-Prozessor der Classic-Server besser geeignet sein.

Schöne Grüße aus Leipzig

Denis
ich komme gerade von der IBExpert Roadshow und da wurde noch einmal bestätigt das bei Mehrkernprozessoren ab ca. 30-50 User der Classic-Server besser geeignet ist.

Abhilfe verspricht die neue Version 2.5 von Firebird, die die Vorteile beider Versionen vereint.

Also in Ihrem Falle müsste man mehr über das System wissen. Ich persönlich würde immer die Classic Variante vorziehen, das bezieht sich aber nur auf Linux.
Bei Windows sieht die Sache etwas anders aus.
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

Beitrag von denis robel »

Hallo Festus01,

eine Frage bezüglich der Performance habe ich noch:

seit der Umstellung auf FB2.1.1 läuft der Fertigungsprozess sehr langsam. Der Statuswechsel für einen Fertigungsauftrag dauert ca. 1 Minute und länger.

Wo kann denn da noch was optimiert werden?

Mein System ist ein Athlon X2 3500+ mit 2GB Ram. Classic Server 2.1.1, aktuelle FreeAdHocUDF vom 20080303, und 10 Clients.

Die CPU-Last geht für den Firebird-Prozess, der den Ferigungsauftrag abarbeitet gegen Maximum und die Speicheraulastung auf den max. definierten Wert aus der firebird.conf --> Server sollte richtig funktionieren.

Habt ihr irgendwo festgehalten an welchen Ecken überall die DB für FB2.0 angepasst wurde?

Ich habe de Eindruck dass der Fertigungsablauf viel zäher von Statten geht als unter FB 1.5.x

Hat die Wahl einer anderen Version von FreeAdHocUDF auch Einfluss auf die Performance?


Schöne Grüße aus Leipzig

Denis
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hallo Denis,

das ist eigentlich ungewöhnlich das eine Routine in FB 2.1 langsamer läuft als in FB 1.5.
Ich habe aber nach der Umstellung auf FB 2.1 alle Proceduren und alle Trigger neu kompiliert. Außerdem noch alle Index neu berechnen lassen.

Vielleicht liegt da noch was im argen.

Wie wurde denn die Umstellung vorgenommen?

Backup auf den 1.5 Server
Restore auf den 2.1 Server

Wenn das alles OK ist müsste man schauen welche Procedure für den Statuswechsel zuständig ist.

Ein bisschen mehr RAM könnte auch nicht schaden :wink:
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

Beitrag von denis robel »

Hallo festus01,

umgestellt habe ich folgendermassen:

Backup auf 1.5x
Restore auf dem 2.1.1

Prozeduren und Trigger habe ich nicht neu kompiliert, kann ich aber noch einmal durchlaufen lassen ...

Ich werde mir mal die Prozedur für den Statuswechsel anschauen und wieder berichten.

Denis
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hallo Denis,
denis robel hat geschrieben: Prozeduren und Trigger habe ich nicht neu kompiliert, kann ich aber noch einmal durchlaufen lassen ...
dabei wird man feststellen, dass einige Proceduren und Trigger nicht kompiliert werden können, da die Syntax von 2.1 etwas strenger ist.

Sollte es da Probleme geben, dann könnte ich evtl . helfen.
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

Beitrag von denis robel »

Hallo Festus,

habe noch ein kleines Problem bezüglich der Firebird 2.1 Sache:

wie sehen denn bei Dir die Trigger BRRCP_BI2 und BRRCP_BU0 aus ?

Bei mir werden für den Ausdruck keine Positionsnummern generiert.
Ich habe den Verdacht das die Trigger wegen des neuen "null"-Handlings nicht richtig hinhauen ...

Schöne Grüße aus Leipzig

Denis
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hallo Denis,
denis robel hat geschrieben: wie sehen denn bei Dir die Trigger BRRCP_BI2 und BRRCP_BU0 aus ?
So sehen sie aus:

Code: Alles auswählen

SET TERM ^ ;



CREATE OR ALTER TRIGGER BRRCP_BI2 FOR BRRCP
ACTIVE BEFORE INSERT POSITION 2
AS
DECLARE VARIABLE BWAER_ID INTEGER;
DECLARE VARIABLE KURS_FW NUMERIC(15,6);
DECLARE VARIABLE BMAND_ID INTEGER; 
DECLARE VARIABLE SJA VARCHAR(1);
DECLARE VARIABLE SNEIN VARCHAR(1);
DECLARE VARIABLE MENGE_KLPE NUMERIC(15,4);
BEGIN
  /* Letzter Stand 27.09.2007 16:35:14 AS */

  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('BRRCP_BI2');

  /* Feld TST wird in VIEW-Trigger gesetzt und kann hier bei Bedarf abgefragt werden*/
  /* TST: 1 = LS-Rückst.; 2 = LS-Pos.; 3 = RG-Rückst.; 4 = RG-Pos. (siehe Domänenbeschr. zum Feld) */

  IF ((NEW.ID IS NULL) OR (NEW.ID = 0)) THEN NEW.ID = GEN_ID(GEN_BRRCP,1);
  NEW.BENUTZER = USER;
  NEW.GESPEICHERT = CURRENT_TIMESTAMP;

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

  IF (NEW.BAUFPO_ID_ALTAUFNRP = 0) THEN NEW.BAUFPO_ID_ALTAUFNRP = NULL;
  IF (NEW.BRRC_ID_ALTRGNR = 0) THEN NEW.BRRC_ID_ALTRGNR = NULL;
  IF (NEW.BRLS_ID_LSNR = 0) THEN NEW.BRLS_ID_LSNR = NULL;
  IF (NEW.BRRC_ID_RGNR = 0) THEN NEW.BRRC_ID_RGNR = NULL;
  IF (NEW.BRRCP_ID_BRRCP = 0) THEN NEW.BRRCP_ID_BRRCP = NULL;
  IF (NEW.BVERPA_ID = 0) THEN NEW.BVERPA_ID = NULL;
  IF (NEW.EPREIS IS NULL) THEN NEW.EPREIS = 0.0;
  IF (NEW.GEBMENGE IS NULL) THEN NEW.GEBMENGE = 0.0;
  IF (NEW.GPREIS IS NULL) THEN NEW.GPREIS = 0.0;
  IF (NEW.GPNRAB IS NULL) THEN NEW.GPNRAB = NEW.GPREIS;
  IF (NEW.MENGE IS NULL) THEN NEW.MENGE = 0.0;
  IF (NEW.MWSTSATZ IS NULL) THEN NEW.MWSTSATZ = 0.0;
  IF (NEW.PRBASIS IS NULL) THEN NEW.PRBASIS = 0;
  IF (NEW.RABATT1 IS NULL) THEN NEW.RABATT1 = 0.0;
  IF (NEW.RABATT2 IS NULL) THEN NEW.RABATT2 = 0.0;
  IF (NEW.EPREIS_FW IS NULL) THEN NEW.EPREIS_FW = 0.0;
  IF (NEW.GPREIS_FW IS NULL) THEN NEW.GPREIS_FW = 0.0;
  IF (NEW.GPNRAB_FW IS NULL) THEN NEW.GPNRAB_FW = NEW.GPREIS_FW;
  IF (NEW.EPREIS_FIX IS NULL) THEN NEW.EPREIS_FIX = sNEIN;
  IF (NEW.GPREIS_FIX IS NULL) THEN NEW.GPREIS_FIX = sNEIN;
  IF (NEW.MTZ_MTA IS NULL) THEN NEW.MTZ_MTA = 0.0;
  IF (NEW.GPREIS_MTZ IS NULL) THEN NEW.GPREIS_MTZ = 0.0;  
  IF (NEW.BSA_EKPREIS IS NULL) THEN NEW.BSA_EKPREIS = 0.0;
  IF (NEW.DECKBEITRAG IS NULL) THEN NEW.DECKBEITRAG = 0.0;
  IF (NEW.UVP IS NULL) THEN
    SELECT UVP
    FROM BAUFPO
    WHERE ID = NEW.BAUFPO_ID_AUFNRPOS
    INTO NEW.UVP;

  /* MENGE_LAG ist die Menge in der Mengeneinheit Verkauf, da in der MENGE
     eine kundenspezifische Einheit reingerechnet werden kann.
     Wird immer mitgepflegt. */
  EXECUTE PROCEDURE P_CEINHEIT_BSAKUNDE(NEW.BSA_ID_ARTNR, NEW.BKUNDE_ID, NULL,
                                        NEW.MENGE, 2, 1)
  RETURNING_VALUES(NEW.MENGE_LAG);

  /* Pos.Nr. für Lieferschein / Rechnung */
  IF (NEW.LS_POSNR IS NULL) THEN NEW.LS_POSNR = ''; /* darf nicht NULL sein */
  IF (NEW.RG_POSNR IS NULL) THEN NEW.RG_POSNR = ''; /* darf nicht NULL sein */

  IF ((NEW.BRLS_ID_LSNR IS NOT NULL) AND ((NEW.LS_POSNR IS NULL) OR (F_LRTRIM(NEW.LS_POSNR)=''))) THEN
    EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_LS_POS', NEW.BRLS_ID_LSNR, 10, NEW.LS_POSNR)
      RETURNING_VALUES (NEW.LS_POSNR);
  ELSE
    IF (NEW.BRLS_ID_LSNR IS NULL) THEN
       NEW.LS_POSNR = '';

  IF ((NEW.BRRC_ID_RGNR IS NOT NULL) AND ((NEW.RG_POSNR IS NULL) OR (F_LRTRIM(NEW.RG_POSNR)=''))) THEN
    EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_RG_POS', NEW.BRRC_ID_RGNR, 10, NEW.RG_POSNR)
      RETURNING_VALUES (NEW.RG_POSNR);
  ELSE
    IF (NEW.BRRC_ID_RGNR IS NULL) THEN
       NEW.RG_POSNR = '';

  BWAER_ID = NULL;
  IF (NEW.BRRC_ID_RGNR IS NOT NULL) THEN
  BEGIN
    SELECT BWAER_ID,
           KURS_FW,
           BMAND_ID
    FROM BRRC
    WHERE ID = NEW.BRRC_ID_RGNR
    INTO :BWAER_ID,
         :KURS_FW,
         :BMAND_ID;
  END
  ELSE IF (NEW.BAUFPO_ID_AUFNRPOS IS NOT NULL) THEN

  BEGIN
    SELECT VB.BWAER_ID,
           VB.KURS_FW,
           VB.BMAND_ID
    FROM BAUFPO VA
    LEFT OUTER JOIN BAUF VB ON VA.BAUF_ID_LINKKEY = VB.ID
    WHERE VA.ID = NEW.BAUFPO_ID_AUFNRPOS
    INTO :BWAER_ID,
         :KURS_FW,
         :BMAND_ID;
  END

  IF (BWAER_ID IS NULL) THEN
  BEGIN
    EXECUTE PROCEDURE P_BMAND_CHECK
    RETURNING_VALUES (:BMAND_ID);

   
    SELECT BWAER_ID
    FROM BMAND
    WHERE ID = :BMAND_ID
    INTO :BWAER_ID;
    KURS_FW = 1.0;
  END

  IF (USER <> 'WORSTCASE') THEN
  BEGIN
    /* Kleinste Preiseinheit prüfen */
    EXECUTE PROCEDURE P_BSA_KLPE(NEW.BSA_ID_ARTNR, NEW.MENGE)
      RETURNING_VALUES(:MENGE_KLPE);

    EXECUTE PROCEDURE P_BRRCP_PREIS (
      :BWAER_ID, 
      :KURS_FW,
      NEW.MENGE,
      :MENGE_KLPE,
      NEW.EPREIS,
      NEW.EPREIS_FW,
      NEW.PRBASIS,
      NEW.RABATT1,
      NEW.RABATT2,
      NEW.GPREIS,
      NEW.GPREIS_FW,
      NEW.BSA_ID_ARTNR,
      NEW.BMENG_ID_MEINHEIT,
      NEW.BMENG_ID_PREISHEIT,
      'MENGE',
      NEW.EPREIS_FIX,
      NEW.GPREIS_FIX,
      :BMAND_ID)
    RETURNING_VALUES(
      NEW.MENGE,
      NEW.EPREIS,
      NEW.EPREIS_FW,
      NEW.PRBASIS,
      NEW.RABATT1,
      NEW.RABATT2,
      NEW.GPREIS,
      NEW.GPREIS_FW);
  
      NEW.EPREIS = F_ZAHLRUNDEN(NEW.EPREIS, 2);
      NEW.EPREIS_FW = F_ZAHLRUNDEN(NEW.EPREIS_FW, 2);
      NEW.GPREIS = F_ZAHLRUNDEN(NEW.GPREIS, 2);
      NEW.GPREIS_FW = F_ZAHLRUNDEN(NEW.GPREIS_FW, 2);
      NEW.GPREIS_MTZ = F_ZAHLRUNDEN(NEW.GPREIS + NEW.MTZ_MTA, 2);      
  END
END
^


SET TERM ; ^


/* Privileges of triggers */
GRANT INSERT ON A_WASMACHTIB TO TRIGGER BRRCP_BI2;
GRANT SELECT ON BAUF TO TRIGGER BRRCP_BI2;
GRANT SELECT ON BAUFPO TO TRIGGER BRRCP_BI2;
GRANT SELECT ON BFIRMA TO TRIGGER BRRCP_BI2;
GRANT SELECT ON BMAND TO TRIGGER BRRCP_BI2;
GRANT SELECT ON BRRC TO TRIGGER BRRCP_BI2;
GRANT UPDATE, REFERENCES ON BRRCP TO TRIGGER BRRCP_BI2;
GRANT EXECUTE ON PROCEDURE P_BARTLHBU01 TO TRIGGER BRRCP_BI2;
GRANT EXECUTE ON PROCEDURE P_BRRCP_PREIS TO TRIGGER BRRCP_BI2;
GRANT EXECUTE ON PROCEDURE P_MASKENKEY_LFDNR TO TRIGGER BRRCP_BI2;

Code: Alles auswählen

CREATE OR ALTER TRIGGER BRRCP_BU0 FOR BRRCP
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE VARIABLE BWAER_ID INTEGER;
DECLARE VARIABLE KURS_FW NUMERIC(15,6);
DECLARE VARIABLE BMAND_ID INTEGER; 
DECLARE VARIABLE SJA VARCHAR(1);
DECLARE VARIABLE SNEIN VARCHAR(1);
DECLARE VARIABLE MENGE_KLPE NUMERIC(15,4);
BEGIN
  /* Letzter Stand 27.09.2007 16:35:46 AS */

  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('BRRCP_BU0');

  /* Feld TST wird in VIEW-Trigger gesetzt und kann hier bei Bedarf abgefragt werden*/
  /* TST: 1 = LS-Rückst.; 2 = LS-Pos.; 3 = RG-Rückst.; 4 = RG-Pos. (siehe Domänenbeschr. zum Feld) */

  IF (NEW.GESPEICHERT <> OLD.GESPEICHERT) THEN  EXCEPTION KEINE_AENDERUNG;
  NEW.BENUTZER = USER;
  NEW.GESPEICHERT = CURRENT_TIMESTAMP;

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

  IF (NEW.BAUFPO_ID_ALTAUFNRP = 0) THEN NEW.BAUFPO_ID_ALTAUFNRP = NULL;
  IF (NEW.BRRC_ID_ALTRGNR = 0) THEN NEW.BRRC_ID_ALTRGNR = NULL;
  IF (NEW.BRLS_ID_LSNR = 0) THEN NEW.BRLS_ID_LSNR = NULL;
  IF (NEW.BRRC_ID_RGNR = 0) THEN NEW.BRRC_ID_RGNR = NULL;
  IF (NEW.BRRCP_ID_BRRCP = 0) THEN NEW.BRRCP_ID_BRRCP = NULL;
  IF (NEW.BVERPA_ID = 0) THEN NEW.BVERPA_ID = NULL;
  IF (NEW.EPREIS IS NULL) THEN NEW.EPREIS = 0.0;
  IF (NEW.GEBMENGE IS NULL) THEN NEW.GEBMENGE = 0.0;
  IF (NEW.GPREIS IS NULL) THEN NEW.GPREIS = 0.0;
  IF (NEW.GPNRAB IS NULL) THEN NEW.GPNRAB = NEW.GPREIS;
  IF (NEW.MENGE IS NULL) THEN NEW.MENGE = 0.0;
  IF (NEW.MWSTSATZ IS NULL) THEN NEW.MWSTSATZ = 0.0;
  IF (NEW.PRBASIS IS NULL) THEN NEW.PRBASIS = 0;
  IF (NEW.RABATT1 IS NULL) THEN NEW.RABATT1 = 0.0;
  IF (NEW.RABATT2 IS NULL) THEN NEW.RABATT2 = 0.0;
  IF (NEW.EPREIS_FW IS NULL) THEN NEW.EPREIS_FW = 0.0;
  IF (NEW.GPREIS_FW IS NULL) THEN NEW.GPREIS_FW = 0.0;
  IF (NEW.GPNRAB_FW IS NULL) THEN NEW.GPNRAB_FW = NEW.GPREIS_FW;
  IF (NEW.EPREIS_FIX IS NULL) THEN NEW.EPREIS_FIX = sNEIN;
  IF (NEW.GPREIS_FIX IS NULL) THEN NEW.GPREIS_FIX = sNEIN;
  IF (NEW.MTZ_MTA IS NULL) THEN NEW.MTZ_MTA = 0.0;
  IF (NEW.GPREIS_MTZ IS NULL) THEN NEW.GPREIS_MTZ = 0.0;  
  IF (NEW.BSA_EKPREIS IS NULL) THEN NEW.BSA_EKPREIS = 0.0;
  IF (NEW.DECKBEITRAG IS NULL) THEN NEW.DECKBEITRAG = 0.0;

  /* Pos.Nr. für Lieferschein / Rechnung */
  IF (NEW.LS_POSNR IS NULL) THEN NEW.LS_POSNR = ''; /* darf nicht NULL sein */
  IF (NEW.RG_POSNR IS NULL) THEN NEW.RG_POSNR = ''; /* darf nicht NULL sein */

  /* MENGE_LAG ist die Menge in der Mengeneinheit Verkauf, da in der MENGE
     eine kundenspezifische Einheit reingerechnet werden kann.
     Wird immer mitgepflegt. */
  EXECUTE PROCEDURE P_CEINHEIT_BSAKUNDE(NEW.BSA_ID_ARTNR, NEW.BKUNDE_ID, NULL,
                                        NEW.MENGE, 2, 1)
  RETURNING_VALUES(NEW.MENGE_LAG);

  BWAER_ID = NULL;
  IF (NEW.BRRC_ID_RGNR IS NOT NULL) THEN
  BEGIN
    SELECT BWAER_ID,
           KURS_FW,
           BMAND_ID
    FROM BRRC
    WHERE ID = NEW.BRRC_ID_RGNR
    INTO :BWAER_ID,
         :KURS_FW,
         :BMAND_ID;
  END
  ELSE
  IF (NEW.BAUFPO_ID_AUFNRPOS IS NOT NULL) THEN
  BEGIN
    SELECT VB.BWAER_ID,
           VB.KURS_FW,
           VB.BMAND_ID
    FROM BAUFPO VA
    LEFT OUTER JOIN BAUF VB ON VA.BAUF_ID_LINKKEY = VB.ID
    WHERE VA.ID = NEW.BAUFPO_ID_AUFNRPOS
    INTO :BWAER_ID,
         :KURS_FW,
         :BMAND_ID;
  END

  IF (BWAER_ID IS NULL) THEN
  BEGIN
    EXECUTE PROCEDURE P_BMAND_CHECK
    RETURNING_VALUES (:BMAND_ID);

    SELECT BWAER_ID
    FROM BMAND
    WHERE ID = :BMAND_ID
    INTO :BWAER_ID;
    
    KURS_FW = 1.0;
  END

  IF (USER <> 'WORSTCASE') THEN
  BEGIN
    /*  Anfang Lieferschein.Position */
    IF ((F_EQUALINTEGER(NEW.BRLS_ID_LSNR, OLD.BRLS_ID_LSNR)=0) OR
        (F_EQUALSTRING(NEW.LS_POSNR, OLD.LS_POSNR)=0)) THEN
    BEGIN
      IF (F_EQUALINTEGER(NEW.BRLS_ID_LSNR, OLD.BRLS_ID_LSNR)=0) THEN
      BEGIN
        IF (NEW.BRLS_ID_LSNR IS NULL) THEN
          NEW.LS_POSNR = '';
        ELSE
        BEGIN
          NEW.LS_POSNR = '';
          EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_LS_POS', NEW.BRLS_ID_LSNR, 10, NEW.LS_POSNR)
          RETURNING_VALUES (NEW.LS_POSNR);
        END
      END
      ELSE
      BEGIN
        /* Pos.Nr. hat sich geändert */
        EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_LS_POS', NEW.BRLS_ID_LSNR, 10, NEW.LS_POSNR)
        RETURNING_VALUES (NEW.LS_POSNR);
      END

      /* Leere Lagerbuchung machen */
      /* Nur für Positionen, die von einem Auftrag kommen (Gutschriften)
         und die noch keinen Lieferschein haben (gesplittete LS-Positionen) */
      IF ((NEW.BAUFPO_ID_AUFNRPOS IS NOT NULL) AND
          (NEW.BRLS_ID_LSNR IS  NULL)) THEN
        EXECUTE PROCEDURE P_BARTLHBU01 (NEW.BARTLH_ID_LAGERNR,NEW.ID,'LS',0);

    END
    /*  Ende Lieferschein.Position */

    /*  Anfang Rechnung Position */
    IF ((F_EQUALINTEGER(NEW.BRRC_ID_RGNR, OLD.BRRC_ID_RGNR)=0) OR
        (F_EQUALSTRING(NEW.RG_POSNR, OLD.RG_POSNR)=0)) THEN
    BEGIN
      IF (F_EQUALINTEGER(NEW.BRRC_ID_RGNR, OLD.BRRC_ID_RGNR)=0) THEN
      BEGIN
        IF (NEW.BRRC_ID_RGNR IS NULL) THEN
          NEW.RG_POSNR = '';
        ELSE
        BEGIN
          NEW.RG_POSNR = '';
          EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_RG_POS', NEW.BRRC_ID_RGNR, 10, NEW.RG_POSNR)
          RETURNING_VALUES (NEW.RG_POSNR);
        END
      END
      ELSE
      BEGIN
        /* Pos.Nr. hat sich geändert */
        EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_RG_POS', NEW.BRRC_ID_RGNR, 10, NEW.RG_POSNR)
        RETURNING_VALUES (NEW.RG_POSNR);
      END
    END
    /*  Ende Rechnung Position */
  END

  IF (USER <> 'WORSTCASE') THEN
  BEGIN
    /* Kleinste Preiseinheit prüfen */
    EXECUTE PROCEDURE P_BSA_KLPE(NEW.BSA_ID_ARTNR, NEW.MENGE)
      RETURNING_VALUES(:MENGE_KLPE);

    EXECUTE PROCEDURE P_BRRCP_PREIS (
      :BWAER_ID, 
      :KURS_FW,
      NEW.MENGE,
      :MENGE_KLPE,
      NEW.EPREIS,
      NEW.EPREIS_FW,
      NEW.PRBASIS,
      NEW.RABATT1,
      NEW.RABATT2,
      NEW.GPREIS,
      NEW.GPREIS_FW,
      NEW.BSA_ID_ARTNR,
      NEW.BMENG_ID_MEINHEIT,
      NEW.BMENG_ID_PREISHEIT,
      'MENGE',
      NEW.EPREIS_FIX,
      NEW.GPREIS_FIX,
      :BMAND_ID)
    RETURNING_VALUES
      NEW.MENGE,
      NEW.EPREIS,
      NEW.EPREIS_FW,
      NEW.PRBASIS,
      NEW.RABATT1,
      NEW.RABATT2,
      NEW.GPREIS,
      NEW.GPREIS_FW;

    NEW.EPREIS = F_ZAHLRUNDEN(NEW.EPREIS, 2);
    NEW.EPREIS_FW = F_ZAHLRUNDEN(NEW.EPREIS_FW, 2);
    NEW.GPREIS = F_ZAHLRUNDEN(NEW.GPREIS, 2);
    NEW.GPREIS_FW = F_ZAHLRUNDEN(NEW.GPREIS_FW, 2);
    NEW.GPREIS_MTZ = F_ZAHLRUNDEN(NEW.GPREIS + NEW.MTZ_MTA, 2);    

    /* EK-Preis aus Artikelstamm und Deckungsbeitrag eintragen,
       wenn Position in Rechnung erfasst wird */
    IF (NEW.BRRC_ID_RGNR IS NOT NULL AND OLD.BRRC_ID_RGNR IS NULL) THEN
    BEGIN
      SELECT F_ZAHLRUNDEN(GPREIS,2)
      FROM BSA
      WHERE ID = NEW.BSA_ID_ARTNR
      INTO NEW.BSA_EKPREIS;
    END
    ELSE
    IF (OLD.BRRC_ID_RGNR IS NOT NULL AND NEW.BRRC_ID_RGNR IS NULL) THEN
    BEGIN
      /* EK-Preis austragen aus Artikelstamm, wenn Position aus Rechnung gelöscht wird */
      NEW.BSA_EKPREIS = 0.0;
      NEW.DECKBEITRAG = 0.0;
    END

    /* Deckungsbeitrag ermitteln, wenn in Rechnung erfasst */
    IF (NEW.BRRC_ID_RGNR IS NOT NULL AND
        ((NEW.GPREIS <> OLD.GPREIS) OR (NEW.MENGE <> OLD.MENGE) OR
         (NEW.BSA_EKPREIS <> OLD.BSA_EKPREIS))) THEN
      /* Berechnug über GPREIS, da hier Rabatt enthalten ist */
      NEW.DECKBEITRAG = NEW.GPREIS - (NEW.BSA_EKPREIS * NEW.MENGE);
  END
END
Wie man sieht, ist an diesen Triggern lange nichts geändert worden.

Was ist denn genau das Problem :?:
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

Beitrag von denis robel »

Hallo Festus

das Problem ist, das das Generieren der Positionsnummern für den Lieferschein und den Rechnungsausdruck nicht funktioniert.

In der Abfrage für den Report (q_rep.4 ) werden einfach keine Werte ausgelesen, weil beim erzeugen von LS- und RG-Positionen nix für BRRCP.LS_POSNR oder BRRCP.RG_POSNR eingetragen wird ....
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hallo Denis,
denis robel hat geschrieben: In der Abfrage für den Report (q_rep.4 ) werden einfach keine Werte ausgelesen, weil beim erzeugen von LS- und RG-Positionen nix für BRRCP.LS_POSNR oder BRRCP.RG_POSNR eingetragen wird ....
wie sieht denn das SQL Script von q_rep4 aus :?:
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

Beitrag von denis robel »

Hallo Festus,

die Apfrage q_rep4 im Druckformular ist in Ordnung.

Mein Problem ist , das ich die Stelle nicht finde, an der die Werte für BRRCP.LS_POSNR und BRRCP.RG_POSNR in die Datenbank geschrieben werden, wenn der Datensatz einem Lieferschein oder einer Rechnung zugeordnet wird.

An den beiden Werten wird auch die Reichenfolge für den Ausdruck auf dem Lieferschein bzw. auf der Rechnung festgelegt. Momentan haben alle Lieferschein- und Rechnungspositionen den Wert '' in der Tabelle BRRCP.

Gab es dieses Problem bei Euch nicht? Oder sind die Druckformulare für Lieerschein und Rechnung nicht an das Standart-Formular angelehnt?

Schöne Grüße aus Leipzig

Denis
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Beitrag von festus01 »

Hallo Denis,
denis robel hat geschrieben: Mein Problem ist , das ich die Stelle nicht finde, an der die Werte für BRRCP.LS_POSNR und BRRCP.RG_POSNR in die Datenbank geschrieben werden, wenn der Datensatz einem Lieferschein oder einer Rechnung zugeordnet wird.
BRRCP.LS_POSNR wird hier gesetzt:

Code: Alles auswählen

Schnipp..
      BEGIN
        IF (NEW.BRLS_ID_LSNR IS NULL) THEN
          NEW.LS_POSNR = '';
        ELSE
        BEGIN
          NEW.LS_POSNR = '';
          EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_LS_POS', NEW.BRLS_ID_LSNR, 10, NEW.LS_POSNR)
          RETURNING_VALUES (NEW.LS_POSNR);
        END
      END
...Schnapp
und BRRCP.RG_POSNR hier:

Code: Alles auswählen

Schnipp....
      BEGIN
        IF (NEW.BRRC_ID_RGNR IS NULL) THEN
          NEW.RG_POSNR = '';
        ELSE
        BEGIN
          NEW.RG_POSNR = '';
          EXECUTE PROCEDURE P_MASKENKEY_LFDNR ('BRRCP_RG_POS', NEW.BRRC_ID_RGNR, 10, NEW.RG_POSNR)
          RETURNING_VALUES (NEW.RG_POSNR);
        END
      END
...Schnapp
Beides ein Auszug aus dem Trigger BRRCP_BU0.

denis robel hat geschrieben: Gab es dieses Problem bei Euch nicht?
Nein, das lief mit der 1.5er Version genauso wie jetzt mit der 2.1er Version.
Ist denn dieses Problem erst jetzt mit der Umstellung aufgetreten, oder ging das noch nie :?:
denis robel hat geschrieben: Oder sind die Druckformulare für Lieerschein und Rechnung nicht an das Standart-Formular angelehnt?
Das schon, aber Grundlage war das Druckformular aus 2005.
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

Beitrag von denis robel »

Hallo Festus01,

ich habe den Fehler eingrenzen können:

die UDFs waren die Ursache ...

Welche Version der FreeAdhocUDF habt Ihre denn bei Euch am Start?

Ich habe nämlich das Problem, dass bei der neuesten Version die Stringverarbeitung nicht funktioniert, es werden alle Nummernkreise nicht erzeugt (beim Einfügen in Irgend eine Maske, für die Nummernkreise definiert sind).

Ich habe alle UDFs neu eingespielt ....
Schöne Grüße aus Leipzig

Denis

-
Linux - my life is too short for reboots
jlanger
Beiträge: 155
Registriert: Do Mär 04, 2004 2:18 pm
Wohnort: Wittlich

Beitrag von jlanger »

es steht doch ganz am Anfang im 1. Post, fett gedruckt:

...mit der FreeAdhocUDF Version 20080303
Antworten