Ανανέωση ιστοσελίδας
ms-office.gr > Forum > Microsoft Access > Access - Ερωτήσεις / Απαντήσεις > Αποφυγή διπλοεγγραφών κατα την μεταφορά δεδομένων από πίνακα σε πίνακα

Access - Ερωτήσεις / Απαντήσεις Access + VBA... Εδώ δεν υπάρχουν όρια!

Απάντηση στο θέμα

 

Εργαλεία Θεμάτων Τρόποι εμφάνισης
  #1  
Παλιά 22-02-13, 00:10
Όνομα: Αλέξανδρος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2013
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 22-01-2010
Περιοχή: ΑΡΤΑ
Μηνύματα: 521
Προεπιλογή Αποφυγή διπλοεγγραφών κατα την μεταφορά δεδομένων από πίνακα σε πίνακα

Καλησπέρα !!! στη κοινότητα.

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

Φιλικά/Αλέξανδρος
Συνημμένα Αρχεία
Τύπος Αρχείου: zip ΓΕΝΙΚΕΣ_ΑΣΦΑΛΕΙΕΣ.zip (115,4 KB, 35 εμφανίσεις)
Απάντηση με παράθεση
  #2  
Παλιά 22-02-13, 09:37
Όνομα: Αλέξανδρος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2013
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 22-01-2010
Περιοχή: ΑΡΤΑ
Μηνύματα: 521
Προεπιλογή

Καλημέρα στη κοινότητα!!

Στο παρακάτω κώδικα με κόκκινο συμπληρωμένο μας ελέγχει ότι για κάθε δηλωθέν στοιχείο που επιλέγουμε να κάνει έλεγχο εάν υπάρχει το ίδιο.
Αλλά Συνεχίζει το πρόβλημα με τις διπλοεγγραφές. Έχω αφαιρέσει από την λίστα το customer_id διότι μου έκανε debug.
1.Τι κώδικα πρέπει να συμπληρώσω εάν χρειάζεται ;
2. Ή στους πίνακες μήπως θέλει κάποιο ευρετήριο να αλλάξω ή πρωτεύον κλειδί ;
Κάτι δεν κάνω σωστά.
Γνωρίζει κάποιο μέλος για βοήθεια;

Κώδικας:
Private Sub Εντολή16_Click()

    Dim db As Database
    Dim rs As Recordset
    Dim ctl As Control
    Dim varItem As Variant

    Set db = CurrentDb
    Set rs = db.OpenRecordset("client")
    Set ctl = Me.Lista0

    For Each varItem In ctl.ItemsSelected
    
    rs.AddNew
    'rs!customer_id = Me.Lista0.Column(1, varItem)
    rs!Etos_asfalisis = Me.Lista0.Column(1, varItem)
    rs!Categories = Me.Lista0.Column(2, varItem)
    rs!code = Me.Lista0.Column(3, varItem)
    rs!arsimb = Me.Lista0.Column(4, varItem)
    rs!arth = Me.Lista0.Column(5, varItem)
    rs!date = Me.Lista0.Column(6, varItem)
    rs!name = Me.Lista0.Column(7, varItem)
    rs!lastname = Me.Lista0.Column(8, varItem)
    rs!epagelma = Me.Lista0.Column(9, varItem)
    rs!afm = Me.Lista0.Column(10, varItem)
    rs!doy = Me.Lista0.Column(11, varItem)
    rs!odos1 = Me.Lista0.Column(12, varItem)
    rs!arithmos1 = Me.Lista0.Column(13, varItem)
    rs!orofos1 = Me.Lista0.Column(14, varItem)
    rs!poli1 = Me.Lista0.Column(15, varItem)
    rs!tk1 = Me.Lista0.Column(16, varItem)
    rs!til1 = Me.Lista0.Column(17, varItem)
    rs!odos2 = Me.Lista0.Column(18, varItem)
    rs!arithmos2 = Me.Lista0.Column(19, varItem)
    rs!orofos2 = Me.Lista0.Column(20, varItem)
    rs!poli2 = Me.Lista0.Column(21, varItem)
    rs!tk2 = Me.Lista0.Column(22, varItem)
    rs!til2 = Me.Lista0.Column(23, varItem)
    rs!coment = Me.Lista0.Column(24, varItem)
    rs!HmerGenesis = Me.Lista0.Column(25, varItem)
    rs!email = Me.Lista0.Column(26, varItem)
    rs!Hm_ekdosis_Diplomatos = Me.Lista0.Column(27, varItem)
    rs!Sinidioktitis = Me.Lista0.Column(28, varItem)
    Me.Form.Requery
    
    rs.Update
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Next varItem

        For Each varItem In ctl.ItemsSelected
        ctl.Selected(varItem) = False

 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Next varItem
    
    MsgBox "ΟΚ... Τα επιλεγμένα δεδομένα καταχωρήθηκαν", vbInformation

    rs.Close
    Set rs = Nothing
    Set db = Nothing

