Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 4 von 4
  1. #1
    Aufsteiger
    Registriert seit
    23.03.2007
    Beiträge
    60

    Standard Gelöst! 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
    Geändert von petermaennchen (16.05.2016 um 08:51 Uhr)

  2. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.291

    Standard

    Zitat Zitat von petermaennchen Beitrag anzeigen

    Code SQL:
    ..
          DELETE FROM monatswerte m WHERE (m.monat = EXTRACT(MONTH FROM [B]refdate[/B])) AND (m.jahr = EXTRACT(YEAR FROM refdate));
          DELETE FROM auswertungen a WHERE (a.Datum = refdate);
    ..

    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

  3. #3
    Aufsteiger
    Registriert seit
    23.03.2007
    Beiträge
    60

    Standard

    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

  4. #4
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.291

    Standard

    Zitat Zitat von petermaennchen Beitrag anzeigen
    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

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •