Avatar billede stoney Nybegynder
07. august 2001 - 23:24 Der er 7 kommentarer og
1 løsning

Interbase/trigger

Jeg har følgende interbase tabel:


/* Table: DELPHI, Owner: SYSDBA */

CREATE TABLE DELPHI
(
  ID    INTEGER NOT NULL,
  SUBJECT    VARCHAR(50),
  TEKST    BLOB SUB_TYPE 0 SEGMENT SIZE 80,
PRIMARY KEY (ID)
);
SET TERM ^ ;


/* Triggers only will work for SQL triggers */

CREATE TRIGGER CREATE_ID FOR DELPHI
ACTIVE BEFORE INSERT POSITION 0
AS
    BEGIN
        NEW.id = GEN_ID(id_GEN, 1);
    END
^

COMMIT WORK ^
SET TERM ;^

Mit spørgsmål er hvordan kalder jeg triggeren i Delphi
så jeg får genereret en unik id ?

Stoney
Avatar billede stoney Nybegynder
07. august 2001 - 23:26 #1
Ups, jeg mener selvfølgelig jeg vil have en unik id når jeg indsætter en ny record


Stoney
Avatar billede sukos Juniormester
07. august 2001 - 23:31 #2
Øhm, skud ud i tågen:
men er det ikke noget med AUTO_INCREMENT?
Avatar billede stoney Nybegynder
07. august 2001 - 23:39 #3
sukos >

Tak for hurtigt svar, men der er ikke indbygget
AUTO_INCREMENT i interbase ligesom i MS Access

Stoney
Avatar billede pellelil Nybegynder
08. august 2001 - 08:00 #4
Du skal IKKE \"kalde\" triggeren fra Delphi. En trigger udføres (såfremt denne er aktiv) AUTOMATISK af din database server. Den trigger du definere ovenstående er defineret som værende aktiv, og det er en \"before insert\" der knytter sig til tabellen \"DELPHI\".

Du skriver det ikke, men jeg vil tro at du har husket at oprette den generator som du anvender (\"id_GEN\") ?

Du kunne istedet have lavet det som en (Stored) Procedure, og i såfald ville du have brug for at kunne kalde denne fra Delphi (TIBStoredProc hvis du bruger IBX), men jeg ville personligt foretrække at gøre det i en trigger. Mine egne triggere ser ud som nedenstående. Jeg undersøger hvorvidt jeg fra Delphi HAR udfyldt ID feltet, og hvis dette ikke er tilfældet så bruger jeg en generator til at generere et fortløbende nummer (igen er det DB-serveren der automatisk udføre triggeren):
<SNIP>
CREATE TRIGGER CASES_BI0 FOR CASES ACTIVE
BEFORE INSERT POSITION 0
as
begin
  /* Set CASEID if not allready set */
  if ((new.CASEID is null) or (new.CASEID = 0)) then
    new.CASEID = gen_id(GEN_CASES_CASEID, 1);
  new.CREATED_AT = \'NOW\';  /* Today\'s date */
end
</SNIP>
Avatar billede stoney Nybegynder
08. august 2001 - 13:09 #5
pelleli >

Som du selv skriver har jeg oprettet en generator(id_gen)

Det er første gang jeg roder med triggers i interbase/delphi.

Jeg vil lige sige det er en ISAPI/web appl jeg skal bruge det til, MEN jeg har testet det ved hjælp at en TTable i et windows program. Når jeg inserter en record
kommer der en meddelelse om af ÌD ikke er udfyldt.

Stoney
Avatar billede pellelil Nybegynder
08. august 2001 - 13:36 #6
Du har helt korrekt (og som det er påkrævet) sat feltet bag din primære nøgle (ID) til at være \"NOT NULL\". Dette betyder at når Delphi \"læser\" din tabel opsætning så sætter den propertien \"Required\" (for det pågældende TxxxField) til True. Dette betyder således at Delphi vil kræve at du udfylder dette felt. Sæt evt. Required\" propertien til False (din trigger vil jo sørge for at udfylde det).
Avatar billede stoney Nybegynder
08. august 2001 - 17:35 #7
pellelil >

Tak for hjælpen.

I øvrigt er jeg vildt fascineret af Interbase.
Jeg synes den er svine hurtig og nem at bruge.

Har du nogle links til benchmarks test af Interbase ?

Stoney
Avatar billede pellelil Nybegynder
08. august 2001 - 20:29 #8
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester