16. maj 2001 - 08:06Der 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.
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.
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
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.
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
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?
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.
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 )
Så snart du har accepteret et svar, mener jeg at spørgsmålet er lukket som det skal.
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.