Πρόσφατα έπρεπε να βρω ένα τρόπο για να μπορούν ορισμένοι χρήστες που εργάζονται σε διάφορα γραφεία, που μπορεί να μην υπάρχει διαθέσιμο ίντερνετ, να δουλεύουν σε ορισμένα δεδομένα που χρήζουν επεξεργασίας. τα δεδομένα εκδίδονται από το κεντρικό γραφείο και πρέπει οι χρήστες να δώσουν ορισμένες πληροφορίες.
Η εταιρία όμως δεν ήθελε να πληρώσει επιπρόσθετα για να αγοράσουμε υπηρεσίες στο cloud για να βάλουμε βάση δεδομένων. όπου το σύστημα θα συγχρόνιζε όταν υπήρχε διαδίκτυο…..
Όμως είχα τη λύση μπροστά μου, OneDrive… το είχαμε αγορασμένο για ορισμένες ομάδες…
Θα δημιουργούσαμε ακόμα μια ομάδα κοινόχρηστη για τους απομακρυσμένους χρήστες και για το κεντρικό γραφείο.
Ο αρχικός σχεδιασμός προέβλεπε ότι θα είχαμε διάφορους φακέλους με έργα
Π.χ:

κ.ο.κ.
Με απόφαση από τη διεύθυνση θα οριζόταν υπεύθυνο άτομο που θα συντηρούσε τους φακέλους με τα έργα. Το προσωπικό στο κεντρικό γραφείο θα ενημέρωνε μέσω της εφαρμογής που θα έφτιαχνα.
Στη συνέχεια οι απομακρυσμένοι χρήστες θα είχαν στο φορητό τους υπολογιστή την εφαρμογή και το OneDrive και κατά τη διάρκεια της μέρα θα συνδέουν τον υπολογιστή με το διαδίκτυο είτε από το σπίτι ή στο γραφείο, και θα αλλαγές θα συγχρονίζονται αυτόματα.
Ο λόγος που επέλεξα τα αρχεία αντί για βάση δεδομένων είναι ότι υπάρχουν χρήστες που είναι σε άλλη επαρχία. και δεν έχουμε γραφεία εκεί.
Διαφορετικός τρόπος προσέγγισης;
VPN φυσικά και να συνδέονται στο διαδίκτυο και να συγχρονίζουν με την εσωτερική βάση δεδομένων, αλλά η πολιτική του τμήματος πληροφορικής δεν το επέτρεπε.
Για τα αρχεία…. πάντα πίστευα ότι η ανταλλαγή πληροφοριών και η επεξεργασία flat files είναι ξεπερασμένη. Κατάλοιπο από legacy προγράμματα. Το να έχεις βάση δεδομένων είναι βασικό κλειδί στις επιχειρήσεις.
Όμως είναι ένα καλό εργαλείο που πρέπει ο κάθε προγραμματιστής να έχει γνώσεις και υπόψη του για λύσεις.
Φυσικά όμως δεν θα χρησιμοποιήσουμε ASCII flat files. Ευτυχώς υπάρχει το XML.
Αυτό θα ήταν αδιανόητο εν έτει 2021 😁
Η λύση στο πρόβλημα είναι το XML Object Serialisation. Υπάρχουν χιλιάδες παραδείγματα στο διαδίκτυο, όπου χιλιάδες συνάδελφοι έχουν αντιμετωπίσει παρόμοια προβλήματα και ο καθένας έχει δώσει τη δική του λύση.
Τι συμβαίνει με αυτή τη λύση.
Στο πρόγραμμα μας δημιουργούμε ένα σχεδιάγραμμα, ένα τύπο δεδομένων καλύτερα, που ονομάζουμε class, μπορούμε να το φανταστούμε με τη πιο κάτω εικόνα .
Περιγράφουμε τι θα αποθηκεύει και διάφορες μεθόδους που μπορεί να χρησιμοποιήσουμε.

Ακολούθως δημιουργούμε μια λίστα (list) με τα διαφορετικά στιγμιότυπα (instances) αυτών των κλάσεων.
Μετά από αυτόν τον πίνακα μπορούμε να κάνουμε διάφορα, όπως επεξεργασία Κ.Ο.Κ.
Ακολούθως έχοντας αυτό το αντικείμενο στη μνήμη του υπολογιστή μπορούμε να το αποθηκεύσουμε στο δίσκο σαν XML αρχείο.
Και να το ανακτήσουμε όταν χρειάζεται με XML Object Deserialization
Θα το δούμε στη πορεία.
Δημιουργία εφαρμογής
Μέσω της εφαρμογής που θα δημιουργήσουμε είναι να δούμε πως μπορούμε να παντρέψουμε την τεχνολογία του XML με OOP
Η εφαρμογή θα έχει ως θέμα προβλήματα και εργασίες τεχνικού.
Από το visual studio προσθέτουμε ένα καινούργιο project.
Βρίσκουμε από τα templates το Windows Forms App

