Announcement

Collapse
No announcement yet.

'Field ID' muss einen Wert haben

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

  • 'Field ID' muss einen Wert haben

    Hallo,

    beim ausführen von:

    IBDataSetDaten->Active=true;
    IBDataSetDaten->Insert();

    IBDataSetDaten->FieldByName("TYP")->AsString = "hier ein typ";
    IBDataSetDaten->Post();
    IBTransaction1->Commit();
    IBDataSetDaten->Active=false;

    erhalte ich den Fehler:

    EDatabaseError mit der Meldung 'Field ID' muss einen Wert haben.

    obwohl ich beim erstellen der Datenbank:

    CREATE GENERATOR Gen_Daten;
    CREATE TABLE Daten(
    ID INTEGER NOT NULL PRIMARY KEY,
    TS TIMESTAMP DEFAULT 'now',
    .....

    set term #;
    create trigger set_id_daten for daten before insert as
    BEGIN
    if (new.id is null) then new.id = gen_id(Gen_Daten,1);
    end#
    set term ;#

    definiert habe. Ein "insert into daten (TYP) VALUES ('blabla');" mittles isql.exe
    funktioniert prima und die ID wird generiert und eingefügt. Beim googeln habe
    ich zwar diverse diskussionen und mögliche lösungen gefunden aber keine
    die diesen Fehlerabbruch beseitigt (zumal meist aus Delphi-Sicht)

    Den IBDataSet habe ich zuerst über SQL-Bearbeiten "select * from DATEN"
    und dann über den Datenmengen-Editor ..."SQL Generieren" konfiguriert.

    Wie löse ich diese Problem?

    p.s. zuvor hatte ich eine Lösung mit IBSQL bei der ich einen SQL String zusammgengebaut und IBSQL1->ExecQuery(); einen Datensatz eingefüt. Hat
    Prinizpiell funktioniert. Bei der Ausführung ist mir Anwendung häufig abgestürzt (keine Rückmeldung).

  • #2
    Was spricht dagegen
    Gen_ID (Gen_Daten, 1)
    in das Insert-Statement für das Feld ID aufzunehmen ...

    Ebis

    Comment


    • #3
      Originally posted by ebis View Post
      Was spricht dagegen
      Gen_ID (Gen_Daten, 1)
      in das Insert-Statement für das Feld ID aufzunehmen ...

      Ebis
      meinst du ím InsertSQL
      insert into DATEN (ID, TYP) values (Gen_ID (Gen_Daten, 1) , :TYP)
      ? Der Fehler bleibt bestehen!

      Comment


      • #4
        Dann vorab mit einem zusäzlichen Select den Wert von GEN_ID ermitteln und diesen dann für InsertSQL verwenden. Ist doof, daß dann zwei Mal die Datenbank befeuert wird, aber so müßte es funktionieren.
        Dirk

        Comment


        • #5
          Problem gelöst!
          Im IBDataSetDaten->OnNewRecort-Event:
          IBDataSetDaten->FieldByName("ID")->AsInteger=0;
          somit wird erst 0 eingetragen und vom Generator wird später dann die
          korrekte ID eingetragen :"-)

          Comment

          Working...
          X