Någon som kan hjälpa mig att gör en räknare i Access97. Interna räknaren använder inte högsta nummret. Utan en internt idnummer. För det kan blir problem med högsta nummret i fleranvändarmiljö om det används fel. Var sätter jag in koden?? Utvecklar du i vb eller Access? Om du har ett formulär som är bundet till T_Kunder tabellen så kommer dena funktion att fungera.Egen räknare.
Jag vill inte använda Access egna räknare.
Utan jag vill använda Movelast funktion eller liknade.
Funktionen som jag vill ha är högsta numret + 1 vid ny post.
MVH
DaltonSv: Egen räknare.
Om du skapar funktionen i Acces97 kan du använda denna funktion:
Public Function NextID(TableName As String, FieldName As String)
Dim db As Database
Dim rsTemp As Recordset
Set db = CurrentDb
Set rsTemp = db.OpenRecordset("SELECT Max(" & FieldName & ") FROM " & TableName, dbOpenSnapshot)
If rsTemp.BOF And rsTemp.EOF Then
NextID = 1
Else
If IsNull(rsTemp(0)) Then
NextID = 1
Else
NextID = rsTemp(0) + 1
End If
End If
End Function
ADO alternativ:
Public Function NextID(Connection AS ADODB.Connection,TableName As String, FieldName As String)
Dim rsTemp As ADODB.Recordset
Set rsTemp = Connection.Execute("SELECT Max(" & FieldName & ") FROM " & TableName, dbOpenSnapshot)
If rsTemp.BOF And rsTemp.EOF Then
NextID = 1
Else
If IsNull(rsTemp(0)) Then
NextID = 1
Else
NextID = rsTemp(0) + 1
End If
End If
End FunctionSv: Egen räknare.
Så här ser min tabell ut
Databas > T_Kunder, kolumnnamn > Nummer, ett formulär "F_Kunder" som är kopplat till T_Kunder och när jag trycker på knappen Ny så skall ett nytt nummer skapas.
Så här tycker jag det skall se ut men vad gör jag för fel??
Private Sub Knapp_Ny_Kund_Click()
Public Function NextID(T_Kunder As String, nummer As String)
Dim db As Database
Dim rsTemp As Recordset
Set db = CurrentDb
Set rsTemp = db.OpenRecordset("SELECT Max(" & nummer & ") FROM " & T_Kunder, dbOpenSnapshot)
If rsTemp.BOF And rsTemp.EOF Then
NextID = 1
Else
If IsNull(rsTemp(0)) Then
NextID = 1
Else
NextID = rsTemp(0) + 1
End If
End If
End Function
End Sub
MVH DaltonSv: Egen räknare.
Här är ett exempel i VB med DAO(Har inte kollat syntax och sånt).
Private Sub Knapp_Ny_Kund_Click()
Dim RecID as long
Dim rsTemp As Recordset
Dim db As Database
Set db = OpenDataabase("c:\databas.mdb")
Set rsTemp = db.openrecordset("T_Kunder",dbopendynaset)
rsTemp.addnew
rsTemp("nummer") = NextID(db)
rsTemp.update
End Sub
Public Function NextID(db As Database)
Dim rsTemp As Recordset
Set rsTemp = db.OpenRecordset("SELECT Max(nummer) FROM T_Kunder", dbOpenSnapshot)
If rsTemp.BOF And rsTemp.EOF Then
NextID = 1
Else
If IsNull(rsTemp(0)) Then
NextID = 1
Else
NextID = rsTemp(0) + 1
End If
End If
End FunctionSv: Egen räknare.
Anledningen till att placera NextID i BeforeUpdate är för att inga dubletter skall skapas. Tänk att du skapar en post som får 55(Högsta posten är 54) smtidigt skapar en annan användare också en ny post som också får 55(Efter somm 54 forfarande är högsta posten). Vilket kommer ge dubletter när de sparar sina poster. Om man istället ger posten sitt nummer först när det sparas blir risken försummbar.
Private Sub Form_BeforeUpdate(Cancel As Integer)
If NewRecord Then
Nummer = NextID()
End If
End Sub
Public Function NextID()
Dim db As Database
Dim rsTemp As Recordset
Set db = CurrentDb
Set rsTemp = db.OpenRecordset("SELECT Max(nummer) FROM T_Kunder", dbOpenSnapshot)
If rsTemp.BOF And rsTemp.EOF Then
NextID = 1
Else
If IsNull(rsTemp(0)) Then
NextID = 1
Else
NextID = rsTemp(0) + 1
End If
End If
End Function