Avatar billede Slettet bruger
11. september 2006 - 13:07 Der er 19 kommentarer og
1 løsning

Fremtvinge mellemliggende datoer

Jeg har det problem at jeg skal vise en trend over uafsluttede opgaver. Der er bl.a. en oprettelsesdato, en prioritering og en evt. afslutningsdato. Dvs. at for en dato (nu skal det godt nok være på uge basis, men..) at for en dato, så er det alle opgaver oprettet frem til den dato, som ikke er afsluttet før efter datoen og de som er afsluttet på dagen (dvs. indenfor ugen).

Problemet er at disse data skal hentes ud fra en fast dato og jeg søger på en periode, så hvordan får jeg forespørgslen til at gå ud fra alle datoer i den pågældende periode?~)

Min eneste løsning lige nu ville være at lave en tabel med "alle" datoer (uger), er der ikke andre muligheder...
Avatar billede terry Ekspert
11. september 2006 - 19:38 #1
Can you try explaining with an example spg? I'm getting lost in all those dates :o)
Avatar billede kjulius Novice
12. september 2006 - 00:26 #2
Er det noget lignende

WHERE oprettelsesdato <= dinDato AND (afslutningsdato IS NULL or afslutningsdato = dinDato)

du søger efter?

Ellers har jeg, som terry også ser ud til, meget svært ved at gennemskue problemstillingen ud fra det oplyste.
Avatar billede Slettet bruger
12. september 2006 - 09:33 #3
Hvis man nu har flg. data:

01-01-2006 ja
01-01-2006 ja
03-01-2006 ja
04-01-2006 ja
04-01-2006 ja

og man i sin forespørgsel afgrænser på perioden fra 01-01-2006 til den 05-01-2006, hvordan kan man så komme frem til flg. resultat:

01-01-2006 2
02-01-2006 0
03-01-2006 1
04-01-2006 2
05-01-2006 0
Avatar billede ffsoft Praktikant
12. september 2006 - 13:14 #4
Det kan klares med lidt kode:

Dato = #01-01-2006#
for iX = 1 to 30
strSQL = "Select count(*) as antal From tblTabel Where OpretDato = #" & Dato & "#;"
set rst = conn.execute strSQL
response.write Dato & " " & rst("antal") & "<br>"
Dato = dateadd("d",Dato,1)
rst.close
next

Koden er IKKE checket for syntaksfejl.
Avatar billede ffsoft Praktikant
12. september 2006 - 13:15 #5
Shit det er jo ren Access så du skal ikke bruge
response.write men messagebox. UPS
Avatar billede terry Ekspert
12. september 2006 - 13:30 #6
You cant do it with an SQL because you have no data for all dates. You will need to create each date in a table and then make a join with a group by date and count
Avatar billede kjulius Novice
12. september 2006 - 19:31 #7
Som terry også er kommet frem til, så er det nemmeste altså at oprette en tabel med alle de datoer, som du realistisk set vil komme til at bruge. Det behøver dog ikke at være så svært. Der er ingen grund til selv at sidde og indtaste dem. Det kan gøres relativt enkelt:

1) Opret en lille midlertidig tabel med et enkelt tal-felt (vi kalder tabellen Dummy og feltet Tal):
2) Indtast 10 rækker med tallene fra 0 til 9 i denne tabel.
3) Opret en tabel med et enkelt datofelt (her kaldet Datoer)
4) Hvis du nu f.eks. ønsker at oprette 10000 datoer startende fra den 1.1.1990 i tabellen Datoer, så opretter du følgende indsætningsforespørgsel:

INSERT INTO Datoer ( Dato )
SELECT Dateadd("d",d1.Tal+(d2.Tal*10)+(d3.Tal*100)+(d4.Tal*1000),#1/1/1990#) AS Dato
FROM Dummy AS d1, Dummy AS d2, Dummy AS d3, Dummy AS d4;

5) Slet tabellen Dummy igen


Nu har du fået oprettet en tabel med 10000 datoer, som starter 1. januar 1970 og slutter 18. maj 2017. Jeg vil tro, at du ikke foreløbigt vil komme uden for det tidsrum.

Herefter kan du forholdsvis hurtigt få resultatet præsenteret:

SELECT d.Dato, COUNT(*) AS Antal
FROM Datoer d LEFT JOIN Logninger l on d.Dato=l.Dato
WHERE d.Dato BETWEEN fraDato AND tilDato
GROUP BY d.Dato
Avatar billede Slettet bruger
13. september 2006 - 12:40 #8
Det var jo som jeg tænkte, jeg er nød til at lave en tabel med datoerne....

Ja, eller det vil sige jeg kan ikke rigtig gennemskue ffsoft's løsning!~)
Avatar billede kjulius Novice
13. september 2006 - 12:57 #9
I hvert fald er det en god idé med datofilen, hvis du f.eks. ønsker at lave en rapport eller lign. som trækker direkte på en forespørgsel.

I øvrigt tror jeg, at jeg må ændre lidt på den viste SQL, for COUNT(*) vil jo også returnere et 1-tal, selv om der faktisk ikke er nogen logninger. Vi bør nok udskifte den med en COUNT(felt fra LEFT JOIN tabellen), som så ikke vil tælle op, hvis feltet er null:

SELECT d.Dato, COUNT(l.Dato) AS Antal
FROM Datoer d LEFT JOIN Logninger l on d.Dato=l.Dato
WHERE d.Dato BETWEEN fraDato AND tilDato
GROUP BY d.Dato
Avatar billede Slettet bruger
13. september 2006 - 15:57 #10
ffsoft>det handler også om at oprette en tabel med datoer ikke sandt!~)
Avatar billede Slettet bruger
15. september 2006 - 08:38 #11
Jeg må jo lave en datotabel.... øvv..
Avatar billede kjulius Novice
15. september 2006 - 08:51 #12
Ja, men det er nu ikke så svært, som jeg også viste dig. Og reelt fylder den altså heller ikke meget. Så op med humøret... :-)
Avatar billede Slettet bruger
15. september 2006 - 09:00 #13
Selvfølgelig, men som jeg efterlyste i spm. så ville jeg gerne kunne udnytte en eller anden form form step funktion i selve forespørgslen, for det kunne være lidt fedt!~)
Avatar billede ffsoft Praktikant
15. september 2006 - 10:13 #14
Nej der skal ikke oprettes en tabel. Tricket er lave en løkke der render alle datoer
igennem, laver et sql udtryk for hver dato og afleverer hvor mange der blev fundet.
Resultatet kan så fyldes i et array som bruges til at fylde data i en form/rapport.

Det må være noget hurtigere end at løbe 10000 datoer igennem, med mindre du altså
har brug for at løbe 10000 datoeer igennem.
Avatar billede kjulius Novice
15. september 2006 - 12:12 #15
--> ffsoft: Du kan godt lave en kode, men med mindre du vil oprette en midlertidig tabel, kan du ikke bruge det til at lave en rapport i Access. Hvis du derimod taler om ASP, er situationen en hel anden, da du så har mulighed for at lave output mid i en løkke.
Hvis der er oprettet et index på datoen, vil der heller ikke skulle gennemløbes 10000 rækker, da Access vil kunne finde lige nøjagtigt de datorækker, der er relevante. Alt i alt vil metoden med datoerne i en tabel være både nemmere og hurtigere.
Avatar billede Slettet bruger
18. september 2006 - 10:20 #16
Er der en løsning alligevel!~)
Avatar billede kjulius Novice
18. september 2006 - 17:03 #17
Nej, du kan ikke indlejre loop kode i din SQL, altså i din forespørgsel. Du kan derimod gøre det i kode uden for SQL. Men det strider mod brugen af en forespøgsel som grundlag for en rapport i Access.

Det er noget andet hvis du arbejder med ASP, PHP og lign., hvor du ikke på samme måde binder din rapport til en forespørgsel, men i stedet selv skal loope data i forespørgslen igennem og "udskrive" dine data.

Så, nej, det kan du ikke på den måde du ønsker at gøre det.
Avatar billede kjulius Novice
18. september 2006 - 17:08 #18
Jeg sidder her og undrer mig... Hvorfor vil du da partou ikke oprette den lille dato-tabel? Det forstår jeg simpelthen ikke, for det er så absolut den mest elegante måde det overhovedet kan gøres på. Mit råd: GET OVER IT!
Avatar billede Slettet bruger
19. september 2006 - 09:02 #19
Jeg opretter også en dato-tabel eller det vil sige en uge/år tabel, men det ville være et rart værktøj at have ved hånden. Muligheden for at fremtvinge et datasæt, hvor dage uden observationer også kunne vises, uden at skulle til at lave en referencetabel. Ideen skulle så være, at fordi access ved at datoerne findes, så kunne man bruge den oplysning. Altså have en funktion af en slags, den kunne måske hedde ALL([Date]).....

Men, som jeg kan forstå.. ren ønsketænkning!~)
Avatar billede kjulius Novice
20. september 2006 - 18:44 #20
Ja, men bare for at forstå din tankegang - hvordan havde du tænkt dig, at din forespørgsel kunne se ud med en sådan funktion?
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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