End Sub
Φιλικά

Αλέξανδρος
Απάντηση με παράθεση
  #3  
Παλιά 22-02-13, 13:10
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλημέρα

Αλέξανδρε θα σου πρότεινα την παρακάτω λύση:

1) Στη φόρμα να προσθέσεις ένα κουμπί πχ cmdInsertClients και στο συμβάν κλικ να προσθέσεις τον παρακάτω κώδικα:
Κώδικας:
Private Sub cmdInsertClients_Click()
    Dim strINTO As String, strWHERE As String, strSQL As String, strIn As String
    
    On Error GoTo ErrHandler
    strIn = InToList
    If strIn = "()" Then
        MsgBox "Δεν έγινε επιλογή στοιχείων"
        Exit Sub
    End If
    strINTO = "INSERT INTO cliend ( Etos_asfalisis, Categories, code, arsimb, arth, " _
            & "[date], name, lastname, epagelma, afm, doy, odos1, arithmos1, orofos1, " _
            & "poli1, tk1, til1, odos2, arithmos2, orofos2, poli2, tk2, til2, coment, " _
            & "HmerGenesis, email, Hm_ekdosis_Diplomatos, Sinidioktitis ) "
    
    strSQL = "SELECT Melontiki_Pelates.Etos_asfalisis, Melontiki_Pelates.Categories, " _
            & "Melontiki_Pelates.code, Melontiki_Pelates.arsimb, Melontiki_Pelates.arth, " _
            & "Melontiki_Pelates.date, Melontiki_Pelates.name, Melontiki_Pelates.lastname, " _
            & "Melontiki_Pelates.epagelma, Melontiki_Pelates.afm, Melontiki_Pelates.doy, " _
            & "Melontiki_Pelates.odos1, Melontiki_Pelates.arithmos1, Melontiki_Pelates.orofos1, " _
            & "Melontiki_Pelates.poli1, Melontiki_Pelates.tk1, Melontiki_Pelates.til1, " _
            & "Melontiki_Pelates.odos2, Melontiki_Pelates.arithmos2, Melontiki_Pelates.orofos2, " _
            & "Melontiki_Pelates.poli2, Melontiki_Pelates.tk2, Melontiki_Pelates.til2, " _
            & "Melontiki_Pelates.coment, Melontiki_Pelates.HmerGenesis, Melontiki_Pelates.email, " _
            & "Melontiki_Pelates.Hm_ekdosis_Diplomatos, Melontiki_Pelates.Sinidioktitis " _
            & "FROM Melontiki_Pelates LEFT JOIN cliend ON Melontiki_Pelates.afm = cliend.afm "
    
    strWHERE = "WHERE cliend.afm Is Null AND Melontiki_Pelates.afm in " & InToList
    strSQL = strINTO & strSQL & strWHERE
    CurrentDb.Execute strSQL
    MsgBox "Η εισαγωγή ολοκληρώθηκε"
    Exit Sub
ErrHandler:
    MsgBox "Error#: " & Err.Number & vbCrLf _
                      & Err.Description
End Sub
2) Στη φόρμα επίσης θα προσθέσεις και την παρακάτω συνάρτηση:
Κώδικας:
Public Function InToList() As String
    Dim x As Variant, str As String
    With Me.Lista0
        For Each x In .ItemsSelected
            str = str & ", '" & .Column(10, x) & "'"
        Next x
        str = "(" & Mid(str, 3) & ")"
    End With
    InToList = str
