This is my corner for documenting my ideas.
It mostly contains posts for Access Databases (samples, full applications, etc.) as i like rapid software application development. Occasionally you will find other stuff like physics notes.

Sunday, 12 September 2010

Χειρισμός των hyperlinks στο Access Runtime

Το Access Runtime είναι μία δωρεάν παρεχόμενη εφαρμογή από την Microsoft με σκοπό όσοι δεν διαθέτουν την Microsoft Access (βρίσκεται στην έκδοση Professional του Office) να μπορούν να ανοίξουν και να τρέξουν τις εφαρμογές της Access όχι όμως και να επέμβουν στον σχεδιασμό τους. Δυστυχώς όμως δεν διαθέτει 100% τη λειτουργικότητα της πλήρους εφαρμογής με συνέπεια μερικά χαρακτηριστικά να είναι απόντα και ο σχεδιαστής θα πρέπει να το λαμβάνει αυτό υπόψιν του όταν θα σχεδιάζει την εφαρμογή καθώς μπορεί να χρειαστεί να την διανείμει μαζί με το Runtime όταν δεν είναι διαθέσιμη στον παραλήπτη της εφαρμογής η Access.

Δυστυχώς ένα από τα χαρακτηριστικά που απουσιάζουν από το Runtime είναι η διαχείριση των hyperlinks, δεν γίνεται δηλαδή να προσθέσεις ή να αφαιρέσεις κάπου αν αυτό απαιτείται. Μία συχνή χρήση τους σε εφαρμογές που φτιάχνονται στην Access είναι να χρησιμοποιούνται ως διαδρομές αρχείων γιατί με το πάτημα επάνω τους ανοίγει το αρχείο στο οποίο δείχνουν. Για παράδειγμα μπορεί για ένα πρόσωπο να θέλουμε να έχουμε τις διαδρομές των αρχείων που σχετίζονται με αυτό (έγγραφα word/acrobat/excel ή οτιδήποτε άλλο) και με ένα πίνακα να τις καταχωρούμε στα αντίστοιχο πεδίο. Θα δούμε μία μέθοδο ώστε να μπορούμε να προσθέσουμε τις διαδρομές των αρχείων σε μορφή hyperlink παρακάμπτοντας την αδυναμία του Runtime.

Πρώτα από όλα θα χρειαστούμε μία ρουτίνα που να ανοίγει το πλαίσιο διαλόγου για την επιλογή της διαδρομής. Αυτή η ρουτίνα παρέχεται στο παράδειγμα και είναι εκτός σκοπού η ανάλυση της, μιας και είναι πολύ διαδεδομένη και υπάρχει σε πολλές παραλλαγές παντού στο Διαδίκτυο. Μας ενδιαφέρει η ρουτίνα η οποία αφού θα πάρει τη διαδρομή του αρχείου να τη μετατρέψει σε hyperlink. Έτσι ο πίνακας μας με ονομασία tblPaths πέρα από το Primary Key θα πρέπει να έχει ένα πεδίο memo (DocPath) που θα κρατάει τις διαδρομές και δεν θα έχει περιορισμούς στο μήκος των χαρακτήρων. Στη σχεδίαση φόρμας αφού βάλουμε τα πεδία του πίνακα επάνω θα πρέπει να τοποθετήσουμε και ένα Command Button στον οποίο θα αντιστοιχίσουμε κώδικα ώστε να ανοίξει το πλαίσιο διαλόγου, να προστεθεί η διαδρομή και να αποθηκευτεί ως hyperlink.

Ο κώδικας που παραθέτω είναι από αυτό εδώ το παράδειγμα 


στο οποίο χρησιμοποείται για να δώσει τη διαδρομή ενός αρχείου εικόνας ώστε αυτή να μην ενσωματώνεται στη βάση (πολύ χρήσιμο) και που εδώ δεν μας ενδιαφέρουν τα κομμάτια που αφορούν την εικόνα οπότε απλοποιείται πολύ. Έτσι αν ονομάσoυμε το Command Button cmdAddFilePath τότε πρέπει να ενσωματώσουμε τον παρακάτω κώδικα ως EventProcedure στο Event OnClick:


Private Sub cmdAddFilePath_Click()
On Error GoTo cmdAddFilePath_Err
    Dim strFilter As String
    Dim lngflags As Long
    Dim varFileName As Variant

    strFilter = "All Files (*.*)" & vbNullChar & "*.*" _
              & vbNullChar & "All Files (*.*)" & vbNullChar & "*.*"

    lngflags = tscFNPathMustExist Or tscFNFileMustExist _
               Or tscFNHideReadOnly

    varFileName = tsGetFileFromUser( _
                  fOpenFile:=True, _
                  strFilter:=strFilter, _
                  rlngflags:=lngflags, _
                  strDialogTitle:="ÅðéëÝîôå ôï áñ÷åßï...")

    If IsNull(varFileName) Then
    Else
        Me![DocPath] = varFileName & "#" & varFileName & "#"
    End If

cmdAddFilePath_End:
    On Error GoTo 0
    Exit Sub

cmdAddFilePath_Err:
    Beep
    MsgBox err.Description, , "Error: " & err.Number _
                            & " in file"
    Resume cmdAddFilePath_End
End Sub




Θα παρατηρήσατε ότι έχω κοκκινήσει τη γραμμή του κώδικα που κάνει όλη τη δουλειά και που στον αρχικό κώδικα ήταν απλά

Me![DocPath] = varFileName

