Public Function DataTableInnerJoin(ByVal Relation As DataRelation, Optional ByVal DataTableName As String = "", Optional ByVal SensitiveValuesOnly As Boolean = True) As DataTable
Dim JoinedDataTable As New DataTable
Dim ThisColumn, NewColumn As DataColumn
Dim ThisRow, NewRow As DataRow
Dim idx As Integer
Dim ThisCell
Dim CellsGroup As New Hashtable
Dim ColumnName As String
If DataTableName = "" Then
JoinedDataTable.TableName = Relation.RelationName + "table"
Else
JoinedDataTable.TableName = DataTableName
End If
For Each ThisColumn In Relation.ChildTable.Columns
If SensitiveValuesOnly Then
If Not Me.isContainedInArray(ThisColumn, Relation.ChildColumns) Then
NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName)
JoinedDataTable.Columns.Add(NewColumn)
End If
Else
NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName)
JoinedDataTable.Columns.Add(NewColumn)
End If
Next
For Each ThisColumn In Relation.ParentTable.Columns
If SensitiveValuesOnly Then
If Not Me.isContainedInArray(ThisColumn, Relation.ParentColumns) Then
NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName)
JoinedDataTable.Columns.Add(NewColumn)
End If
Else
NewColumn = Me.DataColumnCopy(ThisColumn, Relation.RelationName + ThisColumn.Table.TableName + ThisColumn.ColumnName)
JoinedDataTable.Columns.Add(NewColumn)
End If
Next
NewRow = JoinedDataTable.NewRow()
For Each ThisRow In Relation.ChildTable.Rows
CellsGroup.Clear()
NewRow = JoinedDataTable.NewRow()
For idx = 0 To ThisRow.ItemArray.GetUpperBound(0)
ColumnName = Relation.RelationName + Relation.ChildTable.TableName + Relation.ChildTable.Columns(idx).ColumnName
If JoinedDataTable.Columns.Contains(ColumnName) Then
CellsGroup.Add(ColumnName, ThisRow.Item(idx))
NewRow(ColumnName) = ThisRow.Item(idx)
End If
Next
JoinedDataTable.Rows.Add(NewRow)
Next
Dim PrimaryKeyColumns(Relation.ChildTable.PrimaryKey.Length) As DataColumn
idx = 0
For Each ThisColumn In Relation.ChildTable.PrimaryKey
PrimaryKeyColumns(idx) = JoinedDataTable.Columns.Item(Relation.RelationName + Relation.ChildTable.TableName + ThisColumn.ColumnName)
idx = idx + 1
Next
JoinedDataTable.PrimaryKey = PrimaryKeyColumns
Dim externalkeys() As Object
Dim Externalvalues As DataRow
Dim SearchPoint As Int16 = Relation.RelationName.Length
Dim EndSearch As Int16 = Relation.ChildTable.TableName.Length
Dim PrimaryKeyValues(Relation.ChildTable.PrimaryKey.Length - 1), ForeignKeyValues(Relation.ParentTable.PrimaryKey.Length - 1)
For Each ThisRow In JoinedDataTable.Rows
idx = 0
For Each ThisColumn In JoinedDataTable.PrimaryKey
PrimaryKeyValues(idx) = ThisRow.Item(ThisColumn)
idx = idx + 1
Next
Externalvalues = Relation.ChildTable.Rows.Find(PrimaryKeyValues)
For idx = 0 To Relation.ChildColumns.GetUpperBound(0)
ForeignKeyValues(idx) = Externalvalues.Item(Relation.ChildColumns(idx))
Next
Externalvalues = Relation.ParentTable.Rows.Find(ForeignKeyValues)
For Each ThisColumn In Relation.ParentTable.Columns
ColumnName = Relation.RelationName + Relation.ParentTable.TableName + ThisColumn.ColumnName
MessageBox.Show("preif")
If JoinedDataTable.Columns.Contains(ColumnName) Then
MessageBox.Show("ifgone")
ThisRow(ColumnName) = Externalvalues.Item(ThisColumn)
End If
Next
Next
Return JoinedDataTable
End Function