31. oktober 2003 - 10:44Der er
22 kommentarer og 1 løsning
lave perioder ud fra datoer der står i samme felt
Jeg har en tabel i access der f.eks. kan se således ud:
navn dato aktivitet ib 010103 aktiv ib 020203 passiv ib 010303 arkiv ib 010403 aktiv ib 010803 passiv
Der er mange personer i tabellen, men aktivitet kan kun være aktiv, passiv eller arkiveret, og i virkeligheden står der 1 for aktiv 2 for passiv og 3 for arkiveret. En bruger kan have mange perioder, og jeg har til opgave at finde perioden fra en bruger bliver aktiv til han/hun bliver passiv. cyklussen er altid aktiv -> passiv, men nogen gange kommer der en arkiveret. Jeg har forespurgt hos professionelle programmører, men de kunnne ikke hjælpe, så opgaven er nok meget svær
Det vil jeg nok have tilbøjelighed til at give dem ret i :-) Du har jo ikke noget der viser hvilken cyklus de enkelte records hører til, så det vil ikke blive nemt nej. Det jeg mener er at du ikke kan se på din record med passiv hvilken aktiv den hører sammen med og hvis ikke du kan det, så har du lige som mange muligheder for at finde starten.
Jeg har en ide om at søge via en forespørgsel efter første dag ib er aktiv = 1, og første dag ib er passiv - 1 og her søges efter 2 og så smide hele i en rapport. Men i stedet for ib må det være et unikt nr. man må kunne søge på. så kan det laves som imputbox, Kunne man få databasen tilsendt, det ville være lettere, end at skulle opbygge en test db. Min E-mail adresse er: oz1bua@wanadoo.dk Mvh Henrik13
You forget to mention WHEN "arkiveret" happens! Is this after passiv or cn ait happen ant time? Also, I assume that there can be one aktiv which doesnt have a following passiv, is that correct?
(professionelle programmører)! Well there are those who think they are proff. and those that are :o)
If your data structure is as I think it is then I think I can find a solution!
Hvis bare du havde brugt et andet datoformat, så kunne en forespørgsel der sorterer på navn, dato og så på status give dig en liste der viser forløbet.
Datoen skulle så ååååmmdd (altid en god ide hvis der skal sorteres på det)
SELECT tblPerioder.navn, tblPerioder.dato AS aktiv, tblPerioder.aktivitete, (SELECT TOP 1 P.dato from tblPerioder P where P.navn = tblPerioder.navn AND P.dato > tblPerioder.Dato and aktivitete = 2 ) AS passiv, DateDiff("d",[aktiv],[passiv]) AS perioden FROM tblPerioder WHERE (((tblPerioder.aktivitete)=1));
SELECT tblPerioder.navn, tblPerioder.dato AS aktiv, tblPerioder.aktivitete, Nz((SELECT TOP 1 P.dato from tblPerioder P where P.navn = tblPerioder.navn AND P.dato > tblPerioder.Dato and aktivitete = 2 ),Date()) AS passiv, DateDiff("d",[aktiv],[passiv]) AS perioden FROM tblPerioder WHERE (((tblPerioder.aktivitete)=1));
Hvis jeg tester din løsning Terry så kan jeg se 2 'problemer' i den Du tager ikke hensyn til at det første forløb i eksemplet slutter med at blive arkiveret - jeg ved ikke om det har noget at sige. Endvidere finder du samme slutdato for begge forløb i eksemplet.
Vedr datoformatet kan jeg lave det der er brug for. En periode går altid fra aktiv til passiv, arkiveringen har vi ikke brug for, så en periode går altid fra en aktiv dato til nænst dato der er passiv. Jeg har siddet og tygget på jeres svar, og jeg er ikke skrap til sådanne koder, men det ser da ud til at de to første perioder er rigtige, jeg kan ikke rigtig forstå den sidste fra 1-9 til 31-10. en person slutter med en aktiv er personen stadig aktiv, og så skal slut datoen være dd. Det ser ud til at I har fat i noget der, jeg prøver lige at tjekke koden i min base, hvis jeg kan finde ud af det.
Jeg har indtastet de data som ib_nielsen har opgivet i sit spørgsmål og når jeg så prøver den sidste query, så får jeg 020203 som passiv på begge. Det forstår jeg ikke lige helt.
OK hvis arkiveret ikke skal bruges så er det ikke et issue.
The reason why the last period is 60 and not as you may be expecting 61, is because it is STILL 31st! In th ecase of th efirst two records we have gon epast the passiv date so it is alos included in the calcualtion.
but you can always add 1 day if necessary! SELECT tblPerioder.navn, tblPerioder.dato AS aktiv, tblPerioder.aktivitete, Nz((SELECT TOP 1 P.dato from tblPerioder P where P.navn = tblPerioder.navn AND P.dato > tblPerioder.Dato and aktivitete = 2 ),Date()+1) AS passiv, DateDiff("d",[aktiv],[passiv]) AS perioden FROM tblPerioder WHERE (((tblPerioder.aktivitete)=1));
glad to hear you also got it working Hugo, I get nervous when people dont get the same result as me :o)
og god weekend alle sammen!
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.