End Function
Με τον παραπάνω κώδικα εισάγονται στον πίνακα cliend οι εγγραφές από τον πίνακα Melontiki_Pelates, που το afm τους δεν υπάρχει στον πίνακα cliend, αλλά υπάρχει στις επιλογές της λίστας.

Προσοχή, αν σε κάποια πεδία του πίνακα cliend υπάρχουν περιορισμοί (πχ δεν επιτρέπονται null) η εγγραφή του πίνακα Melontiki_Pelates που δε θα ικανοποιεί αυτά τα κριτήρια δε θα εισαχθεί.

Φιλικά/Γιώργος

ΥΓ Το ΑΦΜ το θεωρώ μοναδικό για κάθε πελάτη. Αν αυτό δεν ισχύει δεν ισχύει και η λύση

Τελευταία επεξεργασία από το χρήστη kapetang : 22-02-13 στις 13:21. Αιτία: προσθήκη ΥΓ
Απάντηση με παράθεση
  #4  
Παλιά 22-02-13, 15:35
Όνομα: Αλέξανδρος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2013
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 22-01-2010
Περιοχή: ΑΡΤΑ
Μηνύματα: 521
Προεπιλογή

Καλησπέρα Γιώργο

Ευχαριστώ για την γρήγορη ανταπόκριση. Είναι μια ώραία λύση .Άλλωστε και σε προηγούμενες βοήθειές σου που χρησιμοποιώ σε πολλές βάσεις που έχω κάνει μέχρι τώρα ήταν εποικοδομητικές και πολύ προγραμματιστικές!!!!!!!!!
Στη περίπτωση αυτή πιστεύω ότι ο σχεδιασμός της βάσης δεν είναι με την φιλοσοφία μοναδικότητας του ΑΦΜ.
Στην αρχή το σκέφτηκα για το AFM ότι είναι το μοναδικό και συνήθως όλα τα επαγγελματικά προγράμματα χρησιμοποιούν το AFM σαν κλειδί.
Εδώ όμως που βλέπω την βάση ότι για τη χρήση ασφάλισης αυτοκινήτου μπορεί ένα ΕΠΙΘΕΤΟ και ένα ΑΦΜ να έχει 3 αυτοκίνητα ασφαλισμένα οπότε σαν κλειδί θα πρέπει να βάλω τον ΑΡΙΘΜΟ ΑΥΤΟΚΙΝΗΤΟΥ(Ο οποίος περιέχεται σε δευτερεύουσα φόρμα)
Στη πρωτεύοντα φόρμα cliend υπάρχει δευτερεύουσα φόρμα ηcar.

EΡΩΤΗΣΗ
Τώρα μπορώ να προσθέσω στο κώδικα αυτό και τα στοιχεία της δευτερεύουσας φόρμας και αντι του AFM να βάλω σαν μοναδικό κλειδί τον Αριθμό Αυτοκινήτου;
Θα κάνω κάποιες τροποποιήσεις στο κώδικα και θα επανέλθω το συντομότερο.Στο συνημμένο περιέχεται και ο πίνακας car.

Φιλικά/Αλέξανδρος

ΥΓ¨:Για τους περιορισμούς το γνωρίζω διότι σε δοκιμαστική που έκανα και δεν είχα τα (Not is Null) πεδία συμπληρωμένα και δεν γινόνταν η μεταφορά των δεδομένων.
Συνημμένα Αρχεία
Τύπος Αρχείου: zip ΓΕΝΙΚΕΣ_ΑΣΦΑΛΕΙΕΣ.zip (142,8 KB, 42 εμφανίσεις)
Απάντηση με παράθεση
  #5  
Παλιά 22-02-13, 17:01
Όνομα: Γιώργος
Έκδοση λογισμικού Office: Ms-Office 2010
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική
 
Εγγραφή: 18-06-2010
Μηνύματα: 3.674
Προεπιλογή

Καλησπέρα

Αλέξανδρε δεν έχω χρόνο για να μελετήσω το σχεδιασμό της βάσης σου.

Τα παρακάτω ίσως σε βοηθήσουν να την οργανώσεις καλύτερα.

Κατά τη γνώμη μου η ΒΔ θα πρέπει να έχει:

1) Ένα πίνακα με τα προσωπικά δεδομένα των πελατών (πχ Clients). Ο πίνακας αυτός μπορεί να έχει πρωτεύον κλειδί ένα πεδίο αυτόματης αρίθμησης ή το ΑΦΜ (πχ ClientID).

2) Ένα πίνακα (πχ Cars) με τα στοιχεία των αυτοκινήτων χωρίς τα στοιχεία των ιδιοκτητών και των ασφαλιστηρίων.

Ο πίνακας αυτός μπορεί να έχει πρωτεύον κλειδί ένα πεδίο αυτόματης αρίθμησης ή τον αριθμό του αυτοκίνητου (πχ CarID).

3) Ένα πίνακα που θα συνδέει τους πελάτες με τα αυτοκίνητα (πχ ClientsCars) . Ο πίνακας αυτός θα έχει τουλάχιστον 2 πεδία.

Ένα για την καταχώρηση του ID του πελάτη (ClientID) και ένα για την καταχώρηση του ID του αυτοκινήτου (CarID).

Αν ένας πελάτης έχει 5 αυτοκίνητα στον πίνακα θα έχουμε 5 εγγραφές με το ίδιο ClientID και με διαφορετικά CaraID.

Αν ένα αυτοκίνητο ανήκει σε 3 πελάτες στον πίνακα θα έχουμε 3 εγγραφές με το ίδιο CaraID και με διαφορετικά ClientID.

Πρωτεύον κλειδί θα μπορούσε να οριστεί ένα πεδίο αυτόματης αρίθμησης.

Η ιδιοκτησία ενός αυτοκινήτου δεν είναι στατική, συνεπώς ο πίνακας πρέπει να περιέχει ένα πεδίο για την καταχώρηση της ημερομηνίας απόκτησης της ιδιοκτησίας και ένα για την καταχώρηση της ημερομηνίας απώλειας.

4) Ένα πίνακα (πχ Asfalistiria) για την καταχώρηση των ασφαλιστηρίων, στο οποίο πέραν των άλλων στοιχείων (Ημερομηνία, κλπ) θα καταχωρείται το CarID.

Με βάση την ημερομηνία και το CarID οι ιδιοκτήτες θα μπορούσαν να προσδιοριστούν από τον πίνακα ClientsCars.

Σχετικά με τον πίνακα Melontiki_Pelates, δεν ξέρω τι εξυπηρετεί (στον πίνακα Clients μπορούμε να έχουμε πελάτες χωρίς αυτοκίνητα) και πως προκύπτουν τα στοιχεία του.

Πάντως για να μεταφερθούν τα στοιχεία του στον πίνακα Clients θα πρέπει να έχει ίδια δομή.

Φιλικά/Γιώργος
Απάντηση με παράθεση
  #6  
Παλιά 22-02-13, 20:48
Όνομα: Αλέξανδρος
Έκδοση λογισμικού Office: Ms-Office 2003, Ms-Office 2007, Ms-Office 2013
Γλώσσα λογισμικού Office: Ελληνική
 
Εγγραφή: 22-01-2010
Περιοχή: ΑΡΤΑ
Μηνύματα: 521
Προεπιλογή

