Zum Hauptinhalt springen

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.