Εμφάνιση ενός μόνο μηνύματος
  #4  
Παλιά 01-03-18, 00:20
gmaster Ο χρήστης gmaster δεν είναι συνδεδεμένος
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2007
Γλώσσα λογισμικού Office: Αγγλική
 
Εγγραφή: 28-12-2017
Μηνύματα: 26
Προεπιλογή

Γεια σας και από μένα!

Αν και ίσως να αποτελεί υπερβολή για την περίπτωσή σου Δημήτρη, η πρότασή μου δράττει την ευκαιρία ώστε να ανοίξει το θέμα των συναλλαγών (Transactions) οι οποίες αποτελούν τον πλέον σίγουρο τρόπο διασφάλισης των δεδομένων και των κανόνων μιας εφαρμογής. Όποια αλλαγή και να γίνει μετά την εντολή BeginTrans (Έναρξη συναλλαγής), μπορεί να αναιρεθεί πλήρως από την εντολή Rollback ή να αποθηκευτεί μόνιμα από την εντολή CommitTrans.

Έτσι, η καταχώρηση της τιμής για ένα κατάστημα θα μπορούσε να ανατεθεί στην παρακάτω συνάρτηση:

Κώδικας:
Public Function AppendValue(strKatastima As String, crrPoso As Currency) As Long
    Dim WS As dao.Workspace
    Dim CDB As dao.Database
    Dim lngRet As Long

    lngRet= 0

    If Len(strKatastima) > 0 Then
        Set WS = dao.DBEngine.Workspaces(0)
        Set CDB = CurrentDb
        On Error GoTo ErrHandler
        With WS
            'Έναρξη συναλλαγής
            .BeginTrans
            'Καταχώρηση τιμής
            CDB.Execute "INSERT INTO tblX (POSO, KATASTIMA) VALUES (" _
                              & crrPoso & ", '" & strKatastima & "');", dbFailOnError
            'Έλεγχος αθροίσματος
            If CDB.OpenRecordset("SELECT SUM([POSO]) AS SumP " _
                                       & "FROM tblX GROUP BY KATASTIMA " _
                                       & "HAVING (KATASTIMA='" & strKatastima & "')")![SumP] < 0 Then
                'Αναίρεση αλλαγών λόγω αρνητικού αθροίσματος
                .Rollback
                lngRet= -1
            Else
                'Εφαρμογή αλλαγών
                .CommitTrans
            End If
        End With
    End If
ExitHere:
    'Εκχώρηση επιστρεφόμενης τιμής στη συνάρτηση
    AppendValue = lngRet
    On Error Resume Next
    CDB.Close
    WS.Close
    Set CDB = Nothing
    Set WS = Nothing
    Exit Function
ErrHandler:
    'Αναίρεση αλλαγών λόγω σφάλματος χρόνου εκτέλεσης
    WS.Rollback
    'Εκχώρηση τιμής σφάλματος στη συνάρτηση
    lngRet= Err.Number
    Resume ExitHere
End Function
Ενώ ο χειρισμός της από τη φόρμα Α θα μπορούσε να έχει την παρακάτω μορφή:

Κώδικας:
Private Sub cboKatastimaA_AfterUpdate()
    With Me.POSOA
        If IsNull(.Value) Then
            MsgBox .ValidationText, vbExclamation
            .SetFocus
            Exit Sub
        End If
    End With
    
    With Me.cboKatastimaA
        If IsNull(.Value) Then
            MsgBox .ValidationText, vbExclamation
            .SetFocus
            Exit Sub
        End If
    End With

    Dim lngRet As Long
    lngRet = AppendValue(Me.cboKatastimaA, Me.POSOA)
    If lngRet = 0 Then
        MsgBox "Η καταχώρηση των " & FormatCurrency(Me.POSOA) & " ολοκληρώθηκε με επιτυχία!", vbInformation
    ElseIf lngRet = -1 Then
        'Απόρριψη καταχώρησης λόγω αρνητικού αθροίσματος
        MsgBox "Η καταχώρηση απορρίφθηκε!" & vbCrLf _
               & "Οδηγεί σε αρνητικό άθροισμα για το κατάστημα " & Me.cboKatastimaA, vbExclamation
    Else
        'Απόρριψη καταχώρησης λόγω σφάλματος χρόνου εκτέλεσης
        MsgBox "Η καταχώρηση απορρίφθηκε λόγω απροσδόκητου σφάλματος!" & vbCrLf & vbCrLf _
               & "Σφάλμα :" & lngRet & vbCrLf & Error(lngRet), vbExclamation
    End If
End Sub
Γενικώς, λεπτοί χειρισμοί στα δεδομένα θα πρέπει να γίνονται από όσο το δυνατό λιγότερα σημεία, έτσι ώστε και ο έλεγχος να είναι αποτελεσματικότερος αλλά και η εποπτεία και η συντήρηση ευκολότερη.

Καλή συνέχεια!
Απάντηση με παράθεση