Δουλεύοντας με το Fast Report

1,055 views
Skip to first unread message

Νίκος Μάλιακκας

unread,
Jan 19, 2018, 9:15:27 AM1/19/18
to Softone Developers Network
Γεια σε όλους
Το σημέρινό 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 κάνουμε πράγματα που με τις απλές εκτυπώσεις απλά συμβιβαζόμασταν με ότι υπήρχε διαθέσιμο.
Τα καταγράφω για να τα βρίσκω όποτε τα χρειαστούμε.

Καλή συνέχεια.


kko

unread,
Nov 14, 2024, 12:46:24 PM11/14/24
to Softone Developers Network
ένα έχω να πω Νίκο, πάλευα καμιά ώρα με τα ρημαδοevent του πεδίου και άκρη δεν έβγαζα και θυμήθηκα που είχες γράψει και έλυσα αυτό που ήθελα σε 5 λεπτά, χρωστάω κέρασμα.

Χρωματάκια στα πεδία στην γραμμή ήθελα να βάλω υπολογιζόμενα, παράδειγμα

function MasterData2OnBeforePrint(Sender)
{
    Memo31.Color=Memo31.value; // background, θα μπορούσε να είναι εδώ το if απλά το είχα γράψει να κάνει τις πράξεις στον υπολογισμό του πίνακα (query) γιατί είναι πιο εύκολο να υπολοιγίσω την διαβάθμιση των χρωμάτων.
    Memo31.Font.Color=Memo31.value; //font        
}

το Memo31έχει το χρώμα μέσα που θέλω να χρωματίζει το πεδίο (στο παράδειγμα) για την κάθε γραμμή.
Reply all
Reply to author
Forward
0 new messages