και που η λειτουργία της είναι να δώσει στην ενεργή φόρμα (Me), στο πεδίο DocPath τη τιμή της μεταβλητής varFileName που δεν είναι παρά η διαδρομή του αρχείου. Η μετατροπή που κάναμε ήταν να προσθέσουμε ξανά τη varFileName με το σύμβολο # στην αρχή και το τέλος της πρόσθεσης ώστε να αποθηκεύονται μαζί και οι πληροφορίες που απαιτούν τα hyperlinks (& "#" & varFileName & "#").
Τέλος θα πρέπει να πούμε στην Access να εμφανίζει το πεδίο DocPath ως hyperlink και αυτό γίνεται από την ιδιότητα IsHyperlink θέτοντας το όρισμα της σε Yes.


Έχουμε τελειώσει. Πλέον στο Runtime μπορούμε να προσθέτουμε hyperlinks.



 και φυσικά μπορείτε να μελετήσετε το παράδειγμα


Saturday, 11 September 2010

Υπολογισμός Δόσης Δανείου (Σταθερού Επιτοκίου)

Συχνά ερχόμαστε αντιμέτωποι με το ερώτημα του πόση θα είναι η μηνιαία δόση για να αγοράσουμε ένα καταναλωτικό αγαθό που επιθυμούμε. Τα δάνεια που χορηγούνται σε αυτές τις περιπτώσεις είναι σταθερού επιτοκίου και χαμηλής διάρκειας (12-48 μήνες) οπότε χρησιμοποιείται ένας τύπος υπολογισμού της δόσης ο οποίος προκύπτει από μία μαθηματική διαδικασία, η οποία δεν είναι απαραίτητο να μας απασχολήσει σε αυτή την ανάρτηση. Τον τύπο αυτό τον ενσωματώνουν πολλές τράπεζες στις σελίδες τους για να δώσουν μία γρήγορη απάντηση στον επισκέπτη τους και είναι ο εξής:


Τα απαιτούμενα πεδία για τον υπολογισμό της Μηνιαίας Δόσης είναι το Αρχικό Κεφάλαιο, το Ετήσιο Επιτόκιο δανεισμού, και ο Αριθμός Μηνιαίων Δόσεων. Φυσικά ο υπολογισμός πολύ εύκολα μπορεί να γίνει με τη χρήση του Microsoft Excel αλλά εδώ ασχολούμαστε με την Microsoft Access όπου θα φτιάξουμε μία φόρμα ώστε να έχουμε καλύτερο οπτικό αποτέλεσμα και η οποία θα μπορεί να ενσωματωθεί σε οποιαδήποτε άλλη εφαρμογή μας (εγώ την κατασκεύασα ως βοηθητικό εργαλείο για το miniCRM).

Σε μορφή σχεδίασης επάνω σε μία κενή φόρμα τοποθετούμε τέσσερα πεδία κειμένου (text box) τα οποία αντιστοιχούμε στις απαραίτητες μεταβλητές για τον υπολογισμό της μηνιαίας δόσης που είναι όπως είπαμε το Αρχικό Κεφάλαιο (PrincipalAmount), το Ετήσιο Επιτόκιο (AnnualInterest) από το οποίο υπολογίζουμε το Μηνιαίο Επιτόκιο (MonthlyInterest) και τον Αριθμό των Μηνιαίων Δόσεων (Months). Στο πεδίο PrinicpalAmount μπορούμε να δώσουμε Format Euro μιας και πρόκειται για χρηματικό ποσό. Στο πεδίο AnnualInterest δεν δίνουμε Format Ποσοστού γιατί μπορεί να μπερδέψει τους υπολογισμούς ο τρόπος που χειρίζεται τα ποσοστά η Access. Το πεδίο MonthlyInterest θα ισούται με το πηλίκο του AnnualInterest προς 12 (μήνες του έτους) προς 100 (σε καθαρό αριθμό γιατί δίνουμε αριθμό ποσοστού %). Επειδή ο χρήστης δεν είναι ανάγκη να βλέπει το πεδίο MonthlyInterest το κάνουμε αόρατο θέτοντας την ιδιότητα Visible στα Properties του σε No. Το πεδίο Months που αντιστοιχεί στους Μήνες μπορούμε να το περιορίσουμε ώστε να μην δείχνει δεδαδικούς καθώς η τιμή που δέχεται αντιστοιχεί σε ακέραιο αριθμό.




Τέλος χρειάζεται άλλο ένα text box στο οποίο θα γίνεται ο υπολογισμός της μηνιαίας δόσης με βάση τον παραπάνω τύπο και που χρησιμοποιώντας τα ονόματα που δώσαμε στις απαραίτητες μεταβλητές θα πάρει τη μορφή:


[PrincipalAmount]*(([MonthlyInterest]/((1+[MonthlyInterest])^[Months]-1))+[MonthlyInterest])

Την έκφραση αυτή (με ένα ίσον μπροστά) την βάζουμε στο Control Source του text box που αντιστοιχεί στη μηνιαία δόση και που ας το ονομάσουμε MonthlyPayment και ας του δώσουμε Format Euro.

Θεωρητικά έχουμε τελειώσει αλλά για την την φιλικότητα προς τον χρήστη καλό είναι να υπάρχει και ένα πεδίο που να υπολογίζει τη συνολική επιβάρυνση, το ποσό δηλαδή που θα πληρώσουμε επιπλέον του Αρχικού Κεφαλαίου. Έτσι δεν έχουμε παρά να προσθέσουμε άλλο ένα text box που θα υπολογίζει το συνολικό κεφάλαιο με τους τόκους και θα αφαιρεί το Αρχικό Κεφάλαιο ώστε να παίρνουμε την επιβάρυνση. Οπότε στο Control Source θα μπει η εξής έκφραση

[MonthlyPayment]*[Months]-[PrincipalAmount]

Aποθηκεύουμε και ιδού το αποτέλεσμα εν δράσει:


Και φυσικά μπορείτε να πάρετε έτοιμο: