Avatar billede dsjk Novice
18. juli 2002 - 22:19 Der er 21 kommentarer og
1 løsning

tricky rapport

Jeg har en tabel med kunder i(kundeoplysninger), hver kunde har x biler (tabel: biler) til knyttet, og på hver bil kan der være 1 til 4 termin, hver der står måneden terminen skal falde (gemt med tal, da det hentes fra en måned tabel)

Jeg vil gerne have en rapport der viser:
elle måneder på en række (januar til december)
helt til venstre står hver kunde med sit kundenr, og under kunden står de tilknyttede biler.
Har bilen så fx. termin i juni, står terminspræmien under juni. Har bilen termin i januar og juli står terminspræmien under både januar og juli, osv.
Terminpræmien skulle gerne lægges sammen i bunden, så man kan se hver meget der skal betales i termin i januar, februar osv.

Kan det overhovedet lade sig gøre?

i så fald, hvordan?

dsjk
Avatar billede nih Novice
18. juli 2002 - 22:40 #1
Lav først en foresp som krydstabulering mad alle måneder som kolloneoverskrifter.

Jeg vil tro at 'hekseriet' skal ske her, der efter er det 'nemt' at lave en rapport.

hvis din db er i ver. 2000, så prøv at sende den:
nih@mail1.stofanet.dk

Niels
Avatar billede nih Novice
19. juli 2002 - 00:05 #2
Først laves en UNION således at der fåes en tabel: KundeID, TerminId, Præmie:

SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[1 Termin] as termin, Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
UNION all
SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[2 Termin], Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
UNION all
SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[3 Termin], Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
UNION ALL SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[4 Termin], Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid;

Derefter krydsTabulering
TRANSFORM Sum(Q_AlleTerminer_1.Terminspræmie) AS SumOfTerminspræmie
SELECT Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid
FROM (Q_AlleTerminer AS Q_AlleTerminer_1 LEFT JOIN Måned ON Q_AlleTerminer_1.termin = Måned.nr) INNER JOIN Kundeoplysninger ON Q_AlleTerminer_1.kundeid = Kundeoplysninger.kundeid
GROUP BY Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid
ORDER BY Måned.nr
PIVOT Måned.nr;

Eksembeldb sendt til dsjk

Niels
Avatar billede dsjk Novice
19. juli 2002 - 08:33 #3
det ser meget godt ud.
Bare lige en ting.
Kan jeg få lagt terminspræmien sammen pr måned, så der i januar står 1000, februar 20000 i en række for sig selv nedefor neden?

dsjk
Avatar billede nih Novice
19. juli 2002 - 09:29 #4
Ja - Det skal foregå i rapporten:

I rapportfoden skal laves tekstfelter med kontrolelementkilde:
=Sum([1])  for januar
og en mere
=Sum([2])  for februar
osv.

Niels
Avatar billede nih Novice
19. juli 2002 - 09:38 #5
Har du brug for flere felter i din rapport trækker du dem bare ned i foresp gitteret 'Q_rpt' som rækkeoverskrift.

Du kan også tilføje tabellen 'biler' og trække eks. 'bilmærke' ned - slet dog nogen af alle relationerne, således der kun er relateret mellem 'biler' og 'Q_AlleTerminer'

Niels
Avatar billede dsjk Novice
19. juli 2002 - 10:38 #6
hvordan tilføjer jeg "kundeidfod" sektionen?

jeg har jo rapporthoved, sidehoved, kundeidhoved, detaljesektion, sidefod og rapportfod

men mangler kundeidfod, og det er her jeg skal indsætte sum feltet.

dsjk
Avatar billede nih Novice
19. juli 2002 - 10:53 #7
Tryk på knappen 'Sortering og gruppering' - her sætter du gruppefod til ja.

MEN så får du en sum for hver kundeid, hvis du vil have en samlet sum skal du anvende 'rapportfoden'
Avatar billede dsjk Novice
19. juli 2002 - 18:22 #8
ok, så har jeg fået kigget lidt mere på det, og har fundet en lille fejl.
November vises ikke i rapporten, og jeg kan ikke vælge den.
Så vidt jeg kan se skyldes det at der ikke er nogen biler der har termin i denne måned, men jeg vil gerne have den på alligevel.

Hvad skal jeg rette til?

dsjk
Avatar billede nih Novice
19. juli 2002 - 19:33 #9
JA - Jeg har vendt et outerJoin forkert, Desuden er der lidt jeg ikke har tænkt på - måned '0' ???? - Det må være et normaliserings problem ;o)

