Explication des certificats de pipettes
Comme indiqué dans Éléments de configuration du module Pipette, deux exemples de certificats Pipette sont fournis : PIPETTE et PIPETTE COLUMNS. Les deux sont identiques, à quelques petites différences près.
Commençons par les différences : SubReport5 et SubReport6 servent respectivement à afficher les échantillons individuels.
Dans PIPETTE, le paramètre « Report has Columns » de SubReport5 est défini sur 1, et le paramètre « ColumnTraversal » de SubReport5: Detail est défini sur ctTopToBottom.


En revanche, dans PIPETTE COLUMNS, le paramètre Columns de SubReport5: Report est défini sur 4, et le paramètre ColumnTraversal de SubReport5: Detail est défini sur ctLeftToRight.


Pour la suite de cette discussion, nous utiliserons le modèle de certificat PIPETTE. Si l'on examine l'arborescence des rapports, les rapports « Main », « SubReport1 », « SubReport3 » et « SubReport4 » concernant les certificats, les événements, les modèles et les procédures d'événement sont assez classiques. Par conséquent, ils ne feront pas l'objet d'un examen.

Les sous-rapports 2 et 5 servent à présenter les données « telles quelles », le cas échéant. Les sous-rapports SubReport7 et SubReport6 servent à afficher les données « As Left », le cas échéant.
En consultant le SubReport2, vous pouvez voir la configuration de base.

Étant donné que toutes les données environnementales relatives à l'état « tel quel » sont enregistrées dans tous les points de test, le titre en tient compte. Chaque groupe de quatre points de test représentant un canal ou un échantillon donné comporte le même texte dans la colonne « Groupe » ; un regroupement est donc défini sur ce champ, et la mention « un point de test » s'affiche dans le pied de page du groupe. La logique des feuilles de calcul est utilisée pour organiser les données de manière appropriée. Pour le certificat PIPETTE, SubReport5 superpose les données de sorte que les données du premier échantillon apparaissent alignées avec les données récapitulatives. Dans PIPETTE COLUMNS, cette information apparaît sous les données récapitulatives.
Tout ce qui rend cette fonctionnalité si particulière se trouve dans l'onglet « Calcul ». À titre de référence, voici les gestionnaires d'événements pour chaque sous-rapport :




En les passant en revue dans l'ordre d'exécution, nous commencerons par SubReport2.
procédure TitleBeforeGenerate ;
commencer
si UncertaintyOn = '1' alors
commencer
Label61.visible := true;
Label70.Visible := true;
fin
sinon
commencer
Label61.visible := false;
Label70.Visible := false ;
fin ;
fin ;
Le seul objectif de TitleBeforeGenerate est de masquer la colonne « Uncertainty » si « Uncertainty » n'est pas enregistrée. Dans les clients à partir de la version 11, l'incertitude est toujours enregistrée.
procédure TitleBeforePrint ;
commencer
si '0' = ReturnFromSQL('SELECT COUNT(*) FROM CALPNTSEXTRA WHERE EVENT_NUM='+IntToStr(Events['Event Number'])+' AND FIELD_NAME LIKE ''AS FOUND%''') alors
commencer
Title.Visible := false;
fin
sinon
commencer
Title.Visible := true;
fin ;
fin ;
La variable « TitleBeforePrint » sert à déterminer s'il existe des données « As Found » et à masquer ou afficher le titre en conséquence.
procédure GroupHeaderBand1BeforePrint ;
commencer
Label46.Caption := '';
Label47.Caption := '';
Label48.Caption := '';
Label49.Caption := '';
Label50.Caption := '';
Label51.Caption := '';
Label67.Caption := '';
Label70.Caption := '';
Label67.Caption := 'Réussi' ;
si CalibrationTestPoints['As Found Num 4'] <> 0 alors
Label100.Caption := FormatFloat('0.00000', CalibrationTestPoints['Valeur mesurée n° 1'] / CalibrationTestPoints['Valeur mesurée n° 4'])
sinon
Label100.Caption := '';
fin ;
GroupHeaderBand1BeforePrint sert à réinitialiser les données du pied de page. Cela nous permet de nous assurer qu'il n'y a pas de données en retard. Il calcule également le facteur Z brut (Label100).
Pour DetailBeforePrint, je vais diviser le tout en plusieurs parties.
procédure DetailBeforePrint ;
Var
I, I2, I3, iNumResolution, iResResolution, iUncResolution : Entier ;
sRes, sRes2, sResUnc, sDummy : chaîne de caractères ;
commencer
iNumResolution := StrToIntDef(CalibrationTestPoints['Res.'], 6) ;
iResResolution := StrToIntDef(CalibrationTestPoints['Result Res.'], 0) ;
iUncResolution := StrToIntDef(CalibrationTestPoints['Uncertainty Res.'], 6) ;
sRes := '#######0';
sRes2 := '#######0';
sResUnc := '#######0';
Si ((iNumResolution >= 0) et
(iNumResolution <=12) alors
i2 := iNumResolution ; sinon i2 := 6 ;
Si i2>0, alors
commencer
sRes := sRes + '.' ;
pour i := 0 à i2-1, faire
commencer
sRes := sRes + '0' ;
fin ;
fin ;
Si ((iResResolution > 0) et
(iResResolution <= 12) alors
commencer
i3 := iResResolution ;
sRes2 := sRes2 + '.' ;
pour i := 0 à i3-1, faire
commencer
sRes2 := sRes2 + '0' ;
fin ;
fin sinon sRes2 := sRes;
Si ((iUncResolution > 0) et
(iUncResolution <=12) alors
commencer
i3 := iUncResolution ;
sResUnc := sResUnc + '.';
pour i := 0 à i3-1, faire
commencer
sResUnc := sResUnc + '0' ;
fin ;
fin sinon sResUnc := sRes;
La section ci-dessus n'a qu'un seul objectif : créer les chaînes de caractères servant à définir la résolution, qui seront utilisées dans les appels à FormatFloat ci-dessous. Voici comment s'affichent les données du certificat avec la même résolution que dans le tableau des résultats.
si CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + 'moyenne') alors
commencer
Label46.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label70.Caption := FormatFloat(sResUnc, CalibrationTestPoints['Uncertainty']);
fin
sinon si CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' SD') alors
commencer
Label47.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
fin
sinon si CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' acc') alors
commencer
Label48.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label49.Caption := FormatFloat(sRes, CalibrationTestPoints['Tolerance +']);
Label59.Caption := 'Précision ' + CalibrationTestPoints['Unit'];
Label104.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found Num 5']);
fin
sinon si CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' prec') alors
commencer
Label50.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label51.Caption := FormatFloat(sRes, CalibrationTestPoints['Tolerance +']);
Label65.Caption := 'Précision ' + CalibrationTestPoints['Unit'];
Label105.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found Num 5']);
fin ;
si (CalibrationTestPoints['Verdict'] = 'A') ou (CalibrationTestPoints['Verdict'] = 'F') alors
Label67.Caption := 'Échec' ;
fin ;
Cette section examine les champs « Group » et « Description » et s'en sert pour déterminer quelle donnée est concernée (les lignes « if CalibrationTestPoints['Description']=(CalibrationTestPoints['Group']+ »). Pour chaque section, les valeurs « Tel quel », « Tolérance » et « Unité » sont définies dans le pied de page du groupe. Il vérifie également si les résultats de la fonction « As Found » ont échoué ou non.
Comme vous pouvez le constater, c'est là que se trouve l'essentiel de la logique.
procédure GroupFooterBand1BeforePrint ;
commencer
si '0' = ReturnFromSQL('SELECT COUNT(*) FROM CALPNTSEXTRA WHERE EVENT_NUM='+IntToStr(Events['Event Number'])+' AND SEQ='+CalibrationTestPoints['#']+' AND FIELD_NAME LIKE ''AS FOUND%''') alors
commencer
GroupFooterBand1.Visible := false;
fin
sinon
commencer
GroupFooterBand1.Visible := true;
fin ;
fin ;
GroupFooterBand1BeforePrint permet simplement d'afficher ou de masquer le pied de page de groupe selon qu'il existe ou non des données « telles que trouvées » pour le « point de test » actuel. Cela supprimera toutes les données pour lesquelles vous avez omis de saisir des informations.
Pour en venir au SubReport5, il n'y a qu'un seul gestionnaire d'événements.
procédure DetailBeforePrint ;
Var
I, I2, iNumResolution : Entier ;
sRes, sDummy, sValue, sUnits : chaîne de caractères ;
commencer
iNumResolution := StrToIntDef(CalibrationTestPoints['Res.'], 6) ;
sRes := '#######0';
Si ((iNumResolution >= 0) et
(iNumResolution <=12) alors
i2 := iNumResolution ; sinon i2 := 6 ;
Si i2>0, alors
commencer
sRes := sRes + '.' ;
pour i := 0 à i2-1, faire
commencer
sRes := sRes + '0' ;
fin ;
fin ;
DBText43.DisplayFormat := sRes;
sDummy := CalibrationTestPointsExtra['Valeur de champ (Texte)'];
sValue := copy(sDummy, 1, pos(' ', sDummy) - 1);
sUnits := copy(sDummy, pos(' ', sDummy + 1, length(sDummy));
Label96.Caption := FormatFloat(sRes, StrToFloat(sValue)) + ' ' + sUnits;
si copy(CalibrationTestPointsExtra['Nom du champ'], 1, 8) = 'TEL QUEL' alors
commencer
Label52.Caption := inttostr(strtoint(copy(CalibrationTestPointsExtra['Field Name'], 10, 10000)));
Detail.visible := true;
fin
sinon
commencer
Label52.Caption := inttostr(strtoint(copy(CalibrationTestPointsExtra['Field Name'], 9, 10000)));
Detail.visible := false;
fin ;
fin ;
Cette logique a pour seul objectif de calculer la chaîne de résolution, d'appliquer cette résolution à la masse et au volume, et de contrôler la visibilité selon qu'il s'agit ou non d'un échantillon « tel quel ».
Les règles personnalisées pour SubReport7 et SubReport6 sont fondamentalement les mêmes, à l'exception qu'elles ont été adaptées pour correspondre à « As Left » plutôt qu'à « As Found ».