Acces VB Hoe kom ik vanuit VB in Acces Tabellen

Pagina: 1
Acties:
  • 727 views sinds 30-01-2008
  • Reageer

  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Hallo Tweakers,

Het is voor mij al weer een tijdje geleden dat ik f***ing VB moest proggen, maar nu moet ik via de acces variant van VB tabellen kunnen bekijken velden kunnen opvragen en kunnen wegschrijven. met de documentatie van VB en de help functie kom ik er niet uit, deze documenteert namelijk niets van de acces functies.

Iemand die weet hoe dit kan (dus lezen uit en schrijven naar acces tabellen, en als het even kan ook sql query's uitvoeren). Voorbeelden ter verduidelijking zijn welkom.

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 24-07 17:37
Zoek eens naar de term recordset op het internet (of dit forum). Er is heel veel informatie te vinden, maar je moet wel de juiste termen weten. Recordset is zo'n term. SQL kun je uitvoeren door het commando DoCmd.runSQL ()

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Ik heb inmiddels al wel wat gevonden waar ik verder mee kom,
Set rsMyRS = dbMyDB.OpenRecordSet("MyTable", dbOpenDynaset)

Hiervoor moet er alleen een (dbMyDB) variabele van het type Database gemaakt worden en die bestaat niet in de access variant van VB. Nu is mijn wraag weet iemand de naam van de ?Database Constante? van de geopende database in access waar het form bij hoort?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-07 18:23

Gerco

Professional Newbie

In de Access variant van VB heet de huidige Database CurrentDb. Je kan dus dit doen:
code:
1
CurrentDb.Execute "blaat

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Even wat coding vanuit een Word Macro van waaruit ik ook een Access database benader. Hiervoor moest ik wel eerst de Acces library erinhangen...

code:
1
2
3
4
5
6
7
8
9
Dim WS As Workspace
Dim RS As Recordset
Dim DB As Database

Set WS = CreateWorkspace("", "admin", "", dbUseJet)
Set DB = WS.OpenDatabase("c:\temp\database.mdb")
Set RS = DB.OpenRecordSet("Tabel", magjezelfweten)

endanderest...


Misschien dat je er wat aan hebt... (of niet). ;)

Vlinders moet je volgen, niet vangen...


  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 24-07 17:37
Een voorbeeld hoe ik altijd een recordset binnen vba aanmaak;

code:
1
2
3
4
5
6
7
8
9
10
Dim db As Database
Dim strSQL As String
Dim rst As Recordset
    
Set db = CurrentDb
            
strSQL = "SELECT * " & _
              "FROM tabel" & _
              "WHERE blaat = blaat"
Set rst = db.OpenRecordset(strSQL)

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Allen bedankt voor de zeer helpzame informatie, ik heb nu nog een probleem,

Set agendaSet = CurrentDb.OpenRecordset("Agenda", dbOpenDynaset)

Deze regel levert een error, Ongeldig argument. De tabel Agenda bestaat in deze DB, ik heb ook al een keer geprobeert of het aan de naam Agenda zelf lag en deze hernoemt naar Agendatabel, maar dit had geen resultaat.

agendaSet is van het type Recordset

Als ik het argument dbOpenDynaset weghaal, dan krijg ik de error "typen komen niet overeen" op de zelfde regel

[ Voor 14% gewijzigd door TygeR op 22-06-2006 12:04 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

"Accessvariant van VB" = VBA Met de A van Applications ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
dbOpenDynaset = een constante. Is die bekend? Wat is de huidige code nu?

Vlinders moet je volgen, niet vangen...


  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Huidige Code:

Sub AgendaBijwerken(Datum As Date)
Dim errorID As Integer
errorID = 100
On Error GoTo Err_AgendaBijwerken

Dim agendaSet As recordSet
Dim numberOfRecords As Long
Dim test As String
errorID = 101

Set agendaSet = CurrentDb.OpenRecordset("Agenda")
errorID = 103

If Not agendaSet.EOF Then agendaSet.MoveFirst
errorID = 104
Do While Not agendaSet.EOF
errorID = 105
agendaSet.Find "Startdatum = Datum", , adSearchForward
test = test & agendaSet!Onderwerp
TestLabel.Caption = test
errorID = 106
Loop

errorID = 107

Exit_AgendaBijwerken:
Exit Sub

Err_AgendaBijwerken:
MsgBox Err.Description & "(" & errorID & ")", vbCritical
Resume Exit_AgendaBijwerken

End Sub

  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Heb je nou al een referentie naar die database of niet? CurrentDB werkt volgens mij alleen in VBA in een Access-database namelijk (ook ik kan 't fout hebben).
Zolang je die nog niet hebt kan je niets met recordsets...

Sorry, ik heb jou starttopic niet goed begrepen en dacht dat je in VB richting een access-database moest, maar ik begrijp nu dat je al in een access-database zit...

[ Voor 32% gewijzigd door PaulZ op 22-06-2006 12:14 ]

Vlinders moet je volgen, niet vangen...


Verwijderd

TygeR schreef op donderdag 22 juni 2006 @ 11:50:
Allen bedankt voor de zeer helpzame informatie, ik heb nu nog een probleem,

Set agendaSet = CurrentDb.OpenRecordset("Agenda", dbOpenDynaset)

Deze regel levert een error, Ongeldig argument. De tabel Agenda bestaat in deze DB, ik heb ook al een keer geprobeert of het aan de naam Agenda zelf lag en deze hernoemt naar Agendatabel, maar dit had geen resultaat.

agendaSet is van het type Recordset

Als ik het argument dbOpenDynaset weghaal, dan krijg ik de error "typen komen niet overeen" op de zelfde regel
Welke versie van Access hebben we het hier over ? de nieuwere versies gebruiken namelijk ADO i.p.v DAO, en kennen geen dbOpenDynaset !

  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Als je wel DAO wilt gebruiken:
In vba-venster, Extra, Verwijzingen, vink 'Microsoft DAO x.xx Object Library' en zorg dat ie boven 'Microsoft ActiveX Data Objects' in het rijtje komt te staan...

Vlinders moet je volgen, niet vangen...


Verwijderd

PaulZ schreef op donderdag 22 juni 2006 @ 12:17:
Als je wel DAO wilt gebruiken:
In vba-venster, Extra, Verwijzingen, vink 'Microsoft DAO x.xx Object Library' en zorg dat ie boven 'Microsoft ActiveX Data Objects' in het rijtje komt te staan...
of de verwijzing toevoegen en expliciet opgeven :
code:
1
  dim rs as DAO.RecordSet

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:05
Misschien is het goed om te zeggen dat DAO vreselijk achterhaald is en niet verder ontwikkeld wordt door MS.

Overstappen op ADO lijkt me een goede eerste stap

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Ik denk dat de DB idd al op ADO draaid, maar moet ik dan op een andere manier recordset gebruiken?

Nog even voor de duidelijkheid als ik die DbOpenDynaset weg haal dan zeurt hij nogsteeds over de typen die niet overeen komen, (lijkt alsof een van bijde geen recordset is)

Verwijderd

TygeR schreef op donderdag 22 juni 2006 @ 13:13:
Ik denk dat de DB idd al op ADO draaid, maar moet ik dan op een andere manier recordset gebruiken?

Nog even voor de duidelijkheid als ik die DbOpenDynaset weg haal dan zeurt hij nogsteeds over de typen die niet overeen komen, (lijkt alsof een van bijde geen recordset is)
DIM je Recordset eens expliciet als ADODB.recordset

BTW, kleine tip....zet regelnummers in je code, en je kunt in je errorhandler de ongedocumenteerde functie ERL() gebruiken. Dan hoef je niet iedere keer je errorID te zetten.

  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Hmm als ik agendaRecordset declareer als ADODB.Recordset dan krijg ik de fout, Fout bij gegevenstypeconversie.

Suggesties?

Misschien ook wel handig, het gaat hier om Access 2002.

[ Voor 20% gewijzigd door TygeR op 22-06-2006 13:50 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

TygeR schreef op donderdag 22 juni 2006 @ 12:04:
code:
1
    Set agendaSet = CurrentDb.OpenRecordset("Agenda")
Dit is code die gebruik maakt van de DAO bibliotheek. Op zich niks mis mee; voor eenvoudige mdb-desktop databases is DAO eenvoudig, krachtig en snel. Maar DAO wordt idd niet verder ontwikkeld en als je er weinig of niks vanaf weet zou ik het fijn links laten liggen.

M.a.w. vergeet de voorbeeldcode die je gevonden hebt en ga eens op zoek naar ADO-objecten om tabellen in een access-database te benaderen. Het DAO-database object is vergelijkbaar met het ADO connection object; de functionaliteit van dao.currentdb vind je bij ADO terug onder currentproject.connection. Als je in de helpfile van Access op ADO zoekt kom je waarschijnlijk al een aardig eind. :)

Al met al heeft het dus niet zoveel van doen met f*cking VBA oid: je zit gewoon verschillende bibliotheken door elkaar te haspelen. currentdb.openrecordset levert een DAO-recordset en die probeer jij in aan een ADO recordset toe te wijzen. En dat zal niet lukken, nee. ;)

offtopic:
Access topics komen beter tot hun recht in het onvolprezen officesuites en -software forum ;)

