![]() |
Πρόβλημα με κώδικα VBA Χιαρετώ όλους τους φίλους στο φόρουμ, Παραθέτω πιο κάτω έναν κώδικα το οποίο έχω γράψει έτσι ώστε να μπορεί να γίνεται η καταχώρηση κάποιων δεδομένων σε ένα πίνακα αλλά δυστυχώς όσο και να έχω προσπαθήσει δεν έχω καταφέρει να καταλάβω τι συμβαίνει και δεν δουλεύει όπως θα έπρεπε. Παρακαλώ σημειώστε ότι οι γνώσεις μου σε Vba είναι από το κάτι έως το άσχετος.. Λοιπόν, στην πιο κάτω διαδικασία εφόσον ισχύει η πρώτη περίπτωση όπου δηλαδή το πεδίο "SVN1" είναι κενό, να μπορεί πατώντας το command AddPc να καταχωρεί στον πίνακα tblLogin και στο πεδίο SVN1 την συγκεκριμένη τιμή απο τον tblLogSVN. Στην συνέχεια, εάν όμως δεν ισχύει η πρώτη περίπτωση (όπου δηλαδή SVN1 = Null) θα πρέπει να πατώντας το AddPc να καταχωρεί την τιμή του SVN2 εφόσον ισχύει η δεύτερη παράμετρος όπου δηλαδή το SVN1 δεν είναι κενό ή έχει τιμή μεγαλύτερη απο 1. Έχω δοκιμάσει όλες τις εκδοχές αλλά δυστυχώς δεν έχω καταφέρει να βρώ την λύση στο πρόβλημα και έστι ο κώδικας είτε σταματά στο πρώτο σκέλος της διαδικασίας είτε δεν μπορεί να προχωρήσει στο δεύτερο σκέλος. Σας ευχαριστώ εκ προτέρων Private Sub cmdAddPc_Click() If IsNull(Me.SVN1) Or Me.SVN1 = "" Then MsgBox "Message SVN1.!!", vbInformation, "Warning 1" Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("SELECT TOP 2 SVNnumber FROM tblLogSVN") If rs.RecordCount Then rs.MoveFirst Me.SVN1 = rs!SVNnumber Me.Pc1 = True Else If Not IsNull(Me.SVN1) Or Me.SVN1 > 1 Then MsgBox "Message SVN2.!!", vbInformation, "Warning 2" Set rs = CurrentDb.OpenRecordset("SELECT TOP 2 SVNnumber FROM tblLogSVN") If rs.RecordCount Then rs.MoveNext Me.SVN2 = rs!SVNnumber Me.Pc2 = True End If End If End If End If End Sub |
Γιώργη, δοκίμασε κάτι σαν αυτό... Κώδικας: Private Sub cmdAddPc_Click()Με εκτίμηση Νίκος |
Καλησπέρα φίλε Νίκο, Κατά αρχάς σε ευχαριστώ πολύ φίλε μου για την βοήθεια. Δεν έχω ξαναδουλέψει με το Case άρα δεν έχω και την ανάλογη εμπερία περί τούτου. Παρόλα αυτά θα προσπαθήσω να προσαρμόσω τον κώδικα σου στην βάση μου και εάν και εφόσον παραστεί αναγκαίο θα επανέλθω. Σε κάθε περίπτωση σε ευχαριστώ και πάλι πάρα πολύ. |
Νίκο γειά σου και πάλι, Έχω προσαρμώσει τον κώδικα ώς παρουσιάζεται πάρα κάτω αλλά φίλε θέλω να σταματά η διαδικασία εφόσον ισχύει το ένα απο τα δύο σενάρια. Στον κώδικα όπως τον διαμόρφωσα και πάλι εξακολουθεί εφόσον πατήσω μια φορά το command AddPc να βάζει αφενός μέν την πρώτη φορά την πρώτη εγραφή, και αφετέρου εάν ξαναπατήσεις το command προχωρά και βάζει και την δεύτερη εφόσον τα κριτήρια που θέλω ισχύουν και πάλι (εφόσον πλέον το SVN1 δεν είναι κενό και έχει τιμή μεγαλύτερη του >1) Το ζητούμενο είναι να γίνεται disable το command έτσι ώστε μια φορά να μπορεί να λειτουργήσει εφόσον εάν ο κώδικας "τρέξει" για το Case 1 ισχύουν τα δεδομένα, και εφόσον ενημερωθεί ο πίνακας το SVN1 μεταβάλλεται σε Not Null και >1 και έτσι εάν επιχειρήσει κάποιος απο λάθος να πατήσει ξανά το command συνεχίζει (και καλά το κάνει) να τρέχει και το δεύτερο σκέλος του κώδικα. Παραθέτω το κώδικα όπως τον μετέτρεψα: Private Sub cmdAddPc_Click() Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("SELECT TOP 2 SVNnumber FROM tblLogSVN") If rs.RecordCount = 0 Then Exit Sub Select Case True Case IsNull(Me.SVN1) Or Me.SVN1 = "" Me.SVN1 = rs!SVNnumber: Me.Pc1 = True MsgBox "Message SVN1.!!", vbInformation, "Warning 1" Case Not IsNull(Me.SVN1) Or Me.SVN1 > 1 rs.MoveNext Me.SVN2 = rs!SVNnumber Me.Pc2 = True ' Case Else End Select End Sub |
Εσύ ξέρεις τι σχεδιάζεις και εσύ θα βρεις λύση. Εγώ είδα εκείνους τους βρόχους των τεσσάρων if...else...end if και ...έδωσα χέρι βοήθειας. Ήδη έχεις σκέψεις ( ...disable το κουμπί command... ), οπότε καλή συνέχεια Γιώργη... Με εκτίμηση Νίκος |
Καλησπέρα Χωρίς να είμαι σίγουρος ότι κατάλαβα το ζητούμενο, προτείνω να δοκιμάσεις και τον παρακάτω κώδικα: Κώδικας: Private Sub cmdAddPc_Click()Φιλικά/Γιώργος |
1 Συνημμένο(α) Καλημέρα Γιώργο, ¨Εχω δοκιμάσει τον κώδικα που μου έδωσες αλλά και πάλιν δυστυχώς δεν έφτασα στο ζητούμενο. Επειδή αντιλαμβάνομαι ότι μπορεί να σας έχω κάπως συγχίσει με το ζητούμενο, επισυνάπτω ένα παράδειγμα στο οποίο συμπεριλαμβάνω οδηγίες χρήσης έτσι ώστε να μπορέσουμε να φτάσουμε στο ζητούμενο. Θα εκτιμούσα εάν μπορούσε κάποιος φίλος απο το forum μας να "δωσει" τα φώτα του καθώς όπως προανάφερα "υστερώ" απο πλευράς γνώσεων vba. Σας ευχαριστώ εκ προτέρων και είμαι στην διάθεση σας για οποιαδήποτε διευκρίνηση |
Καλησπέρα Γιώργο δοκίμασε και το εξής: Χωρίς καμιά άλλη αλλαγή στον κώδικα του προηγούμενου μηνύματός μου πρόσθεσε την εντολή Exit Sub ακριβώς κάτω από τη γραμμή Me.Pc1=True. |
Καλησπέρα Γιώργο, Επειδή ο κώδικας που μου έστειλες δεν δούλεψε κανονικά σε ότι αφορά το δεύτερο σκέλος του, το άφησα σε: Private Sub cmdAddPc_Click() If IsNull(Me.SVN1) Or Me.SVN1 = "" Then MsgBox "SVN1.!!", vbInformation, "Warning" Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("SELECT TOP 2 SVNnumber FROM tblLogSVN") If rs.RecordCount Then rs.MoveFirst Me.SVN1 = rs!SVNnumber Me.Pc1 = True End If End If If IsNull(Me.SVN2) Or Me.SVN2 = "" And Me.Pc1 = True Then MsgBox " SVN2.!!", vbInformation, "Warning" Set rs = CurrentDb.OpenRecordset("SELECT TOP 2 SVNnumber FROM tblLogSVN") If rs.RecordCount Then rs.MoveNext Me.SVN2 = rs!SVNnumber Me.Pc2 = True End If End If End Sub Εάν θές δοκίμασε το και εσύ στην βάση που έχω επισυνάψει φίλε. Σε ευχαριστώ |
Καλησπέρα Γιώργο, ο κώδικάς σου τρέχει και μάλλον πιστεύεις ότι σε καλύπτει πλήρως, οπότε δεν έχει νόημα η περαιτέρω συζήτηση. Γράφω το κείμενο αυτό, επειδή, κατά τη γνώμη μου, το φόρουμ θα πρέπει να συμβάλλει στη χρήση από τα μέλη του των καλύτερων τεχνικών. Έτσι θα επισημάνω κάποιες αδυναμίες: 1) Η πρόταση δήλωσης βρίσκεται μέσα σε μπλοκ If με αποτέλεσμα, η μεταβλητή rs, άλλοτε να δηλώνεται και άλλοτε όχι. 2) Είναι φλύαρος (επαναλαμβάνει εντολές). Για παράδειγμα.
3) Δεν ελέγχεται αν το rs έχει τουλάχιστον 2 εγγραφές. Αν έχει λιγότερες από 2 το πεδίο SVN2 δεν μπορεί να ενημερωθεί. Τώρα που έγινε πλήρως κατανοητό το ζητούμενο, θα μπορούσε να χρησιμοποιηθεί ο παρακάτω κώδικας. Κώδικας: Private Sub cmdAddPc_Click() |
Αγαπητέ Γιώργο, Ευχαριστώ για τις διευκρινήσεις αλλά και για την οποιαδήποτε βοήθεια. Ωστόσο, υπενθυμίζω πως έχω κατ' επανάληψη σημειώσει ότι : Παραθέτω πιο κάτω έναν κώδικα το οποίο έχω γράψει έτσι ώστε να μπορεί να γίνεται η καταχώρηση κάποιων δεδομένων σε ένα πίνακα αλλά δυστυχώς όσο και να έχω προσπαθήσει δεν έχω καταφέρει να καταλάβω τι συμβαίνει και δεν δουλεύει όπως θα έπρεπε. Παρακαλώ σημειώστε ότι οι γνώσεις μου σε Vba είναι από το κάτι έως το άσχετος.. Δεν φυμίζομαι φίλε Γιώργο για τις γνώσεις προγραμματισμού είτε της access είτε της Vba. ¨Εχω αναφέρει αρκετές φορές σε άλλες δημοσιεύσεις θεμάτων μου ότι : "Άτομα σαν και εσένα ευτυχώς που υπάρχουν στο φόρουμ μας και το κάνουν ακόμη πιο πλούσιο" και με κάθε ευκαρία εκφράζω τις ιδιαίτερες ευχαριστίες μου σε εσένα. Τώρα σε ότι αφορά το σχόλιο σου : Γράφω το κείμενο αυτό, επειδή, κατά τη γνώμη μου, το φόρουμ θα πρέπει να συμβάλλει στη χρήση από τα μέλη του των καλύτερων τεχνικών λυπάμαι που με τις ελλειπή γνώσεις μου σε vba "μπορεί να μήν συμβάλλω τα μέγιστα" έτσι ώστε τα υπόλοιπα παιδιά στο φόρουμ να παραδειγματισθούν "κακός" απο την έλλειψη γνώσεων Vba μου. Σε ευχαριστώ για μια ακόμη φορά για την βοήθεια σου. Θα προσπαθήσω πρώτα να κατανοήσω τον κώδικα φίλε Γιώργο και εφόσον μπορέσω να τον διαμορφώσω για την δική μου περίπτωση σε διαβεβαιώ ότι θα τον χρησιμοποιήσω. |
Γιώργο παραθέτω τον κώδικα σου και θα εκτιμούσα εάν μπορούσες να βοηθήσεις ο κώδικας "κτυπάει" εφόσον στον tblLogSVN δεν υπάρχουν εγραφές.... Καμιά εισήγηση? Dim rs As DAO.Recordset Set rs = CurrentDb.OpenRecordset("SELECT TOP 2 SVNnumber FROM tblLogSVN") rs.MoveLast If rs.RecordCount Then If Nz(Me.SVN1, "") = "" Then rs.MoveFirst Me.SVN1 = rs!SVNnumber Me.Pc1 = True ElseIf Nz(Me.SVN2, "") = "" And rs.RecordCount > 1 Then rs.MoveLast Me.SVN2 = rs!SVNnumber Me.Pc2 = True Else 'Åäþ áíôéìåôùðßæåôáé ç ðåñßðôùóç ðïõ Ý÷ïõí ðñïóôåèåß 2 Pc 'Áí äå ÷ñåéÜæåôáé ôï ôìÞìá Else ìðïñåß íá äéáãñáöåß. MsgBox "Äå ìðïñïýí íá ðñïóôåèïýí Üëëá Pc. Ç åöáñìïãÞ èá êëåßóåé" Application.Quit End If End If End Sub |
Οφείλεται σε λάθος θέση της εντολής rs.MoveLast Τοποθέτησέ την μετά την εντολή IF rs.recordCount Then |
Γιώργο τώρα δούλεψε μια χαρά. Σε περίπτωση κατά την οποία εφόσον αναγνωρισθεί το SvnNumber (με την διαδικασία που εξήγησα) πώς θα μπορούσα να κάνω Append το SvnNumber απο τον tblSVN μέσα στον tblLogSVN μέσω Vba? Σε ευχαριστώ και πάλι |
Καλημέρα Γιώργο σου δόθηκε κώδικας: 1) Για να βρίσκεις το σειριακό αριθμό του σκληρού δίσκου (svnNumber), ενός Pc. 2) Για να αποθηκεύεις τον svnNumber σε πίνακα (tblSVN) μαζί με την ημερομηνία και την ώρα. Με τον ίδιο τρόπο και με μικρή προσαρμογή (αλλαγή του ονόματος του πίνακα) μπορεί να αποθηκευτεί και στον πίνακα tblLogSVN. Σημειώνω ότι ο πίνακας tblLogSVN δε χρειάζεται ξεχωριστό πεδίο για την ώρα (σ’ ένα πεδίο Date/Time μπορεί να αποθηκευτεί και η ημερομηνία και η ώρα). 3) Για να βρίσκεις, αν o svnNumber υπάρχει σε κάποιο πίνακα. 4) Στο παρόν θέμα, κώδικας για τη διαχείριση των πεδίων SVN1, SVN2 του πίνακα tblLogin. Έχω τη γνώμη, ότι διαθέτεις όλα τα απαιτούμενα εργαλεία για να πετύχεις αυτό που θέλεις. Εσύ γνωρίζεις τι ακριβώς θέλεις και εσύ θα πρέπει να συνδυάσεις τα κομμάτια του κώδικα. Φιλικά/Γιώργος |
:thanks:Καλημέρα Γιώργο, Με τον κώδικα μιά χαρά. Η διαφορά σχετικά με την ενημέρωση και του tblLogSVN έγγυτε στο γεγονός ότι με τον κώδικα που παρομοιάζει με την σχετική διαδικασία ενημέρωσης του tblSVN είναι ότι: Εφόσον "τρέξει" η διαδικασία ενημέρωσης του εν λόγο πίνακα (tblSVN ή και tblLogSVN) κάνει overwrite το record και δεν το προσθέτει ώς νέο. Βέβαια στην περίπτωση κατά την οποία ο πίνακας είναι κενός, κανένα πρόβλημα.. Το "πρόβλημα" είναι όταν ένας πίνακας έχει έστω και μια εγραφή... ακριβώς για αυτό τον λόγο ρώτησα εάν και κατά πόσο θα μπορούσα να ενημερώσω τον tblLogSVN με Append Query μέσω Vba.. Σε κάθε περίπτωση σε ευχαριστώ για όλα. Νάσαι καλά και πάντα γερός:thanks: |
Γιώργο, ο κώδικας που δόθηκε: Κώδικας: strSql = "INSERT INTO tblSVN (SvnNumber,DateAdded) VALUES(" & _ |
Γειά σου Γιώργο, Δοκίμασα τον κώδικα που επισυνάπτεις και όντως, έχεις δίκιο. Σε ευχαριστώ για μιά ακόμη φορά. |
| Η ώρα είναι 18:56. |
Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.