Example Product Rule - XRF Calculations

Scenario: XRF corrections are performed. Total LOI and total oxides calculated if LOI results are available, and the results sent to and SPC file.

Sub Main()

'XRF Corrections Procedure

Dim iNoElems

Dim dT1, dT2, dXFlux, dXSamp, dCorr

Dim dFeX, dFe_XRF, dFe2O3, dFe

Dim dSiO2, dAlsO3, dTiO2, DMn, dMnO, dCaO, dS, SO3, dP, dP2O5, dMgO

Dim dLOI, dTotal, dDiff

Dim sSPCRecord

Dim oSupport, oFileSystem, oTextFile

Const ForAppending = 8

'Set up some defaults for testing purposes

'Current.Pro_Job = "JOB2"

'Current.Cuid = "0000033736"

'Current.Sampleident = "JOB2 0001"

'Current.Sampletype ="UNK"

'Current.Sch_Code = "XRF"

'Current.AnalyteCode = "FEX"

'Current.ProductCode ="GEN_XRF"

Set oSupport = CreateObject("CCSUPP01.clsSupport")

'Ensure XRF-Fe has been analysed

If clsBDProfjob.PopulateByCuid (Current.Cuid, Current.Sch_Code, "FEX") Then

If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then

dFeX = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)

dT1 = 5.4

dT2 = 0.6

If clsBDProfjob.PopulateByCuid (Current.Cuid, "XRFPRP", "XFLUX") Then

dXFlux = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)

If dXFlux < 0.0 Then

dXFlux = dT1

End If

Else

dXFlux = dT1

End If

If clsBDProfjob.PopulateByCuid (Current.Cuid, "XRFPRP", "XSAMP") Then

dXSamp = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)

If dXSamp < 0.0 Then

dXSamp = dT2

End If

Else

dXSamp = dT2

End If

'Get the H2O moisture result and determine the correction factor

If clsBDProfjob.PopulateByCuid (Current.Cuid, Current.Sch_Code, "H2O") Then

dH2O = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)

If dH2O < 0.0 Then

dCorr = (dXFlux / dT1) * (dT2 / dXSamp)

Else

dCorr = (dXFlux / dT1) * (dT2 / dXSamp) * (100 + dH2O) / 100.0

End If

Else

dCorr = (dXFlux / dT1) * (dT2 / dXSamp)

End If

'Do the corrections

'Set BatchUpdate = True so that the record set is not written to the database

'until all data for the current record set is updated

clsBDProfjob.BatchUpdate = True

dFe_XRF = dFeX * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "FE_XRF"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dFe_XRF

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dFe_XRF)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "FE2O3X"

dFe2O3 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "FE2O3"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dFe2O3

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dFe2O3)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "SIO2X"

dSiO2 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "SIO2"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dSiO2

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dSiO2)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "AL2O3X"

dAl2O3 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "AL2O3"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dAl2O3

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dAl2O3)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "TIO2X"

dTiO2 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "TIO2"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dTiO2

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dTiO2)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "MNX"

dMn = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "MN"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dMn

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dMn)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

dMnO = dMn * 1.2912

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "MNO"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dMnO

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dMnO)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "CAOX"

dCaO = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "CAO"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dCaO

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dCaO)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "SX"

dS = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "S"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dS

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dS)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "SO3X"

dSO3 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "SO3"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dSO3

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dSO3)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "PX"

dP = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "P"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dP

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dP)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

dP2O5 = dP * 2.2914

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "P2O5"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dP2O5

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dP2O5)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "MGOX"

dMg0 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * dCorr

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "MGO"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dMgO

ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dMgO)

'Set BatchUpdate = False so that the record set is written to the database

'before it is overwritten with the next populate

clsBDProfjob.BatchUpdate = False

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

Msgbox "XRF Corrections done", vbOKOnly, "XRF"

'If LOI LOI is done, calculate Total

If clsBDProfjob.PopulateByCuid (Current.Cuid, "LOI", "LOI") Then

If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then

dLOI = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)

