www.MsAccess.gr

Δικός μας AutoNumber

•There are no translations available.•

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

•Last Updated on ••Wednesday•, 24 •December• 2008 11:36••