Avatar billede netro Nybegynder
11. november 2004 - 07:10 Der er 8 kommentarer og
1 løsning

Oprettelse af generator må først ske til sidst?

Jeg kører en *.sql-fil med en lang række statements til at designe min database.

Først oprettelse af domæner, tabeller, relationer, så tilføjelse af data til tabellerne.

Det går fint, men inden tilføjelse af data ville jeg gerne oprette en generator og trigger, men det får jeg kun lov til, hvis følgende står til allersidst. Hvorfor?


CREATE GENERATOR Aktivitet_Gen;
CREATE TRIGGER Aktivitet_Trg FOR Aktivitet
BEFORE INSERT POSITION 0 AS
BEGIN
  NEW.AktivitetsID = GEN_ID(Aktivitet_Gen, 1);
END
Avatar billede pellelil Nybegynder
11. november 2004 - 08:20 #1
Kunne vi være over i at det skal "pakkes ind" via SET TERM a'la:

CREATE GENERATOR Aktivitet_Gen;
SET TERM ^ ;
CREATE TRIGGER Aktivitet_Trg FOR Aktivitet
BEFORE INSERT POSITION 0 AS
BEGIN
  NEW.AktivitetsID = GEN_ID(Aktivitet_Gen, 1);
END
^
SET TERM ; ^
Avatar billede netro Nybegynder
11. november 2004 - 08:26 #2
Hvad gør SET TERM helt præcist?

- skal ^ stå så "tilfældigt"?
Avatar billede pellelil Nybegynder
11. november 2004 - 08:58 #3
Normalt bruger InterBase/FireBird ";" som er "terminator-tegn" (fortæller at linien slutter). Problemet er at du midt i din trigger har et ";" (i linien "NEW.AktivitetsID = GEN_ID(Aktivitet_Gen, 1);
") og når IB/FB ser dette tegn "tror den" at du vil afslutte definitionen af din trigger oprettelse (CREATE TRIGGER...).

Via SET TERM fortæller du IB/FB at du nu ønsker at lave terminator tegnet om fra ";" til "^". Herefter har IB/FB ikke længere nogle problemer med at din trigger-oprettelse indeholder ";" for den forventer først at du er færdig med triggeren når den ser "det nye" terminator tegn "^" (ja den skal bare stå der <G>). Sluttelige sætter du terminatoren til ";" som den plejer at være.
Avatar billede pellelil Nybegynder
11. november 2004 - 09:08 #4
Glemte lige at sige: Hvis du skal lave flere triggere (eller StoredProceduer) kan du nøjes med en SET TERM inden du definere disse og SET TERM bagefter:

SET TERM ^ ;

CREATE PROCEDURE P_G_ARTCOSTPRICE_HISTORY_RECID (NUMBERS_TO_GENERATE INTEGER)
RETURNS (ID INTEGER)
AS BEGIN
  EXIT;
END ^

CREATE PROCEDURE P_G_ARTFAMILIES_ARTICLES_RECID (NUMBERS_TO_GENERATE INTEGER)
RETURNS (ID INTEGER)
AS BEGIN
  EXIT;
END ^

CREATE PROCEDURE P_G_ARTFAMILIES_PRICES_RECID (NUMBERS_TO_GENERATE INTEGER)
RETURNS (ID INTEGER)
AS BEGIN
  EXIT;
END ^

SET TERM ; ^
Avatar billede netro Nybegynder
11. november 2004 - 10:02 #5
Okay ja, nu giver deres "tilfældige" placering lige pludselig god mening. Og det virker glimrende. Mange tak :)

Ved du forresten, hvordan en dato formateres til fx. dd/mm-yyyy i et SQL-statement ved udtræk? (IB6 har en Extract-funktion, men jeg bruger pt. IB5)
Avatar billede pellelil Nybegynder
11. november 2004 - 10:29 #6
Ikke så'n lige "on top of my head" da jeg ikke har brug for mine data i det format de vises ved en simpel "select ...." (jeg anvender Delphi så al' formatering af output håndteres via Delphi). Jeg er ikke sikker på at den har en egentlig datoformaterings-funktion og vil tro at du således er nødt til at caste din dato til en streng og du fra denne klipper og klistre !?
Avatar billede netro Nybegynder
11. november 2004 - 10:33 #7
Nej, jeg har nemlig heller ikke kunne finde noget i dokumentationen. Tak igen.
Avatar billede pellelil Nybegynder
11. november 2004 - 10:34 #8
Måske "overkill" men en mulighed er jo at lave en UDF (User Defined Function) hvilket medføre at du laver en "bestemt opbygget" DLL fil hvori du koder lige netop den funktion som du har brug for (således at du kan få formateret dato'en som ønsket), men det er ikke noget jeg har nogen erfaring med !?
Avatar billede netro Nybegynder
11. november 2004 - 17:24 #9
Ja, det var da en løsning. Men så vil jeg nok hellere formatere med C++.
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
Computerworld tilbyder specialiserede kurser i database-management

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