Announcement

Collapse
No announcement yet.

InterBase - Generator

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

  • InterBase - Generator

    Ich habe folgendes Problem: In allen Tabellen meiner Datenbank werden die ID's über Generatoren erzeugt und über einen Before - Insert Trigger in die jeweilige Tabelle getriggert.
    Bei Anlage eines neuen Datensatzes mit Dataset.Append und anschließendem Dataset.Post bekomme ich immer eine Fehlermeldung, dass im Feld ID ein Wert erforderlich ist. Wer kann helfen?

  • #2
    Versuch mal deinen Trigger bei BeforePost Deiner Dataset zu "Triggern", wenn das nicht klappt, versuch es mal mit TStoredProc(Du musst eine procedure auf SQL ebene erzeugen (Dein Interbase) und dann diese mit TStoredProc verknötern und (so mach ich das) bei BeforePost ausführen. Hätt fast was vergessen. Du musst natürlich noch abfragen, ob es ein insert/append oder Edit ist. If DataSet.State = dsInsert then begin StoredProc.Prepare; StoredProc.ExecSQL;...... end

    Comment


    • #3
      Hi,

      Dieses extrem nervige Problem liegt daran, dass deine Delphi-Anwendung höchstpersönlich diese Exception erzeugt. D.h. du bist gezwungen, den Generatorwert clientseitig zu ermitteln ( gleiches gilt übrigens für alle NOT NULL Felder ) und in clienteigenen beforepost, ..edit usw. Triggern zu setzen.

      Damit kannst du dir natürlich im Grunde genommen sparen gleiches serverseitig zu erledigen, denn du hast kaum eine Möglichkeit, einen erzeugten Satz in der Datenmenge zu lokalisieren um dann die gesetzen Werte zu ermitteln, die du brauchst um diese Werte clientseitig nochmals anzugeben.

      Betrüblich fürs C/S-Prinzip

      Gruss
      Gesin

      Comment


      • #4
        Danke erstmal, aber ich versteh noch nicht ganz. Wie kann ich denn meinen Trigger bei BeforePost meiner Dataset "Triggern"?

        Gruß Andrea

        Comment


        • #5
          Hi,

          Die Trigger einer SQL-DB gibt es unabhängig davon auch bei jeder DataSet-Komponente. D.h. das event DataSetxyz.BeforePost( ... ) wird ausgelöst, egal ob es serverseitig einen Trigger gibt oder nicht.

          In der Rubrik IBX findest du den Thread RefreshSQL, der dir vielleicht auch weiterhilft.

          Gruß
          Gesin

          Comment


          • #6
            Hi

            Es funktioniert mit grosser Wahrscheinlichkeit wenn der Trigger im AfterInsert aufgerufen wird.

            Bsp:

            procedure Datenmodul.IBTabelleAfterInsert(DataSet: TDataSet);
            begin
            with IBQAINummer do begin
            SQL.Clear;
            SQL.Add('Select * from P_DE_NUMMER'); {Procedur}
            Open;
            IBTabelle.FieldByName('DE_Nummer').AsInteger := FieldByName('gen').AsInteger;
            Close;
            end;
            end;

            Gruss
            Othma

            Comment

            Working...
            X