Monday, August 27, 2012

Παράδειγμα Εφαρμογής - μέρος 4ο

Στο σημερινό μάθημα θα ολοκληρώσουμε το Tic-Tac-Toe.


Για να είμαι ειλικρινής το είχα ολοκληρώσει με βιντεάκι, αλλά αντιλήφθηκα στο τέλος ότι δεν έγραφε το βιντεάκι. Έτσι θα συμβιβαστούμε με screenshots!

Πάμε!


Ανοίγουμε τη φόρμα FrmTicTacToeBoard που δημιουργήσαμε σε προηγούμενο μάθημα. Δεξί κλικ πάνω στη φόρμα [ στο designer ] και επιλέγουμε "View Code" για να μεταβούμε στο αρχείο που γράφουμε τον κώδικα.


Αντιγράψτε τον κώδικα ως έχει πιο κάτω:


Εξηγήσεις:

1. partial : λέξη κλειδί που υποδηλώνει ότι κώδικας που αφορά την ίδια κλάση ενδέχεται να υπάρχει και σε άλλο αρχείο.
2. : Το σύμβολο ':' αναμεταξύ των λέξεων  FrmTicTacToeBoard  και  Form, σημαίνει ότι η κλάση FrmTicTacToeBoard κληρονομεί από την κλάση Form. Αυτό σημαίνει ότι η κλάση FrmTicTacToeBoard έχει όλες τις ιδιότητες της κλάσης Form.
3. Δήλωση και αρχικοποίηση ενός μονοδιάστατου πίνακα τύπου Player, με δύο θέσεις.
4. Στην πρώτη θέση του πίνακα τοποθετούμε ένα αντικείμενο της κλάσης Player, με το σύμβολο Χ ενώ στη δεύτερη θέση βάζουμε ένα άλλο αντικείμενο με το σύμβολο Ο.
5. Η μέθοδος που έχει το ίδιο όνομα με την κλάση, και δεν έχει τύπο επιστροφής ονομάζεται constructor. Η μέθοδος αυτή καλείται όταν δημιουργείται ένα αντικείμενο της κλάσης αυτής.



Μετά μεταβείτε στον Designer της φόρμας [δεξί κλικ -> View Designer ].

Επιλέξτε το πρώτο από τα εννιά κουμπιά του πίνακα. Δεξί κλικ -> Properties.
Στο παράθυρο με τα Properties, επιλέξτε το κεραυνάκι που βρίσκεται πάνω ψηλά στο παράθυρο. Στη λίστα με τα events, κάνετε διπλό κλικ πάνω στο event "Click".

Το διπλό κλικ θα σας μεταφέρει στον κώδικα, και συγκεκριμένα μέσα σε ένα event που ονομάζεται:



Αντιγράψτε το κώδικα στο event, όπως εμφανίζεται πιο κάτω:



Εξηγήσεις:

1. Το event 'Click' έχει δύο παραμέτρους. Η πρώτη παράμετρος 'object sender' είναι το control το οποίο προκάλεσε το event. Σε αυτή τη γραμμή, κάνουμε cast τον αποστολέεα [sender] σε Button, επειδή γνωρίζουμε ότι ο αποστολέας είναι Button, και θέλουμε να έχουμε πρόσβαση σε αυτό.
2. Η μέθοδος Split είναι μια πολύ χρήσιμη μέθοδος. Μας βοηθά να διαχωρίζουμε strings με βάση ένα χαρακτήρα [ή σύνολο χαρακτήρων]. Στην περίπτωσή μας, επειδή το όνομα των κουμπιών έχει κάποια δομή [Όνομα_x_y] χρησιμοποιούμε τον χαρακτήρα "_" για να σπάσουμε το όνομα του button στις χρήσιμες πληροφορίες.
3.Εδώ μετατρέπουμε το string που περιγράφει ένα αριθμό, στην αριθμητική του τιμή. Προσέξτε ότι δεν κάνουμε cast, αλλά μετατροπή.
4. ** για να είναι σωστή αυτή η γραμμή πρέπει να κάνετε μια αλλαγή στον κώδικα της κλάσης Player. Θα το αφήσω να το ανακαλύψετε.
5. Η δομή συνθήκης switch μας βοηθά να επιλέξουμε την επόμενή μας κίνηση ανάλογα με το τι ισχύει για τη συνθήκη μας. Το σύμβολο '%' συμβολίζει το υπόλοιπο της διαίρεσης μεταξύ δύο αριθμών! πχ. 2%2 = 0,   3%2=1,  5%2=1
6. Το σύμβολο '!' μας δίνει την άρνηση μιας πρότασης bool. Δηλαδή !true = false.



