Imports ERPConnect
Imports ERPConnect.Utils

Public Class ClassSAP
    Public Shared SAPConnectionString
    Public Shared SAP_CONNECTION As New R3Connection()

    Private Shared NewDatatable As DataTable
    Public Shared Function ConnectionInit(Host As String, SysNumber As String, Username As String, PW As String, Client As String, Lang As String)
        Try
            LOGGER.Debug("")
            LOGGER.Debug("SAP Connect started:")
            SAPConnectionString = String.Format("USER={0} LANG={1} CLIENT={2} SYSNR={3} ASHOST={4} PASSWD={5}", Username, Lang, Client, SysNumber, Host, PW)
            Dim con As New R3Connection()
            ERPConnect.LIC.SetLic("W86DWC992C")
            LOGGER.Debug("SAP Connectionstring: " & SAPConnectionString)
            con.Open(SAPConnectionString)
            SAP_CONNECTION.Open(SAPConnectionString)
            LOGGER.Debug("SAP-Connection created!")
            LOGGER.Debug("")
            Return True
        Catch ex As Exception
            MsgBox("Error in SAP ConnectionInit: " & ex.Message, MsgBoxStyle.Critical)
            LOGGER.Warn("Error in SAP ConnectionInit: " & ex.Message)
            Return False
        End Try
    End Function
    Public Shared Function FuBa_Returndatatable_Seperated(FuBaName As String, SplitCharacter As String, Optional RowLimit As Integer = 0)
        Try
            Dim RESULT_TABLE As DataTable = New DataTable

            LOGGER.Debug("Get data from FuBa-Function")
            Dim func As RFCFunction
            Try
                func = SAP_CONNECTION.CreateFunction(FuBaName)
                LOGGER.Debug("func.Execute")
                func.Execute()
                LOGGER.Debug("function was executed")
            Catch ex As Exception
                LOGGER.Warn("Unexpected Error in Create SAP Function: " & ex.Message)
                MsgBox("Error in Create SAP Function: " & ex.Message, MsgBoxStyle.Critical)
                Return Nothing
            End Try
            Dim FUNCT_ROW_COUNT As Integer = 1
            Dim RowMaskresult As String = ""
            Try
                LOGGER.Debug("Checking FunctionExecute")
                'Den ersten Wert ausgeben lassen um die Spalten zu splitten

                For Each row As RFCStructure In func.Tables("T_INDEX").Rows
                    Try
                        If row.Item(1).ToString.Contains(SplitCharacter) Then
                            RowMaskresult = row.Item(1).ToString
                            LOGGER.Debug("RowMask result: " & RowMaskresult)
                            FUNCT_ROW_COUNT = 2
                        End If
                    Catch ex As Exception
                        RowMaskresult = "ErrorInGetSeperatedResult: " & ex.Message
                    End Try
                    If FUNCT_ROW_COUNT = 2 Then Exit For
                Next
            Catch ex As Exception
                LOGGER.Warn("Unexpected Error in Checking FunctionExecute: " & ex.Message)
                MsgBox("Error in Checking FunctionExecute: " & ex.Message, MsgBoxStyle.Critical)
                SAP_CONNECTION.Close()
                Return Nothing
            End Try
            FUNCT_ROW_COUNT = 1
            Dim ColCount As Integer
            If SplitCharacter <> "" And RowMaskresult.Contains(SplitCharacter) Then
                Try
                    LOGGER.Debug("Define Datatable with SplitCharacter method")
                    Dim split() = RowMaskresult.Split(SplitCharacter)
                    If split.Length > 0 Then
                        ColCount = split.Length - 1
                        CURRENT_COL_COUNT = ColCount

                        LOGGER.Debug("ColCount: " & ColCount.ToString)
                        LOGGER.Debug("Split-Results: ")
                        For Each s As String In split
                            LOGGER.Debug("  # " & s)
                        Next

                        For x = 0 To ColCount
                            ' Declare DataColumn and DataRow variables.
                            Dim column As DataColumn
                            column = New DataColumn()
                            column = New DataColumn()
                            column.DataType = Type.GetType("System.String")
                            column.ColumnName = "Column " & x.ToString
                            RESULT_TABLE.Columns.Add(column)
                        Next
                        LOGGER.Debug("Datatable Columns after Split created")
                        ' Create new DataRow objects and add to DataTable.   
                        'Jetzt die Zeilen der Function durchlaufen
                        For Each row As RFCStructure In func.Tables("T_INDEX").Rows
                            Dim new_row As DataRow
                            If RowLimit <> 0 Then
                                If RowLimit = FUNCT_ROW_COUNT Then
                                    LOGGER.Debug("RowCount limited to" & RowLimit.ToString & " rows. Exit SAP Function")
                                    Exit For
                                End If
                            End If
                            new_row = RESULT_TABLE.NewRow()
                            Dim Rowresult As String = row.Item(1).ToString
                            If Rowresult.Contains(SplitCharacter) Then
                                Dim RowSplit() = Rowresult.Split(SplitCharacter)
                                Dim col_index = 0
                                'Jetzt die Spaltenwerte in die NewRow eintragen
                                For x = 0 To ColCount
                                    new_row(x) = RowSplit(x)
                                Next
                                FUNCT_ROW_COUNT += 1
                                RESULT_TABLE.Rows.Add(new_row)
                            End If
                        Next
                        LOGGER.Debug("RowCount FuBa: " & RESULT_TABLE.Rows.Count.ToString)
                        Return RESULT_TABLE
                    Else
                        Return Nothing
                    End If
                Catch ex As Exception
                    LOGGER.Warn("Unexpected Error in Create Datatable with split-method: " & ex.Message)
                    MsgBox("Unexpected Error in Create Datatable with split-method: " & ex.Message, MsgBoxStyle.Critical)
                    SAP_CONNECTION.Close()
                    Return Nothing
                End Try
            Else
                Return Nothing
            End If
        Catch ex As Exception
            LOGGER.Warn("Unexpected Error in Function FuBa_ReturnDatatable Seperated: " & ex.Message)
            MsgBox("Unexpected Error in Function FuBa_ReturnDatatable Seperated: " & ex.Message, MsgBoxStyle.Critical)
            Return Nothing
        End Try
    End Function
    Private Shared WithEvents oReadTbl As New ReadTable(SAPConnectionString)
    Private Shared Sub OnIncomingPackage(ByVal Sender As ReadTable, ByVal PackageResult As DataTable) Handles oReadTbl.IncomingPackage
        Try
            LOGGER.Debug("Processing data package with " +
                  PackageResult.Rows.Count.ToString() + " rows")
            If NewDatatable Is Nothing Then
                NewDatatable = PackageResult.Clone
                LOGGER.Debug("...NewDatatable initialized!")
            End If
            NewDatatable.Merge(PackageResult, False)
            LOGGER.Debug("...Datatable merged with PackageResult!")
        Catch ex As Exception
            MsgBox(ex.Message)
            LOGGER.Error(ex)
        End Try
    End Sub
    Public Shared Function Return_Datatable_for_Table(tablename As String, where_clause As String, Optional RowLimit As Integer = 0)
        Try
            Dim RESULT_TABLE As DataTable = New DataTable
            LOGGER.Debug("Get data from SAP Table", False)
            Dim oReadTable As New ERPConnect.Utils.ReadTable(SAP_CONNECTION)
            oReadTable.PackageSize = 10000
            oReadTable.RaiseIncomingPackageEvent = True
            NewDatatable = Nothing
            If where_clause <> "" Then
                oReadTable.WhereClause = where_clause
            End If
            oReadTable.TableName = tablename
            If RowLimit <> 0 Then
                oReadTable.RowCount = RowLimit
            End If
            LOGGER.Debug("Table.Run executing.....")
            oReadTbl = oReadTable
            oReadTbl.Run()

            LOGGER.Debug("Table.Run executed")
            RESULT_TABLE = oReadTbl.Result
            If Not IsNothing(NewDatatable) Then
                LOGGER.Debug($"Got [{NewDatatable.Rows.Count}] rows")
            End If

            SAP_CONNECTION.Close()
            Return NewDatatable
        Catch ex As Exception
            LOGGER.Error(ex)
            LOGGER.Warn("Unexpected Error in SAP Table Result: " & ex.Message)
            MsgBox("Unexpected Error in SAP Table Result: " & ex.Message, MsgBoxStyle.Critical)
            Return Nothing
        End Try
    End Function


    Public Shared Function LINK_ARC_OBJECT(table As String, barcode As String, contrep As String, docid As String, ardate As String, doctype As String)
        Try
            LOGGER.Debug("CREATE_ARC_OBJECT")
            Dim sapfunc As RFCFunction = SAP_CONNECTION.CreateFunction("BAPI_BARCODE_SENDLIST")

            'Create and fill the frist row
            Dim row As RFCStructure = sapfunc.Tables(table).AddRow()
            row("BARCODE") = barcode
            row("CONTREP") = contrep
            row("DOCID") = docid
            row("ARDATE") = ardate
            row("DOCTYPE") = doctype

            ' Execut e the function
            sapfunc.Execute()

            ' process return structure
            Dim ret As RFCStructure = sapfunc.Imports("RETURN").ToStructure()

            If (ret("TYPE").ToString().Equals("")) Then
                Console.WriteLine("No error reported")
                Return ""
            Else
                Return ret("MESSAGE")
            End If

        Catch ex As Exception
            LOGGER.Warn("Unexpected Error in SAP Table Result: " & ex.Message)
            MsgBox("Unexpected Error in CREATE_ARC_OBJECT: " & ex.Message, MsgBoxStyle.Critical)
            Return ex.Message
        End Try
    End Function
    Public Shared Function INSERT_ARCHIVE_OBJECT(ARCHIV_ID As String, ARC_DOC_ID As String, AR_OBJECT As String, OBJECT_ID As String, SAP_OBJECT As String, DOC_TYPE As String, table As String)
        Try
            LOGGER.Debug("INSERT_ARCHIVE_OBJECT")
            Dim sapfunc As RFCFunction = SAP_CONNECTION.CreateFunction("ARCHIV_CONNECTION_INSERT")

            'Create and fill the frist row
            'Dim row As RFCStructure = sapfunc.
            sapfunc.Exports("ARCHIV_ID").ParamValue = ARCHIV_ID
            sapfunc.Exports("ARC_DOC_ID").ParamValue = ARC_DOC_ID
            sapfunc.Exports("AR_OBJECT").ParamValue = AR_OBJECT
            sapfunc.Exports("OBJECT_ID").ParamValue = OBJECT_ID
            sapfunc.Exports("SAP_OBJECT").ParamValue = SAP_OBJECT
            sapfunc.Exports("DOC_TYPE").ParamValue = DOC_TYPE
            '  row("AR_DATE") = AR_DATE
            ' Execut e the function
            Try
                sapfunc.Execute()
            Catch ex As Exception
                MsgBox("Unexpected Error in sapfunc.Execute: " & ex.Message, MsgBoxStyle.Critical)
                Dim ret As RFCStructure = sapfunc.Imports("RETURN").ToStructure()

                If (ret("TYPE").ToString().Equals("")) Then
                    Console.WriteLine("No error reported")
                    Return "ERROR in Function Execute"
                Else
                    Return ret("MESSAGE")
                End If
            End Try
            ' process return structure
            Return ""

        Catch ex As Exception
            LOGGER.Warn("Unexpected Error in INSERT_ARCHIVE_OBJECT: " & ex.Message)
            MsgBox("Unexpected Error in INSERT_ARCHIVE_OBJECT: " & ex.Message, MsgBoxStyle.Critical)
            Return ex.Message
        End Try
    End Function
End Class
