11. september 2006 - 13:07Der 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...
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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
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
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
Synes godt om
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!~)
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
Synes godt om
Slettet bruger
13. september 2006 - 15:57#10
ffsoft>det handler også om at oprette en tabel med datoer ikke sandt!~)
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... :-)
Synes godt om
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!~)
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.
--> 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.
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.
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!
Synes godt om
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]).....
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?
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.