Τρίτη 1 Μαρτίου 2016

Αναθεώρηση 174 - Νέο Αντικείμενο Γεγονός.

Η νέα αναθεώρηση πρόσθεσε μια προαιρετική  παράμετρο στην Πάνω ώστε να βγάζει μια σειρά αντίγραφα στη κορυφή του σωρού. (χωρίς την δεύτερη παράμετρο θα βγάλει ένα αντίγραφο από μια θέση που θα υποδείξουμε, με τη δεύτερη θα κάνει το ίδιο Ν φορές)
Άδειασε  \\ αδειάζει ο σωρός τιμών
Σειρά 1,2,3,4,5,6 \\ μπαίνουν στο τέλος, οπότε θα βγει το 1 πρώτο
Πάνω 3,3
Σωρός    \\ δείχνει το σωρό με 1 2 3 1 2 3 4 5 6

Αν θέλω να βγάλω την κορυφή 10 φορές τότε Πάνω 1, 10

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

Κύρια προσθήκη στην αναθεώρηση αυτή είναι το αντικείμενο Γεγονός. Βασίζεται στην ιδέα του προγράμματος παραδείγματος στην με το αντικείμενο TheEvent. Όμως δεν είναι ίδιο. Το σύστημα δουλεύει για την επικοινωνία των αντικειμένων με γεγονότα, και σε αυτό όντως έχουμε το ίδιο πράγμα. Επιπλέον όμως μπορούμε αν πετάμε ή να βάζουμε νέες συνδρομές (subscriptions) και επίσης μπορούμε να βάλουμε μια ή περισσότερες συνδρομές "ανώνυμες" που δεν μπορούμε να πετάξουμε.
Ένα Γεγονός μπορεί να ανήκει σε μια ομάδα, ή σε ένα τμήμα τοπικά ή να το ορίσουμε γενικό. Το Γεγονός πυροδοτείται με κλήση σε αυτό και πέρασμα τιμών (και με αναφορά αν θέλουμε). Μόλις συμβεί αυτό τότε το Γεγονός καλεί όλες τις συνδρομές με αντίγραφα των τιμών (και των αναφορών). Οι συνδρομές είναι συναρτήσεις, τις οποίες κρατάει ως αντίγραφο το Γεγονός παρέχοντας όμως και το περιβάλλον, με συνέπεια αν μια συνάρτηση ανήκει σε ένα αντικείμενο τότε αυτή να μπορεί να αλλάξει τιμές του αντικειμένου!

Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε Χ**2, " οκ"
      }
}

Συνάρτηση Β {
      Διάβασε Κ
      Τύπωσε Κ
}


Συνάρτηση Γ {
      Διάβασε Κ
      Τύπωσε Κ*10
}


Γεγονός Α νέο Β(), Γ()
\\ καλεί τις δυο συναρτήσεις χωρίς να περιμένει αποτέλεσμα
Κάλεσε Γεγονός Α, 20
\\ τυπώνει 20 και 200
Γεγονός Α πέτα Β()
Κάλεσε Γεγονός Α, 20
\\ τυπώνει  200
Γεγονός Α Κράτησε
Κάλεσε Γεγονός Α, 20
\\ δεν κάνει τίποτα
Γεγονός Α Άφησε
Βάλε 20
Κάλεσε Γεγονός Α
\\ τυπώνει  200
\\ η κάλεσε δίνει πρόσβαση στο σωρό του τμήματος
\\ αλλά το Γεγονός θα πάρει τον αριθμό στοιχείων που δηλώθηκαν
Τύπωσε Τύπος$(Α)
\\ δίνει mEvent  


\\ Στο σωρό μπαίνει με αναφορά (αν μπει χωρίς θα είναι άχρηστο)
Τμήμα ΔεςΕδώ {
      Διάβασε
      Κάλεσε Γεγονός Β, 40
}
ΔεςΕδώ


Γεγονός Α Καθαρό
Κάλεσε Γεγονός Α, 100 \\ δεν κάνει τίποτα και πετάει το 100
\\ Μπορώ να το ορίσω ξανά
Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε Χ**2, " οκ2"
      }
}
Κάλεσε Γεγονός Α 100 \\ το πρώτο κόμμα είναι προαιρετικό, εδώ δεν υπάρχει!


Για την ώρα μπορούμε σε κλάσεις να βάλουμε το γεγονός αλλά επειδή παίρνει ισχνές αναφορές, σημαίνει ότι η κλάση δεν μπορεί να γυρίσει το γεγονός με ισχνές αναφορές. Επίσης σε ομάδες σε πίνακα (που είναι κλειστές) δεν λειτουργεί ακόμα το σύστημα σωστά. Άρα προς το παρόν κάνουμε όπως λέει το παράδειγμα!

\\ Μπορώ να φτιάξω ένα γενικό γεγονός
\\ που θα έχουν όλα τα τμήματα πρόσβαση
Γενικό Γεγονός Α {
      Διάβασε Χ
      Συνάρτηση {
            Τύπωσε Χ**2, " οκ3"
      }
}
Κάλεσε Γεγονός Α 100



Ομάδα Αλφα {
      μετρητής
      Γεγονός Κ {
            Διάβασε Κάτι$
            Συνάρτηση {
                  \\ η συνάρτηση είναι προαιρετική χωρίς όνομα
                  \\ μπορώ να βάλω σημείωσεις μόνο εδώ
                  \\ τη Διάβασε Κάτι$ την βάζει το σύστημα
                  Τύπωσε Κάτι$
                  .μετρητής++
                
            }
      }
      Τμήμα Διαδικασία {
            Κάλεσε Γεγονός,"οκ"
      }
}


Αλφα.Διαδικασία



Και εδώ το μεγάλο παράδειγμα στα Αγγλικά χωρίς τη χρήση του TheEvent αντικειμένου (δες παράδειγμα στην αναθεώρηση 173)


Ανανεώθηκε 25/10/2021
Στα Windows 10 δεν επιτρέπεται να γράφουμε απ΄ευθείας στο ριζικό κατάλογο C:, οπότε το άλλαξα σε dir$ (τρέχον κατάλογο,  η εντολη Dir User ορίζει τρέχον κατάλογο τον ειδικό κατάλογο της Μ2000, και αυτό γίνεται αυτόματα όταν ανοίγει η Μ2000 σε κατάστασης κονσόλας). Δείτε το με το ? dir$.
Επίσης υπάρχει μια εντολή που ανοίγει το αρχείο στο Notepad.

Form 60,30
Pen 14
Cls 5
Global nl$=chr$(13)+chr$(10)
Class Global Boiler {
Private:
       temp, pressure
Public:
      Module Boiler { Read .temp, .pressure }
      Function getTemp { =.temp }
      Function getPressure {=.pressure }
}


\\  TheEvent publisher
Class Global DelegateBoilerEvent {
      m=1000
      Event BoilerLogHandler { Read message$, &byrefValue }
      Module LogProcess {
               Read tempNow
                remarks$ = "O. K"
               b = Boiler(100, tempNow) : t = b.getTemp()
               p = b.getPressure()
               If ( t > 150 ή t < 80 ή p < 12 ή p > 15) Then {
                  remarks$ = "Need Maintenance"
               }
               Call .OnBoilerEventLog("Logging Info:\n", &.m)
               Call .OnBoilerEventLog("Temparature" + str$(t) + "\nPressure:" + str$(p), &.m)
               Call .OnBoilerEventLog("\nMessage: " + remarks$+"\n", &.m)
               Pen 15 { Print .m } \\ 1006   1012
      }
      Function OnBoilerEventLog {
            Call Event .BoilerLogHandler
      }
}
Class Global BoilerInfoLogger {
Private:
      filename$, fHandler, fHandlerRead, LogNo
Public:
      Module BoilerInfoLogger {
            Read .filename$
            If Not Exist(.filename$) Then {
                  Open .filename$ For Wide Output As .fHandler
                  close #.fHandler
         }
         Open .filename$ For Wide Append As .fHandler
         Open .filename$ For Wide Input As .fHandlerRead
      }
      Function Logger {
          Read info$, &k
          k++
          .LogNo++
          Print # .fhandler, Replace$("\n", nl$, info$);
      }
      Function GetLogNo {=.LogNo}
      Module MoveToStart {
            seek #.fHandlerRead,1
      }
      Function NextLine {
            If Not Eof(#.fHandlerRead ) Then {
                  Line Input #.fHandlerRead, Paragraph$
                  Report Paragraph$
                  =True
            }
      }
      Module Close {
            Close #.fHandler , #.fHandlerRead
      }
   }
Group RecordBoilerInfo {
       Function Logger {
                  Read Info$, &k
                  k++ : Report Replace$("\n", nl$, info$)
                  Rem : Print "stack for values size:", Stack.Size
            }
      Module Main {
            Read YourLogFile$
            filelog = BoilerInfoLogger(YourLogFile$)
            boilerEvent = DelegateBoilerEvent()
            Event boilerEvent.BoilerLogHandler new .Logger(), filelog.logger()

            boilerEvent.LogProcess 12 : GetAllMessages()
            boilerEvent.LogProcess 11 : filelog.MoveToStart : GetAllMessages()

            filelog.Close
            Print filelog.GetLogNo()

            Sub GetAllMessages()
                  Pen 11 {
                        While filelog.NextLine() { }
                  }
            End Sub
     }
}
\\ Begin
RecordBoilerInfo.Main dir$+"boilerNew.txt"
\\ End
win "notepad", dir$+"boilerNew.txt"
Dos "Del "+quote$(dir$+"boilerNew.txt");


