Recordset findfirst and edit

Status
Niet open voor verdere reacties.

Matjes

Gebruiker
Lid geworden
21 jun 2016
Berichten
76
Onderstaand een functie welke een versienummer verhoogd in Access. De VBA code werkt echter niet als ik een record wil editen met findfirst:

De foutmelding is 3251: "De bewerking is niet beschikbaar voor dit object (komt vanaf de procedure welke deze functie aanroept".

Code:
Public Function Version(lngID As Long)

On Error GoTo ErrorHandler

    Set dbs = CurrentDb
    Set tdfs = dbs.TableDefs
    Set rst = dbs.OpenRecordset("tblCSD")

    intNo = Nz(DMax("[Versie]", "tblCSD", "[CSD_ID] = " & lngID), 0)
    
    Debug.Print "No. " & intNo
    strNextNo = CStr(intNo + 1)
    Debug.Print "Next No. " & strNextNo
    
    strSearch = "[CSD_ID] = " & lngID

    
    With rst
        .FindFirst strSearch
        If .NoMatch = False Then
            .Edit
            ![Versie] = strNextNo
            .Update
            .Close
        End If
        .Close
    End With
   
ErrorHandlerExit:
   Exit Function

ErrorHandler:
        MsgBox "Error No: " & Err.Number & "; Description: " & Err.Description
        Resume ErrorHandlerExit
  
End Function


Met de volgende code lukt het wel maar volgens mij zou dit op deze manier niet hoeven, iemand een idee wat er bovenstaand mis gaat?

Code:
Public Function Version(lngID As Long)

On Error GoTo ErrorHandler

    Set dbs = CurrentDb
    Set tdfs = dbs.TableDefs
    Set rst = dbs.OpenRecordset("tblCSD")

    intNo = Nz(DMax("[Versie]", "tblCSD", "[CSD_ID] = " & lngID), 0)
    
    Debug.Print "No. " & intNo
    strNextNo = CStr(intNo + 1)
    Debug.Print "Next No. " & strNextNo
    
    strSearch = "[CSD_ID] = " & lngID
    
    With rst
        If Not .BOF And Not .EOF Then
            .MoveLast
            .MoveFirst
                Do While (Not .EOF)
                    If ![CSD_ID] = lngID Then
                        .Edit
                        ![Versie] = strNextNo
                        .Update
                        .Close
                        GoTo ErrorHandlerExit
                    End If
                .MoveNext
            Loop
        End If
        .Close
    End With

   
ErrorHandlerExit:
   Exit Function

ErrorHandler:
        MsgBox "Error No: " & Err.Number & "; Description: " & Err.Description
        Resume ErrorHandlerExit
  
End Function
 
Ik zou geen van de 2 functies gebruiken, maar deze:
Code:
Public Function Version(lngID As Long)
On Error GoTo ErrorHandler
Dim rst As DAO.Recordset
    
    iNextNo = Nz(DMax("[Versie]", "tblCSD", "[CSD_ID] = " & lngID), 0) + 1
    Set rst = CurrentDb.OpenRecordset("SELECT [Versie] FROM tblCSD WHERE [CSD_ID] = " & lngID)
    With rst
        If .RecordCount > 0 Then
            .Edit
            ![Versie] = iNextNo
            .Update
        End If
        .Close
    End With
   Exit Function

ErrorHandler:
    MsgBox "Error No: " & Err.Number & "; Description: " & Err.Description
  
End Function
En je kan de code ook nog eens in één keer lezen, zo zonder die nodeloze lege regels :D
 
Hi Octafish, bedankt voor de code, werkt prima en dat ruimt weer lekker op :)

Nog wel een andere uitdaging. Ik zou de versie graag willen ophogen met 0,1 en weergeven als 0.1, 0.2, 1.0 enz. Dus met een punt i.p.v. een komma. Met notatie op het formulier, of format in VBA lukt dit nog niet. De Windows eigenschappen aanpassen is geen optie.

Nog ideeën?
 
Nog steeds op basis van het veld lngID?
Lijkt mij niet zo moeilijk:
Code:
Public Function Version(lngID As Long)
On Error GoTo ErrorHandler
Dim rst As DAO.Recordset
Dim dblNextNo As Double
    
    dblNextNo = Nz(DMax("[Versie]", "tblCSD", "[CSD_ID] = " & lngID), 0) + 0.1
    Set rst = CurrentDb.OpenRecordset("SELECT [Versie] FROM tblCSD WHERE [CSD_ID] = " & lngID)
    With rst
        If .RecordCount > 0 Then
            .Edit
            ![Versie] = Format(dblNextNo, "0.0")
            .Update
            .Close
        End If
        .Close
    End With
   Exit Function

ErrorHandler:
    MsgBox "Error No: " & Err.Number & "; Description: " & Err.Description
  
End Function
 
Hi Octafish,

Hartelijk dank voor de code. Met het toepassen van de double begint het op een oplossing te lijken. Op de formulieren en rapporten (en in de tabellen) wordt nog wel een komma gepresenteerd i.p.v. een punt. Heb nog deze code geprobeerd op het formulier alleen dan wijzigt het getal:

Code:
Me.txtVersie = Replace(Me.txtVersie, ",", ".")

Nog aanvullende ideeën om in de formulieren en rapporten een punt te presenteren i.p.v. de komma?

Alvast dank!
 
Punt en komma zijn natuurlijk bepalende elementen in een getal; die kun je niet zomaar omwisselen zonder dat je de waarde van het getal verandert. Als je dit echt wilt doorzetten (persoonlijk zou ik er niet aan beginnen, maar goed) dan moet je een tekstveld gebruiken en geen getalveld. In een tekstveld maakt het niet uit wat er staat, en dan kun je Replace dus prima gebruiken. Maar dan is rekenen uiteraard uit den boze, en dat is nu juist het mooie van getallen :).
 
Hi Octafish,

Ben nog even aan het proberen geslagen met als resultaat een werkend geheel met onderstaande code.

Is het overigens nog aan te bevelen om de Replace(CStr(Val(Nz(Dlookup ... regel eerst in een string variabele te plaatsen of kan dit prima op onderstaande manier?

[Versie] wordt nu twee keer opgevraagd, éénmaal in de recordset en éénmaal met Dlookup. Kan dit nog vereenvoudigd worden? (ik probeer de code maar zo kort mogelijk te houden :))

Code:
Public Function Version(lngID As Long)
On Error GoTo ErrorHandler

    Set rst = CurrentDb.OpenRecordset("SELECT [Versie] FROM tblCSD WHERE [CSD_ID] = " & lngID)
    With rst
        If .RecordCount > 0 Then
            .Edit
            ![Versie] = Replace(CStr(Val(Nz(DLookup("Versie", "tblCSD", "[CSD_ID] = " & lngID), 0)) + 0.1), ",", ".")
            .Update
        End If
        .Close
    End With
   
ErrorHandlerExit:
   Exit Function

ErrorHandler:
        MsgBox "Error No: " & Err.Number & "; Description: " & Err.Description
        Resume ErrorHandlerExit
  
End Function
 
Laatst bewerkt:
Tuurlijk; ik snap eerlijk gezegd niet waarom je een waarde die je al weet ook nog eens opzoekt!
Code:
            !Versie = Replace(CStr(Val(Nz(!Versie, 0)) + 0.1), ",", ".")
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan