Aller directement au contenu principal

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 ».