Q_AlleTerminer:
SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[1 Termin] as termin, Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
WHERE  Biler.[1 Termin] between 1 and 12
UNION all
SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[2 Termin], Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
WHERE  Biler.[2 Termin] between 1 and 12
UNION all
SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[3 Termin], Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
WHERE  Biler.[3 Termin] between 1 and 12
UNION ALL SELECT Kundeoplysninger.kundeid, Biler.bilid, Biler.[4 Termin], Biler.Terminspræmie
FROM Kundeoplysninger INNER JOIN Biler ON Kundeoplysninger.kundeid = Biler.kundeid
WHERE  Biler.[4 Termin] between 1 and 12;

og Q_rpt:
TRANSFORM Sum(Q_AlleTerminer_1.Terminspræmie) AS SumOfTerminspræmie
SELECT Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke
FROM ((Q_AlleTerminer AS Q_AlleTerminer_1 RIGHT JOIN Måned ON Q_AlleTerminer_1.termin = Måned.nr) LEFT JOIN Kundeoplysninger ON Q_AlleTerminer_1.kundeid = Kundeoplysninger.kundeid) LEFT JOIN Biler ON Q_AlleTerminer_1.bilid = Biler.bilid
WHERE (((Kundeoplysninger.kundeid) Is Not Null))
GROUP BY Kundeoplysninger.kundeid, Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke
ORDER BY Måned.nr
PIVOT Måned.nr;

Du skal bare klippe og klistre de ovenstående SQL'er ind i dine foresp.

Fik du styr på de totaler i rapporten ????

Niels
Avatar billede nih Novice
19. juli 2002 - 20:19 #10
rettelse:
og Q_rpt:
TRANSFORM Sum(Q_AlleTerminer_1.Terminspræmie) AS SumOfTerminspræmie
SELECT Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke
FROM ((Q_AlleTerminer AS Q_AlleTerminer_1 RIGHT JOIN Måned ON Q_AlleTerminer_1.termin = Måned.nr) LEFT JOIN Kundeoplysninger ON Q_AlleTerminer_1.kundeid = Kundeoplysninger.kundeid) LEFT JOIN Biler ON Q_AlleTerminer_1.bilid = Biler.bilid
GROUP BY Kundeoplysninger.kundeid, Q_AlleTerminer_1.kundeid, Kundeoplysninger.Fornavn, Kundeoplysninger.Firmanavn, Q_AlleTerminer_1.bilid, Biler.Bilmærke
ORDER BY Måned.nr
PIVOT Måned.nr;
Avatar billede dsjk Novice
19. juli 2002 - 20:46 #11
ok, så virker det hvis.
Har også i mellem tiden fundet ud af at der i "de rigtige" data er biler med termin i hver måned.

Yep totalerne virker fint.

Hvad mener du med måned 0?? - der er ikke nogen måned 0.

dsjk
Avatar billede nih Novice
19. juli 2002 - 23:05 #12
felterne [1 termin], [2 termin], osv i tabellen 'biler', indeholder flere steder værdien 0.
Da disse felter er relateret til 'måned', som IKKE har et recordset med værdien 0, er der lidt kludder i tabelstrukturen. Det behøves/er ikke noget problem, blot man er opmærksom på det.

Glad for det lykkes
Niels
Avatar billede dsjk Novice
19. juli 2002 - 23:25 #13
hmmm, såvidt jeg kan se har 1-4 termin enten et tal mellem 1 og 12, eller også står der ikke noget der i. Altså ingen med 0.
Men skidt med det.

Jeg har lige et par spm. mere:
Jeg har sat sum til =sum([1]) osv. ved alle måneder, og det virker fint, men hvis der er en måned uden terminspræmier, kommer der ikke til at stå 0 i sum, den forsvinder helt. Kan jeg få den til at skrive et 0?
JEg har også lavet en total sum på denne måde:
=Sum([1])+Sum([2])+Sum([3])+Sum([4])+Sum([5])+Sum([6])+Sum([7])+Sum([8])+Sum([9])+Sum([10])+Sum([11])+Sum([12])
Kan det gøres lettere? også her går det galt hvis den er en måned uden terminspræmier, så forsvinder total summen også?

dsjk
Avatar billede nih Novice
19. juli 2002 - 23:55 #14
Nu er jeg ikke ekspert i raporter :(

Du kan lave en foresp mere med udgangspunkt i Q_Rpt, hvor du trækker alle felter ned i foresp.giteret. Felterne 1 - 12 skrives sådan her:
    jan: nz([1];0)
    feb: nz([2];0)
    osv.
Så vil de få værdien 0 istedet for null, og dine beregninger i rapporten vil være OK. Dog skal dine udtryk i rapporten modificeres:
=Sum([jan])+Sum([feb])+ .....

Du kan også vælge at bruge nz() direkte i rapporten: =nz(Sum([1]);0)+nz(Sum([2]);0)+ .....

Jeg kender desværre ikke nogen 'nem' måde, måske kunne du oprette et nyt spm. for at få andre 'eksperter' på banen

Niels
Avatar billede dsjk Novice
20. juli 2002 - 00:06 #15
endnu engang tak, det virker.

Jeg vender tilbage med point, når det er testet i access 97.

dsjk
Avatar billede dsjk Novice
21. juli 2002 - 11:38 #16
hvis jeg nu runder op til 200, kan du så hjælpe mig engang til?

Jeg har lavet en tilsvarende rapport til at vise ea (erhvervsansvar) præmie betalinger, som virker fint. Men jeg har et lille problem.
Der er nogle eapræmie som som træder i kraft om et par år, jeg vil derfor ikke have dem med i rapporten. Jeg har derfor tilføjet en WHERE (Kundeoplysninger.eaikraft < now) linie i forespørglsen, så den ser således ud:

TRANSFORM Sum(Kundeoplysninger.eapræmie) AS SumOfTerminspræmie
SELECT Kundeoplysninger.kundeid
FROM Kundeoplysninger RIGHT JOIN Måned ON Kundeoplysninger.eahoved = Måned.nr
WHERE (Kundeoplysninger.eaikraft < now)
GROUP BY Kundeoplysninger.kundeid
ORDER BY Måned.nr
PIVOT Måned.nr;

men så får jeg (igen) ikke alle måneder med, jeg får kun de måneder der er betalinger i. Hvis ikke WHERE linien er med, vises alle måneder. Hvad skal laves om?

Og lige en xtra ting: eaikraft skrives som dd-mm-åååå (21-07-2002), og jeg vil gerne have at rapporten/forespørgslen vises dem der træder i kraft i hele 2002 og ikke bare now. Hvis du forstår?

dsjk
Avatar billede nih Novice
21. juli 2002 - 12:35 #17
udskift di WHERE med denne:

WHERE (((Year([eaikraft]))<=Year(Now()) Or (Year([eaikraft])) Is Null))

Niels
Avatar billede dsjk Novice
21. juli 2002 - 13:08 #18
det nærmer sig.

Du får jeg de måneder der er trådt/træder i kraft i 2002 hvilket er juni, juli, september og november) og de mdr. som der ikke er nogle betalinger i (heller ikke i dem som først træder i kraft senere), hvilke er marts, maj august, oktober og december.

Men jeg mangler Januar, februar og april, som, har jeg fundet ud af, er de måneder som eksistere i de kunder som ikke tages med da de først træder i kraft senere end 2002.

dsjk
Avatar billede nih Novice
21. juli 2002 - 13:22 #19
TRANSFORM Sum(IIf(Year(Now())>=Year([eaikraft]),[eaikraft],Null)) AS SumOfTerminspræmie
SELECT Kundeoplysninger.kundeid
FROM Kundeoplysninger RIGHT JOIN Måned ON Kundeoplysninger.eahoved = Måned.nr
GROUP BY Kundeoplysninger.kundeid
ORDER BY Måned.nr
PIVOT Måned.nr;

uden en Where, men så kommer alle kunder med.

Niels
Avatar billede nih Novice
21. juli 2002 - 13:39 #20
Du kan også lave din krydstabulering helt uden kriterier.
og derefter lave en ny foresp hvor du udvælger dem du vil ha' med

SELECT Forespørgsel1.*
FROM Forespørgsel1 INNER JOIN Kundeoplysninger ON Forespørgsel1.kundeid = Kundeoplysninger.kundeid
WHERE (((Year([eaikraft]))<=Year(Now())));

hvor Forespørgsel1 er krydstabulering UDEN kriterier.

Niels
Avatar billede dsjk Novice
21. juli 2002 - 16:17 #21
Kunne ikke få den øverste til at virke.

Men den sidste løsning virke fint.

Tak for hjælpen.

dsjk
Avatar billede dsjk Novice
22. juli 2002 - 11:16 #22
alt ser ud til at virke i access 97.

Så her får du pointene.

dsjk
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