Erläuterung zu Pipettenzertifikaten
Wie unter Konfigurationselemente des Pipette-Moduls erwähnt, stehen zwei Beispiel-Pipette-Zertifikate zur Verfügung: PIPETTE und PIPETTE COLUMNS. Die beiden sind bis auf ein paar kleine Unterschiede identisch.
Zunächst zu den Unterschieden: SubReport5 und SubReport6 dienen jeweils zur Darstellung der einzelnen Proben.
In PIPETTE ist bei „SubReport5: Report“ die Spaltenanzahl auf 1 gesetzt, und bei „SubReport5: Detail“ ist „ColumnTraversal“ auf „ctTopToBottom“ gesetzt.


Im Gegensatz dazu ist bei „PIPETTE COLUMNS“ in „SubReport5: Report“ die Spaltenanzahl auf 4 festgelegt, und in „SubReport5: Detail“ ist „ColumnTraversal“ auf „ctLeftToRight“ gesetzt.


Im weiteren Verlauf dieser Erörterung wird die PIPETTE-Zertifizierungsvorlage verwendet. Betrachtet man die Berichtsbaumstruktur, so sind die Berichte „Main“, „SubReport1“, „SubReport3“ und „SubReport4“ für Zertifikate, Ereignisse, Master und Ereignisprozeduren recht standardmäßig. Daher werden sie nicht geprüft.

SubReport2 und SubReport5 dienen dazu, die „As Found“-Daten anzuzeigen, sofern vorhanden. SubReport7 und SubReport6 dienen dazu, die Daten unter „Verbleibend“ anzuzeigen, sofern vorhanden.
Wenn Sie sich SubReport2 ansehen, können Sie die grundlegende Konfiguration erkennen.

Da alle Umgebungsdaten für den Ist-Zustand an allen Messpunkten gespeichert sind, wird dies im Titel angegeben. Jede Gruppe von vier Messpunkten, die einen bestimmten Kanal/eine bestimmte Probe repräsentieren, weist in der Spalte „Gruppe“ denselben Text auf, sodass für dieses Feld eine Gruppierung eingerichtet wird, wobei in der Fußzeile der Gruppe „ein Messpunkt“ angezeigt wird. Die Logik der Kalkulationstabelle wird verwendet, um die Daten entsprechend zusammenzustellen. Für das PIPETTE-Zertifikat überlagert SubReport5 die Daten, sodass die ersten Beispieldaten bündig mit den Zusammenfassungsdaten erscheinen. In „PIPETTE COLUMNS“ wird dies unterhalb der Zusammenfassungsdaten angezeigt.
Was dieses Programm sonst noch so besonders macht, finden Sie auf der Registerkarte „Calc“. Zur Veranschaulichung sind nachfolgend die Ereignisbehandler für jeden Unterbericht aufgeführt:




Wenn wir sie in der Reihenfolge ihrer Ausführung durchgehen, beginnen wir mit SubReport2.
Prozedur TitleBeforeGenerate;
Beginnen
wenn UncertaintyOn = '1' dann
Beginnen
Label61.visible := true;
Label70.Visible := true;
Ende
sonst
Beginnen
Label61.visible := false;
Label70.Visible := false;
Ende;
Ende;
Der einzige Zweck von „TitleBeforeGenerate“ besteht darin, die Spalte „Uncertainty“ auszublenden, wenn „Uncertainty“ nicht registriert ist. In Clients ab Version 11 wird die Unsicherheit immer erfasst.
Prozedur TitleBeforePrint;
Beginnen
if '0' = ReturnFromSQL('SELECT COUNT(*) FROM CALPNTSEXTRA WHERE EVENT_NUM='+IntToStr(Events['Event Number'])+' AND FIELD_NAME LIKE ''AS FOUND%''') then
Beginnen
Title.Visible := false;
Ende
sonst
Beginnen
Title.Visible := true;
Ende;
Ende;
„TitleBeforePrint“ wird verwendet, um festzustellen, ob „As Found“-Daten vorhanden sind, und den Titel entsprechend ein- oder auszublenden.
Prozedur GroupHeaderBand1BeforePrint;
Beginnen
Label46.Caption := '';
Label47.Caption := '';
Label48.Caption := '';
Label49.Caption := '';
Label50.Caption := '';
Label51.Caption := '';
Label67.Caption := '';
Label70.Caption := '';
Label67.Caption := 'Bestanden';
wenn CalibrationTestPoints['As Found Num 4'] <> 0, dann
Label100.Caption := FormatFloat('0.00000', CalibrationTestPoints['As Found Num 1'] / CalibrationTestPoints['As Found Num 4'])
sonst
Label100.Beschriftung := '';
Ende;
„GroupHeaderBand1BeforePrint“ dient dazu, die Daten in der Fußzeile zurückzusetzen. Dadurch stellen wir sicher, dass wir keine Datenverzögerungen haben. Außerdem berechnet es den Roh-Z-Faktor (Label100).
Für „DetailBeforePrint“ werde ich das Ganze in kleinere Abschnitte unterteilen.
Prozedur DetailBeforePrint;
Var
I, I2, I3, iNumResolution, iResResolution, iUncResolution : Integer ;
sRes, sRes2, sResUnc, sDummy : String ;
Beginnen
iNumResolution := StrToIntDef(CalibrationTestPoints['Res.'], 6);
iResResolution := StrToIntDef(CalibrationTestPoints['Result Res.'], 0);
iUncResolution := StrToIntDef(CalibrationTestPoints['Uncertainty Res.'], 6);
sRes := '#######0';
sRes2 := '#######0';
sResUnc := '#######0';
Wenn ((iNumResolution >= 0) und
(iNumResolution <=12) dann
i2 := iNumResolution, andernfalls i2 := 6;
Wenn i2>0, dann
Beginnen
sRes := sRes + '.';
für i := 0 bis i2-1 tu
Beginnen
sRes := sRes + '0';
Ende;
Ende;
Wenn ((iResResolution > 0) und
(iResResolution <= 12) dann
Beginnen
i3 := iResResolution;
sRes2 := sRes2 + '.';
für i := 0 bis i3-1 tue
Beginnen
sRes2 := sRes2 + '0';
Ende;
end else sRes2 := sRes;
Wenn ((iUncResolution > 0) und
(iUncResolution <=12) dann
Beginnen
i3 := iUncResolution;
sResUnc := sResUnc + '.';
für i := 0 bis i3-1 tu
Beginnen
sResUnc := sResUnc + '0';
Ende;
end else sResUnc := sRes;
Der obige Abschnitt dient einzig und allein dazu, die Zeichenfolgen für die Festlegung der Genauigkeit zu erstellen, die in den nachfolgenden FormatFloat-Aufrufen verwendet werden. So werden die Daten im Zertifikat mit derselben Auflösung wie in der Ergebnistabelle angezeigt.
wenn CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' mean') dann
Beginnen
Label46.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label70.Caption := FormatFloat(sResUnc, CalibrationTestPoints['Uncertainty']);
Ende
else if CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' SD') then
Beginnen
Label47.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Ende
else if CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' acc') then
Beginnen
Label48.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label49.Caption := FormatFloat(sRes, CalibrationTestPoints['Tolerance +']);
Label59.Caption := 'Genauigkeit ' + CalibrationTestPoints['Unit'];
Label104.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found Num 5']);
Ende
else if CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' prec') then
Beginnen
Label50.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label51.Caption := FormatFloat(sRes, CalibrationTestPoints['Tolerance +']);
Label65.Caption := 'Genauigkeit ' + CalibrationTestPoints['Unit'];
Label105.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found Num 5']);
Ende;
wenn (CalibrationTestPoints['Verdict'] = 'A') oder (CalibrationTestPoints['Verdict'] = 'F') dann
Label67.Caption := 'Fehlgeschlagen';
Ende;
In diesem Abschnitt werden die Felder „Group“ und „Description“ betrachtet und dazu verwendet, um festzustellen, um welchen Datensatz es sich handelt (die Zeilen, in denen gilt: if CalibrationTestPoints['Description']=(CalibrationTestPoints['Group']+). Für jeden Abschnitt werden die Felder „Ist-Wert“, „Toleranz“ und „Einheit“ in der Gruppenfußzeile festgelegt. Außerdem wird überprüft, ob die Ergebnisse der „As Found“-Analyse fehlgeschlagen sind oder nicht.
Wie Sie sehen können, befindet sich hier der Großteil der Logik.
Prozedur GroupFooterBand1BeforePrint;
Beginnen
if '0' = ReturnFromSQL('SELECT COUNT(*) FROM CALPNTSEXTRA WHERE EVENT_NUM='+IntToStr(Events['Event Number'])+' AND SEQ='+CalibrationTestPoints['#']+' AND FIELD_NAME LIKE ''AS FOUND%''') then
Beginnen
GroupFooterBand1.Visible := false;
Ende
sonst
Beginnen
GroupFooterBand1.Visible := true;
Ende;
Ende;
„GroupFooterBand1BeforePrint“ blendet die Gruppenfußzeile ein oder aus, je nachdem, ob für den aktuellen „Testpunkt“ Daten im Originalformat vorliegen oder nicht. Dadurch werden alle Daten ausgeblendet, für die Sie die Erfassung übersprungen haben.
Was den SubReport5 betrifft, so gibt es nur einen Ereignis-Handler.
Prozedur DetailBeforePrint;
Var
I, I2, iNumResolution: Integer;
sRes, sDummy, sValue, sUnits : String ;
Beginnen
iNumResolution := StrToIntDef(CalibrationTestPoints['Res.'], 6);
sRes := '#######0';
Wenn ((iNumResolution >= 0) und
(iNumResolution <=12) dann
i2 := iNumResolution, andernfalls i2 := 6;
Wenn i2>0, dann
Beginnen
sRes := sRes + '.';
für i := 0 bis i2-1 tue
Beginnen
sRes := sRes + '0';
Ende;
Ende;
DBText43.DisplayFormat := sRes;
sDummy := CalibrationTestPointsExtra['Feldwert (Text)'];
sValue := copy(sDummy, 1, pos(' ', sDummy) - 1);
sUnits := copy(sDummy, pos(' ', sDummy) + 1, length(sDummy));
Label96.Caption := FormatFloat(sRes, StrToFloat(sValue)) + ' ' + sUnits;
wenn copy(CalibrationTestPointsExtra['Feldname'],1,8) = 'AS FOUND' dann
Beginnen
Label52.Caption := inttostr(strtoint(copy(CalibrationTestPointsExtra['Field Name'],10,10000)));
Detail.visible := true;
Ende
sonst
Beginnen
Label52.Caption := inttostr(strtoint(copy(CalibrationTestPointsExtra['Field Name'],9,10000)));
Detail.visible := false;
Ende;
Ende;
Der einzige Zweck dieser Logik besteht darin, die Auflösungszeichenfolge zu berechnen, diese Auflösung auf Masse und Volumen anzuwenden und die Sichtbarkeit davon abhängig zu machen, ob es sich um eine „As Found“-Probe handelt oder nicht.
Die benutzerdefinierten Regeln für SubReport7 und SubReport6 sind im Grunde genommen identisch, wurden jedoch so angepasst, dass sie statt „As Found“ nun „As Left“ verwenden.