Vos calculs, écrits en C#
Les calculs et les règles d’affichage d’un modèle s’écrivent en C#, vérifiés avant l’impression et exécutés dans un cadre sûr.
01
La forme d’un script
Chaque rapport porte une classe C#. Ses méthodes se rattachent aux événements des objets du modèle : une bande qui va s’imprimer, une variable à calculer, un texte à afficher. Le script est rangé dans le fichier .pr, avec le modèle.
1public partial class Script_BL : ReportScript
2{
3 private double _totalPoids;
4 protected override void OnInitialized() { _totalPoids = 0; }
5
6 // Masquer la ligne de remise quand il n’y en a pas
7 private void Detail_OnBeforePrint(PrintEventArgs e)
8 => LIGNE_REMISE.Visible = Tables["LIGNES"]["REMISE"].AsDouble != 0;
9
10 // Calculer le poids de la ligne et le cumuler
11 private void VarPoids_OnCalculate(CalculateEventArgs<double> e)
12 {
13 e.Value = Tables["LIGNES"]["QTE"].AsDouble * Tables["LIGNES"]["POIDS"].AsDouble;
14 _totalPoids += e.Value;
15 }
16}
2{
3 private double _totalPoids;
4 protected override void OnInitialized() { _totalPoids = 0; }
5
6 // Masquer la ligne de remise quand il n’y en a pas
7 private void Detail_OnBeforePrint(PrintEventArgs e)
8 => LIGNE_REMISE.Visible = Tables["LIGNES"]["REMISE"].AsDouble != 0;
9
10 // Calculer le poids de la ligne et le cumuler
11 private void VarPoids_OnCalculate(CalculateEventArgs<double> e)
12 {
13 e.Value = Tables["LIGNES"]["QTE"].AsDouble * Tables["LIGNES"]["POIDS"].AsDouble;
14 _totalPoids += e.Value;
15 }
16}
Un sous-rapport a sa propre classe et accède au rapport principal par Main. L’état se prépare dans OnInitialized et se libère dans Dispose.
02
Les événements
Les événements se déclenchent dans le même ordre qu’avec RPrinter. En face, l’ancien nom en RAP, pour ceux qui migrent.
OBJET
ÉVÉNEMENTS C#
ANCIEN NOM RAP
Rapport
OnBeforePrint, OnAfterPrint, OnBeforePage, OnAfterPage, OnBeforePass, OnAfterPass, OnBeforeColumn, OnAfterColumn
BeforePrint, OnStartPage, OnStartFirstPass…
Cycle de vie
OnInitialized(), Dispose()
GlobalOnCreate, GlobalOnDestroy
Bandes
OnBeforePrint, OnAfterPrint, OnBeforeGenerate, OnAfterGenerate
BeforePrint, AfterGenerate…
Groupes
OnBeforeBreak, OnAfterBreak, OnGetBreakValue
BeforeGroupBreak, AfterGroupBreak
Variables
OnCalculate, OnReset
OnCalc, OnReset
Textes
OnGetText
OnGetText
Mémo, texte riche, image liés
OnGetLines, OnGetRichText, OnGetImage
OnGetMemo, OnGetRichText, OnGetPicture
Tout objet imprimable
OnBeforePrint (e.Cancel masque l’objet), OnAfterRender
OnPrint, OnDrawCommandCreate
Tables
OnRowChanged, avec l’attribut [Table("LIGNES")]
OnTraversal
03
Lire les données
MEMBRE
CE QU’IL FAIT
Tables["T"]["C"]
La rubrique C de la ligne courante de la table T
.AsString, .AsDouble, .AsInt64, .AsBoolean, .AsDateTime
Lecture typée ; une valeur nulle lève une erreur
.AsDoubleOrNull…
Une valeur nulle rend null
.AsDoubleOrDefault…
Une valeur nulle rend zéro, comme ReportBuilder
MoveFirst(), MoveNext(), RecordCount, IsLast
Parcourir une table et savoir où l’on est
LinkTo(maître, champ, champ)
Lier une table détail à sa table maître
Report.PageNumber, Report.PageCount
Numéro de page et nombre de pages
Report.Now
L’heure de l’impression, la même du début à la fin du document
À retenir : « As » lève sur une valeur nulle, « OrNull » rend null, « OrDefault » rend zéro.
04
La bibliothèque
Les 137 fonctions que l’on pouvait appeler en RAP ont leur équivalent en C#. Chacune a été comparée à l’ancien moteur sur environ 54 000 jeux d’essai, en français, en anglais et en allemand.
137
fonctions RAP reprises en C#
≈ 54 000
jeux d’essai comparés à l’ancien moteur
Chaînes
Strings
Copy
Pos
Trim
StringReplace
PadLeft
Conversions
Conversion
StrToDate
StrToFloat
IntToHex
CurrToStr
Mise en forme
Formatting
FormatFloat
FormatCurr
FormatDateTime
FormatMaskText
Dates et heures
DateAndTime
DaysBetween
EncodeDate
DayOfWeek
Mathématiques
ReportMath
Round
RoundTo
Power
Trunc
Fichiers
Files
FileExists
ExtractFileName
Fonctions maison
InHouse
SP_SOMME
SP_Tri
SP_Label
centimes
Requêtes
InternalDb · ExternalDb
SP_Execute_Requete_Interne
SP_Execute_Requete_Externe
05
Dans le concepteur
Vue Événements : la liste des événements de l’objet sélectionné, « + Ajouter » crée la méthode et la rattache
Vue Code : tout le fichier, coloré, avec les lignes en erreur en rouge
Complétion avec Ctrl+Espace ou après un point, boîte à outils de données, d’objets et de fonctions
Bouton Vérifier : compile tous les rapports du modèle sans rien imprimer
Renommer un objet réécrit le code qui l’utilise
Sans le droit « écrire des scripts », le code reste en lecture seule
06
Les messages du compilateur
CODE
SENS
CSxxxx
Erreurs et avertissements habituels du compilateur C#
PR0001
Fonction ou type refusé dans un script (fichiers, réseau…)
PR0002
Appel à une base externe sans le droit correspondant
PR0003 / PR0004
Méthode rattachée introuvable, ou signature incorrecte
PR0005 / PR0006
Classe de script absente, ou langage non pris en charge
PR1001 / PR1002
Information : méthode à typer, ou méthode rattachée à aucun objet
07
Un cadre sûr
Autorisé : types de base, LINQ, collections, texte, dates, expressions régulières avec délai
Refusé : fichiers, réseau, processus, réflexion, code natif, dynamic, état statique
Limites par déclenchement : 10 millions de tours de boucle, 5 secondes, 64 niveaux d’appel
137 tentatives de contournement sont testées à chaque version : aucune ne passe. La base de travail ne s’ouvre qu’en lecture.
Vous utilisez RPrinter ?
Vos scripts Pascal sont traduits en C# à la migration
Migrer depuis RPrinter→[TITRE]
Parlons de vos documents.
E-MAIL
contact@colibase.fr