Ik ben op een (voor mij) onverklaarbaar probleem gestuit:
Ik gebruik VBA-code om berekeningen in een tabel uit te voeren en op te slaan. Onder mijn verhaal vind je de code. De code zorgt er voor dat de waardes in de kolom 'aantal' steeds opgeteld worden, zodat een cumulatieve waarde ontstaat. Dit werkt op zich prima. Het probleem zit hem puur in het openen van de tabel :
oDB.OpenRecordset("istat_pmnd", dbOpenTable)
Wanneer ik de tabel op deze manier open dan staan de records niet in de juiste volgorde. De tabel kent de volgende kolommen
artinr, jartal, period, aantal, cumaantal
Hij moet gesorteerd worden op artinr, jartal,period
Deze sortering heb ik vastgelegd in de eigenschappen van de tabel. Als ik de tabel in gegevensbladweergave open staat alles precies zoals het moet. Laat ik de tabel via oDB.OpenRecordset("istat_pmnd", dbOpenTable)
openen in VBA dan wordt de tabel gesorteerd op jartal,artinr,period.
Ik snap hier helemaal niks van, want ik heb toch echt een andere sorteing in de eigenschappen staan. Hoe kan dit? (en wat kan ik er aan doen?)
Nog vreemder vind ik dat ik wanneer ik de tabel open met:
oDB.OpenRecordset("istat_pmnd", dbOpenDynaset)
Dan staan de records wel in de juiste volgorde (artinr,jartal,period). Ik kan deze manier van openen echter niet gebruiken, omdat het om grote hoeveelheden records gaat. Ik krijg de volgende foutmelding:
Filesharing lockcounts exceeded. Increase maxlocksperfile registry entry.
Aangezien dit programma bij klanten moet draaien is het echter niet wenselijk om het register te gaan wijzigen. Ik heb alle opties die betrekking hebben op de lockedit (dboptimistic enz.) geprobeerd, maar ik blijf de foutmelding krijgen. Is er een manier om helemaal niet te locken? Dit is namelijk niet nodig, omdat dit programma alleen lokaal draait zonder dat anderen toegang hebben op de pc.
Een mooiere oplossing zou zijn om de tabel via
oDB.OpenRecordset("istat_pmnd", dbOpenTable)
in de juiste sorteervolgorde te kunnen openen. Ik heb overigens een andere tabel die op precies dezelfde manier is opgebouwd (zelfde velden, zelfde manier aangemaakt) die wel in de juiste sorteervolgorde wordt geopend wanneer ik van dbopentable gebruik maak. Dit maakt het nog vreemder. Iemand die een oplossing heeft voor dit probleem???????
_____________________________________________
Private Sub Aantal_ingekocht()
Dim oDB As DAO.Database
Dim oRS As DAO.Recordset
Dim lngAantal As Long
Dim lngCounter As Long
Dim dIngekocht() As Double
Dim sProducten() As String
Dim vAantal As Double
Set oDB = CurrentDb()
Set oRS = oDB.OpenRecordset("istat_pmnd", dbOpenTable)
With oRS
.MoveLast
lngAantal = .RecordCount
ReDim dIngekocht(1 To lngAantal)
ReDim sProducten(1 To lngAantal)
' Waarden verzamelen
.MoveLast
For lngCounter = 1 To lngAantal
dIngekocht(lngCounter) = !aantal
sProducten(lngCounter) = !artinr
.MovePrevious
Next
' Waarden schrijven
.MoveLast
For lngCounter = 1 To lngAantal
If lngCounter = 1 Then GoTo Aantalbepalen
If lngCounter Mod 49 = 0 Then
vAantal = 0
End If
Aantalbepalen:
vAantal = vAantal + dIngekocht(lngCounter)
.Edit
!cumaant = vAantal
.Update
.MovePrevious
Next
End With
Set oRS = Nothing
Set oDB = Nothing
End Sub
Ik gebruik VBA-code om berekeningen in een tabel uit te voeren en op te slaan. Onder mijn verhaal vind je de code. De code zorgt er voor dat de waardes in de kolom 'aantal' steeds opgeteld worden, zodat een cumulatieve waarde ontstaat. Dit werkt op zich prima. Het probleem zit hem puur in het openen van de tabel :
oDB.OpenRecordset("istat_pmnd", dbOpenTable)
Wanneer ik de tabel op deze manier open dan staan de records niet in de juiste volgorde. De tabel kent de volgende kolommen
artinr, jartal, period, aantal, cumaantal
Hij moet gesorteerd worden op artinr, jartal,period
Deze sortering heb ik vastgelegd in de eigenschappen van de tabel. Als ik de tabel in gegevensbladweergave open staat alles precies zoals het moet. Laat ik de tabel via oDB.OpenRecordset("istat_pmnd", dbOpenTable)
openen in VBA dan wordt de tabel gesorteerd op jartal,artinr,period.
Ik snap hier helemaal niks van, want ik heb toch echt een andere sorteing in de eigenschappen staan. Hoe kan dit? (en wat kan ik er aan doen?)
Nog vreemder vind ik dat ik wanneer ik de tabel open met:
oDB.OpenRecordset("istat_pmnd", dbOpenDynaset)
Dan staan de records wel in de juiste volgorde (artinr,jartal,period). Ik kan deze manier van openen echter niet gebruiken, omdat het om grote hoeveelheden records gaat. Ik krijg de volgende foutmelding:
Filesharing lockcounts exceeded. Increase maxlocksperfile registry entry.
Aangezien dit programma bij klanten moet draaien is het echter niet wenselijk om het register te gaan wijzigen. Ik heb alle opties die betrekking hebben op de lockedit (dboptimistic enz.) geprobeerd, maar ik blijf de foutmelding krijgen. Is er een manier om helemaal niet te locken? Dit is namelijk niet nodig, omdat dit programma alleen lokaal draait zonder dat anderen toegang hebben op de pc.
Een mooiere oplossing zou zijn om de tabel via
oDB.OpenRecordset("istat_pmnd", dbOpenTable)
in de juiste sorteervolgorde te kunnen openen. Ik heb overigens een andere tabel die op precies dezelfde manier is opgebouwd (zelfde velden, zelfde manier aangemaakt) die wel in de juiste sorteervolgorde wordt geopend wanneer ik van dbopentable gebruik maak. Dit maakt het nog vreemder. Iemand die een oplossing heeft voor dit probleem???????
_____________________________________________
Private Sub Aantal_ingekocht()
Dim oDB As DAO.Database
Dim oRS As DAO.Recordset
Dim lngAantal As Long
Dim lngCounter As Long
Dim dIngekocht() As Double
Dim sProducten() As String
Dim vAantal As Double
Set oDB = CurrentDb()
Set oRS = oDB.OpenRecordset("istat_pmnd", dbOpenTable)
With oRS
.MoveLast
lngAantal = .RecordCount
ReDim dIngekocht(1 To lngAantal)
ReDim sProducten(1 To lngAantal)
' Waarden verzamelen
.MoveLast
For lngCounter = 1 To lngAantal
dIngekocht(lngCounter) = !aantal
sProducten(lngCounter) = !artinr
.MovePrevious
Next
' Waarden schrijven
.MoveLast
For lngCounter = 1 To lngAantal
If lngCounter = 1 Then GoTo Aantalbepalen
If lngCounter Mod 49 = 0 Then
vAantal = 0
End If
Aantalbepalen:
vAantal = vAantal + dIngekocht(lngCounter)
.Edit
!cumaant = vAantal
.Update
.MovePrevious
Next
End With
Set oRS = Nothing
Set oDB = Nothing
End Sub