Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Access 2003 Help

Îåêßíçóå áðü ôï ìÝëïò Christakis. Τελευταία δημοσίευση από το μέλος Christakis στις 10-11-2009, 21:59. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-11-2009, 16:24 54990

    Access 2003 Help

    Χαιρετώ σας

    Ειμαι καινούργιος τόσο στην λίστα όσο και στην Access. Διάβασα πολλά από τα Posts, αλλά δεν βρήκα κάτι που να με βοηθήσει, έτσι παρακαλώ την βοήθειά σας.

    Φτειάχνω μιά εφαρμογή στην Access 2003 English SP2, και σε ένα πεδίο TestID μιάς φόρμας, προσπαθώ να βάλω κώδικα που να μην επιτρέπει τον χρήστη να εισάγει πχ γράμματα, μηδέν, αρνητικές τιμές κλπ, παρά μόνο Θετικούς ακέραιους. Το πεδίο είναι Numeric, not Autonumber Indexed και Dim As Integer. όλα καλά μέχρι εδώ, αλλά όταν εκ παραδρομής αντί γιά 23 εγραψα 2.3, η Access to στρογγυλοποίησε σε 2 και σωστά, και το Msgbox που εχω γιά Duplicate Records μου το επισήμανε. Προσπαθώ να βρώ ένα τρόπο με κώδικα σε κλασική VisualBasic και custom Msgbox να το επισημαίνω στον χρήστη πχ "Ooops.... Decimals", αλλά δεν το έχω καταφέρει. Αντιλαμβάνομαι ότι πρέπει να μπεί  o κώδικας στο BeforeUpdate αλλά όπως προανέφερα δεν μπορώ να τον φτειάξω. Η χρήση του InputMask δεν μου είναι βολική γιατί δεν θα έχω το Msgbox.

    Επίσης, μπορώ να παρακάμψω το default μήνυμα της Access όταν ο χρήστης εισάγει στο ίδιο πεδίο (TestID) χαρακτήρων αντί αριθμών με custom msgbox?

    Κάθε βοήθεια εκτιμητέα, ευχαριστώ εκ των προτέρων.

    Χρήστος. 

     

  •  06-11-2009, 20:25 55008 σε απάντηση της 54990

    Απ: Access 2003 Help

    Με πήγες αρκετά πίσω αλλά κάτι θα κάνουμε για σένα.
    Θες κάτι σαν το παρακάτω που θα το καλείς στο  BeforeUpdate του πεδίου. Το γράφω από μνήμης μην με πυροβολήσεις και σουλούπωσε το. 


     Function IsItOk as Boolean  
    if textbox1.value="" then return false
        If Not IsNumeric(textbox1.value) Then 
             MsgBox "Ooops....
             return false
        ElseIf CSng(textbox1.value)  <> Int(textbox1.value) Then 
            MsgBox "Μόνο ακέραιους1!!!!!!" 
             return fALSE
        End If 
    return true
     End function

    Επίσης για να κρύψεις τα μηνύματα  της Access στο Form load event γράψε αυτό 

    DoCmd.SetWarnings False

    Manos
  •  08-11-2009, 18:07 55044 σε απάντηση της 54990

    Απ: Access 2003 Help

    Αγαπητέ Woody ευχαριστώ γιά την απάντηση και τον χρόνο σου.

    Για κάποιο περίεργο λόγο η "σουλουπώστρα" μου δεν είναι σε φόρμα και κάτι δεν κάνω καλά. Εβαλα τον κώδικα στο BeforeUpdate αλλά η εισαγωγή δεκαδικών δεν δουλεύει. Αν δεν γίνομαι βάρος, παραθέτω τον κώδικα που είχα και ελπίζω να μπορέσης να βγάλης κάτι σαν ποιό έμπειρος. 

    Private Sub TextID_BeforeUpdate(Cancel As Integer)            ' Edited:05Nov09
    On Error GoTo Err_TextID_BeforeUpdate
    If Me!TextID < 1 Then                'Trap any value less than 1
        MsgBox "Format Error!  " & vbCrLf & "Integer Numbers Allowed Only.", vbExclamation,                                                                                                                       Cancel = True
        Me!TextID.Undo
        Me!RecordID.Undo
        SendKeys "{Esc}", True
    ElseIf IsNumeric(Me!TextID) = False Then                              'trap non numeric entries                             
        MsgBox "Format Error! " & vbCrLf &  "Integer Numbers Allowed Only.", vbExclamation, 
        Cancel = True
        Me!TextID.Undo
        Me!RecordID.Undo
        SendKeys "{Esc}", True
    End If                                                                                                                                                                                                                                            End if

    Επίσης, γιά διπλοεγγραφές έχω τον εξής κώδικα στο AfterUpdate

    Private Sub TextID_AfterUpdate()                                         'Edited:03Nov09
    On Error GoTo Err_TextID_AfterUpdate

    Dim rst As DAO.Recordset
    Dim strCriteria As String
    Dim TextID As Integer

    Set rst = Me.RecordsetClone

    If Not Me!TextID = Me.TextID.oldvalue Then                           'Trap Dups
        If rst.NoMatch Then
        Me!NamePrefix.SetFocus
        DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
    Else

        Me!Text380 = Me!TextID
        If (Not IsNull(DLookup("[TextID]", "Equipment", "[TextID] = " & Forms![Equipment]!TextID))) Then
            If (MsgBox("Duplicate Data !" & vbCrLf & "TextID" & "  '' " & Me.[TextID] & " '' " & " has already been Saved in Your Database, Duplicates are NOT Allowed." & vbCrLf & vbCrLf & "Do You wish to Verify the Data in that Record?", vbExclamation + vbYesNo) = vbNo) Then
            Me!TextID.Undo
            Me!RecordID.Undo
            SendKeys "{Esc}", True
            Me!Text380 = ""
            Else
            Me!TextID.Undo
            Me!RecordID.Undo
            SendKeys "{Esc}", True
            DoCmd.GoToRecord acForm, "Equipment", acGoTo, (Me!Text380)
            Me!Text380 = ""
        End If
    End If
    End If
    End If

    Set rst = Nothing

    Exit_TextID_AfterUpdate:
    Exit Sub

    Err_TextID_AfterUpdate:
    MsgBox Err.Description
    Resume Exit_TextID_AfterUpdate

    End Sub

    Tο Snipet που μου έδωσες και ειδικά το τμήμα γιά το
    If CSng(Me!TextID.Value) <> Int(Me!TextID.Value) , δεν ανταποκρίνεται σε Decimals. Θα το δώ περισσότερο αν χρειάζεται κάτι άλλο.

    Ευχαριστώ γιά τον χρόνο σου

    Χρήστος.

  •  09-11-2009, 07:52 55051 σε απάντηση της 55044

    Απ: Access 2003 Help

    Λοιπόν για να δούμε. Καταρχήν δεν έχω περιβάλλον να δοκιμάσω αλλά κάποιες γενικές παρατηρήσεις

    -Βάλε τον έλεγχο σε ένα function ώστε να είναι όσο το δυνατόν reusable

    - Μην χρησιμοποιείς το SendKeys. Είναι αναξιόπιστο

    - Πρώτα κάνεις τον έλεγχο για το isnumeric και μετά πας στα υπόλοιπα.

    - Δεν παίζει αυτό: CSng(Me!TextID.Value) <> Int(Me!TextID.Value), χμ περίεργο. Δοκίμασε τότε με το Instr
    Δηλαδή θα κάνεις string  το Me!TextID.Value και με το instr θα ελέγχεις αν έχει χρησιμοποιήσει "," η "." 
    πχ (δεν έχω περιβάλλον να το δοκιμάσω )

    if inStr(Cstr(Me!TextID.Value,",")<>0 or inStr(Cstr(Me!TextID.Value,".")<>0 then
    MsgBox ..........

    - Μου ήρθε μια άλλη ιδέα μόλις τώρα: Δοκίμασες να βάλεις input mask στο πεδίο. Για δοκίμασε μην γράφουμε όλο αυτό τον κώδικα τσάμπα. Είναι απίστευτο πόσα πράγματα κάνει η Access χωρίς κώδικα. 

    - Τώρα όσον αφορά τα duplicates εγώ ακολουθούσα άλλη στρατηγική. Αν στον πίνακα σου δεν επιτρέπονται το πεδίο είναι unique τότε τον άφηνα να καταχωρεί και το έπιανα στο error event. 

    Αυτά και συγγνώμη αλλά δεν έχω σύστημα για να κάνω verify αυτά που σου λέω. Μόνο από μνήμης. Και ξέρεις τι λένε για τα εγκεφαλικά κύτταρα. Κάθε χρόνο κάτι εκατομμύρια καταστρέφονται :)




    Manos
  •  10-11-2009, 21:59 55110 σε απάντηση της 55051

    Απ: Access 2003 Help

    Αγαπητέ Μάνο, Ευχαριστώ για το χρόνο σου και τις υποδείξεις. Αν θυμάσαι ολα αυτά από μνήμης, τα κύτταρα σου βρίσκονται σε αύξουσα και όχι φθείνουσα κατάσταση.

    Στο θέμα μας τώρα, πάλι δεν έγινε τίποτα με το InStr όπως και με το Csng/Cdbl. Γιά να μην παίζω με την εφαρμογή και να δοκιμάσω σε clean enviroment τα Instr /Csng που μου συνέστησες, εφτιαξα ενα db1 με το Access στα default dbs , δηλαδή ένα πίνακα με δύο πεδία (EmployeeID -Autonumbered-PrimaryKey, EmployeeNumber-Number-Indexed-NoDuplicates) και την αντίστοιχη φόρμα. Έβαλα τον κώδικα όπως είπαμε αλλά καί πάλι δεν έγινε τίποτα. Αλλαξα το DataType στο πεδίο EmployeeNumber του πίνακα από Number σε Text και ω του θαύματος όλα άρχισαν να δουλεύουν σωστά και ταπεινά όπως περίμενες (και περίμενα).Μου άφησε όμως ένα γλυκόπικρο συναίσθημα όταν ξέρω ότι γιά να αλλάξω το DataType στην εφαρμογή θα πρέπει να καταργήσω τις σχέσεις του πίνακα, να αλλάξω το DataType, να αλλάξουν όλες οι φόρμες, αναφορές κλπ που σχετίζονται με το συγκεκριμένο πεδίο, να δημιουργήσω πάλι τις σχέσεις, δoκιμές σε φόρμες, κώδικα κλπ, πολλή δουλειά βλέπω και ο ελεύθερος χρόνος μου δεν νομίζω να με αφήσει. Ετσι, προσβλέπω πάλι να σπαζοκεφαλιάσω στα ίδια με το πεδίο να παραμένει Αριθμητικό, κάτι θα προκύψει ψάχνοντας.

    Την εκδοχή του InputMask, την ανέφερα στο αρχικό μήνυμα,  αν και δεν την θέλω γιατί δεν θα έχω τα custom messages όπως προανέφερα, ισως να αναγκαστώ να την χρησιμοποιήσω τελικά. Ναί έχεις δίκιο, το InputMask και άλλα τεχνάσματα βοηθάνε πάρα πολύ και δεν θέλουν κώδικα, αλλά ο κώδικας έχει άλλη χάρη, κάνει την εφαρμογή ποιό Interactive. 

    Το SendKeys δεν ήξερα οτι είναι αναξιόπιστο, το χρησιμοποιώ γιά την περίπτωση που ο χρήστης σε NewRecord αλλάξει γνώμη καί αφήσει κενά τα RecordId, TestID που θέλω να μήν αφήσει την Access να κάνει Delete το Record και αυξάνει το Autonumber χωρίς λόγο.Ισως υπάρχει άλλος τρόπος να γίνεται αυτό αλλά δεν .......ξέρω κάτι (ακόμα).

    Γιά τα Dups, και πάλι το custom msg is driving me αλλά έχεις δίκιο ίσως να είμαι λίγο αυστηρός(?) με τον χρήστη(ες) λόγω της φύσης της εφαρμογής.

    Πάλι στο πεδίο και ψάξιμο γιά κώδικα που θα λύσει το πρόβλημα. Πάντως σε ευχαριστώ γιά τις υποδείξεις και το χρόνο σου. Αν σκεφτείς ή βρείς κάτι σχετικό (ή μη σχετικό αν πρόκειται γιά συμβουλές) πάντα ευπρόσδεκτος.

    Ευχαριστώ, Χρήστος 

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems