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