11. november 2004 - 07:10Der 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
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 ; ^
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.
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 ^
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 !?
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 !?
Ja, det var da en løsning. Men så vil jeg nok hellere formatere med C++.
Synes godt om
Ny brugerNybegynder
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.