Announcement

Collapse
No announcement yet.

Trigger-Problem mit IB6 unter Win 2000 Prof ?!

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

  • Trigger-Problem mit IB6 unter Win 2000 Prof ?!

    <B>Trigger-Problem mit IB6 unter Win 2000 Prof ?!</B>

    Ich hoffe das mir jemand (Herr Kosch?) weiterhelfen kann.<BR>
    Ich versuche mit Delphi 6 EP eine Datenbankoberfläche "ähnlich" Access für Schulungszwecke zu entwerfen.<BR>
    Das Anlegen der Database und der Tabellen funktioniert.<BR>
    Ich möchte aber auch die Möglichkeit von AutoInc nutzen.<BR>
    <BR>
    <BR>
    Und genau da liegt mein Problem.<BR>
    <BR>
    Ich habe bisher folgenden Quelltext benutzt, der soweit auch funktioniert.<BR>
    <BR>
    ================================================== =====================<BR>
    <B>procedure TDM_Form.NewDatabaseExecute(Sender: TObject);</B><BR>
    <B>begin</B><BR>
    IBTransaction.Active := False;<BR>
    IBDatabase.Close;<BR>
    <B>if</B> FileExists(Neu_Form.NewDBDialog.FileName) <B>then</B> DeleteFile(Neu_Form.NewDBDialog.FileName);<BR>
    IBDatabase.DatabaseName := Neu_Form.NewDBDialog.FileName;<BR>
    IBDatabase.Params.Add('User "SYSDBA"');<BR>
    IBDatabase.Params.Add('Password "1"');<BR>
    IBDatabase.CreateDatabase;<BR>
    <BR>
    IBSQL.Transaction.StartTransaction;<BR>
    IBSQL.SQL.Clear;<BR>
    <BR>
    //Generator (Zähler) für Tab_User_Forms erzeugen<BR>
    IBSQL.SQL.Text :='Create Generator Gen_FormID';<BR>
    IBSQL.ExecQuery;<BR>
    <BR>
    //Tabelle User_Forms erzeugen<BR>
    IBSQL.SQL.Clear;<BR>
    IBSQL.SQL.Add('Create Table Tab_UserForms');<BR>
    IBSQL.SQL.Add('(ID Integer');<BR>
    IBSQL.SQL.Add(',FormName CHAR(100)');<BR>
    IBSQL.SQL.Add(',FormPosition CHAR(15)');<BR>
    IBSQL.SQL.Add(',FormColor CHAR(15)');<BR>
    IBSQL.SQL.Add(',FormDaten CHAR(20))');<BR>
    IBSQL.ExecQuery;<BR>
    <BR>
    IBSQL.SQL.Clear;<BR>
    IBSQL.SQL.Add('Create Trigger Set_FormID For Tab_UserForms Active Before Insert Position 0 AS');<BR>
    IBSQL.SQL.Add('BEGIN');<BR>
    IBSQL.SQL.Add('New.ID = GEN_ID(Gen_FormID,1);');<BR>
    IBSQL.SQL.Add('END');<BR>
    <BR>
    IBSQL.ExecQuery;<BR>
    <BR>
    IBSQL.Transaction.Commit;<BR>
    <B>end;</B><BR>
    <BR>
    ================================================== =====================<BR>

    Das Problem liegt aber darin, das ich das ID-Feld nicht mit "Not Null"<BR>
    deklarieren kann wenn ich die Trigger-Werte nutzen möchte.<BR>
    Denn wenn ich "Not Null" benutze, sagt der Client (IB-Console / Delphi-Programm...) das das Feld FormID einen Wert haben muß.<BR>
    Wenn ich "Not Null" weg lasse funktioniert es zwar, das ist aber nicht das was ich will.<BR>
    <BR>
    Das Feld FormID soll durch den IBServer vergeben werden und muß Read Only sein.<BR>
    <BR>
    <BR>
    Ingo Schreiber
    <BR>
    <BR>

  • #2
    Hallo Ingo,<br><br>
    das ist ein typisches Problem am Client, weil der Client ja zu diesem Zeitpunkt den serverseitig generierten Wert von ID nicht wissen kann! In einem Delphiprogramm kann man dieses Problem relativ einfach lösen.<br><br>
    - Die Property <b>Required</b> auf TField-Ebene auf <b>False</b> setzen, oder<br>
    - Im <b>OnNewRecord</b> Event des TDataset einen "fiktiven" Wert zuweisen (z.B. FieldByName('ID').AsInteger := 0), oder<br>
    - IBO, IBX haben spezielle Möglichkeiten um Generatorwerte zum Client zu holen<br><br>
    Aber auf jeden Fall würde ich den BEFORE INSERT Trigger wie folgt abändern:<br><br>
    <i>
    Create Trigger Set_FormID For Tab_UserForms Active Before Insert Position 0 AS<br>
    BEGIN<br>
    IF (NEW.ID IS NULL OR (NEW.ID = 0)) THEN<br>
    New.ID = GEN_ID(Gen_FormID,1);<br>
    END<br><br>
    </i>
    Somit wird nur ein neuer Generatorwert geholt, falls ID NULL oder gleich 0 ist.<br><br>
    Gruss,<br>
    Thomas Steinmaurer<br>
    IB LogManager 2.0 - The Logging/Auditing Tool for InterBase and Firebird<br>
    http://www.iblogmanager.com<br&gt
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      Hallo Thomas,<br>
      <br>
      Erst einmal vielen Dank für diesen Tipp.<br>
      Hab es ausprobiert und es klappt natürlich.<br>
      <br>
      Gruß Ing

      Comment

      Working...
      X