Spiegazione dei certificati delle pipette
Come indicato nella sezione Elementi di configurazione del modulo Pipette, sono disponibili due certificati Pipette di esempio: PIPETTE e PIPETTE COLUMNS. I due sono identici, tranne che per un paio di piccole differenze.
Cominciamo dalle differenze: SubReport5 e SubReport6 servono rispettivamente a visualizzare i singoli campioni.
In PIPETTE, in SubReport5: Report l'opzione Columns è impostata su 1, mentre in SubReport5: Detail l'opzione ColumnTraversal è impostata su ctTopToBottom.


Al contrario, in PIPETTE COLUMNS, in SubReport5: Report l'opzione Columns è impostata su 4, mentre in SubReport5: Detail l'opzione ColumnTraversal è impostata su ctLeftToRight.


Nel prosieguo di questa discussione verrà utilizzato il modello di certificato PIPETTE. Dando un'occhiata all'albero dei report, i report Main, SubReport1, SubReport3 e SubReport4 relativi a Certificati, Eventi, Master e Procedure di evento sono piuttosto standard. Di conseguenza, non saranno esaminati.

I sottoreport SubReport2 e SubReport5 vengono utilizzati per visualizzare i dati "As Found", se presenti. SubReport7 e SubReport6 servono a visualizzare i dati relativi alle rimanenze, se presenti.
Dando un'occhiata a SubReport2, è possibile vedere la configurazione di base.

Poiché tutti i dati ambientali relativi allo stato "As Found" sono memorizzati in tutti i punti di prova, il titolo ne tiene conto. Ogni gruppo di quattro punti di prova che rappresentano un determinato canale/campione presenta lo stesso testo nella colonna "Gruppo", pertanto viene impostato un raggruppamento su quel campo, con la dicitura "un punto di prova" visualizzata nel piè di pagina del gruppo. Per organizzare i dati in modo adeguato viene utilizzata la logica delle schede di calcolo. Per il certificato PIPETTE, SubReport5 sovrappone i dati in modo che i dati del primo campione appaiano allineati con i dati di riepilogo. In PIPETTE COLUMNS, appare sotto i dati di riepilogo.
Il resto delle caratteristiche che rendono questa funzione speciale si trova nella scheda «Calcolo». A titolo di riferimento, di seguito sono riportati i gestori di eventi per ciascun sottorapporto:




Esaminandoli in ordine di esecuzione, inizieremo con SubReport2.
procedura TitleBeforeGenerate;
inizia
se UncertaintyOn = '1' allora
inizia
Label61.visible := true;
Label70.Visible := true;
fine
altrimenti
inizia
Label61.visible := false;
Label70.Visible := false;
fine;
fine;
L'unico scopo di TitleBeforeGenerate è quello di nascondere la colonna "Incertezza" se non è stata registrata alcuna incertezza. Nei client a partire dalla versione 11, l'incertezza viene sempre registrata.
procedura TitleBeforePrint;
inizia
se '0' = ReturnFromSQL('SELECT COUNT(*) FROM CALPNTSEXTRA WHERE EVENT_NUM='+IntToStr(Events['Event Number'])+' AND FIELD_NAME LIKE ''AS FOUND%''') allora
inizia
Title.Visible := false;
fine
altrimenti
inizia
Title.Visible := true;
fine;
fine;
TitleBeforePrint viene utilizzato per verificare la presenza di dati "As Found" e per nascondere o mostrare il titolo di conseguenza.
procedura GroupHeaderBand1BeforePrint;
inizia
Label46.Caption := '';
Label47.Caption := '';
Label48.Caption := '';
Label49.Caption := '';
Label50.Caption := '';
Label51.Caption := '';
Label67.Caption := '';
Label70.Caption := '';
Label67.Caption := 'Superato';
se CalibrationTestPoints['As Found Num 4'] <> 0 allora
Label100.Caption := FormatFloat('0.00000', CalibrationTestPoints['Valore rilevato n. 1'] / CalibrationTestPoints['Valore rilevato n. 4'])
altrimenti
Label100.Caption := '';
fine;
GroupHeaderBand1BeforePrint serve a azzerare i dati nel piè di pagina. In questo modo ci assicuriamo di non avere dati in ritardo. Calcola inoltre il fattore Z grezzo (Label100).
Per DetailBeforePrint, ho intenzione di suddividere il lavoro in parti.
procedura DetailBeforePrint;
Var
I, I2, I3, iNumResolution, iResResolution, iUncResolution : Intero ;
sRes, sRes2, sResUnc, sDummy : String ;
inizia
iNumResolution := StrToIntDef(CalibrationTestPoints['Res.'], 6);
iResResolution := StrToIntDef(CalibrationTestPoints['Result Res.'], 0);
iUncResolution := StrToIntDef(CalibrationTestPoints['Uncertainty Res.'], 6);
sRes := '#######0';
sRes2 := '#######0';
sResUnc := '#######0';
Se ((iNumResolution >= 0) e
(iNumResolution <=12) allora
i2 := iNumResolution; altrimenti i2 := 6;
Se i2>0, allora
inizia
sRes := sRes + '.';
per ogni i da 0 a i-1
inizia
sRes := sRes + '0';
fine;
fine;
Se ((iResResolution > 0) e
(iResResolution <=12) allora
inizia
i3 := iResResolution;
sRes2 := sRes2 + '.';
per ogni i da 0 a i3-1
inizia
sRes2 := sRes2 + '0';
fine;
end else sRes2 := sRes;
Se ((iUncResolution > 0) e
(iUncResolution <=12) allora
inizia
i3 := iUncResolution;
sResUnc := sResUnc + '.';
per ogni i da 0 a i3-1
inizia
sResUnc := sResUnc + '0';
fine;
end else sResUnc := sRes;
La sezione precedente ha un unico scopo: creare le stringhe per l'impostazione della risoluzione utilizzate nelle chiamate a FormatFloat riportate di seguito. Ecco come vengono visualizzati i dati nel certificato con la stessa risoluzione della griglia dei risultati.
se CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + 'media') allora
inizia
Label46.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label70.Caption := FormatFloat(sResUnc, CalibrationTestPoints['Uncertainty']);
fine
altrimenti se CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' SD') allora
inizia
Label47.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
fine
altrimenti se CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' acc') allora
inizia
Label48.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label49.Caption := FormatFloat(sRes, CalibrationTestPoints['Tolerance +']);
Label59.Caption := 'Precisione ' + CalibrationTestPoints['Unit'];
Label104.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found Num 5']);
fine
altrimenti se CalibrationTestPoints['Description'] = (CalibrationTestPoints['Group'] + ' prec') allora
inizia
Label50.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found']);
Label51.Caption := FormatFloat(sRes, CalibrationTestPoints['Tolerance +']);
Label65.Caption := 'Precisione ' + CalibrationTestPoints['Unit'];
Label105.Caption := FormatFloat(sRes, CalibrationTestPoints['As Found Num 5']);
fine;
se (CalibrationTestPoints['Verdict'] = 'A') oppure (CalibrationTestPoints['Verdict'] = 'F') allora
Label67.Caption := 'Errore';
fine;
Questa sezione esamina i campi "Group" e "Description" e li utilizza per determinare quale dato sia oggetto dell'analisi (le righe "if CalibrationTestPoints['Description']=(CalibrationTestPoints['Group']+"). Per ogni sezione, nel piè di pagina del gruppo vengono impostati i valori "Come trovato", "Tolleranza" e "Unità". Verifica inoltre se i risultati di "As Found" hanno dato esito negativo o meno.
Come potete vedere, è qui che si concentra la maggior parte della logica.
procedura GroupFooterBand1BeforePrint;
inizia
se '0' = ReturnFromSQL('SELECT COUNT(*) FROM CALPNTSEXTRA WHERE EVENT_NUM='+IntToStr(Events['Event Number'])+' AND SEQ='+CalibrationTestPoints['#']+' AND FIELD_NAME LIKE ''AS FOUND%''') allora
inizia
GroupFooterBand1.Visible := false;
fine
altrimenti
inizia
GroupFooterBand1.Visible := true;
fine;
fine;
GroupFooterBand1BeforePrint si limita a nascondere o mostrare il piè di pagina del gruppo a seconda che siano presenti o meno dati "As Found" per l'attuale "punto di prova". In questo modo verranno esclusi tutti i dati relativi ai periodi che hai saltato.
Passando al SubReport5, c'è un solo gestore di eventi.
procedura DetailBeforePrint;
Var
I, I2, iNumResolution : Intero ;
sRes, sDummy, sValue, sUnits : String ;
inizia
iNumResolution := StrToIntDef(CalibrationTestPoints['Res.'], 6);
sRes := '#######0';
Se ((iNumResolution >= 0) e
(iNumResolution <=12) allora
i2 := iNumResolution; altrimenti i2 := 6;
Se i2>0, allora
inizia
sRes := sRes + '.';
per ogni i da 0 a i-1
inizia
sRes := sRes + '0';
fine;
fine;
DBText43.DisplayFormat := sRes;
sDummy := CalibrationTestPointsExtra['Valore campo (testo)'];
sValue := copy(sDummy, 1, pos(' ', sDummy) - 1);
sUnits := copy(sDummy, pos(' ', sDummy + 1, length(sDummy));
Label96.Caption := FormatFloat(sRes, StrToFloat(sValue)) + ' ' + sUnits;
se copy(CalibrationTestPointsExtra['Field Name'],1,8) = 'AS FOUND' allora
inizia
Label52.Caption := inttostr(strtoint(copy(CalibrationTestPointsExtra['Field Name'],10,10000)));
Detail.visible := true;
fine
altrimenti
inizia
Label52.Caption := inttostr(strtoint(copy(CalibrationTestPointsExtra['Field Name'],9,10000)));
Detail.visible := false;
fine;
fine;
L'unico scopo di questa logica è calcolare la stringa di risoluzione, applicare tale risoluzione alla massa e al volume e gestire la visibilità a seconda che si tratti o meno di un campione "As Found".
Le regole personalizzate per SubReport7 e SubReport6 sono sostanzialmente le stesse, tranne per il fatto che sono state modificate per corrispondere all’opzione «As Left» anziché «As Found».