VBA-probleem DAO-recordset

  • Onderwerp starter Onderwerp starter flbos
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

flbos

Gebruiker
Lid geworden
5 feb 2004
Berichten
267
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
 
Probeer het eens met een query waarin de sortering altijd goed moet werken. De sortering die je op de tabel hebt opgeslagen is geen echte sortering, maar eigenlijk gewoon een query.

Als je de tabel opent via jouw manier zal er op invoervolgorde getoond worden.

Met ADO heb ik meer ervaring, daarin gaat het openen van een recordset op basis van een query in ieder geval goed.

Als je bent geinteresseerd in de ADO code plaats ik die de volgende keer wel even.


Grtz,
 
Bedankt voor de hulp. Met een query is het echter zo dat ik de recordset moet openen met de optie 'opendynaset'.

Op zich werkt dit goed, de recordset wordt in de juiste volgorde geopend. Ik heb dan echter het probleem dat er tijdens het inlezen van de waarden in een array (deel van de VBA-code) een error optreedt:

Filesharing lockcounts exceeded. Increase maxlocksperfile registry entry.

Is er een manier om dit te voorkomen? Bij voorkeur zonder het register te editen in verband met het installeren van de applicatie bij klanten.

Begrijp ik het goed dat als ik zorg dat de gegevens in de tabel in de juiste volgorde worden ingevoerd dat ik dan wel het juiste resultaat krijg met 'opentable'?

Alvast bedankt!
 
In een oplossing met ADO (inclusief code) ben ik ook zeker geinteresseerd!!
 
Probeer in onderstaande code eens te spelen met de manier waarop de recordset wordt geopend, mischien dat het de oplossing biedt...

Code:
dim cnn as ADODB.connection
dim rst as new ADODB.recordset

set cnn=currentproject.connection
rst.open <querynaam>, cnn, acOpenDynamic
rst.movefirst
Do
  'Jouw code hier
rst.MoveNext
If rst.EOF Then
  Exit Do
End If
Loop
rst.close
cnn.close
set rst = nothing
set cnn = nothing
 
Ik heb het geprobeerd met deze code, maar ik krijg het niet voor elkaar om op deze manier een recordset te openen. Ik krijg de error 'een variabele is niet gedefineerd'. Er wordt niet aangegeven op welke plaats de eventuele fout zou moeten zitten.

Ik probeer het als volgt:


Dim cnn As ADODB.Connection
Dim rst As New ADODB.Recordset

Set cnn = CurrentProject.Connection
rst.Open "tabelnaam", cnn, adOpenDynamic

Ik heb in de help zitten zoeken, maar ik kom er niet uit. Nog suggesties?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan