Records groepsgewijs optellen

Status
Niet open voor verdere reacties.

Laroguz

Gebruiker
Lid geworden
27 mei 2006
Berichten
97
Ik heb een tabel waar een veld met een Valutabedrag in staat. Nu wil ik het totaalbedrag van de eerste 15 records, het totaalbedrag van de volgende 15 records enz. Hoe krijg je dit voor elkaar.


Bij voorbaat dank
Wim Janssen
 
Programmeren!
Met tabellen en queries is het niet echt goed mogelijk om iets om de 15 records te doen, tenzij je in je tabel een veld hebt waarop je kunt groeperen, dan kun je in een query een GROUP BY clausule gebruiken.

Anders in VBA een recordset openen en record voor record verwerken. Je kunt dan een teller bijhouden en om de 15 records het totaal bepalen.
 
Beste Bartuls,

Er is inderdaad geen veld waar ik op kan groeperen of filteren.
Het is een tabel met 3 velden nl. "Klantnummer", "Omzet" en "Datum". Het veld "Omzet" is het bewuste veld. Omzet wil zeggen, één betaling van de klant. Als de klant 15 betalingen gedaan heeft, moet er een kortingsbon van 5% over het totaal van deze betalingen berekend worden. Vervolgens over de volgende 15 enz.
Ik was dus inderdaad al iets aan het programmeren in VBA waarbij ik inderdaad alle records afloop en de waardes bij elkaar tel. Dit ging goed totdat de code bij de laatste record kwam die dus niet herkend word.

Groeten
Wim
 
Frontier zei:
misschien iets doen met if [currentrecord] > 15 then .....

dat kan helemaal niet. Ga met VBA aan de slag zoals Barstuls zegt:

ff een opzetje:

Code:
function TEST
dim DB as dao.database
dim RS as dao.recordset
dim X as integer
dim Xgroep as integer
dim XBedrag as currency

set DB=currentdb
set RS=db.openrecordset("selec * from jouwtabel", dbopensnapshot)
rs.movelast:rs.movefirst 'om de recordcount-propertie te vullen

do until rs.eof
x = x +1
XBedrag = XBedrag + nz(rs!hetveldmethetbedrag,0)

if x = 15 then
Xgroup=Xgroup +1
debug.print "groep " & Xgroup & " - " & XBedrag
x=0
end if

rs.movenext
loop

exithere:
set db=nothing
set rs=nothing

end function

als de recordset geen gegevens bevat ontstaat een foutmelding dus je zult iets van een foutafhandeling toe moeten voegen.

Ik hoop dat je hiermee iets kan, anders posten maar en we helpen je weer verder.
 
De volgende code werkt. Alleen ben ik er nog niet uit bij welke gebeurtenis ik hem moet laten uitvoeren. Onderstaande wordt namelijk berekend in een subformulier van een klantenformulier. Dus bij elke record van het klantenformulier moet onderstaande doorlopen worden.



Private Sub Form_Open(Cancel As Integer)

Dim WaardeTotaal As Integer
Dim RecordsTotaal As Integer

DoCmd.GoToRecord , , acLast
RecordsTotaal = CurrentRecord
DoCmd.GoToRecord , , acFirst

Do While CurrentRecord < 16 And CurrentRecord <= RecordsTotaal

DoCmd.GoToControl "TxtOmzet"
WaardeTotaal = WaardeTotaal + TxtOmzet
If CurrentRecord = RecordsTotaal Then
GoTo Einde
End If
DoCmd.GoToRecord , , acNext

Loop

Einde:

DoCmd.GoToControl "TxtTotaal"
TxtTotaal = WaardeTotaal

End Sub


Groeten
Wim
 
ik neem aan dat je een klant selecteert in het hoofdformulier. Pak dan het form-event 'on current' oftewel in het NL: 'bij aanwijzen'

dit is het event als je naar een andere record springt in een formulier.
 
Het probleem is dat de code in het subformulier staat.

Groeten
Wim
 
Ik ben net even weg geweest. Ik ga hier morgen mee verder. Lijkt een oplossing te geven.
De totale code voor 4 blokken van 15 records ziet er nu zo uit.


-------------------------------------------------------------------------------------------------------------
Dim WaardeTotaal15 As Integer
Dim WaardeTotaal30 As Integer
Dim WaardeTotaal45 As Integer
Dim WaardeTotaal60 As Integer
Dim RecordsTotaal As Integer

''Bepaal aantal records
DoCmd.GoToRecord , , acLast
RecordsTotaal = CurrentRecord
DoCmd.GoToRecord , , acFirst

''Tel de eerste set van 15 records bij elkaar
Do While CurrentRecord < 16 And CurrentRecord <= RecordsTotaal

DoCmd.GoToControl "TxtOmzet"
WaardeTotaal15 = WaardeTotaal15 + TxtOmzet
If CurrentRecord = RecordsTotaal Then
GoTo Einde15
End If
DoCmd.GoToRecord , , acNext

Loop

Einde15:

DoCmd.GoToControl "TxtTotaal15"
TxtTotaal15 = WaardeTotaal15
DoCmd.GoToRecord , , acFirst

''Ga naar de 16e record
Do While CurrentRecord < 16

If CurrentRecord = RecordsTotaal Then
GoTo Einde30
End If
DoCmd.GoToRecord , , acNext

Loop

''Tel de tweede set van 15 records bij elkaar
Do While CurrentRecord < 31 And CurrentRecord <= RecordsTotaal

DoCmd.GoToControl "TxtOmzet"
WaardeTotaal30 = WaardeTotaal30 + TxtOmzet
If CurrentRecord = RecordsTotaal Then
GoTo Einde30
End If
DoCmd.GoToRecord , , acNext

Loop

Einde30:

DoCmd.GoToControl "TxtTotaal30"
TxtTotaal30 = WaardeTotaal30
DoCmd.GoToRecord , , acFirst

''Ga naar de 31e record
Do While CurrentRecord < 31

If CurrentRecord = RecordsTotaal Then
GoTo Einde45
End If
DoCmd.GoToRecord , , acNext

Loop

''Tel de derde set van 15 records bij elkaar
Do While CurrentRecord < 46 And CurrentRecord <= RecordsTotaal

DoCmd.GoToControl "TxtOmzet"
WaardeTotaal45 = WaardeTotaal45 + TxtOmzet
If CurrentRecord = RecordsTotaal Then
GoTo Einde45
End If
DoCmd.GoToRecord , , acNext

Loop

Einde45:

DoCmd.GoToControl "TxtTotaal45"
TxtTotaal45 = WaardeTotaal45
DoCmd.GoToRecord , , acFirst

''Ga naar de 46e record
Do While CurrentRecord < 46

If CurrentRecord = RecordsTotaal Then
GoTo Einde60
End If
DoCmd.GoToRecord , , acNext

Loop

''Tel de vierde set van 15 records bij elkaar
Do While CurrentRecord < 61 And CurrentRecord <= RecordsTotaal

DoCmd.GoToControl "TxtOmzet"
WaardeTotaal60 = WaardeTotaal60 + TxtOmzet
If CurrentRecord = RecordsTotaal Then
GoTo Einde60
End If
DoCmd.GoToRecord , , acNext

Loop

Einde60:

DoCmd.GoToControl "TxtTotaal60"
TxtTotaal60 = WaardeTotaal60
-------------------------------------------------------------------------------------------------------------


Nu nog op de juiste manier oproepen en we zijn klaar.

Groeten
Wim
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan