Example Product Rule - LOI Calculation
Scenario: The total LOI is calculated. Total oxides are calculated if XRF results are available, and results emailed.
Sub Main()
'Loss Of Ignition Calculation
Dim dWt1, dWt2, dWt3, dWt4, dWt5, dWt6
Dim dLOI, dLOI105, dLOI371, dLOI538, dLOI900
'Set up some defaults for testing purposes
'Current.Pro_Job = "JOB2"
'Current.Cuid = "0000033736"
'Current.Sampleident = "JOB2 0001"
'Current.Sampletype ="UNK"
'Current.Sch_Code = "LOI"
'Current.AnalyteCode = "WT1"
'Current.ProductCode ="GEN_XRF"
Set oSupport = CreateObject("CCSUPP01.clsSupport")
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.BatchUpdate = True
'Ensure WT1 (weight of Cruc) is done
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT1"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dWt1 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'Ensure WT2 (weight of Cruc+Sample) is done
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT2"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dWt2 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'Ensure that WT3 (weight of Cruc+Sample post105.C) is done
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT3"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dWt3 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'See if LOI105 already calculated
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI105"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dLOI105 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
Else
dLOI105 = (dWt2 - dWt3) / (dWt2 - dWt1) * 100.0
'Update LOI105 for the current Cuid
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI105
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dLOI105)
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
End If
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT4"
If clsBDProfjob.FoundProfjobSchemeAnalyte Then
'WT4 profiled indicates that a 4 temperature LOI is to be calculated
'Ensure WT4 (weight of Cruc+Sample post371.C) is done
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT4"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dWt4 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'See if LOI371 already calculated
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI371"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dLOI371 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
Else
dLOI371 = (dWt3 - dWt4) / (dWt3 - dWt1) * 100.0
'Update LOI371 for the current Cuid
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI371
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dLOI371)
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
End If
'Ensure WT5 (weight of Cruc+Sample post538.C) is done
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT5"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dWt5 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'See if LOI538 already calculated
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI538"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dLOI538 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
Else
dLOI538 = (dWt4 - dWt5) / (dWt3 - dWt1) * 100.0
'Update LOI538 for the current Cuid
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI538
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dLOI538)
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
End If
'Ensure WT6 (weight of Cruc+Sample post900.C) is done
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "WT6"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dWt6 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'See if LOI900 already calculated
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI900"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dLOI900 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
Else
dLOI900 = (dWt5 - dWt6) / (dWt3 - dWt1) * 100.0
'Update LOI900 for the current Cuid
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI900
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dLOI900)
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
End If
'Calculate LOI
dLOI = dLOI371 + dLOI538 + dLOI900
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI"
'Update LOI for the current Cuid
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dLOI)
'Save the record set, using BatchUpdate = False,
'indicating there is no more to save for this Cuid + Sch + Anal
clsBDProfjob.BatchUpdate = False
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
'If XRF Fe is done, calculate Total
If clsBDProfjob.PopulateByCuid (Current.Cuid, "XRF", "FE") Then
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
CalcTotal
Else
Msgbox "XRF not available - no totals calculated", vbOKOnly, "LOI"
End If
End If
End If
End If
End If
Else
'Only a 2 temperature LOI is to be calculated
'See if LOI900 already calculated
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI900"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dLOI900 = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
Else
dLOI900 = (dWt3 - dWt6) / (dWt3 - dWt1) * 100.0
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI900
ProfjobCuidSchemeAnalyte.Finalvalue = cStr(dLOI900)
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
End If
'Calculate LOI
dLOI = dLOI900
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI"
'Update LOI for the current Cuid
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dLOI
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dLOI)
'Save the record set, using BatchUpdate = False,
'indicating there is no more to save for this Cuid
clsBDProfjob.BatchUpdate = False
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
'If XRF Fe is done, calculate Total
If clsBDProfjob.PopulateByCuid (Current.Cuid, "XRF", "FE") Then
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
CalcTotal
Else
Msgbox "XRF not available - no totals calculated", vbOKOnly, "LOI"
End If
End If
End If
End If
End If
End If
End Sub
Sub CalcTotal ()
'Calculation of Total oxides with LOI
Dim dTotal
Set oSupport = CreateObject("CCSUPP01.clsSupport")
'Save the record set, using BatchUpdate = True,
'indicating there is more to save for this Cuid
clsBDProfjob.BatchUpdate = True
'Get LOI-LOI
clsBDProfjob.PopulateByCuid Current.Cuid, "LOI", "LOI"
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dTotal = oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'Get XRF-Fe2O3,SiO2,Al2O3,TiO2,MnO,CaO,S,P2O5,MgO
If clsBDProfjob.PopulateByCuid (Current.Cuid, "XRF", "FE2O3") Then
If ProfjobCuidSchemeAnalyte.Analytestatus = "CPL" Then
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "SIO2"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "AL2O3"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "TIO2"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "MNO"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "CAO"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "S"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "P2O5"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "MGO"
dTotal = dTotal + oSupport.cnvdouble(ProfjobCuidSchemeAnalyte.Finalvalue)
'Update the calculated Total for the current Cuid
clsBDProfjob.PopulateByCuid Current.Cuid, "XRF", "TOTAL"
ProfjobCuidSchemeAnalyte.Analytestatus ="CPL"
ProfjobCuidSchemeAnalyte.Numericvalue = dTotal
ProfjobCuidSchemeAnalyte.Finalvalue = cStr (dTotal)
'Save the record set, using BatchUpdate = False,
'indicating there is no more to save for this Cuid
clsBDProfjob.BatchUpdate = False
clsBDProfjob.IsProfjobCuidSchemeAnalyteDirty = True
clsBDProfjob.SaveProfjobCuidSchemeAnalyte True
'Send message with Total details
SendEmail "Lab manager", "XRF Totals", "Cuid" & vbTab & Current.Cuid & vbCrLf & _
"Job" & vbTab & Current.Pro_Job & vbCrLf & _
"Sample" & vbTab & Current.Sampleident & vbCrLf & _
"Total = " & ProfjobCuidSchemeAnalyte.Finalvalue, _
"labmgr@company.com", ""
End If
End If
End If
End Sub
Sub SendEmail ( sProfile, sSubject, sMessage, sRecipient, sAttach )
Dim oEmail
Set oEmail = New clsEmail
With oEmail
.Session = sProfile
.Subject = sSubject
.Text = sMessage
.Recipient = sRecipient
.Attach = sAttach
If Msgbox ("OK to send to " & .Recipient & vbCrLf & sSubject, 4 + 48, "Email" ) = 6 Then
.Send
End If
End With
Set oEmail = Nothing
End Sub
Class clsEmail
'Simple Email Class
Private msSession, msSubject, msText, msRecipient, msAttach
Property Let Session (sSession)
msSession = sSession
End Property
Property Let Subject (sSubject)
msSubject = sSubject
End Property
Property Let Text (sText)
msText = sText
End Property
Property Let Recipient (sRecipient)
msRecipient = sRecipient
End Property
Property Let Attach (sAttach)
msAttach = sAttach
End Property
Property Get Session ()
Session = msSession
End Property
Property Get Subject ()
Subject = msSubject
End Property
Property Get Text ()
Text = msText
End Property
Property Get Recipient ()
Recipient = msRecipient
End Property
Property Get Attach ()
Attach = msAttach
End Property
Sub Send ()
'Send the email
Dim oSession, oMessage, oRecipient, oAttach
Set oSession = CreateObject ("MAPI.Session")
oSession.Logon msSession
Set oMessage = oSession.Outbox.Messages.Add
oMessage.Subject = msSubject
oMessage.Text = msText
If msAttach <> "" Then
Set oAttach = oMessage.Attachments.Add
oAttach.Source = msAttach
End If
Set oRecipient = oMessage.Recipients.Add
oRecipient.Name = msRecipient
oRecipient.Resolve
oMessage.Update
oMessage.Send
oSession.Logoff
set oAttach = Nothing
set oMessage = Nothing
set oRecipient = Nothing
set oSession = Nothing
End Sub
End Class