Announcement

Collapse
No announcement yet.

column unknown: while schleife im trigger mit variable

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • column unknown: while schleife im trigger mit variable

    Guten Tag beisammen,

    leider stoße ich erneut auf ein Problem mit Firebird 2.5.

    Ich bin dabei, diverse Funktionen in den Server zu verlagern. Dabei wird auf eine Variable immer mit einem Fehler reagiert.
    Sicherlich ein Syntaxfehler

    SET TERM ^ ;
    /* Automatisches Löschen der Monatswerte und der abhängigen Felder in der Auswertung */
    CREATE TRIGGER Fehl_changetables FOR Fehltage
    ACTIVE after INSERT OR UPDATE OR DELETE
    POSITION 0
    AS
    declare variable refdate Date;
    BEGIN
    /* falls insert, dann ist old leer */
    if (old.StartDatum is NULL) then
    begin
    /* In einer Schleife abarbeiten */
    refdate = new.startdatum;
    while (refdate <= new.Enddatum) do
    begin
    delete from monatswerte m where (m.monat = extract(month from refdate)) and (m.jahr = extract(year from refdate));
    delete from auswertungen a where (a.Datum = refdate);
    refdate = refdate + 1;
    end
    end
    else
    /* ab hier update oder delete */
    begin
    /* In einer Schleife abarbeiten */
    refdate = old.startdatum;
    while (refdate <= old.Enddatum) do
    begin
    delete from monatswerte m where (m.monat = extract(month from refdate)) and (m.jahr = extract(year from refdate));
    delete from auswertungen a where (a.Datum = refdate);
    refdate = refdate + 1;
    end
    end
    END^

    SET TERM ; ^


    Was ist daran falsch?

    Zur Erklärung:
    In einer Tabelle "Fehltage" wurde eine Änderung vorgenommen.
    Die Berechnungen in den Tabellen Monatswerte und Auswertungen sollen gelöscht werden.
    Dazu ist der Datumsbereich in der while- Schleife abzuarbeiten.

    Fehlermeldung
    SQL Message : -206
    Column does not belong to referenced table

    Engine Code : 335544569
    Engine Message :
    Dynamic SQL Error
    SQL error code = -206
    Column unknown
    REFDATE
    At line 16, column 69
    Die Variable in Fett wird bemängelt. Könnt ihr mir helfen?

    Vielen Dank und Gruß

    Peter
    Zuletzt editiert von petermaennchen; 16.05.2016, 07:51.

  • #2
    Originally posted by petermaennchen View Post

    [HIGHLIGHT=SQL]
    ..
    delete from monatswerte m where (m.monat = extract(month from refdate)) and (m.jahr = extract(year from refdate));
    delete from auswertungen a where (a.Datum = refdate);
    ..
    [/HIGHLIGHT]

    Was ist daran falsch?
    Fehlermeldung

    Die Variable in Fett wird bemängelt. Könnt ihr mir helfen?
    Bin mir nicht sicher, aber ich glaub, da muss ein : vor die Variable.
    Gruß, defo

    Comment


    • #3
      Hallo Defo,

      das war es! Vielen Dank dafür.
      Kannst du mir das erklären? Warum wird bei der Function extract(month from date) die variable refdate mit Doppelpunkt angesprochen, quasi als Platzhalter für input, wenn diese davor ohne Doppelpunkt initialisiert werden kann?
      Ist das ein Goodie von Firebird?

      Hier zur Vervollständigung des Threads der komplette Trigger

      SET TERM ^ ;
      /* Automatisches Löschen der Monatswerte und abhängigen Felder in der Auswertung */
      CREATE TRIGGER Fehl_changetables FOR Fehltage
      ACTIVE after INSERT OR UPDATE OR DELETE
      POSITION 0
      AS
      declare variable refdate Date;
      BEGIN
      /* falls insert, dann ist old leer */
      if (old.StartDatum is NULL) then
      begin
      /* In einer Schleife abarbeiten */
      refdate = new.startdatum;
      while (refdate <= new.Enddatum) do
      begin
      delete from monatswerte m where (m.monat = extract(month from :refdate)) and (m.jahr = extract(year from :refdate));
      delete from auswertungen a where (a.Datum = :refdate);
      refdate = refdate + 1;
      end
      end
      else
      /* ab hier update oder delete */
      begin
      /* In einer Schleife abarbeiten */
      refdate = old.startdatum;
      while (refdate <= old.Enddatum) do
      begin
      delete from monatswerte m where (m.monat = extract(month from :refdate)) and (m.jahr = extract(year from :refdate));
      delete from auswertungen a where (a.Datum = :refdate);
      refdate = refdate + 1;
      end
      end
      END^

      SET TERM ; ^


      Vielen Dank noch einmal und Gruß

      Peter

      Comment


      • #4
        Originally posted by petermaennchen View Post
        Kannst du mir das erklären? Warum wird bei der Function extract(month from date) die variable refdate mit Doppelpunkt angesprochen, quasi als Platzhalter für input, wenn diese davor ohne Doppelpunkt initialisiert werden kann?
        Ist das ein Goodie von Firebird?
        Nein, ich kenne das Innenleben von FB nicht, habe Firebird noch nie produktiv benutzt, nur für irgendwelche Basteleien, aber hier gibt es sicher Experten für FB, die es genau wissen.
        Meine Vermutung ist, dass es "historisch" ist und vielleicht etwas bequemer beim Parsen des Codes, also den Parser einfacher macht, vielleicht auch schlanker oder schneller. Es wird ja offenbar nur im SQL Statement selbst so gemacht. Der Parser muss ja sowieso den Code der SP vom darin liegenden SQL unterscheiden. Vielleicht sind es sogar wirklich 2 verschiedene Parser. Die Notation mit : als Prefix erinnert sehr an die Schreibweise von SQL Statements in Delphi. Aus der Ecke (früher Borland) kommt ja wohl auch Firebird bzw. ursprünglich Interbase.
        Gruß, defo

        Comment

        Working...
        X