Καλησπέρα Γιώργο
Ευχαριστώ πάντως για το πολίτιμο σου χρόνο που διέθεσες στο θέμα αυτό.Με το πρώτο μήνυμα σου είδα τον τρόπο που προγραμματιστικά μεταφέρω τα δεδομένα αλλά και με το δεύτερο μήνυμα είσαι πολύ κατατοπιστικός και επεξηγηματικός.
Έίχa κάνει κάτι παρόμοιο με την περιγραφή σου πιό παλιά.Η βάση αυτή που είχα κάνει ήταν μεγάλη και ο αδερφός μου που ασχολείται με το αντικείμενο ήθελε κάτι απλό.Έτσι έκανα μια μικρή βάση με μια φόρμα που συνδέεται με μια φόρμα cars για τα αυτοκίνητα.Την οποία δεν ανέβασα αν και τα αντικείμενα(Πίνακες)κατά λάθος ήταν κρυφά και ίσως δεν φαινόνταν ο πίνακας cars.Μετά προέκυψε το γεγονός της προσθήκης.Έτσι αλλάζει και ο σχεδιασμός της βάσης.Διότι πολλοί πελάτες τι στιγμή που τους ρωτάς για ασφάλιση σου λέει ότι το αυτοκίνητο λήγει πχ σε 3 μήνες.Τότε πρέπει να καταγράψω τα στοιχεία σε μια φόρμα που την ονόμασα Μελλοντικοί πελάτες(όπου και προκύπτει το όνομα).Μετα με ένα ερώτημα θα με ειδοποιούσε 10 ημέρες πριν ότι έφτασε η περίοδος για την ασφάλιση του αυτοκινήτου.
Αφού τα στοιχεία θα προ υπήρχαν στη φόρμα Μελλοντικοί πελάτες και ο πελάτης έχει δώσει το οκ και θέλει να τ ασφαλίσει το αυτοκίνητο ο ασφαλιστής θα έχει κατεγραμμένα ολα τα στοιχεια και του πελάτη για την φόρμα cliend και του αυτοκινήτου cars.
Τότε με ένα κουμπί απο τους μελλοντικοί πελάτε θα γινόνταν η μεταφορά των δεδομένω που θα ήταν ίδια με της φόρμα Cliend και της υποφόρμας Cars.
Το δείγμα που ανέβασα ήταν μόνο για να δώ την μεταφορά.Στην ουσία ήταν 2 πίνακες Cliend και Car και μια φόρμα Cliend με δευτερεύουσα Car.

Πάντως σε υπερευχαριστώ για το χρόνο σου και για το νέο τρόπο υπόδειξης ανακατασκευής.Με έβαλε σε μεράκι να ακολουθήσω τα βήματα της επεξηγησης.

Φιλικά/Αλέξανδρος
Απάντηση με παράθεση
Απάντηση στο θέμα


Δικαιώματα - Επιλογές
Δε μπορείτε να δημοσιεύσετε νέα μηνύματα
Δε μπορείτε να δημοσιεύσετε απαντήσεις
Δεν μπορείτε να επισυνάψετε αρχεία
Δεν μπορείτε να επεξεργαστείτε τα μηνύματα σας

Ο κώδικας ΒΒ είναι σε λειτουργία
Τα Smilies είναι σε λειτουργία
Ο κώδικας [IMG] είναι σε λειτουργία
Ο κώδικας HTML είναι εκτός λειτουργίας
Trackbacks are εκτός λειτουργίας
Pingbacks are εκτός λειτουργίας
Refbacks are εκτός λειτουργίας


Παρόμοια Θέματα

Θέμα Δημιουργός Forum Απαντήσεις Τελευταίο Μήνυμα
Προσάρτηση δεδομενων απο πίνακα με autonumber σε πίνακα με ΙD:Number γιώργοςΚ Access - Ερωτήσεις / Απαντήσεις 2 20-01-17 20:12
[Συναρτήσεις] Αυτόματη αύξηση (κωδικού) κατά 1 σε πίνακα gfevran Excel - Ερωτήσεις / Απαντήσεις 27 02-11-15 01:59
Μεταφορά δεδομένων από πίνακα ή ερώτημα σε νέο πίνακα με άλλη μορφή. dim.konst Access - Ερωτήσεις / Απαντήσεις 2 09-12-14 21:31
Δημιουργία πίνακα με χρήση δεδομένων από έναν άλλο πίνακα και ένα ερώτημα nikosmin Access - Ερωτήσεις / Απαντήσεις 0 28-10-13 13:53
[ Πίνακες ] Ενημέρωση δεδομένων πίνακα από άλλο πίνακα ΚΩΣΤΑΣ2 Access - Ερωτήσεις / Απαντήσεις 2 27-04-11 12:50


Η ώρα είναι 19:35.