H Access όπως γνωρίζουμε μας δίνει την δυνατότητα σε ένα πεδίο ενός πίνακα να επιλέξουμε το AutoNumber ως επιλογή τύπου πεδίου. Το AutoNumber όμως είναι ως λειτουργία του προβληματικό. Δηλαδή με την επεξεργασία που κάνουμε σε μία εγγραφή όταν δεν την αποθηκεύσουμε αλλά πατήσουμε πχ ESC τότε ο αριθμός του AutoNumber έχει ήδη δεσμευτεί και μεταβαίνοντας σε νέα εγγραφή δεν μας δίνει το σύστημα Autonumber τον σωστό αριθμό αλλά 2 αριθμούς μετά. Με δεύτερο Esc μεταβαίνει στον 3 αριθμό κοκ.
Μπορούμε να διορθώσουμε το Autonumber αν κλείσουμε τον πίνακα και την βάση και ξανά ανοίξουμε και δώσουμε εγγραφή καινούργια. Όμως επειδή αυτό είναι φανερό ότι δεν είναι λειτουργικό μεταβαίνουμε στην επιλογή να κατασκευάσουμε μία συνάρτηση που θα μας επιστρέφει τον σωστό αριθμό.
Παρακάτω δημοσιεύουμε 2 συναρτήσεις οι οποίες θα πρέπει να εισαχθούν σε ένα Module και θα καλούνται από το Event Before Insert της Φόρμας (Πριν δηλαδή εισαχθεί μία καινούργια εγγραφή).
Κώδικας για Εισαγωγή στο Module
Public Function CustAutoNum(FormFieldID, TableName As String, Optional StartNum, Optional StepNum As Long) As Integer
' © Ηλιάδης Κωνσταντίνος : http://www.MsAccess.gr
' Κώδικας Ελεύθερος προς Ιδιωτικό χρήση.
' FormFieldID : Το Όνομα του πεδίου της φόρμας στο οποίο θέλουμε να εφαρμόσουμε
' την αύξουσα αρίθμηση
' TableName : Το όνομα του πίνακα που αντιστοιχεί στην ιδιότητα RecordSource της ' φόρμας.
' StartNum : Αριθμός που δηλώνει την έναρξη αρίθμησης
' StepNum : Βήμα, κατά πόσο θα αυξάνει ο αριθμός
If IsMissing(StartNum) Then
CustAutoNum = Nz(DMax(FormFieldID, TableName), 0) + Nz(StepNum, 1)
Else
CustAutoNum = Nz(DMax(FormFieldID, TableName), StartNum - Nz(StepNum, 1)) + Nz(StepNum, 1)
End If
End Function
Καλούμε τον κώδικα στο BeforeInsert της Φόρμας με ένα παράδειγμα στο οποίο το όνομα πεδίου της φόρμας είναι το ID και ο πίνακας ο Customers. Ξεκινά η αρίθμηση από το 10 και αυξάνει κατά 1.
Private Sub Form_BeforeInsert(Cancel As Integer)
Me.ID = CustAutoNum("ID", "Customers", 10, 1)
End Sub
Η δεύτερη συνάρτηση είναι αυτή που βρίσκει και την σπασμένη σειρά και δίνει τον αριθμό που λείπει. Πχ. στην σειρά 1,2,4,5,6 δεν θα δώσει τον 7 αλλά το 3. Όλοι οι παράμετροι είναι
Formcr Το όνομα της φόρμα που στο οποίο θα εφαρμοστεί η τρέχουσα αρίθμηση, Το frmObj που είναι το πεδίο-αντικείμενο (πχ Textbox ), Ο πίνακας table και το πεδίο του πίνακα που θα γράφεται το ID (Αύξων αρίθμηση).
Public Function FCustomCounter(Optional formcr As Form, Optional frmobj, Optional table, Optional field As String)
' Before Insert Form_Event
' Dim formcr As Form, frmobj As Object, table, field As String
' Set frmobj = Me.customerid
' Set formcr = Screen.ActiveForm
' table = "O Πινακας"
' field = "ID Πίνακα"
' Call Fcustomcounter(formcr, frmobj, table, field)
Dim nstart, first As Variant
nstart = 1
Set rstcounter = New ADODB.Recordset
Dim count, last, flast, fist As Variant
Set rstcounter = CurrentDb.OpenRecordset("select * FROM " & table & " ORDER BY " & field)
If rstcounter.BOF = True And rstcounter.EOF = True Then
frmobj = 1
Exit Function
End If
rstcounter.MoveLast
count = rstcounter.RecordCount
last = rstcounter.Fields(field)
flast = last - nstart + 1
If count flast Then
rstcounter.MoveFirst
first = rstcounter.Fields(field)
If first > 1 Then
frmobj = 1
GoTo Endlabel
End If
Do Until count = first
Dim curnum As Variant
rstcounter.MoveNext
curnum = rstcounter.Fields(field)
first = first + 1
If curnum first Then
frmobj = first
rstcounter.Requery
Exit Do
End If
Loop
GoTo Endlabel
End If
Dim vforms As Form
frmobj = last + 1
Endlabel:
rstcounter.Close
Set rstcounter = Nothing
End Function
| •<• •Prev• |
|---|

