Imports ERPConnect
Public Class ClassSAP
    Public Shared SAPConnectionString
    Public Shared SAP_CONNECTION As New R3Connection()
    Public Shared Function ConnectionInit(Host As String, SysNumber As String, Username As String, PW As String, Client As String, Lang As String)
        Try
            If LogErrorsOnly = False Then ClassLogger.Add("", False)
            If LogErrorsOnly = False Then ClassLogger.Add(" >> SAP Connect started:", False)
            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")
            If LogErrorsOnly = False Then ClassLogger.Add(" >> SAP Connectionstring: " & SAPConnectionString, False)
            con.Open(SAPConnectionString)
            SAP_CONNECTION.Open(SAPConnectionString)
            If LogErrorsOnly = False Then ClassLogger.Add(" >> SAP-Connection created!", False)
            If LogErrorsOnly = False Then ClassLogger.Add("", False)
            Return True
        Catch ex As Exception
            MsgBox("Error in SAP ConnectionInit: " & ex.Message, MsgBoxStyle.Critical)
            ClassLogger.Add("Error in SAP ConnectionInit: " & ex.Message, True)
            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

            If LogErrorsOnly = False Then ClassLogger.Add(" >> Get data from FuBa-Function", False)
            Dim func As RFCFunction
            Try
                func = SAP_CONNECTION.CreateFunction(FuBaName)
                If LogErrorsOnly = False Then ClassLogger.Add(" >> func.Execute", False)
                func.Execute()
                If LogErrorsOnly = False Then ClassLogger.Add(" >> function was executed", False)
            Catch ex As Exception
                ClassLogger.Add(">> Unexpected Error in Create SAP Function: " & ex.Message, False)
                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
                If LogErrorsOnly = False Then ClassLogger.Add(" >> Checking FunctionExecute", False)
                '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
                            If LogErrorsOnly = False Then ClassLogger.Add(" >> RowMask result: " & RowMaskresult, False)
                            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
                ClassLogger.Add(">> Unexpected Error in Checking FunctionExecute: " & ex.Message, False)
                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
                    If LogErrorsOnly = False Then ClassLogger.Add(" >> Define Datatable with SplitCharacter method", False)
                    Dim split() = RowMaskresult.Split(SplitCharacter)
                    If split.Length > 0 Then
                        ColCount = split.Length - 1
                        CURRENT_COL_COUNT = ColCount
                        If LogErrorsOnly = False Then
                            ClassLogger.Add(" >> ColCount: " & ColCount.ToString, False)
                            ClassLogger.Add(" >> Split-Results: ", False)
                            For Each s As String In split
                                ClassLogger.Add("  # " & s, False)
                            Next
                        End If
                        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
                        If LogErrorsOnly = False Then ClassLogger.Add(" >> Datatable Columns after Split created", False)
                        ' 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
                                    If LogErrorsOnly = False Then ClassLogger.Add(" >> RowCount limited to" & RowLimit.ToString & " rows. Exit SAP Function", False)
                                    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
                        If LogErrorsOnly = False Then ClassLogger.Add(" >> RowCount FuBa: " & RESULT_TABLE.Rows.Count.ToString, False)
                        Return RESULT_TABLE
                    Else
                        Return Nothing
                    End If
                Catch ex As Exception
                    ClassLogger.Add(">> Unexpected Error in Create Datatable with split-method: " & ex.Message, False)
                    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
            ClassLogger.Add(">> Unexpected Error in Function FuBa_ReturnDatatable Seperated: " & ex.Message, False)
            MsgBox("Unexpected Error in Function FuBa_ReturnDatatable Seperated: " & ex.Message, MsgBoxStyle.Critical)
            Return Nothing
        End Try
    End Function
    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
            If LogErrorsOnly = False Then ClassLogger.Add(" >> Get data from SAP Table", False)
            Dim table As New ERPConnect.Utils.ReadTable(SAP_CONNECTION)
            'Dim cWhereClause = "SAP_OBJECT EQ '<ObjectType>' AND AR_DATE GE '<AR_DATE>'"
            'Dim sSearchDate1 = "20160101"
            'cWhereClause = Replace(cWhereClause, "<ObjectType>", Objekttyp.Text)
            'cWhereClause = Replace(cWhereClause, "<AR_DATE>", sSearchDate1)
            If where_clause <> "" Then
                table.AddCriteria(where_clause)
            End If
            table.TableName = tablename
            If RowLimit <> 0 Then
                table.RowCount = RowLimit
            End If
            If LogErrorsOnly = False Then ClassLogger.Add(" >>Table.Run executing.....", False)
            table.Run()
            If LogErrorsOnly = False Then ClassLogger.Add(" >>Table.Run executed", False)
            RESULT_TABLE = table.Result
            SAP_CONNECTION.Close()
            Return RESULT_TABLE
        Catch ex As Exception
            ClassLogger.Add(">> Unexpected Error in SAP Table Result: " & ex.Message, False)
            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
            If LogErrorsOnly = False Then ClassLogger.Add(" >> CREATE_ARC_OBJECT", False)
            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
            ClassLogger.Add(">> Unexpected Error in SAP Table Result: " & ex.Message, False)
            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
            If LogErrorsOnly = False Then ClassLogger.Add(" >> INSERT_ARCHIVE_OBJECT", False)
            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
            ClassLogger.Add(">> Unexpected Error in INSERT_ARCHIVE_OBJECT: " & ex.Message, False)
            MsgBox("Unexpected Error in INSERT_ARCHIVE_OBJECT: " & ex.Message, MsgBoxStyle.Critical)
            Return ex.Message
        End Try
    End Function
End Class