[ Voor 11% gewijzigd door Lustucru op 22-06-2006 14:01 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Hoe kan ik controleren of ik met een ADO of een DAO dbase werk? DAO lijkt mij wenselijk, het is een DB met ruim 100.000records.

Kan ik ook het een in het ander omzetten?

Verwijderd

TygeR schreef op donderdag 22 juni 2006 @ 14:04:
Hoe kan ik controleren of ik met een ADO of een DAO dbase werk? DAO lijkt mij wenselijk, het is een DB met ruim 100.000records.

Kan ik ook het een in het ander omzetten?
TygeR schreef op donderdag 22 juni 2006 @ 13:49:
Hmm als ik agendaRecordset declareer als ADODB.Recordset dan krijg ik de fout, Fout bij gegevenstypeconversie.

Suggesties?

Misschien ook wel handig, het gaat hier om Access 2002.
ADO code voor je probleem ( let op, ik doe dit 1 keer )
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub AgendaBijwerken( Datum As Date )
  Dim AgendaSet As adodb.recordset
  Dim strSQL As String  
  
10  On Error GoTo ErrHandler
  
20  Set AgendaSet = New adodb.recordset
    
30  strSQL = "Select onderwerp from Agenda where startdatum = #" & format(datum,"yyyy-MM-dd") & "#"
40  AgendaSet.open strSQL,currentproject.connection
50  If Not AgendaSet.eof Then
60    Testlabel.caption = AgendaSet.recordset.fields("Onderwerp").value
70    rs.close
80  End If
90  Set RS = Nothing
  
ErrHandler:
100  MsgBox "Fout in regel " & erl & vbcrlf & err.number & " : " & err.description
  
End Sub

LET OP : Deze code is ongetest, en kan nog fouten bevatten.

[edit] Haakjes om AgendaSet.open weggehaald

[ Voor 6% gewijzigd door Verwijderd op 22-06-2006 14:24 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Je werkt met een Access database. Die wordt bestuurd met de jetengine. Je benadert hem mbv ADO of met DAO of desnoods met alletwee door elkaar, als je van prutsen houdt. DAO/ADO is dus geen eigenschap van de database, maar zijn objecten die databases ontsluiten voor andere talen.

Een voorbeeldje op dezelfde access database
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub daoFind()
    Dim rs As DAO.Recordset
    
    Set rs = CurrentDb.OpenRecordset("blaat", dbOpenDynaset)
    rs.FindFirst "id=1"
    If Not rs.NoMatch Then
        MsgBox rs!blaattekst
    End If
    
 End Sub
 'of

 Sub adoFind()
    Dim rs As ADODB.Recordset
    
    Set rs = New ADODB.Recordset
    rs.Open "blaat", CurrentProject.Connection, adOpenKeyset
    rs.Find "id=1"
    If Not rs.EOF Then
        MsgBox rs!blaattekst
    End If
    
 End Sub

[ Voor 3% gewijzigd door Lustucru op 22-06-2006 14:21 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Heb de Sub nu herschreven voor ADO:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Sub AgendaBijwerken(Datum As Date)
    Dim errorID As Integer
    errorID = 100
On Error GoTo Err_AgendaBijwerken
        
    Dim agendaSet As ADODB.recordSet
    Set agendaSet = New ADODB.recordSet
    
    Dim test As String
    errorID = errorID + 1
    
    agendaSet.Open "Agenda", CurrentProject.Connection
    errorID = errorID + 1
        
    If Not agendaSet.EOF Then agendaSet.MoveFirst
    errorID = errorID + 1
    Do While Not agendaSet.EOF
        errorID = errorID + 1
        agendaSet.Find "Startdatum = " & Datum
        errorID = errorID + 1
        test = test & agendaSet!Onderwerp
        errorID = errorID + 1
        TestLabel.Caption = test
        errorID = errorID + 1
    Loop
    
    errorID = errorID + 1
    
    agendaSet.Close
    Set agendaSet = Nothing
    
Exit_AgendaBijwerken:
    Exit Sub

Err_AgendaBijwerken:
    MsgBox Err.Description & "(" & errorID & ")", vbCritical
    agendaSet.Close
    Set agendaSet = Nothing
    Resume Exit_AgendaBijwerken
    
End Sub

Hij komt een stuk verder ErrorID=104 en de fout is nu: Voor de rijenset wordt achterwaarts doorlopen niet ondersteund?

Deze snap ik niet? 'tis zoiezo al zeer gebrekkig Nederlands

[ Voor 4% gewijzigd door TygeR op 22-06-2006 14:32 ]


Verwijderd

je opent je recordset als Forward only.

Mijn versie van de code al geprobeerd ?

[ Voor 38% gewijzigd door Verwijderd op 22-06-2006 14:42 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

ALs je in je VBA editor op een keyword gaat staan en op F1 ramt krijg je context help. Dan lees je bij recordset open:
CursorType
Optional. A CursorTypeEnum value that determines the type of cursor that the provider should use when opening the Recordset. The default value is adOpenForwardOnly.
Aangezien je geen cursor opgeeft mag je dus niet achteruit. :)
Anders gezegd, installeer die help maar, je zult hem nog meer nodig hebben. 't is niet de bedoeling dat je elke error die je krijgt hier dropt voor een oplossing als je de oplossing zo kunt vinden door de bijbehorende manual een keer te nemen.
FFrenzy schreef op donderdag 22 juni 2006 @ 14:40[/message]:
je opent je recordset als Forward only.

Mijn versie van de code al geprobeerd ?
@Die opent ook met een defaultcursor ;)


offtopic:
zoiezo gebrekkig nederlands? sowieso!

[ Voor 36% gewijzigd door Lustucru op 22-06-2006 14:53 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 28-07 13:26

Creepy

Tactical Espionage Splatterer

Niesje schreef op donderdag 22 juni 2006 @ 13:58:
offtopic:
Access topics komen beter tot hun recht in het onvolprezen officesuites en -software forum ;)
Your wish is my command :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Niesje schreef op donderdag 22 juni 2006 @ 14:46:
@Die opent ook met een defaultcursor ;)
Maar omdat ik de selectie al in de SQL doe, is een ForwardOnly recordset goed genoeg ;)

  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Ik heb inmiddels ook al de code van FFrenzy geprobeert, waarbij het lezen werkt (geen fouten daarin) en denk dat ik er nu wel uit kom, Bedankt allemaal voor jullie snelle hulp.

Verwijderd

TygeR schreef op donderdag 22 juni 2006 @ 14:54:
Ik heb inmiddels ook al de code van FFrenzy geprobeert, waarbij het lezen werkt (geen fouten daarin) en denk dat ik er nu wel uit kom, Bedankt allemaal voor jullie snelle hulp.
:) , goed om te horen....maar SNAP je ook wat ik in die code doe ?

Let er trouwens ook op dat ik in mijn code alleen het onderwerp uit het allereerste record in de caption zet, en niet alle onderwerpen aan elkaar geplakt zoals jij in jouw code doet.
Pagina: 1