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

 

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

Creating a master-details windows form for database inserts...?

Îåêßíçóå áðü ôï ìÝëïò PanPan. Τελευταία δημοσίευση από το μέλος PanPan στις 17-01-2008, 15:30. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-01-2008, 12:47 38848

    Creating a master-details windows form for database inserts...?

    Καλημέρα.

    Έχω φτιάξει μια φόρμα για να εμφανίζω τα δεδομένα μου σε μορφή master-details. Αποτελείται από details view controls, που είναι τα πεδία του master table μου και ένα datagridview που περιέχει τα πεδία του detail table μου. Έχω χρησιμοποιήσει table adapters και έχω κάνει τους πίνακες μου σωστά bound, δηλ. τα πεδία του master πίνακα είναι bound στον πίνακα master και τα πεδία του detail είναι bound στον detail table με datasource τον master πίνακα και datamember την σχέση που έχουν οι δυο πίνακες. Χρησιμοποιώ VB2005 και SQLServer2000 ως βάση δεδομένων. Κάποια από τα πεδία των πινάκων μου είναι not nullable, όπως π.χ. η Καθαρή Αξία, η Ποσότητα, η Τιμή, κ.α. Επίσης κάποια από τα πεδία των πινάκων μου κάνουν lookup σε άλλους πίνακες. Ένα τέτοιο πεδίο είναι ο συναλλασσόμενος στον master table και ακόμη είναι not nullable. Έχω γράψει κώδικα στην DataSetClass για να δώσω default τιμές όπου χρειάζεται.

    Το πρόβλημα που είχα αρχικά ήταν με τις τιμές των πεδίων που είναι not nullable και ταυτόχρονα είναι foreignkeys σε άλλους πίνακες. Π.χ. ο συναλλασσόμενος που προανέφερα είναι πεδίο του master πίνακα και επίσης foreign key σε άλλον πίνακα. Φυσικά ορίζω το lookup. Για να μπορέσω να κάνω το insert σε μια τέτοια φόρμα, θα πρέπει λογικά να σώσω πρώτα την εγγραφή του master πίνακα, ώστε να μπορέσω να σώσω τα δεδομένα που θα εισάγω στην εγγραφή του details πίνακα και να μην παίρνω exception. Δοκίμασα να δώσω default τιμές στα not nullable πεδία, ακόμη και σε αυτά που είναι foreignkeys, για να μπορέσω να σώσω επιτυχώς. Γι' αυτά που είναι nullable δεν δίνω default τιμές. Ξεκινάω κάνοντας Add το NewRow του master πίνακα. Όταν ανοίγει η φόρμα και πάω να αλλάξω την τιμή που έζχω δώσει σε κάποιο από αυτά τα πεδία, όπως τον συναλλασσόμενο παίρνω το ωραιότατο exception στο run-time "Object reference not set to an instance of an object." Θα μπορούσα να πω πως δεν υπάρχει το row για τα foreignkeys, αλλά βλέπω στο debug πως έχουν ήδη πάρει ένα row τα εν λόγω πεδία. Δεν ξέρω τι φταίει και εν πάσει περιπτώσει πως υλοποιείται ένα τέτοιο σενάριο όσον αφορά τα inserts και όχι απλώς το view που έχει το παράδειγμα της Microsoft;; Κάποιος που να μπορεί να βοηθήσει δίνοντας καμιά ιδέα;


    "Μη σταματάς να αναζητάς αυτό που αγαπάς, ειδάλλως θα καταλήξεις να αγαπάς ό,τι βρίσκεις." (Αγνώστου)
  •  07-01-2008, 13:32 38852 σε απάντηση της 38848

    Απ: Creating a master-details windows form for database inserts...?

    Αν κατάλαβα καλά, το πρόβλημα σου δεν έχει να κάνει με master-detail αλλά πως να σώσεις datasets τα οποία περιλαμβάνουν πίνακες με relations μεταξύ τους. Πρέπει πρώτα να αποθηκεύσεις τις διαγραφές από τους child πίνακες προς τον parent και μετά να αποθηκεύσεις τα updates από τον parent προς τους child. Υπάρχουν σχετικά παραδείγματα στο MSDN, απλά δεν αναφέρονται ως master detail. Το master detail είναι τρόπος να φτιάχνεις μία φόρμα γι αυτό και δεν θα βρεις τέτοιες αναφορές στο documentation ADO.NET.  Κοίτα και το Walkthrough: Saving Data to a Database (Multiple Tables)

    Όσον αφορά το exception, πού εμφανίζεται? Σε δικό σου κώδικα? Κάπου αλλού? Κοίταξες το call stack του exception? Πάω στοίχημα ότι κάτι συμβαίνει με τον επιπλέον κώδικα που έγραψες. Για να αποθηκεύσεις tables με relations πάντως δεν χρειάζεται να πειράξεις τον κώδικα του DataSet. Αν τα relations είναι σωστά φτιαγμένα, αρκεί να κάνεις τα update με τη σωστή σειρά.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  07-01-2008, 13:59 38858 σε απάντηση της 38852

    Απ: Creating a master-details windows form for database inserts...?

    Παναγιώτη, ευχαριστώ για την απάντησή σου. Ο επιπλέον κώδικας είναι για να δίνω κάποιες default τιμές, όπως και το UserCreated, UserModified, DateCreated, DateModified, αλλά και για υπολογισμών κάποιων αξιακών πεδίων (παραστατικό είναι).....

    To "Object reference..." βρήκα από που μου έρχεται. Παρόλο που κάνω Add to NewRow του master πίνακά μου και βλέπω DataRowState: Added, ωστόσο όταν είμαι πια στον detail πίνακα καλώντας την DataRowChanged ενημερώνοντας τα εκεί αξιακά πεδία με υπολογισμούς, έπειτα πάω να ελέγξω το parentrow το βρίσκω Nothing..... (θέλω να ενημερώσω τα σύνολα των αξιακών πεδίων που βρίσκονται στον master ταυτόχρονα με τις αλλαγές που κάνω στα details).....

    Δεν ξέρω πια τι άλλο να κάνω και γι΄αυτό ζήτησα βοήθεια. Εκτός και αν θεωρείς πως δεν χρειάζεται να κάνω αυτούς τους υπολογισμούς στην κλάση του Dataset και απλά να πάω στο save της φόρμας και να ελέγξω τα DataSet.GetChanges (όπως λέει το παράδειγμα της Microsoft, το οποίο δεν δουλεύει παρεμπιπτόντως.... Βλέπεις είχα δοκιμάσει παλιότερα το MSDN sample που μου υποδεικνύεις και ξέρω πως δεν παίζει, εκτός και αν φταίει κάτι άλλο σε αυτό.) Αλλά αν δεν σώσω το row του master παίρνω πάλι το exception "ForeignKeyConstraint FK_EDTLineItem_EDTDocumentPurchases requires the child key values (2) to exist in the parent table."

    Η σχέση πάνω στο dataset έχει ως εξής: Both Relation And ForeinKey Constraint,  Update Rule: Cascade, Delete Rule: Cascade, Accept/Reject Rule: None

    Τα IDs φυσικά και είναι primary keys. Μάλιστα υπάρχει το fDocumentPurchaseID στον detail πίνακα, foreignkey που αναφέρεται στο ID του master.


    "Μη σταματάς να αναζητάς αυτό που αγαπάς, ειδάλλως θα καταλήξεις να αγαπάς ό,τι βρίσκεις." (Αγνώστου)
  •  07-01-2008, 14:47 38863 σε απάντηση της 38858

    Απ: Creating a master-details windows form for database inserts...?

    Φταίει κάτι άλλο, γιατί το sample δεν είναι τυχαίο. Έτσι ακριβώς δουλεύει το ADO.NET. Θα σου πρότεινα να ξεκινήσεις με ένα καθαρό project το οποίο θα περιέχει μόνο ένα DataSet με δύο πίνακες, ή ακόμα και να ακολουθήσεις τα βήματα του Walkthrough για να καταλάβεις πως δουλεύουν οι related πίνακες. Απ' ότι καταλαβαίνω, το πρόβλημα σου δεν έχει να κάνει ούτε με τη διαδικασία του update στη βάση αλλά με το πως να προσθέσεις γραμμές σε child πίνακες.

    Σε παρακαλώ πάντως, γράψε λίγο καλύτερα γιατί είναι πολύ δύσκολο να καταλάβω τί έχεις κάνει. Σπάσε παραγράφους, μην ενώνεις όλα τα actions που έκανες σε μία πρόταση και μην κόβεις βήματα. Αν κατάλαβα καλά, έβαλες ένα νέο row στον parent πίνακα και μετά? Πως έφτασες στο DataRowChange event του child? Mήπως εννοείς κάτι διαφορετικό όταν λες DataRowChanged?  Πως πρόσθεσες τη γραμμή στον child πίνακα? Μήπως τα primary keys των πινάκων σου είναι Identity οπότε δεν έχουν τιμή πριν το update?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  07-01-2008, 15:49 38867 σε απάντηση της 38863

    Απ: Creating a master-details windows form for database inserts...?

    Έχεις δίκιο. Έχω γράψει πολύ γρήγορα και αρκετά αγχωμένα. Θέλω να τελειώνω πια με αυτό, γιατί ήδη έχω χάσει αρκετό χρόνο.

    Λοιπόν, για να τα πάρω από την αρχή. Είχα πρόβλημα όταν πήγαινα να αποθηκεύσω όλη την εγγραφή (αφού είχα συμπληρώσει όλα τα πεδία του master και του detail πίνακα), ενώ δεν είχα κάνει πουθενά save την εγγραφή του master. Δηλαδή το row του master ήταν σε DataRowState: Detached. Έτσι αποφάσισα να κάνω add to NewRow του master, πριν συμπληρώσω τα πεδία του detail πίνακα. Στο TableNewRow του master δίνω default τιμές όπου χρειάζεται (για τα not nullable πεδία. Έλα ντε που έχω και not nullable πεδία που ταυτόχρονα είναι και foreignkeys σε άλλους πίνακες.) 

    Έπειτα αφού σηκωθεί η φόρμα και τροποποιήσω τα δεδομένα του στον master πίνακα (δεν μου κάνουν παντού οι τιμές που δ΄νω, πχ. το fTradeAccount θέλω να το αλλάξω). Όταν κάνω αλλαγές στο row του master,  παίρνω το "Object reference...", μια και όπως ανακάλυψα από το debug, το row είναι σε RowState: Detached(!?) και μάλιστα γίνεται nothing. Το πως σηκώνεται το DataRowChanged είναι φυσικό και επόμενο με το που κάνει κανείς αλλαγές στον πίνακα........

    Τώρα πως φτάνω στον detail πίνακα και μάλιστα στην dataRowChanged, είναι όταν προσπαθώ να βάλω γραμμή πριν ακόμη σώσω τον header. Εκεί παρατηρώ στους υπολογισμούς μου επί των γραμμών πως το ParentRow είναι Nothing (αναφέρομαι σε αυτό, γιατί ταυτόχρονα θέλω να ενημερώνω τα σύνολα των αξιακών που είναι στον header).

    Καμιά ιδέα πώς να λύσω το πρόβλημα αυτό; Δηλαδή να εισάγω επιτυχώς τον header και έπειτα να προχωρήσω στα details.....


    "Μη σταματάς να αναζητάς αυτό που αγαπάς, ειδάλλως θα καταλήξεις να αγαπάς ό,τι βρίσκεις." (Αγνώστου)
  •  17-01-2008, 15:30 39288 σε απάντηση της 38867

    Απ: Creating a master-details windows form for database inserts...?

    Για να ενημερώσω και όσους πιθανόν να συναντήσουν το ίδιο πρόβλημα με μένα...

    Τελικά η λύση ήταν απλή. Με μια τροποποίηση στον κώδικα μου μπόρεσα να υλοποιήσω το σενάριο μου. Για περαιτέρω βοήθεια κοίταξα και στο How Do I: Updating Related Tables και πλέον έχω προχωρήσει αρκετά.

    Ευχαριστώ για την βοήθεια συνονόματε Παναγιώτη.

     

     


    "Μη σταματάς να αναζητάς αυτό που αγαπάς, ειδάλλως θα καταλήξεις να αγαπάς ό,τι βρίσκεις." (Αγνώστου)
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems