Avatar billede ghazaleh Nybegynder
09. september 2005 - 10:02 Der er 11 kommentarer og
1 løsning

Beregne ny dato i trigger

Jeg har denne her trigger:

CREATE TRIGGER NyAftale ON Agr
FOR INSERT,UPDATE
AS
BEGIN
  DECLARE
  @aftaleactno INTEGER,
  @fradato INTEGER,
  @tildato INTEGER,
  @frakl INTEGER,
  @tilkl INTEGER,
  @aktoernr INTEGER,
  @kontaktperson INTEGER,
  @beskrivelse TEXT,
  @udfoert INTEGER,
  @udfoertdato INTEGER,
  @gr6 INTEGER,
  @gr7 INTEGER

  SELECT @aftaleactno=AgrActNo, @fradato=FrDt, @tildato=ToDt, @frakl=FrTm, @tilkl=ToTm, @aktoernr=ActNo, @kontaktperson=LiaActNo, @beskrivelse=Descr, @udfoert=Fin, @udfoertdato=FinDt, @gr6=Gr6, @gr7=Gr7
    FROM inserted
  IF (@udfoert = 1) AND (@gr7 = 0)
  BEGIN
  @fradato = @udfoertdato + tid til næste (@gr6)
  @tildato = @tildato - @fradato
  @tildato = @tildato + tid til næste (@gr6)
  INSERT INTO agr(FrDt,ToDt,FrTm,ToTm,ActNo,LiaActNo,Descr,Gr6)
        values (@fradato,@tildato,@frakl,@tilkl,@aktoernr,@kontaktperson,@beskrivelse,@gr6)
  UPDATE agr SET gr7 = 1 WHERE Agr.AgrActNo = @aftaleactno
  END
END

De 3 linier:

@fradato = @udfoertdato + tid til næste (@gr6)
@tildato = @tildato - @fradato
@tildato = @tildato + tid til næste (@gr6)

Er ikke korrekte. Jeg skal have skiftet dem ud med 3 linier som beregner en ny dato ud fra antal dage. Dvs. @udfoertdato indeholder fx 20050909 og her skal jeg fx lægge 30 til så datoen bliver 20051009

Hvordan regner man med datoer i triggers?
Avatar billede ghazaleh Nybegynder
09. september 2005 - 11:59 #1
Har kigget lidt i hjælpen.

Jeg kan se at jeg skal bruge cast eller convert til at konvertere mine felter (Integer felter).

Hvad er syntaks for at bruge fx cast og konvertere fra integer til datetime og fra datetime til integer?
Avatar billede torstenhagemann Nybegynder
09. september 2005 - 12:10 #2
Er der nogen særlig grund til at du bruger integers til dine datoer i stedet for datetime?

Hvis du brugte datetime ville du kunne bruge DATEADD(d, 30, @fradato).

/Torsten
Avatar billede torstenhagemann Nybegynder
09. september 2005 - 12:16 #3
Syntaks for cast og convert står også i hjælp, men ellers er det
cast(@fradato as datetime) respektive convert(datetime, @fradato), men du kan ikke konvertere integers i dit format til en datetime, hvis du bruger cast forventer MS SQL at det integer du leverer er antal dage siden 1. januar 1900.
Avatar billede torstenhagemann Nybegynder
09. september 2005 - 12:36 #4
Jeg ville klart foretrække

DECLARE @fromdate smalldatetime, @todate smalldatetime, @completedate smalldatetime

@tildato = cast(str(ToDt) as smalldatetime) osv.

og så lave beregningerne ud fra det.

Men det ser også ud til at der er lidt kludder med dine beregninger - når du beregner @tildato i dine tre udtryk, så benytter du @fradato, som du lige har givet en ny værdi, så det går vel galt der?

Og det står mig ikke helt klart hvor "tid til næste(@gr6)" kommer fra, er det en konstant eller er det en funktion der leverer det resultat?
Avatar billede ghazaleh Nybegynder
09. september 2005 - 12:47 #5
hej
Jeg tænkte ikke lige over det, men jeg kan godt se at min pseudo-kode kan virke lidt forvirrende

Jeg har ikke adgang til at rette i databasen, så derfor bliver jeg nød tl at arbejde med dato-felter som Integer. Sådan er den bygget op.

Jeg har forsøgt mig med følgende syntaks nu, men det giver en fejl:

CREATE TRIGGER NyAftale ON Agr
FOR INSERT,UPDATE
AS
BEGIN
  DECLARE
  @tempdato DATETIME,
  @aftalenr INTEGER,
  @aftaleactno INTEGER,
  @fradato INTEGER,
  @tildato INTEGER,
  @frakl INTEGER,
  @tilkl INTEGER,
  @aktoernr INTEGER,
  @kontaktperson INTEGER,
  @beskrivelse TEXT,
  @udfoert INTEGER,
  @udfoertdato INTEGER,
  @gr6 INTEGER,
  @gr7 INTEGER

  SELECT @aftalenr=AgrNo, @aftaleactno=AgrActNo, @fradato=FrDt, @tildato=ToDt, @frakl=FrTm, @tilkl=ToTm, @aktoernr=ActNo, @kontaktperson=LiaActNo, @beskrivelse=Descr, @udfoert=Fin, @udfoertdato=FinDt, @gr6=Gr6, @gr7=Gr7
    FROM inserted
  IF (@udfoert = 1) AND (@gr7 = 0)
  BEGIN
    CAST(@udfoertdato AS datetime)
    @tempdato = @udfoertdato + @gr6
    CAST(@udfoertdato AS integer)
    CAST(@tildato AS datetime)
    CAST(@fradato AS datetime)
    @tempdato = (@tildato - @fradato) + @gr6
    @tildato = @tildato + @tempdato
    CAST(@tildato AS integer)
    INSERT INTO agr(AgrActNo,FrDt,ToDt,FrTm,ToTm,ActNo,LiaActNo,Descr,Gr6)
        values (@aftaleactno,@udfoertdato,@tildato,@frakl,@tilkl,@aktoernr,@kontaktperson,@beskrivelse,@gr6)
    UPDATE agr SET gr7 = 1 WHERE Agr.AgrNo = @aftalenr
  END
END
Avatar billede capaj Nybegynder
09. september 2005 - 16:22 #6
Til evt. inspiration:

declare @Intdato as bigint
set @intDato=20050909

-- Conv. af int dato til dato format
declare @dateDato datetime
set @dateDato = cast(cast(@intDato as nvarchar(10)) as datetime)

-- Plus 30 dage
Select Plus30=dateadd(day,30,@dateDato )

/Capaj
Avatar billede ldanielsen Nybegynder
11. september 2005 - 22:50 #7
Jeg omskriver lige capaj's udmærkede indlæg:

Med CONVERT kan du styre formatet, her bruger jeg formatet 112 (ISO med 4 cifre i årstal). Den tager en char eller varchar:

DECLARE @strDato char(8)
set @strDato = '20050909'

-- Conversion af streng til dato format
DECLARE @dtmDato datetime
set @dtmDato = CONVERT(datetime, @strDato, 112)

-- Plus 30 dage
DECLARE @dtmPlus30 datetime
SET @dtmPlus30 = DATEADD(d, 30, @dtmDato)

CONVERT er en afløser for CAST, og den har lidt flere muligheder
Avatar billede ghazaleh Nybegynder
14. september 2005 - 11:19 #8
Tak for det. Nu kom jeg da så langt at min syntaks er korrekt og jeg kan køre triggeren på databasen, men når jeg gemmer i agr så triggeren starter, så melder programmet fejl og går ned, men kun hvis den går ind i if-sætningen. Er der nogen der kan se en fejl inde i if-sætningen? triggeren ser nu sådan her ud:

CREATE TRIGGER NyAftale ON Agr
FOR INSERT,UPDATE
AS
BEGIN
  DECLARE
  @tempdato DATETIME,
  @temptildato DATETIME,
  @tempdatodiff INTEGER,
  @tempdatoplus DATETIME,
  @aftalenr INTEGER,
  @aftaleactno INTEGER,
  @fradato INTEGER,
  @tildato INTEGER,
  @frakl INTEGER,
  @tilkl INTEGER,
  @aktoernr INTEGER,
  @kontaktperson INTEGER,
  @beskrivelse CHAR,
  @udfoert INTEGER,
  @udfoertdato INTEGER,
  @gr6 INTEGER,
  @gr7 INTEGER

  SELECT @aftalenr=AgrNo, @aftaleactno=AgrActNo, @fradato=FrDt, @tildato=ToDt, @frakl=FrTm, @tilkl=ToTm, @aktoernr=ActNo, @kontaktperson=LiaActNo, @beskrivelse=Descr, @udfoert=Fin, @udfoertdato=FinDt, @gr6=Gr6, @gr7=Gr7   
    FROM inserted
  IF (@udfoert = 1) AND (@gr7 = 0) AND (@gr6<>0)
  BEGIN 
    SET @tempdato = CONVERT(datetime, @udfoertdato, 112)
    SET @tempdatoplus = DATEADD(d, @gr6, @tempdato)
    SET @udfoertdato = CONVERT(integer, @tempdatoplus)

    SET @tempdato = CONVERT(datetime, @fradato, 112)
    SET @temptildato = CONVERT(datetime, @tildato, 112)
    SET @tempdatodiff = DATEDIFF(d, @temptildato, @tempdato)   
    SET @tempdatoplus = DATEADD(d, @tempdatodiff, @tempdatoplus)
    SET @tildato = CONVERT(integer, @tempdatoplus)

    SET @aftalenr = @aftalenr + 1
 
    INSERT INTO agr(AgrActNo,AgrNo,FrDt,ToDt,FrTm,ToTm,ActNo,LiaActNo,Descr,Gr6)
        values (@aftaleactno,@aftalenr,@udfoertdato,@tildato,@frakl,@tilkl,@aktoernr,@kontaktperson,@beskrivelse,@gr6)

    UPDATE agr SET gr7 = 1 WHERE Agr.AgrNo = @aftalenr
  END
END
Avatar billede ghazaleh Nybegynder
16. september 2005 - 09:38 #9
Ok det er en ny problemstilling, så jeg opretter et nyt spørgsmål i stedet.

Vil I lægge et svar så fordeler jeg points
Avatar billede ldanielsen Nybegynder
16. september 2005 - 10:17 #10
Ikke jeg
Avatar billede ghazaleh Nybegynder
30. september 2005 - 08:57 #11
Er der ingen der vil have points?
Avatar billede ghazaleh Nybegynder
16. januar 2006 - 10:17 #12
Nå så lukker jeg spørgsmålet igen, men tak for svarene i hvert fald
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