SKMundra
13 days agoNew Contributor III
Combining/Joining DataSets
Hi Everyone.
I am unable to join datasets and suing below code.
Purpose: is to combine the outcome of 2 method queries WF Status and CertificationStatus to get a single table.
Kindly help with your comments or guidance:
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.Common
Imports System.Globalization
Imports System.IO
Imports System.Linq
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Imports OneStream.Finance.Database
Imports OneStream.Finance.Engine
Imports OneStream.Shared.Common
Imports OneStream.Shared.Database
Imports OneStream.Shared.Engine
Imports OneStream.Shared.Wcf
Imports OneStream.Stage.Database
Imports OneStream.Stage.Engine
Namespace OneStream.BusinessRule.DashboardDataSet.GetWFStatusandCertification
Public Class MainClass
Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardDataSetArgs) As Object
Try
Select Case args.FunctionType
Case Is = DashboardDataSetFunctionType.GetDataSetNames
Dim DSnames As New List(Of String)()
DSnames.Add("GetWFStatusandCertificationF")
Return DSnames
Case Is = DashboardDataSetFunctionType.GetDataSet
If args.DataSetName.XFEqualsIgnoreCase("GetWFStatusandCertificationF") Then
Dim WFTable As DataTable = New DataTable("WFSTATUS")
Dim CertTable As DataTable = New DataTable("WFCertSTATUS")
Dim CertTable1 As DataTable = New DataTable("WFCertSTATUS1")
Dim CertTable2 As DataTable = New DataTable("WFCertSTATUS2")
Dim WFTime As String = "2023M12" 'args.NameValuePairs("2023M12")
Dim WFScenario As String = "Actuals" 'args.NameValuePairs("Actuals")
Dim WFName As String = "P1000 Group" 'args.NameValuePairs("P1000 Prudential Group")
Dim methodTypeId As String
Dim methodQuery As String
Dim resultDataTableName As String
Using dbConnApp As DBConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
'Create Tables in Memory
WFTable.Columns.Add("ProfileKey")
WFTable.Columns.Add("ProfileName")
WFTable.Columns.Add("ScenarioName")
WFTable.Columns.Add("TimeName")
WFTable.Columns.Add("StatusText")
WFTable.Columns.Add("LastExecutedStepStatus")
WFTable.Columns.Add("LastExecutedStepTimeUTC")
WFTable.Columns.Add("LastExecutedStepTimeEST")
methodTypeId = XFCommandMethodTypeId.WorkflowStatus
methodQuery = "{" & WFName &"}{" & WFScenario & "}{" & WFTime & "}{AllProfiles}{Descendants}{}"
resultDataTableName = "WFSTATUS"
Dim customSubVars As New Dictionary(Of String, String)
Dim objDataSet As DataSet = BRApi.Database.ExecuteMethodCommand(dbConnApp,methodTypeId,methodQuery, resultDataTableName,customSubVars)
For Each Row As DataRow In objDataSet.Tables("WFSTATUS").Rows
Dim easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
Dim EST = TimeZoneInfo.ConvertTimeFromUtc(Row.Item("LastExecutedStepTime"), easternZone)
WFTable.Rows.Add(Row.Item("ProfileKey"),Row.Item("ProfileName"),Row.Item("ScenarioName"),Row.Item("TimeName"),Row.Item("StatusText"),Row.Item("LastExecutedStepStatus"),Row.Item("LastExecutedStepTime"),EST)
Next
'Return WFTable
End Using
Using DBConAppForCert1 As DbConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
CertTable1.Columns.Add("ProfileName")
CertTable1.Columns.Add("ProfileKey")
CertTable1.Columns.Add("ScenarioKey")
CertTable1.Columns.Add("ScenarioName")
CertTable1.Columns.Add("TimeKey")
CertTable1.Columns.Add("TimeName")
methodTypeId = XFCommandMethodTypeId.CertificationForWorkflowUnit
MethodQuery = "{" & WFName & "}" & "{" & WFScenario & "}" & "{" & WFTime & "}" &"{True}" &"{}"
resultDataTableName = "WFCertSTATUS1"
Dim CustomSubVars As New Dictionary(Of String, String)
Dim ObjDataSet As DataSet = BRApi.Database.ExecuteMethodCommand(DBConAppForCert1,methodtypeid,methodQuery,resultDataTableName,CustomSubVars)
For Each Row As DataRow In ObjDataSet.Tables("WFCertSTATUS1").Rows
CertTable1.Rows.Add(Row.Item("ProfileName"),Row.Item("ProfileKey"),Row.Item("ScenarioKey"),Row.Item("ScenarioName"),Row.Item("TimeKey"),Row.Item("TimeName"))
Next
' Return CertTable1
End Using
Using DBConAppForCert2 As DbConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
CertTable2.Columns.Add("ProfileKey")
CertTable2.Columns.Add("ScenarioKey")
CertTable2.Columns.Add("TimeKey")
CertTable2.Columns.Add("SignOffState")
CertTable2.Columns.Add("UserName")
CertTable2.Columns.Add("TimeStamp")
methodTypeId = XFCommandMethodTypeId.CertificationForWorkflowUnit
MethodQuery = "{" & WFName & "}" & "{" & WFScenario & "}" & "{" & WFTime & "}" &"{True}" &"{}"
resultDataTableName = "WFCertSTATUS2"
Dim CustomSubVars As New Dictionary(Of String, String)
Dim ObjDataSet As DataSet = BRApi.Database.ExecuteMethodCommand(DBConAppForCert2,methodTypeId,MethodQuery,resultDataTableName,CustomSubVars)
For Each Row As DataRow In ObjDataSet.Tables("WFCertSTATUS2_SignOffGroups").Rows
CertTable2.Rows.Add(Row.Item("ProfileKey"),Row.Item("ScenarioKey"),Row.Item("TimeKey"),Row.Item("SignOffState"),Row.Item("UserName"),Row.Item("TimeStamp"))
Next
' Return CertTable2
End Using
'
' Return WFTable
Dim DS_CertStatus As New DataSet("DS_CertificationStatus")
DS_CertStatus.Tables.Add(WFTable)
' DS_CertStatus.Tables.Add(CertTable1)
DS_CertStatus.Tables.Add(CertTable2)
DS_CertStatus.Relations.Add("ProfileKeyRelation",DS_CertStatus.Tables(0).Columns("ProfileKey"),DS_CertStatus.Tables(1).Columns("ProfileKey"),False)
Return DS_CertStatus
End If
End Select
Return Nothing
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
End Try
End Function
End Class
End Namespace
sry about that, here's an update, Monday morning, I misread your initial code...
Here's how you can combine the results, using what you had:Imports System Imports System.Collections.Generic Imports System.Data Imports System.Data.Common Imports System.Globalization Imports System.IO Imports System.Linq Imports System.Windows.Forms Imports Microsoft.VisualBasic Imports OneStream.Finance.Database Imports OneStream.Finance.Engine Imports OneStream.Shared.Common Imports OneStream.Shared.Database Imports OneStream.Shared.Engine Imports OneStream.Shared.Wcf Imports OneStream.Stage.Database Imports OneStream.Stage.Engine Namespace OneStream.BusinessRule.DashboardDataSet.GetWFStatusandCertification Public Class MainClass Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As DashboardDataSetArgs) As Object Try Select Case args.FunctionType Case Is = DashboardDataSetFunctionType.GetDataSetNames Dim DSnames As New List(Of String)() DSnames.Add("GetWFStatusandCertificationF") Return DSnames Case Is = DashboardDataSetFunctionType.GetDataSet If args.DataSetName.XFEqualsIgnoreCase("GetWFStatusandCertificationF") Then Return GetWFStatusandCertificationF(si, args) End If End Select Return Nothing Catch ex As Exception Throw ErrorHandler.LogWrite(si, New XFException(si, ex)) End Try End Function Private Function GetWFStatusandCertificationF(ByVal si As SessionInfo, ByVal args As DashboardDataSetArgs) As DataTable Dim WFTable As New DataTable("WFSTATUS") Dim CertTable2 As New DataTable("WFCertSTATUS2") Dim CombinedTable As New DataTable("CombinedWFandCertStatus") CombinedTable.Columns.Add("ProfileKey") CombinedTable.Columns.Add("ProfileName") CombinedTable.Columns.Add("ScenarioName") CombinedTable.Columns.Add("TimeName") CombinedTable.Columns.Add("StatusText") CombinedTable.Columns.Add("LastExecutedStepStatus") CombinedTable.Columns.Add("LastExecutedStepTimeUTC") CombinedTable.Columns.Add("LastExecutedStepTimeEST") CombinedTable.Columns.Add("SignOffState") CombinedTable.Columns.Add("UserName") CombinedTable.Columns.Add("TimeStamp") Dim WFName As String = "P1000 Prudential Group" Dim WFScenario As String = "Actuals" Dim WFTime As String = "2023M12" Dim methodTypeId As String = XFCommandMethodTypeId.WorkflowStatus Dim resultDataTableName As String = "WFSTATUS" Dim methodQuery As String Dim customSubVars As New Dictionary(Of String, String) methodQuery = "{" & WFName & "}{" & WFScenario & "}{" & WFTime & "}{AllProfiles}{Descendants}{}" Using dbConnApp As DBConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si) Dim objDataSet As DataSet = BRApi.Database.ExecuteMethodCommand(dbConnApp, methodTypeId, methodQuery, resultDataTableName, customSubVars) For Each row As DataRow In objDataSet.Tables("WFSTATUS").Rows WFTable.Rows.Add(row.Item("ProfileKey"), row.Item("ProfileName"), row.Item("ScenarioName"), row.Item("TimeName"), row.Item("StatusText"), row.Item("LastExecutedStepStatus"), row.Item("LastExecutedStepTime"), row.Item("LastExecutedStepTime")) Next End Using methodTypeId = XFCommandMethodTypeId.CertificationForWorkflowUnit methodQuery = "{" & WFName & "}" & "{" & WFScenario & "}" & "{" & WFTime & "}" & "{True}" & "{}" Using DBConnAppForCert2 As DbConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si) CertTable2.Columns.Add("ProfileKey") CertTable2.Columns.Add("ScenarioKey") CertTable2.Columns.Add("TimeKey") CertTable2.Columns.Add("SignOffState") CertTable2.Columns.Add("UserName") CertTable2.Columns.Add("TimeStamp") Dim objDataSet As DataSet = BRApi.Database.ExecuteMethodCommand(DBConnAppForCert2, methodTypeId, methodQuery, "WFCertSTATUS2", customSubVars) For Each row As DataRow In objDataSet.Tables("WFCertSTATUS2_SignOffGroups").Rows CertTable2.Rows.Add(row.Item("ProfileKey"), row.Item("ScenarioKey"), row.Item("TimeKey"), row.Item("SignOffState"), row.Item("UserName"), row.Item("TimeStamp")) Next End Using For Each wfRow As DataRow In WFTable.Rows Dim profileKey As Object = wfRow("ProfileKey") Dim certRows As DataRow() = CertTable2.Select("ProfileKey = '" & profileKey.ToString() & "'") For Each certRow As DataRow In certRows Dim newRow As DataRow = CombinedTable.NewRow() newRow("ProfileKey") = wfRow("ProfileKey") newRow("ProfileName") = wfRow("ProfileName") newRow("ScenarioName") = wfRow("ScenarioName") newRow("TimeName") = wfRow("TimeName") newRow("StatusText") = wfRow("StatusText") newRow("LastExecutedStepStatus") = wfRow("LastExecutedStepStatus") newRow("LastExecutedStepTimeUTC") = wfRow("LastExecutedStepTimeUTC") newRow("LastExecutedStepTimeEST") = wfRow("LastExecutedStepTimeEST") newRow("SignOffState") = certRow("SignOffState") newRow("UserName") = certRow("UserName") newRow("TimeStamp") = certRow("TimeStamp") CombinedTable.Rows.Add(newRow) Next Next Return CombinedTable End Function End Class End Namespace