Avatar billede hugopedersen Nybegynder
16. maj 2001 - 08:06 Der er 12 kommentarer og
1 løsning

Opdatering af felt via stored procedure

Jeg har en database lavet i Access som jeg er ved at forsøge at flytte til MS SQL 7, men jeg er løbet ind i et problem.
Jeg har følgende felter i en tabel
fldFrekvens
fldCalcDate
fldLastDate
fldNextDate
Det jeg så gerne vil, er at lave en stored procedure der gør følgende :
Hvis fldFrekvens > 0 læg fldFrekvens måneder til fldCalcDate indtil fldCalcDate > fldLastDate og gem værdien i fldNextDate.

Jeg har nu prøvet jeg ved ikke hvor mange forskellige indfald, men ingen positive resultater er opnået endnu.

Send mig gerne en e-mail hvis der skal en mere detaljeret forklaring til.

Avatar billede hugopedersen Nybegynder
16. maj 2001 - 08:07 #1
Glemte lige en detalje:
Resultatet i fldNextDate skal være > dags dato
Avatar billede mwittrock Nybegynder
16. maj 2001 - 08:42 #2
hugopedersen,

felterne fldCalcDate og fldLastDate skal vel også opdateres? Måske bør du lige med et par linier forklare hvad du gerne vil opnå med din stored procedure.

Avatar billede mwittrock Nybegynder
16. maj 2001 - 08:46 #3
Og jeg gætter iøvrigt på, at du kun vil udføre beregningen på rækker, hvor fldNextDate < GETDATE(), altså hvor datoen i fldNextDate er overskredet?
Avatar billede hugopedersen Nybegynder
16. maj 2001 - 11:44 #4
Felterne fldCalcDate og fldLastDate må IKKE opdateres af denne procedure.

Her kommer så den lidt længere forklaring:
Databasen er til håndtering af kalibrering af alt vores måleudstyr. Når et instrument oprettes indtastes
fldCalcDate = den dato kalibreringsindkaldelser beregnes ud fra. Denne dato bruges for at tage højde for at et instrument kan sendes til rep. midt i perioden og komme tilbage nykalibreret.
fldFrekvens = det antal måneder der skal gå mellem kalibrering.

fldLastCal udfyldes i forbindelse med at en kalibrering registreres.
Det jeg så ønsker er at proceduren skal kunne finde en ny kalibreringsdato på alle instrumenter hvor frekvensen er > 0
Avatar billede mwittrock Nybegynder
16. maj 2001 - 11:53 #5
Men var det korrekt antaget, at beregningen kun skal udføres på rækker, hvor fldNextDate < GETDATE()?
Avatar billede hugopedersen Nybegynder
16. maj 2001 - 13:22 #6
Det kan man sådan set ikke konkludere. Det kan jo godt være at jeg retter på fldCalcDate og så skal den jo genberegne en ny værdi til fldNextDate ligegyldigt hvad der står.
Avatar billede mwittrock Nybegynder
16. maj 2001 - 16:10 #7
OK, jeg tror jeg har et godt bud til dig... øjeblik.
Avatar billede mwittrock Nybegynder
16. maj 2001 - 17:31 #8
Her er en procedure. OBS: Jeg har ikke mulighed for at teste den her, så sørg for at afprøve den på testdata. Bemærk også at \"dit_tabelnavn_her\" skal erstattes af navnet på din tabel. Sidst men ikke mindst skal det siges, at selve beregningen kunne være pænere, men nedenstående burde fungere.

CREATE PROCEDURE BeregnKalibrering AS

  DECLARE c_Candidates CURSOR FOR
    SELECT fldFrekvens,
          fldCalcDate,
          fldLastDate
    FROM  dit_tabelnavn_her
    WHERE  fldFrekvens > 0
  FOR UPDATE OF fldNextDate
 
  DECLARE @currFrekvens INTEGER -- OBS, skal rettes til den datatype du har givet fldFrekvens, hvis det altså ikke er INTEGER
  DECLARE @currCalcDate DATETIME
  DECLARE @currLastDate DATETIME
  DECLARE @i INTEGER
 
  OPEN c_Candidates
 
  FETCH NEXT FROM c_Candidates INTO @currFrekvens, @currCalcDate, @currLastDate
 
  WHILE (@@FETCH_STATUS = 0)
    BEGIN
    SET @i = 1
    WHILE (DATEADD(mm, @i*@currFrekvens, @currCalcDate) <= @currLastDate OR DATEADD(mm, @i*@currFrekvens, @currCalcDate) <= GETDATE())
      SET @i = @i + 1
    UPDATE dit_tabelnavn_her SET fldNextDate = DATEADD(mm, @i*@currFrekvens, @currCalcDate) WHERE CURRENT OF c_Candidates
    FETCH NEXT FROM c_Candidates INTO @currFrekvens, @currCalcDate, @currLastDate
    END
 
  CLOSE c_Candidates
  DEALLOCATE c_Candidates
Avatar billede hugopedersen Nybegynder
17. maj 2001 - 07:19 #9
Det ser på en eller anden måde fornuftigt ud.
Desværre har jeg ikke mulighed for at teste det før i morgen.
Jeg burde vel egentlig give dig pointene nu eller?
Avatar billede mwittrock Nybegynder
17. maj 2001 - 07:58 #10
Det må du naturligvis gerne, men du er også velkommen til at vente til i morgen. Jeg er dog ganske sikker på, at selve procedurens struktur er korrekt i.f.t. hvad du har brug for.
Avatar billede mwittrock Nybegynder
17. maj 2001 - 08:12 #11
Ok, tak. Skriv en kommentar i denne tråd, hvis du løber ind i problemer.
Avatar billede hugopedersen Nybegynder
18. maj 2001 - 12:11 #12
Hej - det virker næste uændret. Jeg havde bare opgivet feltnavnene lidt forkert, men efter rettelse funkede det.
Nu mangler jeg bare at lave en procedure der kan ændre datoer til at være en bestemt dag i måneden. Men den tror jeg at jeg har fod på.

( er der ikke noget med at sådan et spørgsmål her skal/kan lukkes? Gad vidst hvordan - det er første spørgsmål jeg prøver her )
Avatar billede mwittrock Nybegynder
18. maj 2001 - 12:25 #13
Godt at høre, at den virkede som den skulle :)

Så snart du har accepteret et svar, mener jeg at spørgsmålet er lukket som det skal.
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