Jag har en Access 2000 databas med ett Formulär. Varje gång en användare hoppar till en ny post med hjälp av bläddringspilarna längst ner så tänkte jag läsa ett värde från den nya posten med hjälp av VBA kod. Jag får dock inte till det riktigt. Värdet jag får kommer från den gamla posten, inte den nya?? Det borde funka om du anropar värdet direkt istället. Precis som Johan skriver. Access kompilerar fält från datastrukture till medlemmar på formulärklassen. Detta ställer till problem om datastrukturen förändras. Kan dessutom ställa till problem om namnet inehåller ogiltliga tecken för en class medlem, t.ex. rs("First Name") blir Me.First_Name.Form_Current i Access 2000
Efter vad jag har läst så skall "Form_Current" köras efter att en ny post valts, så egentligen borde det funka, men det gör det inte. Jag gör alltså någonting galet. Kan någon säga mig vad efter att ha tittat på den lilla exempelkodsnutten nedan?
Private Sub Form_Current()
Dim rs As DAO.Recordset
Dim sName As String
Set rs = Me.Recordset
sName = rs("BLName")Sv: Form_Current i Access 2000
Dvs. Me.{fältnamnet}
Om du sätter ett nytt Recordset till Me.Recordset så tror jag inte den behåller vilken position som var sist.
Det borde betyda att det svar du får är ur den första posten i ditt Recordset?
/JohanSv: Form_Current i Access 2000
Använder du recordsetet så måste du leta fram till rätt post innan du hämtar värdet, därför är det bättre att värdet finns på formuläret.
Om du inte vill att användaren ska se det så ändra kontrollen så att den blir osynlig.Sv: Form_Current i Access 2000
Det är därför bättre att adresera fält från aktul post genom controls collectionen:
<code>
Private Sub Form_Current()
Dim sName As String
If Me.NewRecord Then
Else
sName = "" & Me.Controls("BLName")
End If
End Sub
</code>
Vilket är default medlem på formulärklassen:
<code>
Private Sub Form_Current()
Dim sName As String
If Me.NewRecord Then
Else
sName = "" & Me("BLName")
End If
End Sub
</code>
Du kan även använda dig av recordset, men det känns i ditt fall onödigt:
<code>
Private Sub Form_Current()
Dim rs As DAO.Recordset
Dim sName As String
If Me.NewRecord Then
Else
Set rs = Me.RecordsetClone
rs.Bookmark = Me.Bookmark
sName = "" & rs("BLName")
End If
End Sub
</code>