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

 

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

Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

Îåêßíçóå áðü ôï ìÝëïò stathis. Τελευταία δημοσίευση από το μέλος stathis στις 15-10-2008, 15:46. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  15-10-2008, 11:47 45474

    Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    Καλημέρα σε όλους,

    Έχω έναν πίνακα Α στον οποίο θέλω να αποθηκεύω παραστατικά. Ανάλογα με τον τύπο του παραστατικού, πρέπει να ακολουθείται μια λογική αύξουσας αρίθμησης.
    Έτσι πχ, για τον παραστατικό τύπου 1, η αρίθμηση έχει σταματήσει στον αριθμό 20, ενώ για το παραστατικό τύπου 2, η αρίθμηση έχει σταματήσει στον αριθμό 12.
    Οι τύποι των παραστατικών και η αρίθμηση βρίσκονται αποθηκευμένοι σε έναν δεύτερο πίνακα Β.

    Ο πίνακας Α διαθέτει ένα primary key με identity increment και ένα πεδίο για τον αριθμό παραστατικού.

    Έχω σκεφτεί να δημιουργήσω έναν trigger after insert, που να διαβάζει την εγγραφή και ανάλογα με τον τύπο παραστατικού να ενημερώνει
    αφενός το πεδίο του αριθμού παραστατικού του πίνακα Α και αφετέρου την αρίθμηση του πίνακα Β

    Το πρόβλημα είναι ότι αυτό δουλεύει μόνο εάν γίνει εισαγωγή μίας εγγραφής (το @@rowcount του πίνακα inserted=1),

    Θα μπορούσα να δημιουργήσω ένα cursor για τις εγγραφές του inserted πίνακα, αλλά αυτό δεν μου φαίνεται και τόσο καλή ιδέα, ιδίως μέσα σε trigger.

    Φαντάζομαι ότι πρόκειται για κλασική φάση για όποιον έχει ασχοληθεί με εφαρμογή τιμολόγησης και παραστατικών.

    Ευχαριστώ.
  •  15-10-2008, 12:20 45475 σε απάντηση της 45474

    Απ: Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    Μια σκέψη,

    γιατί όταν ο χρήστης επιλέξει τι τύπο παραστατικού θα έχει, εσύ να κάνεις ένα select και να πέρνεις το μεγαλύτερο ID του Β πίνακα με βάση τον τύπο του παραστατικού.

    π.χ

    select max(id) from tblB where tupos='a'

    ή

    select id from tblB where tupos='a' order by id desc

    και στο αποτέλεσμα προσθέτεις +1.

    αν κατάλαβα σωστά, μπορεί και να δουλέψει έτσι.ελπίζω να βοήθησα.

  •  15-10-2008, 13:05 45477 σε απάντηση της 45474

    Απ: Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    stathis:


    Το πρόβλημα είναι ότι αυτό δουλεύει μόνο εάν γίνει εισαγωγή μίας εγγραφής (το @@rowcount του πίνακα inserted=1)

    Δεν υπάρχει κάποιο πρόβλημα. Άνετα μπορείς να γράψεις 2-3 διαφορετικά inserts μέσα στο trigger τα οποία θα ελέγχουν τον τύπο του παραστατικού, π.χ. insert into B select ... from inserted where inserted.Type=1; insert into B select ... from inserted where inserted.Type=2 .

    Ή μπορείς να κάνεις κάπως πιο περίπλοκο το insert για να δουλέψει με τη μία, π.χ.

    insert into B (InvoiceID,InvoiceNumber)
    select InvoiceID, (SELECT MAX(InvoiceNumber)+1 From B where B.InvoiceType=inserted.InvoiceType)
    from inserted

    Δεν προλαβαίνω να δοκιμάσω το παραπάνω για να βεβαιωθώ ότι η σύνταξη είναι σωστή, αλλά η ιδέα είναι ότι για κάθε εγγραφή στον inserted επιλέγω το μέγιστο αριθμό παραστατικού +1 από τον B και τον βάζω μέσα.

    Γενικά,  δεν υπάρχει κανένας λόγος να δουλέψεις με cursors, απλά set operations αρκούν για το 99.999% των περιπτώσεων


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-10-2008, 13:17 45478 σε απάντηση της 45475

    Απ: Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    DaltonGR:

    Μια σκέψη..



    Ευχαριστώ για την απάντηση φίλε Dalton,

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

    Παναγιώτης Καναβός:

    Δεν υπάρχει κάποιο πρόβλημα...



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


  •  15-10-2008, 14:44 45479 σε απάντηση της 45478

    Απ: Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    Θα μπορούσες να κάνεις την εισαγωγή παραστατικού με μια procedure στην οποία κατά την καταχώρηση θα επιλέγει το max(idnum) + 1 απο άλλο πίνακα και εκτός αυτού πρίν κάνει το select θα εκτελεί το begin tran ώστε να κλειδώνει τον πίνακα και να μη μπορεί κανείς άλλος να πάρει την ίδια αρίθμηση σε περίπτωση ταυτόχρονης καταχώρησης.


    Αυτοί που ζουν γενναίοι είναι ενάρετοι,κάνουν ένδοξες πράξεις και πέθαινουν αιώνια ξακουστοί....
    Μ.Αλέξανδρος...IV Crusade...
  •  15-10-2008, 15:01 45481 σε απάντηση της 45479

    Απ: Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    Το begin tran είναι περιττό γιατί κάθε ξεχωριστό statement εκτελείται από μόνο του σε ξεχωριστό transaction. Ένα inser .. select max(idnum) +1 εξ ορισμού εκτελείται σε ένα transaction, κλειδώνει τον πίνακα και δεν υπάρχει περίπτωση να βγουν ίδιες αριθμήσεις.

    Από την άλλη, αν για οποιοδήποτε λόγο αποτύχει η δημιουργία του αριθμού παραστατικού (π.χ. λόγω μακροχρόνιου blocking) δεν θα ακυρωθεί και η αρχική εισαγωγή του παραστατικού. Εκεί όντως χρειάζεται να υπάρχει transaction το οποίο να καλύπτει και το αρχικό insert και τη δημιουργία του αριθμού παραστατικού.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-10-2008, 15:46 45484 σε απάντηση της 45481

    Απ: Trigger on insert για δημιουργία κλειδιού (αριθμού παραστατικού) σε πίνακα

    Σας ευχαριστώ όλους,

    Δηλαδή πιστεύετε ότι με μια SP με transaction για select-insert-update θα είμαι καλυμμένος?
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems