Vai al contenuto principale

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