Toon posts:

[Access] VBAcode autonummering wijzigen

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

Verwijderd

Topicstarter
Ik ben een studentenadministratie aan het opzetten in Access. Tot nu toe weinig problemen gehad, maar van VBA heb ik weinig kaas gegeten...

1 van de onderdelen van de administratie is het formulier "Student," gekoppeld aan de tabel "Student." Wanneer dit formulier wordt ingevuld wordt gelijk een "Studentnummer" aangemaakt dmv autonummering.
Dit studentnummer is dus oplopend. Tot zo ver geen probleem, echter ieder jaar of eventueel zelfs maand moet dit kunnen worden gewijzigd.
Stel: 1 januari 2007 is het eerste studentnummer 2007001, de 2e student krijgt dan 2007002 etc. Maar in 2008 moeten de studentnummers worden: 2008001, 2008002 etc. Hoop dat dit een beetje duidelijk is?!

Nu kan dit op een vervelende, omslachtige, handmatige manier iedere keer worden aangepast, maar niet door mensen die erg weinig verstand hebben van Access...

Ik wil het op een andere manier oplossen nadat ik een scriptje tegenkwam, die ik kan gebruiken. Ik moet het script echter invullen, maar heb geen idee wat en hoe. Het is misschien heel simpel, maar ik kom er niet uit.

De manier waarop het kan is als volgt:

Ik heb een formulier gemaakt genaamd: "Nieuw volgnummer"
Dit formulier bestaat uit 2 tekstvakken, de 1e is "Hoogste waarde." In dit tekstvak wordt zodra het formulier wordt geopend, gezocht in het formulier "Student" naar het laatste (en tevens het hoogste)
"Studentnummer" en weergegeven, bijvoorbeeld 2007045. Dit vak kan niet worden gewijzigd.
Het tweede vak heet: "Nieuwe waarde." In dit vak moet de nieuwe waarde worden ingevuld, bijvoorbeeld 2008001. Wanneer dan op ok wordt gedrukt dan wordt de autonummering "Studentnummer" aangepast in het formulier "Student" en dus ook in tabel "Student." Athans, zo zou het moeten werken. De macro's kloppen volgens mij?!

Het enige wat ik nu nog nodig heb is een VBA script. Dit heb ik gevonden, maar moet nog naar mijn situatie worden aangepast. Vraag is dus of iemand mij hierbij kan en wil helpen?
Ik hoop niet dat ik gemakzuchtig overkom, maar ik kom er echt niet uit. Hoop dat jullie het verhaal een beetje snappen..

Het VBAscript is:

Function NieuwAutoNummer(Tabelnaam As String, Veldnaam As String, NieuwNummer As Long)

' auteur: Ben Groenendijk maart 2000
' procedure die automatisch een nieuwe beginwaarde aan een veld met autonumering geeft.
' aanroepvoorbeeld: NieuwAutonummer("Klant", "Klantnr", 20000)
' 1ste parameter is de tabelnaam, 2de parameter de veldnaam en de 3de parameter de nieuwe waarde.

'!! Krijgt u een compileer fout tijdens de uitvoering van deze module,
' dan: selecteer via de menubalk Uitvoeren, Beginwaarden. Vervolgens via de menubalk
' Extra, Verwijzingen de optie Microsoft DAO 3.6 Object Library aanvinken.

On Error GoTo NieuwAutoNummerErr

Dim dbsHuidigeDatabase As Database

' Huidige database selecteren.
Set dbsHuidigeDatabase = CurrentDb()

' nieuw record toevoegen aan het bestand met de nieuw gekozen waarde minus de waarde 1 dbsHuidigeDatabase.Execute "INSERT INTO " & Tabelnaam & "(" & Veldnaam & ") VALUES (" _
& NieuwNummer - 1 & ");"

' zojuist toegevoegde record verwijderen. dbsHuidigeDatabase.Execute "DELETE * FROM " & Tabelnaam & " WHERE " & Veldnaam & _
" = " & NieuwNummer - 1 & ";"
Set dbsHuidigeDatabase = Nothing

NieuwAutoNummerExit:
Exit Function

NieuwAutoNummerErr:
Select Case Err
Case 3127
MsgBox "U hebt een niet bestaande veldnaam ingevoerd.", vbCritical, "Foutboodschap"
Case Else
MsgBox "Fout: " & Err & ", " & Error
End Select
Resume NieuwAutoNummerExit
End Function

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Een volgend nummer bepalen is niet zo moeilijk in VBA:
Visual Basic:
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
Option Explicit

Const MAXSTUDENTS As Integer = 1000

Function getYear(studentID As Long) As Integer
    getYear = studentID \ MAXSTUDENTS
End Function

Function generateNewStudentID(previousId As Long, currentYear As Integer) As Long
    If getYear(previousId) = currentYear Then
        generateNewStudentID = previousId + 1
    Else
        generateNewStudentID = CLng(currentYear) * MAXSTUDENTS + 1
    End If
End Function

Sub Test()
    Dim previousId As Long
    Dim currentYear As Integer
    
    previousId = Year(Now) * MAXSTUDENTS + Int(Rnd() * (MAXSTUDENTS / 10 - 2) + 1)
    previousId = CLng(InputBox("Geef oude nummer", "Oude nummer", previousId))
    
    currentYear = Year(Now)
    currentYear = CInt(InputBox("Geef huidige jaar", "Jaar", currentYear))
    
    MsgBox "Als het oude nummer " & previousId & _
           " is, dan wordt het nieuwe nummer in " & _
           currentYear & ": " & _
           generateNewStudentID(previousId, currentYear)
End Sub


offtopic:
Code kan je tussen code-tags zetten (met vb voor highlighting). Als je toch gaat editten, dan kan je in dit geval de code het beste weghalen. Het voegt niets toe.

[ Voor 0% gewijzigd door Daos op 24-04-2007 17:52 . Reden: Integerdeling bij getYear ]