'Set BatchUpdate = True so that the record set is not written to the database

'until all data for the current record set is updated

clsBDProfjob.BatchUpdate = True

'If Wet-Fe is present, use it to calculate FE2O3, else use XRF-Fe

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "FE_WET"

If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then

dFe = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue) * 1.4297

Else

dFe = dFe_XRF * 1.4297

End If

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "FE"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dFe

ProfjobCuidSchemeAnalyte.Finalvalue = cStr(dFe)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

'Calculate Total with LOI and Total oxides

dTotal = dFe + dSiO2 + dAl2O3 + dTiO2 + dMnO + dCaO + dS + dP2O5 + dMgO + dLOI

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "TOTAL"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dTotal

ProfjobCuidSchemeAnalyte.Finalvalue = cStr(dTotal)

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

dDiff = dFe_XRF / ((99.96 - (dTotal - dFe2O3)) * 0.6994)

clsBDProfjob.PopulateByCuid Current.Cuid, Current.Sch_Code, "DIFF"

ProfjobCuidSchemeAnalyte.Analytestatus = "CPL"

ProfjobCuidSchemeAnalyte.Numericvalue = dTotal

ProfjobCuidSchemeAnalyte.Finalvalue = cStr(dTotal)

'Set BatchUpdate = False so that the record set is written to the database

'before it is overwritten with the next populate

clsBDProfjob.BatchUpdate = False

clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True

clsBDProfjob.SaveProfjobCuidSchemeAnalyte True

'Pass all results to SPC

Set oFileSystem = CreateObject( "Scripting.FileSystemObject" )

Set oTextFile = oFileSystem.OpenTextFile( "I:\CCLASELSQL\SPC\XRF.SPC", ForAppending, True )

'SPF file format:

'SCHEME 1-20

'IDENT 21-40

'JOB 41-60

'DD/MM/YY 61-68

'HH:MM:SS 69-76

'#EL=nnn 77-83

'ELEMn 84-93

'FLAG 94

'VALUE 95-106

'Determine the list of analytes for this scheme

iNoElems = 0

sSPCRecord = ""

clsBDProfjob.SkipProfjobCuidSchemeAnalyte 0

do while not clsBDProfjob.EOFProfjobCuidSchemeAnalyte

iNoElems = iNoElems + 1

sSPCRecord = sSPCRecord & _

Left( ProfjobCuidSchemeAnalyte.AnalyteCode & Space(20), 20 ) & _

Left( ProfjobCuidSchemeAnalyte.Analytestatus & Space(3), 3 ) & _

Left( ProfjobCuidSchemeAnalyte.Finalvalue & Space(20), 20 )

clsBDProfjob.SkipProfjobCuidSchemeAnalyte 1

loop

oTextFile.WriteLine Left( Current.Sch_Code & Space(20), 20 ) & _

Left( Current.Sampleident & Space(20), 20 ) & _

Left ( Current.Pro_Job & Space(20), 20 ) & _

CCLASDateFormat(Now) & "#ANA=" & Right( "00" & cStr(iNoElems), 3 ) & _

sSPCRecord

oTextFile.Close

MsgBox "SPC file updated", vbOKOnly, "SPC"

Else

Msgbox "LOI-LOI not completed - no totals calculated", vbOKOnly, "XRF"

End If

Else

Msgbox "LOI-LOI not found - no totals calculated", vbOKOnly, "XRF"

End If

End If

Else

Msgbox "XRF-FEX not found", vbOKOnly, "XRF"

End If

End Sub

Function CCLASDateFormat ( DateIn )

Dim dDateIn

CCLASDateFormat = Right("0"&cStr(Day(DateIn)),2) & ":" & Right("0"&cStr(Month(DateIn)),2) & ":" & _

Right("O"&cStr(Year(DateIn)),2) & "0" & Right("0"&cStr(Hour(DateIn)),2) & ":" & _

Right("0"&cStr(Minute(DateIn)),2) & ":" & Right("0" & cStr(Second(DateIn)),2)

End Function