Avatar billede nhoff Nybegynder
08. marts 2008 - 10:04 Der er 5 kommentarer og
1 løsning

Lav en query med 'manglende' datoer

- Overskriften er måske ikke helt sigende :-)

Jeg har en tabel (tblPoint) med 3 felter:

fldID
fldDato
fldPoint

Jeg har 3 records i tabellen

Dato:        Point:
04-02-2008    6
06-02-2008    10
10-02-2008    5

Jg vil gerne lave en query, der viser summen af point for hver dato fra d. 01-02-2008 til 10-02-2008. Dvs. jeg vil gerne ende op med en query, der viser følgende resultat:

01-02-2008: 0
02-02-2008: 0
03-02-2008: 0
04-02-2008: 6
05-02-2008: 0
06-02-2008: 10
07-02-2008: 0
08-02-2008: 0
09-02-2008: 0
10-02-2008: 5

Jeg vil dog helst undgå at skulle indtaste records for alle datoer, så det er noget med at loope igennem alle datoer i et givent datointerval og konstruere en sql-streng på den måde - eller?
Avatar billede nhoff Nybegynder
08. marts 2008 - 10:05 #1
Jeg har prøvet at lave en UNION query, men hvis datointervallet bliver bare en lille smule stort så bliver det godt nok en laang sql-streng som Access skal bruge tilsvarende lang tid på at tygge sig igennem.
Avatar billede Slettet bruger
09. marts 2008 - 01:29 #2
man kunne lave et recordset, som bygger på et loop, der indeholder datoer og de data, som ville komme fra recordsettet tblPoint, men det skal der nok lige leges lidt med for at få det til at virke. Det ville dog være en lækker løsning!~)

Hvad du kan gøre, sådan forholdsvis simpelt er at lave en tabel, som hedder tblDato og som indeholder et felt, der hedder Dato. Så lav flg. modul:

Option Compare Database
Option Explicit

Public Function OpretDato(FraDato As Date, TilDato As Date)
Dim DatoSQL As String
Dim Dato As Date
DoCmd.SetWarnings False
For Dato = Format(FraDato, "dd-mm-yyyy") To Format(TilDato, "dd-mm-yyyy") Step 1
DatoSQL = "INSERT INTO tblDato(Dato) SELECT '" & Dato & "'"
DoCmd.RunSQL DatoSQL
Next
DoCmd.SetWarnings True
End Function

og så i immediate vinduet skriver du f.eks.

call opretdato(#01-01-2008#,#31-12-2008#)

Du har nu en tabel hvor du har tilføjet alle datoer for 2008, så kan du lave flg. forespørgsel:

SELECT tblDato.Dato, nz([tblPoint].[fldPoint],0) AS fldPoint
FROM tblDato LEFT JOIN tblPoint ON tblDato.Dato = tblPoint.fldDato
WHERE (((tblDato.Dato) Between [FraDato:] And [TilDato:]));
Avatar billede nhoff Nybegynder
10. marts 2008 - 11:40 #3
Tak for input.

Jeg er helt på det rene med, at jeg kan lave en tabel med datoer, der i realiteten vil være en kalender. Derfra kan jeg hente de nødvendige data. Selvom det er en løsning der vil fungere, er jeg i virkeligheden mere interesseret i at høre om der var nogle der kendte til en metode, hvor man ikke 'støtter' sig til en yderligere tabel?
- Hvad mener du med "man kunne lave et recordset, som bygger på et loop, der indeholder datoer og de data, som ville komme fra recordsettet tblPoint, men det skal der nok lige leges lidt med for at få det til at virke..."?
Avatar billede Slettet bruger
10. marts 2008 - 13:08 #4
jeg kigger på det med et halvt øje, så der går lige lidt tid!~)
Avatar billede Slettet bruger
12. marts 2008 - 08:20 #5
Hej undskyld jeg ikke lige har været forbi, jeg kiggede på det men kunne ikke lige få de forskellige loops til at makke ret (jeg har en masse andre bolde i luften!~) så jeg endte med at sætte noget sammen, som simpelthen bare fyldte tomme datoer på, prøv at se tabellen før og efter du åbner formularen!~)

www.spgprogramming.com/access/Eksperten/spm822803.mdb
Avatar billede nhoff Nybegynder
14. marts 2008 - 10:20 #6
Tak for input. Din metode er smart nok, men jeg ledte efter en mulig metode der ikke indbefattede temporære tabeller eller andet. Jeg tænkte at der måske var en eller anden queryteknik jeg ikke var opmærksom på.
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