Florian Dąbkowski

Florian Dąbkowski Quality Engineer,
Alps Electric

Temat: Operacje na Recordset

witam,

Mam zdefiniowany Recordset:
    Set con = New ADODB.Connection
Set con = CurrentProject.Connection
Set rs = New ADODB.Recordset

rs.Open txtSQL, con
Do Until rs.EOF
Set rs = con.Execute(strUP)
rs.MoveNext
Loop
rs.Close
con.Close
Set con = Nothing
Set rs = Nothing

Za pomocą którego chcę uaktualnić pola w tabeli. Ogólnie wszystko działa, tzn. dla wybranego zestawu rekordów zmieniam wartość pól, tylko że na samym końcu wyskakuje mi Run-time error '3704' operation is not allowed when the object is closed.
Program wywala się w lini rs.MoveNext
Nie jestem pewien czy we właściwy sposób wywołuję kwerendę UPDATE "strUP"

Poproszę o pomoc.
Pozdrawiam
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Operacje na Recordset

Linijka

Set rs = con.Execute(strUP)


nadpisuje Ci recordset po którym robisz pętle...
A najbardziej prawdopodbne, że ten update nie zwraca recordsetu...
Florian Dąbkowski

Florian Dąbkowski Quality Engineer,
Alps Electric

Temat: Operacje na Recordset

A tak prościej, można, proszę :)
Florian Dąbkowski

Florian Dąbkowski Quality Engineer,
Alps Electric

Temat: Operacje na Recordset

Tak dla pełnego zrozumienia podłączam pełen kod procedury:


Private Sub cmdAdd_Click()
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim daDate As Date
Dim strZm As String
Dim txtSQL As String
Dim strSQL As String
Dim strUP As String

daDate = InputBox("Podaj datę w formacie RRRR-MM-DD")
strZm = InputBox("Podaj numer zmiany")

txtSQL = "SELECT tblCzesc.ID_Czesc, tblCzesc.Czesc, tblCzesc.maszyna, tblCzesc.zmiana, tblCzesc.data" & _
" FROM tblCzesc" & _
" WHERE (((tblCzesc.data) Is Null))"

strUP = "UPDATE tblCzesc SET tblCzesc.zmiana = '" & strZm & "', tblCzesc.data = '" & daDate & "'" & _
" WHERE (((tblCzesc.data) Is Null))"

Set con = New ADODB.Connection
Set con = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.CursorLocation = adUseClient

rs.Open txtSQL, con
rs.MoveFirst
Do Until rs.EOF
Set rs = con.Execute(strUP)
rs.MoveNext
Loop
rs.Close
con.Close
Set rs = Nothing
Set con = Nothing
End Sub
Florian Dąbkowski edytował(a) ten post dnia 21.09.12 o godzinie 13:33
Michał Dziubek

Michał Dziubek Programista,
INFORM\'1

Temat: Operacje na Recordset

Prościej:

rs to pączek, rekord to 1 gryz

w swoim kodzie robisz coś takiego
1. bierz pączka
2. robisz gryz (jesteś w pierwszym rekordzie)
3. poczym zamieniasz tego pączka na nic (nothing), linijka cytowana przezemnie
4. chcesz wziąść nastepnego gryza...

Kod przekomlikowany nie muszisz robi rekordsetu aby wykonać update możesz tak
Private Sub cmdAdd_Click()
Dim daDate As Date
Dim strZm As String
Dim strUP As String

daDate = InputBox("Podaj datę w formacie RRRR-MM-DD")
strZm = InputBox("Podaj numer zmiany")


strUP = "UPDATE tblCzesc SET tblCzesc.zmiana = '" & strZm & "', tblCzesc.data = '" & daDate & "'" & _
" WHERE (((tblCzesc.data) Is Null))"

currentproject.connection.Execute strUP
End Sub


Przy metodzie z recordsetem powinno to wygladać tak:

Private Sub cmdAdd_Click()
Dim rs As ADODB.Recordset
Dim daDate As Date
Dim strZm As String
Dim txtSQL As String

daDate = InputBox("Podaj datę w formacie RRRR-MM-DD")
strZm = InputBox("Podaj numer zmiany")

txtSQL = "SELECT tblCzesc.ID_Czesc, tblCzesc.Czesc, tblCzesc.maszyna, tblCzesc.zmiana, tblCzesc.data" & _
" FROM tblCzesc" & _
" WHERE (((tblCzesc.data) Is Null))"


Set rs = New ADODB.Recordset
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.CursorLocation = adUseClient

rs.Open txtSQL, CurrentProject.Connection
rs.MoveFirst
Do Until rs.EOF
rs!data = daDate
rs!zmiana = strZM
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Michał Dziubek edytował(a) ten post dnia 21.09.12 o godzinie 13:56

Następna dyskusja:

DAO recordset - liczenie re...




Wyślij zaproszenie do