EDMI.API/Client: WIP GetVariableValue

This commit is contained in:
Jonathan Jenne 2021-07-12 13:57:51 +02:00
parent 9f2cbc17e5
commit b81d6a1314
2 changed files with 172 additions and 70 deletions

View File

@ -14,7 +14,6 @@ Public Class Client
Private ReadOnly _channelFactory As ChannelFactory(Of IEDMIServiceChannel)
Private ReadOnly _IPAddressServer As String
Private _dummy_table_attributes As DataTable
Private _channel As IEDMIServiceChannel
@ -32,6 +31,29 @@ Public Class Client
Public AccessRight As AccessRight
End Class
Public Class VariableValue
Public ReadOnly Property IsVector As Boolean = False
Public Property Value As Object
Public Property Type As Type
Public Sub New(pValue As Object)
' Check if value is a collection
If TypeOf pValue Is IEnumerable Then
IsVector = True
End If
' Try to determine the type
If IsNothing(pValue) Then
Type = Nothing
Else
Type = pValue.GetType
End If
Value = pValue
End Sub
End Class
Public Shared Function ParseServiceAddress(AddressWithOptionalPort As String) As Tuple(Of String, Integer)
Dim oSplit() As String = AddressWithOptionalPort.Split(":"c)
Dim oAppServerAddress As String = oSplit(0)
@ -108,6 +130,10 @@ Public Class Client
End Try
End Function
Private Function PreloadAttributes()
End Function
''' <summary>
''' TODO: Creates a new object
''' </summary>
@ -245,8 +271,7 @@ Public Class Client
If oType = GetType(DataTable).Name Then
Dim oValueTable As DataTable = pValue
Dim oCurrentValue As Object
Dim oCurrentValueType As String
Dim oCurrentValue As VariableValue
If pOptions.CheckDeleted = True Then
Dim oOptions As New GetVariableValueOptions With {
@ -257,19 +282,16 @@ Public Class Client
' Get current value
oCurrentValue = GetVariableValue(pObjectId, pAttributeName, pAttributeType, oOptions)
' Get current type
oCurrentValueType = oCurrentValue.GetType.Name
' If current value is datatable
If oCurrentValueType = GetType(DataTable).Name Then
If oCurrentValue.Type = GetType(DataTable) Then
' Convert value to Datatable
Dim oCurrentTable As DataTable = oCurrentValue
Dim oTable As DataTable = oCurrentValue.Value
If oCurrentTable.Rows.Count > 1 Then
If oTable.Rows.Count > 1 Then
'now Checking whether the old row still remains in Vector? If not it will be deleted as it cannot be replaced in multivalues
For Each oRow As DataRow In oCurrentTable.Rows
For Each oRow As DataRow In oTable.Rows
Dim oExists As Boolean = False
For Each oNewValueRow As DataRow In oValueTable.Rows
Dim oInfo = $"Checking oldValue[{oRow.Item(0)}] vs NewValue [{oNewValueRow.Item(1)}]"
@ -301,12 +323,12 @@ Public Class Client
Next
If oExists = False Then
_logger.Debug($"Value [{oCurrentValue}] no longer existing in Vector-Attribute [{pAttributeName}] - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue)
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue.Value)
End If
Else
_logger.Debug($"Value [{oCurrentValue}] of Attribute [{pAttributeName}] obviously was updated during runtime - will be deleted!")
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue)
DeleteTermObjectFromMetadata(pObjectId, pAttributeName, oCurrentValue.Value)
End If
@ -342,18 +364,17 @@ Public Class Client
End Function
Public Class GetVariableValueOptions
Public FromIDB As Boolean = False
Public Username As String = String.Empty
Public Language As String = String.Empty
End Class
Public Function GetVariableValue(pObjectId As Long, pAttributeName As String, pAttributeType As AttributeType, Optional pOptions As GetVariableValueOptions = Nothing) As Object
Public Function GetVariableValue(pObjectId As Long, pAttributeName As String, pAttributeType As AttributeType, Optional pOptions As GetVariableValueOptions = Nothing) As VariableValue
If pOptions Is Nothing Then
pOptions = New GetVariableValueOptions()
End If
Dim oLanguage = NotNull(pOptions.Language, GetUserLanguage())
Dim oUsername = NotNull(pOptions.Username, Environment.UserName)
pOptions.Language = NotNull(pOptions.Language, GetUserLanguage())
pOptions.Username = NotNull(pOptions.Username, Environment.UserName)
' Check if ObjectId exists
Try
@ -368,29 +389,9 @@ Public Class Client
End Try
' Get Attributes and Values from Database
Dim oTable As DataTable
Try
Dim oResult As TableResult = _channel.ReturnDatatable_MSSQL_IDB($"EXEC [PRIDB_GET_VALUE_DT]({pObjectId}, '{oLanguage}')")
If oResult.OK = False Then
Throw New ApplicationException(oResult.ErrorMessage)
End If
If oResult.Table Is Nothing OrElse oResult.Table.Rows.Count = 0 Then
Return Nothing
End If
oTable = oResult.Table
Catch ex As Exception
_logger.Error(ex)
Return Nothing
End Try
Dim oAttributes As DataTable = GetAttributesForObject(pObjectId, pOptions.Language)
' TODO: Check if Attribute exists & REfactor
Try
Dim oVectorAttribute As Boolean = False
Select Case pAttributeType
@ -402,44 +403,112 @@ Public Class Client
oVectorAttribute = False
End Select
Dim oAttributeValue As Object = Nothing
Dim oValues As New List(Of Object)
Dim oRows As List(Of DataRow) = oAttributes.AsEnumerable().
Where(Function(pRow As DataRow) pRow.Item("AttributeTitle") = pAttributeName).
ToList()
If Not IsNothing(_dummy_table_attributes) Then
If oVectorAttribute = True And _dummy_table_attributes.Rows.Count = 1 And pOptions.FromIDB = False Then
Try
If pAttributeName = "IDBCreatedWhen" Then
pAttributeName = "ADDED_WHEN"
ElseIf pAttributeName = "IDBCreatedWho" Then
pAttributeName = "ADDED_WHO"
ElseIf pAttributeName = "IDBChangedWhen" Then
pAttributeName = "CHANGED_WHEN"
ElseIf pAttributeName = "IDBChangedWho" Then
pAttributeName = "CHANGED_WHO"
End If
If oVectorAttribute = False Then
Dim oRow As DataRow = oRows.FirstOrDefault()
Dim oType As String = oRow.Item("AttributeType")
oAttributeValue = _dummy_table_attributes.Rows(0).Item(pAttributeName)
Catch ex As Exception
_logger.Debug($"Error getting Attribute from IDB_DT_DOC_DATA: {ex.Message}")
End Try
Dim oValue = GetValueByType(oRow, oType)
'oValues.Add(oValue)
End If
End If
If Not IsNothing(oAttributeValue) Then
Return oAttributeValue
Return New VariableValue(oValue)
Else
_logger.Debug($"oAttributeValue for Attribute [{pAttributeName}] is so far nothing..Now trying FNIDB_PM_GET_VARIABLE_VALUE ")
End If
Dim oFNSQL = $"SELECT * FROM [dbo].[FNIDB_PM_GET_VARIABLE_VALUE] ({pObjectId},'{pAttributeName}','{oLanguage}',CONVERT(BIT,'0'))"
Dim oDatatable As TableResult = _channel.ReturnDatatable_MSSQL_IDB(oFNSQL)
For Each oRow As DataRow In oRows
Dim oType As String = oRow.Item("AttributeType")
If oDatatable.OK = False Then
Throw New ApplicationException(oDatatable.ErrorMessage)
Dim oValue = GetValueByType(oRow, oType)
oValues.Add(oValue)
Next
Return New VariableValue(oValues)
End If
If oDatatable.Table.Rows.Count = 1 Then
oAttributeValue = oDatatable.Table.Rows.Item(0).Item(0)
End If
'If Not IsNothing(oAttributes) Then
' If oVectorAttribute = True And _dummy_table_attributes.Rows.Count = 1 And pOptions.FromIDB = False Then
' Try
' If pAttributeName = "IDBCreatedWhen" Then
' pAttributeName = "ADDED_WHEN"
' ElseIf pAttributeName = "IDBCreatedWho" Then
' pAttributeName = "ADDED_WHO"
' ElseIf pAttributeName = "IDBChangedWhen" Then
' pAttributeName = "CHANGED_WHEN"
' ElseIf pAttributeName = "IDBChangedWho" Then
' pAttributeName = "CHANGED_WHO"
' End If
' oAttributeValue = _dummy_table_attributes.Rows(0).Item(pAttributeName)
' Catch ex As Exception
' _logger.Debug($"Error getting Attribute from IDB_DT_DOC_DATA: {ex.Message}")
' End Try
' End If
'Else
' Throw New ApplicationException($"Could not get Attributes for ObjectId [{pObjectId}]")
'End If
'TODO: BRAUCHEN SIE DAS ÜBERHAUPT??????11111?!!1!1
'If Not IsNothing(oAttributeValue) Then
' Return oAttributeValue
'Else
' _logger.Debug($"oAttributeValue for Attribute [{pAttributeName}] is so far nothing..Now trying FNIDB_PM_GET_VARIABLE_VALUE ")
'End If
'Dim oFNSQL = $"SELECT * FROM [dbo].[FNIDB_PM_GET_VARIABLE_VALUE] ({pObjectId},'{pAttributeName}','{pOptions.Language}',CONVERT(BIT,'0'))"
'Dim oDatatable As TableResult = _channel.ReturnDatatable_MSSQL_IDB(oFNSQL)
'If oDatatable.OK = False Then
' Throw New ApplicationException(oDatatable.ErrorMessage)
'End If
'If oDatatable.Table.Rows.Count = 1 Then
' oAttributeValue = oDatatable.Table.Rows.Item(0).Item(0)
'End If
Catch ex As Exception
_logger.Error(ex)
Return Nothing
End Try
End Function
Private Function GetValueByType(pRow As DataRow, pTypeString As String) As Object
Try
Dim oAttributeValue As Object
Select Case pTypeString
Case Constants.AttributeTypeName.BIT
oAttributeValue = pRow.Item("ValueBigInt")
Case Constants.AttributeTypeName.BIG_INTEGER
oAttributeValue = pRow.Item("ValueBigInt")
Case Constants.AttributeTypeName.DATE
oAttributeValue = pRow.Item("ValueDate")
Case Constants.AttributeTypeName.DATETIME
oAttributeValue = pRow.Item("ValueDate")
Case Constants.AttributeTypeName.DECIMAL
oAttributeValue = pRow.Item("ValueDecimal")
Case Constants.AttributeTypeName.FLOAT
oAttributeValue = pRow.Item("ValueDecimal")
Case Constants.AttributeTypeName.VARCHAR
oAttributeValue = pRow.Item("ValueText")
Case Constants.AttributeTypeName.VECTOR_INTEGER
oAttributeValue = pRow.Item("ValueBigInt")
Case Constants.AttributeTypeName.VECTOR_STRING
oAttributeValue = pRow.Item("ValueText")
Case Else
oAttributeValue = Nothing
End Select
Return oAttributeValue
Catch ex As Exception
@ -449,6 +518,29 @@ Public Class Client
End Try
End Function
Private Function GetAttributesForObject(pObjectId As Long, pLanguage As String) As DataTable
Dim oTable As DataTable
Try
Dim oResult As TableResult = _channel.ReturnDatatable_MSSQL_IDB($"EXEC [PRIDB_GET_VALUE_DT]({pObjectId}, '{pLanguage}')")
If oResult.OK = False Then
Throw New ApplicationException(oResult.ErrorMessage)
End If
If oResult.Table Is Nothing OrElse oResult.Table.Rows.Count = 0 Then
Return Nothing
End If
oTable = oResult.Table
Return oTable
Catch ex As Exception
_logger.Error(ex)
Return Nothing
End Try
End Function
Private Function DeleteTermObjectFromMetadata(pObjectId As Long, pAttributeName As String, pTerm2Delete As String, Optional pUsername As String = "", Optional pLanguage As String = "") As Boolean
Try
Dim oLanguage = NotNull(pLanguage, GetUserLanguage())
@ -516,8 +608,6 @@ Public Class Client
End Try
End Function
''' <summary>
''' Return infos about a file object
''' </summary>

View File

@ -17,4 +17,16 @@
VectorString = 8
VectorInteger = 9
End Enum
Public Class AttributeTypeName
Public Const VARCHAR = "VARCHAR"
Public Const BIG_INTEGER = "BIG INTEGER"
Public Const FLOAT = "FLOAT"
Public Const [DECIMAL] = "DECIMAL"
Public Const [DATE] = "DATE"
Public Const [DATETIME] = "DATETIME"
Public Const BIT = "BIT"
Public Const VECTOR_STRING = "VECTOR STRING"
Public Const VECTOR_INTEGER = "VECTOR INTEGER"
End Class
End Class