Επιλέγουμε next, δίνουμε όνομα για το έργο μας και επιλέγουμε που θέλουμε να το αποθηκεύσουμε.
Επιλέγουμε next, χρησιμοποιώ το .NET Core 5, αλλά μπορείτε να επιλέξετε και το 3 long term support.
Επιλέγουμε την Form1 όπου θα δημιουργήσουμε το user interface του προγράμματος μας.
Προσθέτουμε 3 buttons στο πάνω μέρος της οθόνης και ένα DataGrid view
Σχεδιάζουμε τη φόρμα όπως φαίνεστε στη πιο κάτω εικόνα

Σχεδιασμός κλάσης (Class)
| Technical Work |
| +Case Number : |
| +Customer Name : |
| +Customer Address : |
| +Problem : |
| +Time Registered : |
| +Completed : |
Όπως μπορείτε να δείτε όλα τα attributes είναι public
Ο λόγος είναι ότι το xml serialization μπορεί να κάνει serialize μόνο ότι είναι public
Ορισμός λίστας
Η λίστα ορίζετε στη κύρια κλάση του προγράμματος μας και είναι διαθέσιμη από όλες τις functions μας.
Κατά την αρχικοποίηση η λίστα είναι κενή

Κουμπί save
Όταν ο χρήστης πατήσει το κουμπί καλείτε η ρουτίνα και περνάμε σαν παράμετρο τη λίστα μας

Κώδικας για το serialization
Η ρουτίνα μας δέχεται σαν παράμετρο τη λίστα με τα τεχνικά προβλήματα.
Γίνεται ένας τυπικός έλεγχος εάν η λίστα μας είναι άδεια.
Με try και catch δηλώνουμε όλα τα variables που χρειάζονται ώστε να γίνει το serialization, όπου το αντικείμενο xml Serializer γεμίζει ένα memory stream αντικείμενο, στη συνέχεια αποθηκεύουμε το xml αρχείο.
Το αρχείο αποθηκεύεται στο φάκελο όπου είναι το πρόγραμμα μας.

Κώδικας για το de-serialization
Ο ακόλουθος κώδικας “κοιτάζει“ εάν υπάρχει το xml αρχείο.
Μετά φορτώνεται το αρχείο στη μνήμη και με τη χρήση του xml document το περνάμε σε ένα string reader. Στη συνέχεια περνάμε το αρχείο στο serializer όπου καλούμε τη ρουτίνα του deserialization.
Εάν όλα πάνε καλά τότε επιστρέφουμε το αντικείμενο.

Κώδικας για φόρτωση του αρχείο XML κατά τη ενεργοποίηση της εφαρμογής
Κατά την ενεργοποίηση της εφαρμογής μας, καλούμε τη ρουτίνα του deserialize. Όπου φορτώνουμε τυχών αποθηκευμένα αντικείμενα στη λίστα μας.
Αυτό επιτυγχάνεται με τη χρήση του LINQ όπου μετατρέπουμε το πίνακα (array) σε list.
Το UpdateDG καλείτε ώστε να φορτώσει τα διάφορα αντικείμενα στο data grid view μας.

Κουμπί complete
Όταν ο χρήστης επιλέξει μια ή πολλές γραμμές στο data grid view τότε μπορεί να επιλέξει ότι η εργασία έχει ολοκληρωθεί.
Αυτό επιτυγχάνετε με τη χρήση ενός for each loop και τη χρήση LINQ όπου εύκολα ψάχνουμε στη λίστα μας εάν ο αριθμός του προβλήματος συνάδει με το επιλεγμένο στο data grid view

Κουμπί Add
Εμφανίζει ένα νέο παράθυρο για τη προσθήκη νέας εγγραφής.
Η φόρμα που εμφανίζετε επιστρέφει πίσω DialogResult.OK όταν ο χρήστης επιλέξει ΟΚ

Φόρμα για προσθήκη νέας εγγραφής

Public variables για επιστροφή αξιών στη κύρια φόρμα

Κώδικας κουμπιού ΟΚ