Πηγαίνετε στον Designer της φόρμας. Επιλέξτε τα υπόλοιπα 8 κουμπιά του πίνακα [κρατώντας πατημένο το Ctrl, και επιλέγοντας με το ποντίκι ένα-ένα τα κουμπιά]. Όπως είναι επιλεγμένα τα κουμπιά, δεξί κλικ, Properties και μετά Events [κεραυνάκι]. Στο event click, επιλέξτε από τη λίστα, το event "btnCell_1_1_Click".


Για να δουλέψει σωστά το πρόγραμμα, πέρα από το σημείο 4, πρέπει να γίνει ακόμα μια διόρθωση στην κλάση Player, στη συνάρτηση HasWon. Θα το αφήσω να το ανακαλύψετε.
 Πατώντας F5 ή το play, μπορείτε να τρέξετε την εφαρμογή.



Monday, April 9, 2012

Παράδειγμα Εφαρμογής - μέρος 3

Στην προηγούμενη ανάρτηση δημιουργήσαμε μια κλάση η οποία περιγράφει τους παίκτες.

Επειδή αντιλαμβάνομαι ότι τελικά τα γράμματα δεν ήταν ευδιάκριτα, παραθέτω τον κώδικα εδώ. (σαν εικόνα .. επειδή βαριέμαι να βάλω τα χρώματα).

 Όπως μπορείτε να διαπιστώσετε, ο κάθε παίκτης δεν γνωρίζει τι γίνεται γενικά στο παιχνίδι, παρά μόνο τις δικές του κινήσεις. Τις κινήσεις του ο παίκτης της κρατά στον πίνακα _moves.
Ο πίνακας _moves αναπαριστά τον πίνακα του παιχνιδιού, και έχει τιμή true όπου ο παίκτης μας έχει κάνει κίνηση, ενώ false στις υπόλοιπες.

Σήμερα θα δούμε την λογική με την οποία θα υλοποιήσουμε την συνάρτηση HasWon, η οποία θα επιστρέφει true εάν ο παίκτης έχει κερδίσει ή false όταν δεν έχει κερδίσει.


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

Άρα αν συμβαίνει ένα από τα 3, πρέπει να επιστρέψουμε true. Σε αντίθετη περίπτωση (κανένα από τα 3) επιστρέφουμε false.

 Τι πρέπει να προσέξουμε:
 Ο κώδικάς μας πρέπει να δουλεύει σωστά και αποδοτικά.

1. Έχουμε στη διάθεσή μας την τελευταία κίνηση του παίκτη, έτσι δεν χρειάζεται να ελέγξουμε όλο τον πίνακα κινήσεων, αλλά μόνο τις περιοχές που επηρεάζονται από την τελευταία κίνηση (η τρίλιζα θα γίνει από την τελευταία κίνηση, άρα σίγουρα η θέση της τελευταίας κίνησης περιέχεται στην τρίλιζα).

2. Θα εκμεταλλευτούμε το γεγονός ότι ο πίνακας κινήσεων αποτελείται από  bools, και έτσι θα χρησιμοποιήσουμε boolean λογική. 

Ο κώδικας:


 
Σημειώσεις: Το σύμβολο '&&' αναπαριστά το λογικό AND.
 Έτσι εάν έχουμε  Δ = Α && Β && Γ ;

Το Δ είναι αληθές (true) αν και μόνο εάν Α=true, B=true και Γ=true.

Νομίζω ότι τα περισσότερα είναι αυτοεπεξηγηματικά. Αν έχετε απορίες στα σχόλια.

 



 

Thursday, March 29, 2012

Παράδειγμα Εφαρμογής - Μέρος 2 (βίντεο)

Τελικά, μετά από off the record σχόλια για το προηγούμενο βίντεο, είπα να το διακινδυνέψω και να δοκιμάσω με ήχο το επόμενο βίντεο.

Στο πιο κάτω βίντεο δημιουργούμε το Class Player κατά 90%.  Δεν κάνουμε τίποτα το ιδιαίτερο, αφού το ενδιαφέρον κομμάτι της κλάσης το αφήνουμε για το επόμενο μάθημα!

Full Screen για να βλέπετε καλύτερα.








Monday, March 26, 2012

Παράδειγμα Εφαρμογής - Μέρος 1β

Στη σημερινή ανάρτηση θα κάνουμε μια μικρή ανάλυση του προβλήματος, ώστε να είμαστε στον ίδιο παρονομαστή και να συνεννοούμαστε.

Οι κανόνες του παιχνιδιού Tic-Tac-Toe που θέλουμε να υλοποιήσουμε είναι οι εξής:

1. Στο παιχνίδι συμμετέχουν δύο παίχτες.
2. Η πρώτη κίνηση είναι πάντα του Παίχτη 1.
3. Ο ένας παίχτης γράφει 'Χ' και ο άλλος γράφει 'Ο'.
4. Οι παίκτες παίζουν εναλλάξ, με μια κίνηση κάθε φορά
5. Έχουμε ένα ταμπλό με 9 θέσεις
6. Ο κάθε παίχτης μπορεί να γράψει σε οποιαδήποτε κενή θέση
7. Το παιχνίδι τελειώνει όταν:
   α. Κάποιος παίχτης συμπληρώσει οριζόντια ή κάθετα ή οριζόντια τρεις θέσεις (με το σύμβολό του)
   β. Δεν υπάρχουν άλλες κενές θέσεις, όπου έχουμε ισοπαλία


Υπάρχουν πάρα πολλοί τρόποι να υλοποιηθεί αυτό το παιχνίδι. Εγώ θα το προσεγγίσω με ένα τρόπο ο οποίος θα μου επιτρέψει να χρησιμοποιήσω όσο το δυνατό περισσότερο τις δυνατότητες της γλώσαας C# και ευρύτερα του εργαλείου Visual Studio. (για να μη νομίζεται ότι κάνουμε τα απλά πολύπλοκα για την πλάκα).


Αντικειμενοστρέφεια ή αλλιώς Object Oriented

Η C# είναι αντικειμενοστραφής γλώσσα. Αυτό σημαίνει ότι για να τη χρησιμοποιούμε σωστά και να την αξιοποιούμε στο μέγιστο πρέπει να μπορούμε να αναγάγουμε κάθε πρόβλημα σε κλάσεις και αντικείμενα.

Κλάσεις που εντοπίζουμε:

1. Παίκτης
2. Πίνακας Παιχνιδιού (board)

Τον πίνακα του παιχνιδιού ήδη αρχίσαμε να τον υλοποιούμε. Η φόρμα που φτιάξαμε στο προηγούμενο μέρος, ήταν μια κλάση που αναπαριστά τον πίνακα του παιχνιδιού. (φυσικά δεν την έχουμε ολοκληρώσει ακόμα).


Ανάλυση Κλάσεων:

Α. Παίκτης:

  Χαρακτηριστικά:
1. Σύμβολο ( 'Χ' ή 'Ο' )
2. Σειρά (πρώτος, δεύτερος)
3. Αριθμός κινήσεων

Ενέργειες (Μεθόδοι)
1. Κάνε κίνηση [γράψε το σύμβολο σε συγκεκριμένο κελί του πίνακα]
2. Έλεγξε εάν έχεις νικήσει

Β. Πίνακας:

Χαρακτηριστικά:

1. Παίκτες (2 παίκτες)
2. Αριθμός κινήσεων


Ενέργειες:

1. Εντόπισε όταν ο χρήστης θέλει να κάνει κίνηση και ενημέρωσε τον παίκτη που είναι η σειρά του.
2. Εμφάνισε το σύμβολο του παίκτη στο κελί που έχει επιλέξει
3. Έλεγξε κατά πόσο το παιχνίδι έχει τελειώσει


Θα σας αφήσω μέχρι εδώ, να το σκεφτείτε λίγο, και στο επόμενο μέρος θα έχουμε και βιντεάκι - όπου θα υλοποιήσουμε τα πιο πάνω (μέχρι ως ένα σημείο).


Saturday, March 24, 2012

Παράδειγμα εφαρμογής - Μέρος 1