Αποτέλεσμα στο text αρχείο:
Logging Info:
Temparature 100
Pressure: 12
Message: O. K
Logging Info:
Temparature 100
Pressure: 11
Message: Need Maintenance

Εγχειρίδιο της Μ2000 - Τεύχος 23ο

12. Βάσεις Δεδομένων


Σε αυτό το εγχειρίδιο σκοπός είναι να δούμε τι εντολές έχει η Μ2000 για βάσεις δεδομένων, να δούμε μερικά θέματα πάνω σε αυτές αλλά όχι να σταθούμε σε θέματα ποιοτικά, το πώς σχεδιάζουμε βάσεις δεδομένων. Το κομμάτι του σχεδιασμού είναι μια άλλη επιστήμη. Εδώ θα δούμε τη διεπαφή, προγραμματιστικά που έχει η Μ2000 με τις βάσεις δεδομένων. Πριν την 7η έκδοση το υποσύστημα που χρησιμοποιούνταν ήταν το DAO .3.5 ή ένα data access object με την "μηχανή" Jet της Microsoft (διαχείριση βάσεων τύπου Access 97). Από την 7η έκδοση και μετά άλλαξε το σύστημα, χωρίς να αλλάξουν οι βασικές εντολές την λειτουργικότητά τους, αλλά προστέθηκαν και άλλες, και μπήκε το ADO Object Model. Αυτό το μοντέλο αν και διαφορετικό από το DAO, έχει προσαρμοστεί στις εντολές και έχει την ίδια απόκριση (αν χρησιμοποιηθεί όπως στις παλαιές εκδόσεις της Μ2000).

Μια διαφορά του παλιού με του νέου συστήματος (κρυμμένη εσωτερικά) είναι ότι παλιά υπήρχε το WorkSpace ενώ τώρα όλα αρχίζουν και τελειώνουν με το Connection. Η M2000 κρατάει μια σύνδεση μέχρι να την κλείσουμε ή μέχρι να τερματίσει το πρόγραμμα. Κάθε φορά που πετυχαίνουμε σύνδεση μπορούμε να κρατάμε αποκλειστικά την σύνδεση για μας. Οπότε αν θέλουμε κάνουμε ότι ενέργεια έχουμε και κλείνουμε την σύνδεση.
Ένα ενδιαφέρον θέμα με το ADO είναι ότι μπορεί να λειτουργήσει με ODBC (Open Database Connectivity) δηλαδή βάσεις που  διαχειρίζονται από το λειτουργικό, και εμείς απλά λέμε ποια θέλουμε (χωρίς να ξέρουμε καν που είναι, μπορεί να είναι η βάση σε υπολογιστή δικτύου), δίνουμε κωδικό και συνθηματικό και έχουμε σύνδεση! Μάλιστα εδώ υπάρχουν και χρήστες με κωδικό (διαφορετικό από τυχόν κωδικό για ξεκλείδωμα της βάσης).

Οι βάσεις που φτιάχνει η Μ2000 με τον καθορισμένο απλό τρόπο είναι κλειδωμένες με ένα απλό κλειδί, όχι για να κρύβουμε τα στοιχεία αλλά για να ξέρει ο διερμηνευτής ότι η βάση είναι δική του! Αν το ξέρει αυτό τότε μπορεί να την σβήσει. Θέλουμε να σβήνουμε με ευκολία μια βάση αν κάνουμε δοκιμές! Επειδή ο κώδικας είναι ανοικτός, μπορεί κανείς να βρει το κωδικό εύκολα.

Οι εντολές για τις βάσεις δεδομένων είναι οι παρακάτω: (η εντολή Επιστροφή χωρίς τιμές δεν είναι εντολή για βάσεις δεδομένων, αλλά για επιστροφή από κλήση ρουτίνας σε ετικέτα)

ΑΝΑΖΗΤΗΣΗ, ΑΝΑΚΤΗΣΗ, ΑΡΧΕΙΟ, ΑΦΑΙΡΕΣΗ, ΒΑΣΗ, ΒΑΣΗ.ΠΑΡΟΧΟΣ, ΒΑΣΗ.ΧΡΗΣΤΗΣ, ΔΕΙΞΕ, ΔΟΜΗ, ΕΚΤΕΛΕΣΗ, ΕΠΙΣΤΡΟΦΗ, ΠΡΟΣΘΗΚΗ, ΣΥΜΠΙΕΣΗ, ΤΑΞΗ




Υπάρχει μια διαφορά με τις παλιές εκδόσεις της Μ2000, όταν στον τελεστή LIKE χρησιμοποιούσαμε το *. Στο DAO έχει αντικατασταθεί με % και η Μ2000 δεν ελέγχει το ερώτημα πριν το στείλει, για να το αλλάξει. Αν θέλουμε να βρούμε κάτι που ξεκινάει από Α θα βάλουμε Like 'A%'  ενώ αν βάλουμε >= 'Α' τότε μπορεί να πάρουμε και κάτι από Β αν λείπει όλο το Α..

12.1 Τυπική Βάση Δεδομένων


Οι τυπικές βάσεις δεδομένων που χρησιμοποιεί η M2000 είναι Access97 αλλά μπορούμε να το αλλάξουμε αυτό όπως εδώ στην Σημ 1 έχουμε την εντολή Βάση.Πάροχος. που δίνει τα απαιτούμενα στοιχεία. Επειδή κάνουμε δοκιμές και αλλάζουμε τύπο, καλό είναι να σβήσουμε το αρχείο με άμεση εντολή μέσω κονσόλας (που δεν θα ανοίξει, θα εκτελέσει απλά την εντολή).
Στο παράδειγμα φτιάχνουμε ένα αρχείο (table με την ονομασία της Access, αλλά εδώ δεν χρησιμοποιούμε τον όρο Πίνακας γιατί τον έχουμε για άλλη χρήση) με δυο στοιχεία, ένα κλειδί και ένα υπόμνημα. Το υπόμνημα δεν έχει μέγεθος, Είναι κείμενο που καταχωρούμε στο πεδίο. Την πρώτη φορά καταχωρούμε κείμενο σε τρεις γλώσσες με την εντολή Προσθήκη. Πριν όμως έχουμε δώσει μια εντολή Τάξη που ρυθμίζει ποια είναι τα κλειδιά ταξινόμησης. Η εντολή Ανάκτηση αναζητά και αν βρει μας φέρνει το πρώτο, στο σωρό, με πρώτο στοιχείο πόσες εγγραφές βρήκε με το συγκεκριμένο κριτήριο (μπορούμε αντί για όνομα πίνακα να δώσουμε SQL ερώτημα, στην θέση του ονόματος  και έχουμε κενά τα τελευταία δυο αλφαριθμητικά). Η εντολή επιστροφή χωρίς τιμές κάνει επιστροφή από κλήση με διαμέσου, αλλά με τιμές είναι η επιστροφή τιμών στην εγγραφή του πίνακα. Αν θέλουμε να παραλείψουμε κάποια τιμή (όπως εδώ δεν θέλουμε να βάλουμε πάλι το όνομα russian, τότε δεν βάζουμε τιμή και βάζουμε απλά ένα δεύτερο κόμμα.
Η βάση για να κλείσει πριν κλείσει το διερμηνευτής θέλει την Κλείσε με μονοπάτι(κατάλογο), όνομα και τύπο.

Η πρώτη εντολή αδειάζει το σωρό τιμών αν και παρακάτω χρησιμοποιούμε την Σωρός Νέος { } και απομονώνουμε τις εγγραφές πεδίων στο σωρό στο μπλοκ αυτό.

Σε αυτό το παράδειγμα φτιάχνουμε ένα μόνο αρχείο, σε μια βάση δεδομένων. Η βάση δεδομένων είναι ένα μόνο αρχείο στο δίσκο αλλά μπορεί να ενσωματώνει σε αυτό πολλά αρχεία (Tables στην SQL). (Δουλεύω την 174 αναθεώρηση, και έχω ήδη βάλει αντικείμενο Event)

Άδειασε
τυπ$=".mdb"
α$= {Американские суда находятся в международных водах.
Giời nắng hay giời mưa Bần không bao giờ quan-tâm.
Ελληνικά
}
Σημ 1 : Βάση.Πάροχος "Microsoft.ACE.OLEDB.12.0","Jet OLEDB"
\\\ αν θέλουμε να αλλάξουμε τύπο βάσης τότε καλό είναι να την διαγράψουμε
\\ χωρίς τον έλεγχο που κάνει η εντολή Βάση . Βγάζουμε τις σημειώσεις 1 και 2
Σημ 2 : Κονσόλα "Del "+Παράθεση$(κατ$+"ηΒάσηΜου1"+τυπ$);
Βάση "ηΒάσηΜου1"
Δες οκ {
      Αρχείο "ηΒάσηΜου1","UNI", "key", Κείμενο, 20, "MyMemo", Υπόμνημα, 0
      Τάξη "ηΒάσηΜου1","UNI", "key", Αύξουσα
      Προσθήκη "ηΒάσηΜου1","UNI", "russian", α$
      Σωρός Νέος {
            Ανάκτηση "ηΒάσηΜου1","UNI", 1, "key","russian"
            ΔείξεΜου()
      }
      Επιστροφή "ηΒάσηΜου1","SELECT * FROM UNI WHERE key='russian'", ,"ok"+str$(now)
      Σωρός Νέος {
            Ανάκτηση "ηΒάσηΜου1","UNI", 1, "key","russian"
            ΔείξεΜου()
      }      
}
Αν λάθος ή όχι οκ Τότε {
      Αναφορά "Δεν βρέθηκε η βάση, ή κάποιο άλλο λάθος"
      Αναφορά Λάθος$
}
\\ Στο Κλείσε Βάση πρέπει να δώσουμε όλο το μονοπάτι και τον τύπο!
Κλείσε Βάση κατ$+"ηΒάσηΜου1"+τυπ$
Ρουτίνα ΔείξεΜου()
      τοπικές Πόσα, χώρα$, αναφορά$
      Διάβασε Πόσα
            Αν Πόσα>0 τότε {
                  Διάβασε χώρα$, αναφορά$
                  Τύπωσε χώρα$
                  Αναφορά αναφορά$
            }
Τέλος Ρουτίνας



12.2 Δομή Απλής Βάσης


Υπάρχει τρόπος η Μ2000 να διαβάσει τη δομή μιας βάσης. Σε αυτό το πρόγραμμα φαίνεται και ο επιλογέας (λίστα επιλογών). Η εντολή Αρχεία με τον διακόπτη "+" στέλνει την εξαγωγή στη λίστα επιλογών. Δοκιμάστε αυτό Επιλογή "Ναι","Όχι" και μετά το Τύπωσε Επιλογή.

α=Στήλη ' κρατάμε στο α το πλάτος νοητής στήλης στην οθόνη
Τύπωσε $(0,8) ' ορίζουμε πλάτος 8
Επιλογή ' σβήνουμε την λίστα επιλογών
Αρχεία + "mdb"  ' βάζουμε στην λίστα επιλογών όλα τα αρχεία τύπου "mdb"
                          ' από τον τρέχον κατάλογο
Αν Επιλογές>0 Τότε { ' Αν υπάρχουν επιλογές στην λίστα
      Τύπωσε "Επέλεξε ένα αρχείο:";
      Επιλογή ! ' εμφάνιση της λίστας για να επιλέξουμε
      Αν Επιλογή>0 Τότε {
            ΒΑΣΗ$=Επιλογή$( Επιλογή )
            Τύπωσε Πεζ$(ΒΑΣΗ$)+".mdb"
            Τύπωσε "Δομή"
            Τύπωσε "Αρχεία:";
            Δομή ΒΑΣΗ$
            Διάβασε ΑΡΧΕΙΑ ' εδώ δεν έχουμε την εντολή ΑΡΧΕΙΑ
                     'αλλά φτιάχνουμε μια μεταβλητή με το ίδιο όνομα και δίνουμε τιμή
                     ' από τον σωρό
            Τύπωσε ΓΡΑΦΗ$(ΑΡΧΕΙΑ)
            Αν ΑΡΧΕΙΑ>0 Τότε {
                  ΓΙΑ Ι=1 Έως ΑΡΧΕΙΑ {
                        Διάβασε ΟΝΟΜΑΤΑ$, ΤΑΞΕΙΣ
                        Τύπωσε Ι,") "+ΟΝΟΜΑΤΑ$
                        Δομή ΒΑΣΗ$, ΟΝΟΜΑΤΑ$
                        Διάβασε Πεδία
                        ΤΑΞΕΙΣ=0
                        Αν Ειναρ Τότε Διάβασε ΤΑΞΕΙΣ
                                    ' Αν υπάρχει αριθμός στο σωρό και όχι λέξη τότε...
                        Αν Πεδία>0 Τότε {
                              ΓΙΑ Π=1 Έως Πεδία {
                                    Διάβασε ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$, ΜΗΚΟΣ
                                    Τύπωσε "",Π,") "+Πεδίο$(ΠΕΡΙΓΡΑΦΗ$,17),"",ΤΥΠΟΣ$, ΜΗΚΟΣ
                              }
                        }
                        Αν ΤΑΞΕΙΣ>0 Τότε {
                              Τύπωσε "","ΤΑΞΗ:"
                              Διάβασε Πεδία
                              Αν Πεδία>0 Τότε {
                                    ΓΙΑ Π=1 Έως Πεδία {
                                          Διάβασε ΠΕΡΙΓΡΑΦΗ$, ΤΥΠΟΣ$
                                          Τύπωσε "",Π,") "+Πεδίο$(ΠΕΡΙΓΡΑΦΗ$,17),"",ΤΥΠΟΣ$
                                    }
                              }
                        }
                  }
            }
      }
}
Τύπωσε $(0,α)



12.3 Ετοιμασία Βάσης με εντολή Εκτέλεσε



Υπάρχει τρόπος να δώσουμε μέσω SQL γλώσσας εντολές για να κάνουμε διάφορες εργασίες, όπως και να δημιουργήσουμε αρχεία (Tables στην ορολογία της SQL).
Έχουμε δώσει στα πεδία του πίνακα κάποιες ιδιότητες, όπως autoincrement primary key, ή NOT NULL (δεν το δέχεται άδειο)

Βάση.Πάροχος "" \\  επαναφορά στην αρχική ρύθμιση
Βάση "άλφα"  ' διαγράφει αν βρει όνομα
Εκτέλεση "άλφα", { CREATE TABLE Employees(ID autoincrement primary key,  LastName   VARCHAR(40) ,  FirstName  VARCHAR(40)  NOT NULL, MyMemo TEXT )}
Προσθήκη "άλφα","Employees",,"Γιώργος","Κύριος","Γεια χαρά από Ελλάδα"
Ανάκτηση "άλφα", "Employees", 1,"",""
Διάβασε Πόσα, Κωδ, Όνομα$, Επώνυμο$, Σημείωση$
Τύπωσε $(4, 6),  "Βάση:","άλφα"
Τύπωσε  "¨Ονοματεπώνυμο:",Επώνυμο$ + " " + Όνομα$
Τύπωσε "Σημείωση:"
Τύπωσε "",
Αναφορά Σημείωση$
Κλείσε Βάση Κατ$+"άλφα.mdb"
Τύπωσε


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


12.4 Χρήση της Εκτέλεσε και άλλων εντολών


Λίγα λόγια για το πρόγραμμα. Εδώ φτιάχνουμε μια βάση με πίνακες (αρχεία τα λέμε εδώ). Βάζουμε τρία αρχεία μέσα στη βάση καθώς και δύο που λέγονται Τάξεις και κρατάνε τα αρχεία ταξινομημένα. Το τρίτο αρχείο μπήκε στο κώδικα για να σβήσουμε τις εγγραφές του και να δούμε τη διαφορά στο μέγεθος του αρχείου της βάσης. Η βάση δηλαδή είναι ένα αρχείο στο δίσκο που έχεις τα δικά της αρχεία μέσα. Μπορούμε να εκτελέσουμε εντολές που δεν γυρνάνε κάτι όπως αυτήν με την Εκτέλεση,αλλά μπορούμε να δημιουργούμε με ερωτήματα πίνακες με ότι θέλουμε ακόμα και μια μόνο εγγραφή με ένα πεδίο, όπως με την εντολή Ανάκτηση και  το ερώτημα "SELECT SUM(ΠΟΣΟ) FROM ΚΙΝΗΣΕΙΣ". Οι βάσεις υποστηρίζουν Unicode.

Φόρμα 60,30
Κ$="βαση1"
Ευρώ$=Χαρκωδ$(0X20AC)
Βάση Κ$
Τύπωσε "ΕΦΤΙΑΞΑ ΝΕΑ ΒΑΣΗ "+Κ$+".mdb"
Τύπωσε "ΣΤΟΝ ΚΑΤΑΛΟΓΟ "+κατ$


\\ Φτιάχνουμε ένα αρχείο μέσα στη βάση με πεδία
Αρχείο Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ", "ΚΩΔ", ΜΑΚΡΥΣ, 0, "ΤΙΤΛΟΣ", ΚΕΙΜΕΝΟ, 20, "ΠΡΟΣΗΜΟ", ΚΕΙΜΕΝΟ, 1
Αρχείο Κ$, "ΚΙΝΗΣΕΙΣ", "ΚΩΔ", ΜΑΚΡΥΣ, 0,"ΗΜΕΡΟΜΗΝΙΑ",ΛΟΓΙΣΤΙΚΟ, 0,  "ΤΥΠΟΣ", ΜΑΚΡΥΣ, 0, "ΠΟΣΟ", ΛΟΓΙΣΤΙΚΟ, 0
Αρχείο Κ$, "ΣΒΗΣΕΜΕ", "ΚΩΔ", ΜΑΚΡΥΣ, 0,"ΥΠΟΜ", ΥΠΟΜΝΗΜΑ, 0
\\ Διορθώνουμε τον ΚΩΔ για να αλλάζει μόνος του
Εκτέλεση Κ$, "ALTER TABLE [ΚΙΝΗΣΕΙΣ] ALTER COLUMN [ΚΩΔ] AUTOINCREMENT"
\\ Ορίζουμε τάξεις
Τάξη Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ", "ΤΙΤΛΟΣ",ΑΥΞΟΥΣΑ
Τάξη Κ$, "ΚΙΝΗΣΕΙΣ","ΗΜΕΡΟΜΗΝΙΑ",ΑΥΞΟΥΣΑ, "ΚΩΔ", ΑΥΞΟΥΣΑ
\\ Τώρα θα βάλουμε τίτλους λογαριασμών, και αν προσθέτουν ή αφαιρούν από το ταμείο
Σωρός Νέος {
      Σειρά "ΒΕΝΖΙΝΕΣ","-","ΑΓΟΡΕΣ ΥΛΙΚΩΝ" ,"-", "ΑΤΟΜΙΚΑ", "-", "ΜΙΣΘΟΙ", "-", "ΕΞΩΤΕΡΙΚΑ", "+", "ΚΑΤΑΘΕΣΗ", "-", "ΑΝΑΛΗΨΗ", "+", "*", "*"
      Διάβασε Α$,Β$
      Κ=1
      Ενώ Α$<>"*" {
            Προσθήκη Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ",Κ,Α$, Β$
            Διάβασε Α$,Β$
           Κ++
      }
}
\\ βάζω δική μου αρίθμηση
Κ--
Τύπωσε ΜΟΡΦΗ$("ΕΒΑΛΑ {0} ΛΟΓΑΡΙΑΣΜΟΥΣ", Κ)
\\ τώρα διαβάζουμε με σειρά ταξινόμησης
Για Ι=1 Έως Κ
      Σωρός Νέος {
            Ανάκτηση Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ", Ι,"",""
            Διάβασε ΠΟΣΑ, ΚΩΔ, ΤΙΤ$, ΠΡΟ$
            Τύπωσε ΜΟΡΦΗ$("{0::-2} {1::-4} {2:20} {3}", Ι, ΚΩΔ, ΤΙΤ$, ΠΡΟ$)
      }
Επόμενο Ι
\\ Τώρα θα κάνουμε μερικές κινήσεις
Σωρός Νέος {
      Σειρά "12-1-2015","ΕΞΩΤΕΡΙΚΑ", 20000,"12-3-2015","ΚΑΤΑΘΕΣΗ", 3000,"14-3-2015", "ΒΕΝΖΙΝΕΣ",50.5
      Ενώ ΟΧΙ ΚΕΝΟ {
            Διάβασε ΗΜ$,ΤΥΠ$, ΠΟΣΟΝ
            ΗΜ=ΗΜΕΡΑ(ΗΜ$) \\ μετατροπή σε αριθμό
            Σωρός Νέος {
                  Αναζήτηση Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ",1,"ΤΙΤΛΟΣ","=", τυπ$
                  Διάβασε ΠΟΣΑ
                  Αν ΠΟΣΑ>0 Τότε {
                        Διάβασε ΚΩΔ : Πέτα : Διάβασε ΠΡΟ$
                  } ΑΛΛΙΩΣ ΛΑΘΟΣ "ΔΕΝ ΒΡΙΣΚΩ ΤΙΤΛΟ ΛΟΓΑΡΙΑΣΜΟΥ!"
            }
            Αν ΠΡΟ$="-" Τότε ΠΟΣΟΝ-!
            Προσθήκη Κ$,"ΚΙΝΗΣΕΙΣ",, ΗΜ, ΚΩΔ, ΠΟΣΟΝ
      }
}
Τύπωσε "ΕΓΓΡΑΦΕΣ"
Σωρός Νέος {
      Ανάκτηση Κ$, "ΚΙΝΗΣΕΙΣ", 1,"",""
      Διάβασε ΠΟΣΑ
      \\ τα υπόλοιπα που βάζει η ανάκτηση στο σωρό τα πετάμε
}
Για Ι=1 Έως ΠΟΣΑ
      Σωρός Νέος {
            Ανάκτηση Κ$, "ΚΙΝΗΣΕΙΣ", Ι,"",""
            Διάβασε ΠΟΣΑ, ΚΩΔ1, ΗΜ, ΚΩΔ, ΠΟΣΟΝ
            ΤΙΤΛ$="<???>"
            Σωρός Νέος {
                  \\ μπορώ να έχω φωλιασμένους νέους σωρούς
                  Αναζήτηση Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ", Ι,"ΚΩΔ","=",ΚΩΔ
                  Αν Αριθμός>0 Τότε Πέτα: Διάβασε ΤΙΤΛ$
            }
            Τύπωσε ΜΟΡΦΗ$("{0::-2} {1:10} {2:20} {3:2:-12}"+Ευρώ$, Ι, Ημέρα$(ΗΜ),ΤΙΤΛ$, ΠΟΣΟΝ)
      }
Επόμενο Ι
Ανάκτηση Κ$,"SELECT SUM(ΠΟΣΟ) FROM ΚΙΝΗΣΕΙΣ",1,"",""
Αν Αριθμός>0 Τότε Διάβασε ΠΟΣΟΝ : Τύπωσε "ΤΑΜΕΙΟ:";ΠΟΣΟΝ;Ευρώ$
Τύπωσε Αρχείου.Μήκος(Κ$+".mdb")
Για Ι=1 Έως 100 {
      Προσθήκη Κ$,"ΣΒΗΣΕΜΕ",Ι , {Κείμενο
                        Άλλη παράγραφος
                        Και άλλη
                        }
}
Τύπωσε Αρχείου.Μήκος(Κ$+".mdb")
Για Ι=1 Έως 100 {
      Αφαίρεση Κ$,"ΣΒΗΣΕΜΕ","ΚΩΔ",Ι
}
Σωρός Νέος {
      Ανάκτηση Κ$, "ΣΒΗΣΕΜΕ", 1,"",""
      Τύπωσε "Συνολικές Εγγραφές στο ΣΒΗΣΕΜΕ", Αριθμός
}
Τύπωσε Αρχείου.Μήκος(Κ$+".mdb") \\ ίδιο μήκος
Κλείσε Βάση Κατ$+Κ$+".mdb"
Συμπίεση Κ$+".mdb"
Τύπωσε Αρχείου.Μήκος(Κ$+".mdb")




Από την έκδοση 8.7 αναθεώρηση 6 η Ημερομηνία μπορεί να οριστεί ως πεδίο Ημερομηνία και θα επιστρέφεται ως αλφαριθμητικό και θα καταχωρείται ως αλφαριθμητικό (βέβαια τρέχει και το προηγούμενο πρόγραμμα). Στο πεδίο είναι αριθμός, και τις μετατροπές τις κάνει η Μ2000.
Οι αλλαγές είναι εδώ:
Αρχείο Κ$, "ΚΙΝΗΣΕΙΣ", "ΚΩΔ", ΜΑΚΡΥΣ, 0,"ΗΜΕΡΟΜΗΝΙΑ",ΗΜΕΡΟΜΗΝΙΑ, 0,  "ΤΥΠΟΣ", ΜΑΚΡΥΣ, 0, "ΠΟΣΟ", ΛΟΓΙΣΤΙΚΟ, 0

(αφαιρέθηκε η μετατροπή ημερομηνίας σε αριθμό)
Σωρός Νέος {
      Σειρά "12-1-2015", "ΕΞΩΤΕΡΙΚΑ",20000,"12-3-2015", "ΚΑΤΑΘΕΣΗ",3000, "14-3-2015","ΒΕΝΖΙΝΕΣ",50.5
      Ενώ ΟΧΙ ΚΕΝΟ {
            Διάβασε ΗΜ$,ΤΥΠ$, ΠΟΣΟΝ
            Σωρός Νέος {
                  Αναζήτηση Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ",1,"ΤΙΤΛΟΣ","=", τυπ$
                  Διάβασε ΠΟΣΑ
                  Αν ΠΟΣΑ>0 Τότε {
                        Διάβασε ΚΩΔ : Πέτα : Διάβασε ΠΡΟ$
                  } ΑΛΛΙΩΣ ΛΑΘΟΣ "ΔΕΝ ΒΡΙΣΚΩ ΤΙΤΛΟ ΛΟΓΑΡΙΑΣΜΟΥ!"
            }
            Αν ΠΡΟ$="-" Τότε ΠΟΣΟΝ-!
            Προσθήκη Κ$,"ΚΙΝΗΣΕΙΣ",, ΗΜ$, ΚΩΔ, ΠΟΣΟΝ
      }
}


και εδώ διαβάζαμε το ΗΜ και δίναμε στην Τύπωσε το Ημέρα$(ΗΜ):
Για Ι=1 Έως ΠΟΣΑ
      Σωρός Νέος {
            Ανάκτηση Κ$, "ΚΙΝΗΣΕΙΣ", Ι,"",""
            Διάβασε ΠΟΣΑ, ΚΩΔ1, ΗΜ$, ΚΩΔ, ΠΟΣΟΝ
            ΤΙΤΛ$="<???>"
            Σωρός Νέος {
                  \\ μπορώ να έχω φωλιασμένους νέους σωρούς
                  Αναζήτηση Κ$, "ΛΟΓΑΡΙΑΣΜΟΙ", Ι,"ΚΩΔ","=",ΚΩΔ
                  Αν Αριθμός>0 Τότε Πέτα: Διάβασε ΤΙΤΛ$
            }
            Τύπωσε ΜΟΡΦΗ$("{0::-2} {1:10} {2:20} {3:2:-12}"+Ευρώ$, Ι, ΗΜ$,ΤΙΤΛ$, ΠΟΣΟΝ)
      }
Επόμενο Ι