[VBA] Iets mis met ADO Recordset Opslaan

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

  • tennis-boy
  • Registratie: December 2004
  • Laatst online: 07-09-2025
Hebben jullie een idee waarom hij niet wilt opslaan (na wijzigingen)? Mis ik iets?
Het betreft een code voor VBA Access. Ik krijg geen foutmelding.

Sub OpslaanToernooiTabel()

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Set cnn = CurrentProject.Connection

With rst
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenKeyset
.LockType = adLockPessimistic
.Source = "SELECT * FROM tblDraw WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
.Open
End With

Dim SpelerID As String, Speler As String, Seed As String, Toernooi As String

For i = 1 To 32
rst!Speler = [Forms]![frmToernooi]("cboSpeler" & i).Value
rst!Seed = [Forms]![frmToernooi]("txtSeed" & i).Value
rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
Next

rst.Update
rst.Close


With rst
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenKeyset
.LockType = adLockPessimistic
.Source = "SELECT * FROM tblToernooi WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
.Open
End With

Dim WinnaarID As String, Winnaar As String

For j = 1 To 31
rst!Winnaar = [Forms]![frmToernooi]("cboWinnaar" & j).Value
rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
Next

rst.Update
rst.Close

msgbox Prompt:="De gegevens zijn opgeslagen!", _
Buttons:=vbInformation, _
Title:="Opgeslagen!"

End Sub

[ Voor 17% gewijzigd door tennis-boy op 02-12-2004 15:16 ]


  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

En wat is de foutmelding precies? ;)

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • tennis-boy
  • Registratie: December 2004
  • Laatst online: 07-09-2025
zwippie schreef op donderdag 02 december 2004 @ 15:15:
En wat is de foutmelding precies? ;)
Geen foutmelding. ;) En geen problemen met compileren. :)

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Bedoel je dat je records niet in de tabel worden opgeslagen of dat je vba-code niet wordt opgeslagen in de module?
(Ik wil wel helpen hoor, maar het is fijn om een duidelijke omschrijving van het probleem te hebben ;) )

Mocht het het eerste zijn, ik denk dat je misschien deze constructie moet gebruiken:
Visual Basic:
1
2
3
4
5
6
7
8
 For j = 1 To 31
rst.AddNew
rst!Winnaar = [Forms]![frmToernooi]("cboWinnaar" & j).Value
rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
rst.Update
Next

rst.Close

[ Voor 39% gewijzigd door zwippie op 02-12-2004 15:29 ]

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 18-05 19:46

JWolters

Killing Me Killing You

in
code:
1
2
3
4
5
For i = 1 To 32
  rst!Speler = [Forms]![frmToernooi]("cboSpeler" & i).Value
  rst!Seed = [Forms]![frmToernooi]("txtSeed" & i).Value
  rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
Next

overschrijf je steeds de waarde in de recordset met de waarde van de combobox en zal alleen de waarde van de laatste combobox bewaard worden

Time is my only fear, an enemy of Sand


  • tennis-boy
  • Registratie: December 2004
  • Laatst online: 07-09-2025
zwippie schreef op donderdag 02 december 2004 @ 15:24:
Bedoel je dat je records niet in de tabel worden opgeslagen of dat je vba-code niet wordt opgeslagen in de module?
(Ik wil wel helpen hoor, maar het is fijn om een duidelijke omschrijving van het probleem te hebben ;) )

Mocht het het eerste zijn, ik denk dat je misschien deze constructie moet gebruiken:
Visual Basic:
1
2
3
4
5
6
7
8
 For j = 1 To 31
rst.AddNew
rst!Winnaar = [Forms]![frmToernooi]("cboWinnaar" & j).Value
rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
rst.Update
Next

rst.Close
Ik kan de gegevens op de comboboxen niet opslaan in de tabel. Geen AddNew want deze zijn al in de tabel, maar ik moet ze alleen wijzigen.
En ik sla ze in twee verschillende tabellen op: in tblDraw en tblToernooi, vandaar voor tblDraw cboSpeler en voor tblToernooi cboWinnaar.

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 18-05 19:46

JWolters

Killing Me Killing You

je kiest bij het openen van de recordset slechts voor één record met gegevens via de where-clause. Ik ken de database structuur niet, maar ik verwacht dat ieder toernooi zijn eigen record kent.

Het lijkt erop dat dat de tabel tblDraw drie velden kent: Speler, Seed en Toernooi, de tabel tblToernooi twee: Winnaar en Toernooi.

Dit is dezelfde code herschreven:
code:
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
42
43
44
Sub OpslaanToernooiTabel()
    
    Dim rst As ADODB.Recordset
    
    set rst = New ADODB.Recordset
    
    With rst
        .ActiveConnection = CurrentProject.Connection
        .CursorType = adOpenKeyset
        .LockType = adLockPessimistic
        .Source = "SELECT speler,seed,toernooi FROM tblDraw WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
        .Open

'       For i = 1 To 32
'           .fields("Speler").value = [Forms]![frmToernooi]("cboSpeler" & i).Value
'           .fields("Seed").value = [Forms]![frmToernooi]("txtSeed" & i).Value
'           .fields("Toernooi").value = [Forms]![frmToernooi]![cboToernooi].Value
'       Next
        
        .fields("Speler").value = [Forms]![frmToernooi]("cboSpeler32").Value
        .fields("Seed").value = [Forms]![frmToernooi]("txtSeed32").Value
        .update
        
        .Close

        .Source = "SELECT winnaar,toernooi FROM tblToernooi WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
        .Open

'       For j = 1 To 31
'           .fields("Winnaar").value = [Forms]![frmToernooi]("cboWinnaar" & j).Value
'           .fields("Toernooi").value = [Forms]![frmToernooi]![cboToernooi].Value
'       Next

        .fields("Winnaar").value = [Forms]![frmToernooi]("cboWinnaar31").Value
        .Update
        
        .Close
    End With    
    
    msgbox Prompt:="De gegevens zijn opgeslagen!", _
        Buttons:=vbInformation, _
        Title:="Opgeslagen!"

End Sub

Time is my only fear, an enemy of Sand


  • tennis-boy
  • Registratie: December 2004
  • Laatst online: 07-09-2025
JWolters, hee erg bedankt met je hulp, maar zo te zien worden de gegevens toch niet opgeslagen. Sterker nog, de eerste veld cboSpeler1 werd zomaar eruitgegooid.
Jammer dat ik hier geen bestandje kan posten.

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

JWolters schreef op donderdag 02 december 2004 @ 19:45:
code:
1
.fields("Winnaar").value = [Forms]![frmToernooi]("cboWinnaar31").Value
Lol. Dat is inderdaad gelijkwaardige code, maar vast niet wat ie zoekt. ;)

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Ik denk dat je iets zoekt in de trant van:
Visual Basic:
1
2
3
4
5
6
7
8
9
.Source = "SELECT speler,seed,toernooi FROM tblDraw WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
.Open

While Not rs.EOF
    If .fields("Speler").value > 0 And .fields("Speler").value < 33 Then
        .fields("Seed").value = [Forms]![frmToernooi]("txtSeed" & .fields("Speler").value).Value
        .fields("Toernooi").value = [Forms]![frmToernooi]![cboToernooi].Value
    End If
Wend

Hey, I came here to be drugged, electrocuted and probed, not insulted.


Verwijderd

moet je niet met recordset.edit doen:

code:
1
2
3
4
5
6
7
8
For j = 1 To 31
rst.edit
rst!Winnaar = [Forms]![frmToernooi]("cboWinnaar" & j).Value
rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
rst.Update
Next

rst.Close

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Verwijderd schreef op donderdag 02 december 2004 @ 23:05:
moet je niet met recordset.edit doen:
Nee, niet in VB. Wel in C++. Dat zijn de enige twee talen waarmee ik dit wel eens heb gedaan. Oh wacht, ik zie net dat dit VBA is. Nou ja, zal wel net als VB gaan.

Hey, I came here to be drugged, electrocuted and probed, not insulted.


Verwijderd

In vba kan het zeker met .edit (doe het geregeld)

Maar is het niet zo dat de je naar de volgende regel in de recordset moet gaan anders schrijft hij alles over elkaar heen. Het wordt dan zo:

code:
1
2
3
4
5
6
7
For j = 1 To 31
  rst.edit
  rst!Winnaar = [Forms]![frmToernooi]("cboWinnaar" & j).Value
  rst!Toernooi = [Forms]![frmToernooi]![cboToernooi].Value
  rst.Update
  rst.movenext
Next

  • tennis-boy
  • Registratie: December 2004
  • Laatst online: 07-09-2025
Haploid, bedankt voor je voorbeeld maar het werkt niet. Sterker nog, het programma liep vast nadat ik je codes heb gebruikt. Blijkbaar kwam het in oneindig lus of zo.

En inderdaad bij ADO Recordset heb je geen rst.Edit nodig, bij DOA Recordset wel.

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

tennis-boy schreef op donderdag 02 december 2004 @ 23:32:
Haploid, bedankt voor je voorbeeld maar het werkt niet. Sterker nog, het programma liep vast nadat ik je codes heb gebruikt. Blijkbaar kwam het in oneindig lus of zo.

En inderdaad bij ADO Recordset heb je geen rst.Edit nodig, bij DOA Recordset wel.
Oh ja, shit, dat doe ik elke keer. Er hoort natuurlijk nog een MoveNext in de while-loop. Anders is die inderdaad vrij oneindig. |:(
Visual Basic:
1
2
3
4
5
6
7
8
9
10
.Source = "SELECT speler,seed,toernooi FROM tblDraw WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
.Open

While Not rs.EOF
    If .fields("Speler").value > 0 And .fields("Speler").value < 33 Then
        .fields("Seed").value = [Forms]![frmToernooi]("txtSeed" & .fields("Speler").value).Value
        .fields("Toernooi").value = [Forms]![frmToernooi]![cboToernooi].Value
    End If
    .MoveNext
Wend

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • tennis-boy
  • Registratie: December 2004
  • Laatst online: 07-09-2025
JWolters, bedankt voor de moeite maar helaas werkt deze code niet.
Ik ben weer terug naar rst!... en geen .fields meer en met rst!... werd toch opgeslagen naar de tabellen maar niet altijd. Ik snap het niet. Ik denk dat het probleem ligt met EOF en BOF (of zo).
Ik heb EOF en BOF op True en False gezet en dan werden ze af en toe geschreven naar de tabel.

code:
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
42
43
44
45
46
47
48
49
Sub OpslaanToernooiTabel()

Dim rst As New ADODB.Recordset
Set rst = New ADODB.Recordset

With rst
    .ActiveConnection = CurrentProject.Connection
    .CursorType = adOpenKeyset
    .LockType = adLockOptimistic
    .Source = "SELECT * FROM tblDraw WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
    .Open

    If .EOF = False And .BOF = True Then
        
    For i = 1 To 32
        !Speler = [Forms]![frmToernooi]("cboSpeler" & i).Value
        !Seed = [Forms]![frmToernooi]("cboSeed" & i).Value
        .MoveNext
    Next i
      
    .Update
    End If
    .Close
End With

With rst
    .ActiveConnection = CurrentProject.Connection
    .CursorType = adOpenKeyset
    .LockType = adLockOptimistic
    .Source = "SELECT * FROM tblToernooi WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
    .Open

    If .EOF = True And .BOF = False Then
            
    For j = 1 To 31
        !Winnaar = [Forms]![frmToernooi]("cboWinnaar" & j).Value
        .MoveNext
    Next j
    
    .Update
    End If
    .Close
End With

msgbox Prompt:="De gegevens zijn gewijzigd!", _
        Buttons:=vbInformation, _
        Title:="Gewijzigd!"
        
End Sub

  • JWolters
  • Registratie: Maart 2001
  • Laatst online: 18-05 19:46

JWolters

Killing Me Killing You

Om het iets eenvoudiger te maken zou je eens de velden van de tabellen kunnen beschrijven en een afdruk van het invoerformulier plaatsen.

Ik vermoed dat je een invoer scherm hebt ('frmToernooi''). Hierop staan 32 comboxen "cboSpeler", 31 comboboxen "cboWinnaar", 32 tekstvelden "txtSeed" en één combobox "cboToernooi".

Je kiest waarschijnlijk het toernooi via cboToernooi waarna je de Spelers, Seed en Winnaar aanpast. Deze aanpassingen wil je terugzetten in de DB.

Je geeft zelf aan dat de gegevens al aanwezig zijn, dus een .EOF kan niet van toepassing zijn.

Zet eens een watch op de waarde van een van de velden die je gaat wijzigen in de loop en kijk wat er gebeurt (je zult zien dat dezelfde waarde steeds overschreven wordt, zoals ik eerder gepost heb en nogmaals werd opgemerkt door Haploid ;) )

Even voortborduren op de code van Haploid:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
.Open "SELECT speler,seed,toernooi FROM tblDraw WHERE Toernooi = '" & [Forms]![frmToernooi]("cboToernooi") & "'"
For i = 1 To 32
    .filter = "Speler='" & [Forms]![frmToernooi]("cboSpeler" & i).Value  "'"
    if not .eof then
        .fields("Seed").value = [Forms]![frmToernooi]("txtSeed" & i).Value
'       deze hoeft niet omdat dit al in de where-clause staat
'       .fields("Toernooi").value = [Forms]![frmToernooi]![cboToernooi].Value
        .update

    endif
Next
.filter = vbnullstring


Zelf werk ik liever met update statements:
Visual Basic:
1
2
3
4
for i = 1 to 32
    '   gegevens zijn aanwezig
    CurrentProject.Connection.Execute "update tblDraw set seed='" & [Forms]![frmToernooi]("txtSeed" & i).Value & "' where toernooi='" & [Forms]![frmToernooi]("cboToernooi") & "' and speler='" & [Forms]![frmToernooi]("cboSpeler" & i).Value  "'"
next i


Maar de vraag blijft wat je nu exact wilt doen...

Time is my only fear, an enemy of Sand

Pagina: 1