Επειδή κάποιος μπορεί να μην ξαναασχολήθηκε με το εργαλείο της Microsoft Visual Studio έφτιαξα ένα μικρό βίντεο καταγράφοντας τη διαδικασία δημιουργίας ενός απλού project. Η διαδικασία δεν είναι ολοκληρωμένη. Σε αυτή την ανάρτηση απλά δημιουργούμε μια φόρμα, χωρίς οποιαδήποτε λειτουργία. (αν θέλετε να δείτε κώδικα αναμένετε στο ακουστικό σας - αυτή ανάρτηση είναι απλά drag &drop-ing και ρύθμιση χαρακτηριστικών).

(Στην αρχή προσπάθησα να ηχογραφήσω και τη φωνή μου, αλλά ήταν πολύ fail, έτσι δεν έχει ήχο).


Τι θα δείτε:

1. Πώς δημιουργούμε ένα νέο Project - Windows Forms Application
2. Πώς προσθέτουμε μια νέα φόρμα στο Project
3. Πώς προσθέτουμε controls (κουμπιά, labels, textboxes) σε μια φόρμα, και πώς ρυθμίζουμε διάφορα χαρακτηριστικά τους (μέγεθος, κείμενο κ.α.)

Αυτά που πρέπει να προσέξετε:

Όταν δημιουργείς μια εφαρμογή είναι σημαντικό να προνοείς (όσο γίνεται) ώστε οι οθόνες της εφαρμογής να προσαρμόζονται στις οθόνες του χρήστη. (δηλαδή να προσαρμόσονται στα διαφορετικά resolutions). Αυτό επιτυγχάνεται σε μεγάλο βαθμό χρησιμοποιώντας: TableLayoutPanel(s) σε συνδυασμό με το property Dock.


Τα επόμενα βίντεο θα συνεχίσουν στο ίδιο project και σκοπός μας είναι να δημιουργήσουμε μια απλή εφαρμογή με την οποία 2 παίκτες θα μπορούν να παίζουν Tic-Tac-Toe. Φυσικά απώτερος σκοπός μας είναι να μάθουμε να κτίσουμε φόρμες και να τους προσθέτουμε λειτουργίες!

Αν έχετε εισηγήσεις/απορίες/παρατηρήσεις αφήστε σχόλιο.


Το βίντεο κάντε το full screen, διαφορετικά θα δυσκολευτείτε :)



Wednesday, March 21, 2012

Visual Studio Task List

Ένας σωστός προγραμματιστής έχει μια λίστα με όλες τις εργασίες (tasks) που πρέπει να διεκπεραιώσει.

Η MS Visual Studio προσφέρει τη δυνατότητα διατήρησης της λίστας αυτής.

Υπάρχουν δύο είδη εργασιών (tasks).

  1. User Tasks
  2. Comments

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

Το δεύτερο είδος εργασίας είναι αρκετά ενδιαφέρον και πολύ χρήσιμο. Χρησιμοποιώντας κάποιες λέξεις κλειδιά στα σχόλια στον κώδικα μπορείτε να προσθέτετε tasks  στη λίστα. Όταν από τη λίστα με διπλό κλικ επιλέξετε μια εργασία, τότε ανοίγει το αρχείο στην γραμμή που γράφτηκε το σχόλιο αρχικά!

Τις λέξεις-κλειδιά μπορείτε να τις ρυθμίσετε όμως σας βολεύει, από την επιλογή Options του εργαλείου.

Επειδή μπορεί να σας σύγχυσα παραθέτω και εικόνες.






Κάπου στον κώδικα υπάρχουν αυτά τα σχόλια:
 
 //UNDONE Must do this

 //TODO Calculate the total amount

 //MULTILING Message for Invoice cannot be registered because the total amount is zero
                










Sunday, March 18, 2012

T-Sql Bulk Insert, Data Import (μέρος 1ο)

Μια καλή ημέρα, ενώ είσαι άνετος και χαλαρός στο γραφείο σου, ο project leader σου ανακοινώνει ότι το σύστημα που αναπτύσσεις πρέπει να υποστηρίζει μαζική εισαγωγή (import) δεδομένων από άλλο σύστημα σε τακτά χρονικά διαστήματα (πχ. κάθε εβδομάδα, ή κάθε μήνα κ.ο.κ). Το άλλο σύστημα παράγει flat αρχεία - δηλαδή απλά αρχεία κειμένου, όπου κάθε γραμμή αντιστοιχεί σε μια εγγραφή.

Στην αρχή γυρίζει σου επειδή σκέφτεσαι τις προτόγονες μεθόδους που έκαμνες στο πανεπιστήμιο (ανοίγεις το αρχεία και διαβάζεις/επεξεργάζεσαι γραμμή-γραμμή). Μετά θυμάσαι ότι εδιάβασες μια σχετική ανάρτηση και γλιτώνεις χρόνο και ταλαιπωρία!



Σε έτσι περιπτώσεις, οι βασικές απαιτήσεις είναι:

1. Ακεραιότητα των δεδομένων
2. Αποδεκτός χρόνος εκτέλεσης


Για να διασφαλίσεις την ακεραιότητα των δεδομένων πρέπει να:

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

Για να έχεις καλό χρόνο εκτέλεσης, πρέπει να κάνεις με λίγες εντολές πολλά πράγματα.


Ο δρόμος προς τη λύση - Μέρος Πρώτο

Ένα flat αρχείο δεν είναι σε διαχειρίσιμη μορφή, σίγουρα χρειάζεται επεξεργασία. Πόσο ωραία θα ήταν εάν μπορούσες με λίγη προσπάθεια να μεταφέρεις τα δεδομένα του αρχείου σε ένα πίνακα στον Sql Server....   Μπορείς!

Ο πίνακας στον οποίο προορίζονται τα δεδομένα εισηγούμε να έχει τις εξής στήλες :

1. Όλες τις στήλες που έχει το flat αρχείο (varchar2)
2. SequenceNo [μοναδικός αριθμός για κάθε record]
Παρόλο που σαν πρώτη σκέψη θα το έβαζες Identity για να είσαι σίγουρος ότι θα είναι μοναδικός, ωστόσο απονθαρρύνω τη χρήση Identity για αυτή τη στήλη, επειδή σε κάποια φάση θα γίνει τεράστιος αριθμός - και θα χρειάζεται να κάνεις διορθωτικές ενέργειες μετά (e.g. truncate).
Προτίνω να είναι Decimal(28,0), παρόλο που και πιο μικρός χώρος μπορεί να εξυπηρετήσει το σκοπό μας - εξαρτάται από τον όγκο των δεδομένων.
3. DateOfExecution (datetime)
Είναι πολύ σημαντική πληροφορία να ξέρεις πότε εκτελέστηκε η εισαγωγή των δεδομένων, για να μην την ψάχνεις βάλε την να είσαι σίγουρος!
 4. FlatFileDate (date)
Επίσης σημαντικό είναι να ξέρεις πότε έχει παραχθεί το Flat File ώστε να αποφύγεις πισωγυρίσματα (δηλαδή να εισαγάγεις παλιότερα δεδομένα).
5. Status (int)
Αυτή η στήλη είναι η ραχοκοκκαλιά της όλης διαδικασίας. Οι πιθανές τιμές που έχει αυτή η στήλη είναι: [
null=δεν έχει επεξεργαστεί ακόμα,
10 = νέα εγγραφή - πρέπει να γίνει εισαγωγή,
20 = υφιστάμενη εγγραφή - πρέπει να γίνει ενημέρωση,
11 = εισάχθηκε
21 = ενημερώθηκε
-1 = άκυρη εγγραφή]






Βήμα 1: BULK INSERT
Η εντολή Bulk Insert μεταφέρει το περιεχόμενο ενός αρχείου σε ένα πίνακα στον sql server.
Με λίγα λόγια, χρειάζεται να δημιουργήσεις ένα αρχείο με το οποίο να περιγράφεις τη δομή το flat αρχείου και επίσης να περιγράφεις τη σχέση του αρχείου με τον πίνακα στον οποίο προορίζονται τα δεδομένα. Το αρχείο αυτό ονομάζεται Format File (για προφανής λόγους). Μετά μπορείς να εκτελέσεις την εντολή BULK INSERT δίνοντας την τοποθεσία του flat αρχείου, την τοποθεσία του format file και τον πίνακα για τον οποίο προορίζονται τα δεδομένα.
Σημαντική λεπτομέρεια: η εντολή αυτή δεν εγγυάται ότι τα δεδομένα θα μπουν στον πίνακα με τη σειρά που εμφανίζονται στο flat αρχείο.

Περισσότερες οδηγίες για αυτή την εντολή, εδώ.


Βήμα 2: Αρχικοποίηση του SequenceNo
Έχουμε ένα πίνακα με κάμποσα rows, και θέλουμε κάθε record, στη στήλη SequenceNo να έχει ένα αριθμό μοναδικό ανάμεσα σε όλα τα records. (unique key). Έστω ότι ο πίνακάς μας ονομάζεται ImportTable. Αρκεί να εκτελέσουμε τον πιο κάτω κώδικα:

Begin

Declare  @SequenceNo Decimal(18,0)

set @SequenceNo=0;

Update ImportTable
set
SequenceNo = @SequenceNo,
@SequenceNo = @SequenceNo +1

end

Βήμα 3: Εντόπισε τις άκυρες εγγραφές

Ακυρη εγγραφή είναι αυτή που δεν μπορεί να μεταφερθεί επειδή παραβιάζει κανόνες - είτε ακεραιότητας δεδομένων, είτε business rules.
Παράδειγματα κανόνων:
1. Η στήλη είναι υποχρεωτική
2. Η στήλη πρέπει να είναι συγκεκριμένου τύπου (date, bool, numeric etc).
3. Η στήλη είναι Foreign Key σε άλλο πίνακα - άρα πρέπει να υπάρχει η αντίστοιχη τιμή στον άλλο πίνακα.

 Εδώ μπαίνουν τα set based queries (που αναφέραμε σε άλλη ανάρτηση).

Update
ImportTable
set
Status = -1
where
SequenceNo IN
(
Select SequenceNo
from ImportTable
left outer join Table1 on Table1.Column3 = ImportTable.Column3 --
where
ImportTable.Column1 is null OR
ISDATE( ImportTable.Column21) = 0 OR
ISNUMERIC (ImportTable.Column22) =0 OR
Table1.ColumnPK IS NULL
)


Για να καταλάβουμε τι κάμνει το πιο πάνω statement πρέπει να το σπάσουμε σε μικρότερα κομμάτια.
Ξεκινούμε από το εμφωλιασμένο statement:

Select SequenceNo
from ImportTable
left outer join Table1 on Table1.Column3 = ImportTable.Column3 --
where
ImportTable.Column1 is null OR
ISDATE( ImportTable.Column21) = 0 OR
ISNUMERIC (ImportTable.Column22) =0 OR
Table1.ColumnPK IS NULL

Επιστρέφει όλα τα  SequenceNo των εγγραφών (records) για τα οποία ισχύει τουλάχιστο ένα από τα πιο κάτω:
1. Η στήλη Column1 είναι κενή (παραβίαση υποχρεωτικού πεδίου)
2. Η στήλη  Column21 δεν είναι ημερομηνία (λάθος τύπος πεδίου)
3. Η στήλη Column22 δεν είναι αριθμός (λάθος τύπος πεδίου)
4. Η στήλη  Column3 που αντιστοιχεί σε Foreign Key δεν βρίσκει την αντίστοιχη τιμή στον αντίστοιχο πίνακα

** Η συνάρτηση ISDATE δεν αναγνωρίζει τις ημερομηνίες μικρότερες της Jan 01, 1753.
**Η συνάρτηση ISNUMERIC δέχεται και σύμβολα νομισμάτων σαν μέρος κάποιου αριθμού

Άρα, αναλύοντας το statement, ουσιαστικά ενημερώνει όλες τις εγραφές που σπάζουν τουλάχιστο ένα από τους κανόνες ακεραιότητας (ή business rule) θέτοντας το Status = -1 (invalid record).

Βήμα 4: Εντόπισε τις εγγραφές που υπάρχουν ήδη στο δικό μας σύστημα (άρα εγγραφές για ενημέρωση)

Update
ImportTable
set
Status = 20
where
SequenceNo IN
(
Select SequenceNo
from
ImportTable
Inner join MyTable on MyTable.LinkCode = ImportTable.Column1 
where Status != -1 
) 

Αρκετά ξεκάθαρο νομίζω. Διευκρινίζω μόνο
MyTable: Ο αντίστοιχος πίνακας του συστήματός μου.
MyTable.LinkCode: στήλη με την οποία γίνεται η αντιστοίχιση - και πρέπει να είναι μοναδική (πχ Αριθμός Ταυτότητας αν μιλούμε για πελάτες).


Βήμα 5: Όσα δεν είναι ούτε άκυρα, ούτε υφιστάμενα μάρκαρέ τα για εισαγωγή


Update
ImportTable
set
Status = 10
where
Status is null




Μέχρι εδώ για σήμερα. Στην επόμενη φάση θα δούμε την μαζική ενημέρωση και εισαγωγή των δεδομένων.