Avatar billede mugs Novice
27. februar 2005 - 13:37 Der er 18 kommentarer og
1 løsning

Sum med kriterie i thomasjepsens filtreringsfunktion.

Jeg anvender (endnu engang) thomasjepsen's dynamiske filtreringsfunktion.
I den fortløbende formular er der, blandt en del andre felter, 2 felter:

- Lønartgrp
- Beløb

Lønartgrp indeholder et tal 1,2,eller 3, afhængig hvilken lønart der er tale om. Beløbs-feltet siger sig selv.

Jeg ønsker nu 3 ubundne tekstbokse, der viser totalbeløbet indenfor hver sin lønartgrp i den filtrerede formular.

Datakilden =Sum([Beløb]) viser totalbeløbet i den filtrerede formular. Men hvordan får jeg lige koblet et kriterie på:

=Sum([Beløb]) der hvor formularens felt lønartgrp er = 1 i den filtrerede formular.
27. februar 2005 - 13:50 #1
hvad med at kode det:

Me!DitSumFelt = DSum("Beløb", "Dintabel", GetFilter())

Koden lægges på VedFiltrering eller VedAnvendFilter (kan ikke huske hvilken, der kommer først)
Avatar billede mugs Novice
27. februar 2005 - 13:59 #2
Denne:

Me!Tekst30 = DSum("Beløb", "DATA", GetFilter()

Indsat på VedFiltrering og VedAnvendFilter er uden virkning. Tekst30 (den ubundne tekstboks) viser den samlede total når formularen åbnes. Ved filtrering sker der ikke noget.
27. februar 2005 - 14:16 #3
Hmm, ja der sker ikke meget :o(

Nå, men du kan altid lægge koden på funktionen AktiverFilter i modulet:

Public Function AktiverFilter(F As Form)
'***********************************************************************************************
'  Denne kode er udviklet af Thomas Jepsen, 2000
'  Dele eller hele koden må frit benyttes i applikationer, så længe kildeangivelse er bevaret
'  Besøg www.makeiteasy.dk eller skriv til tj@makeiteasy.dk,
'  hvis der opstår fejl eller spørgsmål, eller du har brug for yderligere assistance
'***********************************************************************************************
       
    Dim SQLStr As String
    SQLStr = GetFilter
    If Len(SQLStr) = 0 Then
        F.FilterOn = False
    Else
        F.Filter = SQLStr
        F.FilterOn = True
    End If
    F!Tekst30 = DSum("Beløb", "DATA", SQLStr)
End Function


Men jeg er ikke selv tilfreds med den løsning....tænker over det....
Avatar billede mugs Novice
27. februar 2005 - 14:24 #4
Det fungerer fint. Dog er der den ulempe, at jeg så ikke kan bruge modulet i andre sammenhænge hvis formularen ikke indeholder Tekst30. Men det må jeg arbejde med.

Hvis du finder de vises sten, vil jeg blive glad for en mail. Det er ikke noget der haster.

Nu er det tid til en spadseretur. -5 Gr, høj klar solskin og vindstille. Lige et vejr til en tur omkring inderdammen. Og ikke noget med Buch's Vinstue idag ;o)
27. februar 2005 - 14:35 #5
ja, det var derfor jeg ikke var så vild med den løsning :o(

Jeg forstår ikke helt, at filter-hændelserne ikke virker. Jeg har brugt dem før i andre henseender....hmm
27. februar 2005 - 14:40 #6
Alternativt skal du lægge koden på VedAktuel. Det burde også virke og er måske meget fornuftig, hvis du f.eks. retter i nogle af posterne, så er VedFilter ikke ofte nok.

Prøv denne på VedAktuelt:
Me!Tekst30 = DSum("Beløb", "DATA", GetFilter)

(og Mugs->giv nu de stakkels tekstbokse nogle ordentlige navne! Ville du f.eks. kalde din søn for "Dreng30"?)
Avatar billede mugs Novice
27. februar 2005 - 21:26 #7
Hmmm - Glemte vi ikke lige kriterierne?
28. februar 2005 - 06:02 #8
Kriterierne ligger jo i GetFilter
Avatar billede mugs Novice
28. februar 2005 - 09:49 #9
Ja - Men beløbet skal fordeles i de 3 løngrupper 1, 2 eller 3. Hvis jeg filtrerer efter f.eks. et firmanavn, kan der udbetales løn i alle 3 løngrupper, og det er det, jeg mener med kriterier.
28. februar 2005 - 10:24 #10
ah - jeg troede, at det var en del af filteret. Men det kan det jo selvfølgelig ikke være ;)

Så bliver koden lidt længere:

Dim Kriterie as String
Kriterie = getfilter
if len(Kriterie) > 0 then
    Me!Tekst30 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 1)
    Me!Tekst32 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 2)
    Me!Tekst34 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 3)
else
    Me!Tekst30 = DSum("Beløb", "DATA", "lønartgrp = 1)
    Me!Tekst32 = DSum("Beløb", "DATA", "lønartgrp = 2)
    Me!Tekst34 = DSum("Beløb", "DATA", "lønartgrp = 3)
endif

Og nej! Der er ikke en fejl i "endif", hehe :)
28. februar 2005 - 10:24 #11
og så mangler der naturligvis " i slutningen af hver DSum:

Dim Kriterie as String
Kriterie = getfilter
if len(Kriterie) > 0 then
    Me!Tekst30 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 1")
    Me!Tekst32 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 2")
    Me!Tekst34 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 3")
else
    Me!Tekst30 = DSum("Beløb", "DATA", "lønartgrp = 1")
    Me!Tekst32 = DSum("Beløb", "DATA", "lønartgrp = 2")
    Me!Tekst34 = DSum("Beløb", "DATA", "lønartgrp = 3")
endif
Avatar billede mugs Novice
28. februar 2005 - 11:05 #12
Nu sker der noget. Foreløbig har jeg sat koden ind i en kommandoknap og den filtrerer og opsummerer beløbet.

Jeg får data fra et regneark hentet fra SAP, og der er ikke løndata i løngrupper 1 og 2. Jeg håber senere idag at få et nyt regneark med data i alle løngrupper. Så indtil videre lader jeg det ligge.

Hvor vil du sætte koden ind? Data i formularen skal IKKE ændres.
28. februar 2005 - 12:20 #13
hmm, jeg tror, at jeg ville lave en lokal public funktion (altså på formularen) med denne kode:

Public Function Filtrer
Dim Kriterie as String
AktiverFilter Me
Kriterie = getfilter
if len(Kriterie) > 0 then
    Me!Tekst30 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 1")
    Me!Tekst32 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 2")
    Me!Tekst34 = DSum("Beløb", "DATA", Kriterie & " And lønartgrp = 3")
else
    Me!Tekst30 = DSum("Beløb", "DATA", "lønartgrp = 1")
    Me!Tekst32 = DSum("Beløb", "DATA", "lønartgrp = 2")
    Me!Tekst34 = DSum("Beløb", "DATA", "lønartgrp = 3")
endif
End function

På alle dine søgefelter sætter du så denne værdi ind på egenskaben EfterOpdatering:
=Filtrer()
Avatar billede mugs Novice
01. marts 2005 - 20:51 #14
Kæmper stadig.
Problemet er, at den i visse situationer beregner korrekt, i andre situationer beregner den forkert.
01. marts 2005 - 20:52 #15
Man kan ikke vinde hver gang :o)
Avatar billede mugs Novice
01. marts 2005 - 21:13 #16
Næhhh - Men jeg tror, der begynder at tegne sig et billede nu. I hvert fald vil jeg gerne kvittere med point og en tak for hjælpen.

Måske vender jeg tilbage, når jeg har kontrolleret det endnu engang imorgen tidlig.
01. marts 2005 - 21:15 #17
Mugs, du ved jo, at når jeg nu har fået pointene, så er der lukket for det varme vand, haha ;o)
Avatar billede mugs Novice
01. marts 2005 - 21:18 #18
Gamle pointhaj.
Du er kun så grådig, fordi du er bange for din 2. plads ;o)
01. marts 2005 - 22:01 #19
nah, jeg er kun bange for, at jeg stadg er på 2. pladsen om en uges tid ;o)
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