Announcement

Collapse
No announcement yet.

AutoInc-Felder und Interbase

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

  • AutoInc-Felder und Interbase

    Hallo Entwickler!<p>
    Wie kann ich beim Interbase 6 AutoInc-Felder in Tabellen erstellen?<p>
    Gruss Andreas

  • #2
    Hallo,

    für diese Aufgabe ist beim InterBase eine <b>GENERATOR</b> zuständig, der über die CREATE GENERATOR-Anweisung erzeugt wird:
    <pre>
    CREATE GENERATOR Gen_ProNr;
    SET GENERATOR Gen_ProNr TO 1000;
    </pre>
    Der Wert für den neuen Datensatz wird entweder automatisch von einem TRIGGER zugewiesen oder direkt selbst ausgelesen:
    <pre>
    CREATE TRIGGER Set_ProNr FOR ProMain BEFORE INSERT AS
    BEGIN
    IF (NEW.ProNr IS NULL) THEN NEW.ProNr = GEN_ID(Gen_ProNr,1);
    END
    </pre>
    Beim direkten Auslesen aus dem eigenen Programm heraus wird sehr häufig eine STORED PROCEDURE eingesetzt:
    <pre>
    CREATE PROCEDURE GET_PROJNR
    RETURNS (ProjNr INTEGER) AS
    BEGIN
    ProjNr = GEN_ID(Gen_ProNr,1);
    END
    </pre>
    Einzelheiten und ausführlichere Beschreibungen sind in meinem Buch <i>Client/Server-Datenbankentwicklung mit Delphi</i> zu finden

    Comment


    • #3
      Hallo Andreas,

      ich bekomme keinen Trigger auf meinem Interbase server 6_0_1 Version 1.0.0.315 installiert:

      CREATE TRIGGER Set_ProNr FOR Project BEFORE INSERT AS
      BEGIN
      IF (NEW.ProNr IS NULL) THEN NEW.ProNr = GEN_ID(Gen_ProNr,1);
      END

      Dynamic SQL Error
      SQL error code = -104
      Unexpected end of command
      Statement: CREATE TRIGGER Set_ProNr FOR PROJECT BEFORE INSERT AS
      BEGIN
      IF (NEW.ProNr IS NULL) THEN NEW.ProNr = GEN_ID(Gen_ProNr,1)

      Das Semmikolon vor dem end habe ich definitiv eingegeben!
      Kannst Du mir helfen?
      (in welchen Verlag ist Dein Buch Client-Server Arbeiten mit Datenbanken erschienen)

      Friede

      Comment


      • #4
        Hallo,

        auf welchem Weg (welches Tool) wurde die CREATE TRIGGER-Anweisung abgesetzt?

        P.S: Im <i>Software&Support-Verlag</i>, der Link <b>Bücher</b> rechts auf dieser Seite führt genau dahin ;-

        Comment


        • #5
          Hallo Andreas,

          ich habe die create trigger Anweisung in der IBConsole (Interactive SQL) abgesetzt. Alle anderen SQL-Anweisungen, einschliesslich generieren des generators klappen einwandfrei.

          Friede

          Comment


          • #6
            Hallo,

            wenn das Fenster <i>Interactive SQL</i> aus der IBConsole heraus aufgerufen wird, kann man dort über <b>Edit | Options</b> den Dialog für die SQL-Optionen aufrufen. Und dort gibt es die Möglichkeit, im Eingabefeld <b>Terminator</b> das vorbelegte Terminatorzeichen <b>;</B> durch einen eigenen Wert zu ersezten. Auf diesem Weg kann man das definieren, was früher über SET TERM erledigt wurde. Da das Semikolon innerhalb des Triggers benötigt wird, muss man auf ein anderes Zeichen (wie zum Beispiel <b>^</b>) ausweichen:
            <pre>
            CREATE TRIGGER Set_ProNr FOR ProMain BEFORE INSERT AS
            BEGIN
            IF (NEW.ProNr IS NULL) THEN NEW.ProNr = GEN_ID(Gen_ProNr,1);
            END
            ^
            </pre>

            P.S: Um eine Stored Procedure direkt in SQL-Form im <b>SQL-Explorer</B> (BDE) anlegen zu können, muss die Konfiguration für den Anweisungsbegrenzer im Dialog <b>Abfrageoptionen</B> geändert werden

            Comment


            • #7
              Hallo Andreas,

              ich danke Dir für den Tip mit den Anweisungsbegrenzern. Ist ja auch ganz logisch - auf einmal sogar die Fehlermeldung.
              Dennoch hätte ich so ganz allein wohl noch Ewigkeiten gesucht.

              Friede

              Comment

              Working...
              X