Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια! |
| Εργαλεία Θεμάτων | Τρόποι εμφάνισης |
#1
| |||
| |||
Πρόβλημα με κώδικα 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 |
#2
| ||||
| ||||
Γιώργη, δοκίμασε κάτι σαν αυτό... Κώδικας: 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 2η συνθήκη < κάνε ότι λέει κώδικας ...» case else <αν δεν ισχύουν οι συνθήκες 1η και 2η, κάνε τα εξής...> End select End Sub Με εκτίμηση Νίκος Τελευταία επεξεργασία από το χρήστη Meteora : 05-10-14 στις 20:09. |
#3
| |||
| |||
Καλησπέρα φίλε Νίκο, Κατά αρχάς σε ευχαριστώ πολύ φίλε μου για την βοήθεια. Δεν έχω ξαναδουλέψει με το Case άρα δεν έχω και την ανάλογη εμπερία περί τούτου. Παρόλα αυτά θα προσπαθήσω να προσαρμόσω τον κώδικα σου στην βάση μου και εάν και εφόσον παραστεί αναγκαίο θα επανέλθω. Σε κάθε περίπτωση σε ευχαριστώ και πάλι πάρα πολύ. |
#4
| |||
| |||
Νίκο γειά σου και πάλι, Έχω προσαρμώσει τον κώδικα ώς παρουσιάζεται πάρα κάτω αλλά φίλε θέλω να σταματά η διαδικασία εφόσον ισχύει το ένα απο τα δύο σενάρια. Στον κώδικα όπως τον διαμόρφωσα και πάλι εξακολουθεί εφόσον πατήσω μια φορά το 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 |
#5
| ||||
| ||||
Εσύ ξέρεις τι σχεδιάζεις και εσύ θα βρεις λύση. Εγώ είδα εκείνους τους βρόχους των τεσσάρων if...else...end if και ...έδωσα χέρι βοήθειας. Ήδη έχεις σκέψεις ( ...disable το κουμπί command... ), οπότε καλή συνέχεια Γιώργη... Με εκτίμηση Νίκος |
#6
| |||
| |||
Καλησπέρα Χωρίς να είμαι σίγουρος ότι κατάλαβα το ζητούμενο, προτείνω να δοκιμάσεις και τον παρακάτω κώδικα: Κώδικας: Private Sub cmdAddPc_Click() 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 End If If Nz(Me.SVN2, "") = "" And rs.RecordCount > 1 Then rs.MoveLast Me.SVN2 = rs!SVNnumber Me.Pc2 = True End If End If End Sub Φιλικά/Γιώργος |
#7
| |||
| |||
Καλημέρα Γιώργο, ¨Εχω δοκιμάσει τον κώδικα που μου έδωσες αλλά και πάλιν δυστυχώς δεν έφτασα στο ζητούμενο. Επειδή αντιλαμβάνομαι ότι μπορεί να σας έχω κάπως συγχίσει με το ζητούμενο, επισυνάπτω ένα παράδειγμα στο οποίο συμπεριλαμβάνω οδηγίες χρήσης έτσι ώστε να μπορέσουμε να φτάσουμε στο ζητούμενο. Θα εκτιμούσα εάν μπορούσε κάποιος φίλος απο το forum μας να "δωσει" τα φώτα του καθώς όπως προανάφερα "υστερώ" απο πλευράς γνώσεων vba. Σας ευχαριστώ εκ προτέρων και είμαι στην διάθεση σας για οποιαδήποτε διευκρίνηση |
#8
| |||
| |||
Καλησπέρα Γιώργο δοκίμασε και το εξής: Χωρίς καμιά άλλη αλλαγή στον κώδικα του προηγούμενου μηνύματός μου πρόσθεσε την εντολή Exit Sub ακριβώς κάτω από τη γραμμή Me.Pc1=True. |
#9
| |||
| |||
Καλησπέρα Γιώργο, Επειδή ο κώδικας που μου έστειλες δεν δούλεψε κανονικά σε ότι αφορά το δεύτερο σκέλος του, το άφησα σε: 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 Εάν θές δοκίμασε το και εσύ στην βάση που έχω επισυνάψει φίλε. Σε ευχαριστώ |
#10
| |||
| |||
Καλησπέρα Γιώργο, ο κώδικάς σου τρέχει και μάλλον πιστεύεις ότι σε καλύπτει πλήρως, οπότε δεν έχει νόημα η περαιτέρω συζήτηση. Γράφω το κείμενο αυτό, επειδή, κατά τη γνώμη μου, το φόρουμ θα πρέπει να συμβάλλει στη χρήση από τα μέλη του των καλύτερων τεχνικών. Έτσι θα επισημάνω κάποιες αδυναμίες: 1) Η πρόταση δήλωσης βρίσκεται μέσα σε μπλοκ If με αποτέλεσμα, η μεταβλητή rs, άλλοτε να δηλώνεται και άλλοτε όχι. 2) Είναι φλύαρος (επαναλαμβάνει εντολές). Για παράδειγμα.
3) Δεν ελέγχεται αν το rs έχει τουλάχιστον 2 εγγραφές. Αν έχει λιγότερες από 2 το πεδίο SVN2 δεν μπορεί να ενημερωθεί. Τώρα που έγινε πλήρως κατανοητό το ζητούμενο, θα μπορούσε να χρησιμοποιηθεί ο παρακάτω κώδικας. Κώδικας: Private Sub cmdAddPc_Click() 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 |
« Προηγούμενο Θέμα
|
Επόμενο Θέμα »
| |
Παρόμοια Θέματα | ||||
Θέμα | Δημιουργός | Forum | Απαντήσεις | Τελευταίο Μήνυμα |
[VBA] Πρόβλημα με error σε κώδικα | kolekas | Excel - Ερωτήσεις / Απαντήσεις | 3 | 11-05-16 20:14 |
[VBA] Πρόβλημα σε κώδικα | xristos | Excel - Ερωτήσεις / Απαντήσεις | 5 | 16-03-16 18:43 |
Πρόβλημα σε κώδικα vba | ΑΛΕΞΙΑ | Access - Ερωτήσεις / Απαντήσεις | 1 | 12-10-15 17:05 |
Πρόβλημα με μεγάλο κώδικα...!!!! | γιώργοςΚ | Access - Ερωτήσεις / Απαντήσεις | 3 | 09-05-15 14:13 |
Πρόβλημα σε κώδικα | jimrenoir | Access - Ερωτήσεις / Απαντήσεις | 2 | 10-05-11 15:50 |
Η ώρα είναι 15:13.