Oracle Trigger - After Insert - Feld aktualisieren

Oh, Art hat eine andere Quelle....
SQL:
CREATE OR REPLACE TRIGGER DEMO.CHARGE_MHD
BEFORE INSERT
    ON DEMO.Artikel_Charge
    FOR each ROW
DECLARE
    artikel_art Artikel.Art%type;
BEGIN

    SELECT art INTO artikel_art
    FROM Artikel
    WHERE Artikel.ArtikelID = :new.ArtikelID;

    CASE artikel_art
        CASE '1' THEN :NEW.MHD := :NEW.datherst +700;
        CASE '2' THEN :NEW.MHD := :NEW.datherst +1065;
        CASE '3' THEN :NEW.MHD := :NEW.datherst +1430;
        CASE '4' THEN :NEW.MHD := :NEW.datherst +1796;
        CASE '5' THEN :NEW.MHD := :NEW.datherst +1796;
        CASE '6' THEN :NEW.MHD := :NEW.datherst +1796;
        CASE '7' THEN :NEW.MHD := :NEW.datherst +1796;
        CASE '8' THEN :NEW.MHD := :NEW.datherst +1065;
        CASE '9' THEN :NEW.MHD := :NEW.datherst +700;
        CASE 'A' THEN :NEW.MHD := :NEW.herstelldatum +1430;
    END CASE;
END;
 
@Yaslaw vielen Dank für deine Hilfe.

Hier der fertige Code
Ich habe mich aber für When statt Case entschieden, da Case nicht klappte ;)
Und bei der Berechnung des MHD hab ich mich für Monate statt Tage entschieden.

SQL:
CREATE OR REPLACE TRIGGER DEMO.CHARGE_MHD
BEFORE INSERT
    ON DEMO.Artikel_Charge
    FOR each ROW
DECLARE
    artikel_art Artikel.Art%TYPE;
BEGIN
    SELECT art INTO artikel_art
    FROM Artikel
    WHERE Artikel.ArtikelID = :NEW.ArtikelID;
    CASE
    WHEN Artikel_Art = '1' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 23 );
        WHEN Artikel_Art = '2' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 35 );
        WHEN Artikel_Art = '3' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 47 );
        WHEN Artikel_Art = '4' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 59 );
        WHEN Artikel_Art = '5' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 59 );
        WHEN Artikel_Art = '6' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 59 );
        WHEN Artikel_Art = '7' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 59 );
        WHEN Artikel_Art = '8' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 35 );
        WHEN Artikel_Art = '9' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 23 );
        WHEN Artikel_Art = 'A' THEN :NEW.MHD := add_months( to_date(:NEW.datherst,'DD.MM.YYYY'), 47 );

    END CASE;

END;
 
Moin warface,

so weit, so gut, aber...

Egal, ob du jetzt erwägst, das MHD über Trigger zu errechnen oder immer in Views/Abfragen zu ermitteln:
Der Algorithmus deutet stark darauf hin, dass du dir das Leben einfacher machen solltest mit einer einer neuen Hilfstabelle mit den zwei Spalten "Artikel_Art" und "MHDDauerInMonaten" (oder so ähnlich).
Bzw. deine bestimmt vorhandene Stammdaten-Tabelle "ArtikelArten" um dieses Feld "MHDDauerInMonaten" erweitern.
Besser noch mit zwei weiteren zusätzlichen Feldern "gültig_von"/Gültig_bis"

Denn diesen Algorithmus in einem Trigger zu vergraben... das wird auf Dauer nicht praktikabel.

Spätestens wenn sich bei Artikel_Art 'A' die DauerInMonaten von 47 auf 48 ändert, werden deine Datensätze widersprüchlich.

Aber was soll's... bis hierhin war es ein amüsanter Thread.
Ab jetzt stehen eher fachlich zu beurteilende Anforderungen im Raum und nicht mehr handwerkliche.
Da können wir weniger unterstützen, denke ich.

Grüße
Biber
 
Zurück