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