Γεια σε όλους
Το σημέρινό task είχε το εξής πρόβλημα:
Στις γραμμές των ειδών, το πεδίο τιμή γραμμής θα έπρεπε να έχει είτε 2 είτε 3 δεκαδικά, ανάλογα αν η τιμή είχε τρίτο δεκαδικό διαφορετικό από το μηδέν.
Είπα λοιπόν να δοκιμάσω το λεγόμενο JScript του Fast Report
Φέρνω λοιπόν το πεδίο MTRLINES.PRICE στο Master1Data, τον οποίο συνέδεσα με το MTRLINES dataset.
Πάω στα events του πεδίου και βλέπω ότι έχουμε ένα OnBeforePrint .
Κάνω διπλό κλικ πάνω του και μου φτιάχνει στο script το παρακάτω:
function MTRLINESPRICEOnBeforePrint(Sender)
{
}
Από το (λιτό) documentation της Fast-Report για τα script είπα να δοκιμάσω το
function MTRLINESPRICEOnBeforePrint(Sender)
{
ShowMessage(Sender.Value);
}
και έτσι πήρα για μήνυμα στην οθόνη για κάθε γραμμή 2 φορές και ένα κενό μηνυμα στην αρχή. Το μήνυμα το πήρα αφού πάτησα καταχώρηση και preview, με το σκετο preview μάλλον τρέχει το προηγούμενα καταχωρημένο script και όχι το τρέχον.
Ωραία λέω, τώρα θα φτιάξω μια συνάρτηση για να μου επιστρέφει αν το τρίτο δεκαδικό του αριθμού που είχα στο Sender.Value είναι μηδεν ή όχι.
ανοίγω έναν online javascript tester
και τρέχω το παρακάτω
function has3DecimalNonZero(val){
if (val===null) return false;
var e=val*1000;
var s=e.toString();
var l=s[s.length-1];
var i=parseInt(l,10);
return i>0;
}
alert(has3DecimalNonZero(1.221));
δοκιμάζω διάφορες τιμές για τεστ και καταλαβαίνω ότι λειτουργεί κανονικά
παω λοιπον και το κάνω copy-paste στον JScript Editor του FastReport.
και γράφω και το παρακάτω:
function MTRLINESPRICEOnBeforePrint(Sender)
{
if(has3DecimalNonZero(Sender.Value))
{
//ShowMessage(VarToStr(Sender.Value));
Sender.DisplayFormat.FormatStr="%2.3f";
}
else {
Sender.DisplayFormat.FormatStr="%2.2f";
}
}
Και τότε άρχισαν τα exceptions και τα σφάλματα!.
Μετά από ώρα προσπάθειας και ελέγχου γραμμή γραμμή κατάλαβα ότι αυτό που η FastReport ονομάζει JScript δεν είναι το ίδιο πράμα με αυτό που εμείς εννοούμε (αυτό που έχουν οι browsers και το softone)
Διαβάζω το
και βλέπω κάπου την ShowMessage
και αντιλαμβάνομαι ότι οι συναρτήσεις που καταλαβαίνει είναι αυτές που λέει εκεί.
ΟΚ, τελικά μετά από αρκετό χρόνο η συνάρτηση έγινε έτσι:
function has3DecimalNonZero(v){
TRY {
var ret=false;
var e=v*1000;
var ei=Trunc(e);
var s=VarToStr(ei);
var l=Copy(s,Length(s),1);
var i=StrToInt(l);
ret=i>0;
//ShowMessage(VarToStr(v) + " s:" + s + " l: " + l + " --- " + VarToStr(ret));
return ret;
}
EXCEPT {
//ShowMessage("error:" + VarToStr(v));
return false;
}
}
Αλλά δεν τελειωσαν όλα εκεί!
Ενώ ο κώδικας (με uncommended ta ShowMessage) λειτουργούσε μόνο στις γραμμές που πραγματικά έπρεπε, το πεδίο που ενημερωνόταν για την αλλαγή δεν ήταν ο Sender, αλλά η επόμενη γραμμή.
Μετά φώναξα τον Μάκη για να δούμε το φαινόμενο και τελικά βρήκαμε την άκρη!
Βάλαμε την αλλαγή στο OnBeforePrint όλου του MasterData1
συμπληρώνοντας το παρακάτω:
function MasterData1OnBeforePrint(Sender)
{
if (has3DecimalNonZero(<MTRLINES."Price">)){
MTRLINESPRICE.DisplayFormat.FormatStr="%2.3f";
}
else {
MTRLINESPRICE.DisplayFormat.FormatStr="%2.2f";
}
}
Άρα για να κάνεις αλλαγές στην εμφάνιση των πεδίων στις γραμμές, θα πρέπει να κάνεις τους ελέγχους στην OnBeforePrint του dataset και όχι του πεδίου.
Τα παραπάνω δεν πρέπει σε καμιά περίπτωση να θεωρηθούν προσβλητικά/υποτιμητικά για το εργαλείο. Με το FastReport κάνουμε πράγματα που με τις απλές εκτυπώσεις απλά συμβιβαζόμασταν με ότι υπήρχε διαθέσιμο.
Τα καταγράφω για να τα βρίσκω όποτε τα χρειαστούμε.
Καλή συνέχεια.