DED_MOROZ написал:
Транзакция SE37
Использовать последовательность функциональных модулей(ФМ):
Упростим решение, есть макрос, который постит проводки из excel.
Собственно таблица в excel
Code:
Posting Date Reverse Date Doc. Type Header Text Doc. Curr. Period GL Account Debit GL Account Credit Supplier Tax Code SGL code. Amount Profit Center Cost Center Item Text Document Key Reversal Document Key Error Message
31.12.2016 KR Header Text RUB 12 3101010100 MIAS01 600,00 MIAS03 Item Text
Далее делаете кнопку "Провести в SAP" для вызова макроса
Code:
'Import ActiveX using Tools -> References -> Browse:
' -> C:\Program Files\SAP\FrontEnd\SAPgui\Unicode\wdtfuncU.ocx
' -> C:\Program Files\SAP\FrontEnd\SAPgui\Unicode\wdtaocxU.ocx
' -> C:\Program Files\SAP\FrontEnd\SAPgui\Unicode\wdtlogU.ocx
Option Explicit
Private LogonControl As SAPLogonCtrl.SAPLogonControl
Private R3Connection As SAPLogonCtrl.Connection
Private TableFactory As SAPTableFactory
Private objBAPIControl As Object
Private objBAPICommit, objBAPIRollback, objBAPICommitWait As Object
Private Functions As SAPFunctionsOCX.SAPFunctions
Private objBAPIAccDocumentPost As Object
Private objBAPIAccDocumentReverse As Object
Private objAccountGL As SAPTableFactoryCtrl.Table
Private objAccountReceivable As SAPTableFactoryCtrl.Table
Private objAccountPayable As SAPTableFactoryCtrl.Table
Private objCurrencyAmount As SAPTableFactoryCtrl.Table
Private objReturnMsg As SAPTableFactoryCtrl.Table
Private objDocumentHeader As Object
Private objDocType As Object
Private objDocKey As Object
Private objDocSys As Object
Private objReversalHeader As Object
Private objReversalDocType As Object
Private objReversalDocKey As Object
Private objReversalDocSys As Object
Private objReversalReturnMsg As SAPTableFactoryCtrl.Table
Private Const colPostingDate As Integer = 1
Private Const colReverseDate As Integer = 2
Private Const colDocumentType As Integer = 3
Private Const colDocumentHeader As Integer = 4
Private Const colDocumentCurrency As Integer = 5
Private Const colDocumentSpecPeriod As Integer = 6
Private Const colGLAccountDebit As Integer = 7
Private Const colGLAccountCredit As Integer = 8
Private Const colSupplier As Integer = 9
Private Const colSupplierTaxCode As Integer = 10
Private Const colSupplierSGL As Integer = 11
Private Const colAmount As Integer = 12
Private Const colProfitCenter As Integer = 13
Private Const colCostCenter As Integer = 14
Private Const colItemText As Integer = 15
Private Const colDocumentKey As Integer = 16
Private Const colReversalDocumentKey As Integer = 17
Private Const colErrorMessage As Integer = 18
Sub Button1_Click()
Call main
End Sub
Private Sub SAPLogon()
Dim retcd As Boolean
Dim SilentLogon As Boolean
Set LogonControl = CreateObject("SAP.LogonControl.1")
Set R3Connection = LogonControl.NewConnection
R3Connection.Client = "777" ' !! Ваш мандант !!
R3Connection.ApplicationServer = "192.168.1.58" ' !! Ваш хост !!
R3Connection.Language = "RU" ' !! Ваш язык !!
R3Connection.User = "Plank" ' !! Ваш пользователь !!
R3Connection.Password = "" ' !! Ваш пароль !!
R3Connection.System = "H79" ' !! Ваш SAP SID !!
R3Connection.SystemNumber = "00" ' !! Ваша инстанция !!
R3Connection.UseSAPLogonIni = False 'True
SilentLogon = False
retcd = R3Connection.Logon(0, SilentLogon)
If retcd <> True Then MsgBox "Logon failed": End
Set objBAPIControl = CreateObject("SAP.Functions")
objBAPIControl.Connection = R3Connection
Set objBAPICommit = objBAPIControl.Add("BAPI_TRANSACTION_COMMIT")
Set objBAPIRollback = objBAPIControl.Add("BAPI_TRANSACTION_ROLLBACK")
Set objBAPICommitWait = objBAPICommit.Exports("WAIT")
objBAPICommitWait.Value = "X"
' Direct postings BAPI object links:
Set objBAPIAccDocumentPost = objBAPIControl.Add("BAPI_ACC_DOCUMENT_POST")
Set objDocumentHeader = objBAPIAccDocumentPost.Exports("DOCUMENTHEADER")
Set objAccountGL = objBAPIAccDocumentPost.Tables("ACCOUNTGL")
Set objAccountPayable = objBAPIAccDocumentPost.Tables("ACCOUNTPAYABLE")
Set objCurrencyAmount = objBAPIAccDocumentPost.Tables("CURRENCYAMOUNT")
Set objReturnMsg = objBAPIAccDocumentPost.Tables("RETURN")
Set objDocType = objBAPIAccDocumentPost.Imports("OBJ_TYPE")
Set objDocKey = objBAPIAccDocumentPost.Imports("OBJ_KEY")
Set objDocSys = objBAPIAccDocumentPost.Imports("OBJ_SYS")
' objAccountGL.Rows.Add
' objAccountPayable.Rows.Add
objCurrencyAmount.Rows.Add
objCurrencyAmount.Rows.Add
' Reversal BAPI object links:
Set objBAPIAccDocumentReverse = objBAPIControl.Add("BAPI_ACC_DOCUMENT_REV_POST")
Set objReversalHeader = objBAPIAccDocumentReverse.Exports("REVERSAL")
Set objReversalDocType = objBAPIAccDocumentReverse.Imports("OBJ_TYPE")
Set objReversalDocKey = objBAPIAccDocumentReverse.Imports("OBJ_KEY")
Set objReversalDocSys = objBAPIAccDocumentReverse.Imports("OBJ_SYS")
Set objReversalReturnMsg = objBAPIAccDocumentReverse.Tables("RETURN")
End Sub
Private Sub PostSingleDocument(sheet_row As Integer)
Dim index_msg As Integer
objAccountGL.FreeTable
objAccountPayable.FreeTable
' objCurrencyAmount.FreeTable
objDocumentHeader.Value("USERNAME") = R3Connection.User
objDocumentHeader.Value("COMP_CODE") = "MIAS" ' !! Ваша БЕ !!
objDocumentHeader.Value("DOC_DATE") = ActiveSheet.Cells(sheet_row, colPostingDate)
objDocumentHeader.Value("PSTNG_DATE") = ActiveSheet.Cells(sheet_row, colPostingDate)
objDocumentHeader.Value("DOC_TYPE") = ActiveSheet.Cells(sheet_row, colDocumentType)
objDocumentHeader.Value("HEADER_TXT") = ActiveSheet.Cells(sheet_row, colDocumentHeader)
objDocumentHeader.Value("FIS_PERIOD") = ActiveSheet.Cells(sheet_row, colDocumentSpecPeriod)
' Debit side
objAccountGL.Rows.Add
objAccountGL.Value(1, "ITEMNO_ACC") = "0000000001"
objAccountGL.Value(1, "GL_ACCOUNT") = Format(ActiveSheet.Cells(sheet_row, colGLAccountDebit), "0000000000") '"0000501001"
objAccountGL.Value(1, "COSTCENTER") = ActiveSheet.Cells(sheet_row, colCostCenter) '"MIAS03"
objAccountGL.Value(1, "TAX_CODE") = ActiveSheet.Cells(sheet_row, colSupplierTaxCode)
objAccountGL.Value(1, "PROFIT_CTR") = ActiveSheet.Cells(sheet_row, colProfitCenter)
objAccountGL.Value(1, "ITEM_TEXT") = ActiveSheet.Cells(sheet_row, colItemText)
' Credit side
If ActiveSheet.Cells(sheet_row, colGLAccountCredit) <> "" Then
objAccountGL.Rows.Add
objAccountGL.Value(2, "ITEMNO_ACC") = "0000000002"
objAccountGL.Value(2, "GL_ACCOUNT") = Format(ActiveSheet.Cells(sheet_row, colGLAccountCredit), "0000000000") '"0000501001"
objAccountGL.Value(2, "COSTCENTER") = ActiveSheet.Cells(sheet_row, colCostCenter) '"MIAS03"
objAccountGL.Value(2, "TAX_CODE") = ActiveSheet.Cells(sheet_row, colSupplierTaxCode)
objAccountGL.Value(2, "PROFIT_CTR") = ActiveSheet.Cells(sheet_row, colProfitCenter)
objAccountGL.Value(2, "ITEM_TEXT") = ActiveSheet.Cells(sheet_row, colItemText)
ElseIf ActiveSheet.Cells(sheet_row, colSupplier) <> "" Then
objAccountPayable.Rows.Add
objAccountPayable.Value(1, "ITEMNO_ACC") = "0000000002"
objAccountPayable.Value(1, "VENDOR_NO") = ActiveSheet.Cells(sheet_row, colSupplier) '"1000000000"
objAccountPayable.Value(1, "SP_GL_IND") = ActiveSheet.Cells(sheet_row, colSupplierSGL)
objAccountPayable.Value(1, "TAX_CODE") = ActiveSheet.Cells(sheet_row, colSupplierTaxCode)
objAccountPayable.Value(1, "PROFIT_CTR") = ActiveSheet.Cells(sheet_row, colProfitCenter)
objAccountPayable.Value(1, "ITEM_TEXT") = ActiveSheet.Cells(sheet_row, colItemText)
End If
' Currencies
' objCurrencyAmount.Rows.Add
objCurrencyAmount.Value(1, "ITEMNO_ACC") = "0000000001"
objCurrencyAmount.Value(1, "CURRENCY") = ActiveSheet.Cells(sheet_row, colDocumentCurrency)
objCurrencyAmount.Value(1, "AMT_DOCCUR") = CDec(ActiveSheet.Cells(sheet_row, colAmount))
' objCurrencyAmount.Rows.Add
objCurrencyAmount.Value(2, "ITEMNO_ACC") = "0000000002"
objCurrencyAmount.Value(2, "CURRENCY") = ActiveSheet.Cells(sheet_row, colDocumentCurrency)
objCurrencyAmount.Value(2, "AMT_DOCCUR") = -(CDec(ActiveSheet.Cells(sheet_row, colAmount)))
If objBAPIAccDocumentPost.Call Then
For index_msg = 1 To objReturnMsg.Rows.Count
ActiveSheet.Cells(sheet_row, colErrorMessage) = objReturnMsg.Value(index_msg, "MESSAGE")
If index_msg > 1 Then Exit For
Next index_msg
If objDocKey.Value <> "$" Then
If objBAPICommit.Call Then
ActiveSheet.Cells(sheet_row, colDocumentKey) = CStr(objDocKey.Value)
If ActiveSheet.Cells(sheet_row, colReverseDate) <> "" Then
objReversalHeader.Value("OBJ_TYPE") = objDocType.Value
objReversalHeader.Value("OBJ_KEY_R") = objDocKey.Value
objReversalHeader.Value("OBJ_SYS") = objDocSys.Value
objReversalHeader.Value("COMP_CODE") = "MIAS" ' !! Ваша БЕ !!
objReversalHeader.Value("PSTNG_DATE") = ActiveSheet.Cells(sheet_row, colReverseDate)
If objBAPIAccDocumentReverse.Call Then
For index_msg = 1 To objReversalReturnMsg.Rows.Count
ActiveSheet.Cells(sheet_row, colErrorMessage) = objReversalReturnMsg.Value(index_msg, "MESSAGE")
If index_msg > 1 Then Exit For
Next index_msg
If objReversalDocKey.Value <> "$" Then
If objBAPICommit.Call Then
ActiveSheet.Cells(sheet_row, colReversalDocumentKey) = CStr(objReversalDocKey.Value)
End If 'objBAPICommit.Call
End If ' objReversalDocKey.Value <> "$"
End If ' objBAPIAccDocumentReverse.Call
End If ' ActiveSheet.Cells(sheet_row, 2) <> ""
End If 'objBAPICommit.Call
End If
End If
objBAPIRollback.Call
End Sub
Private Sub SAPLogoff()
R3Connection.Logoff
End Sub
Private Sub main()
Dim index_row As Integer
Call SAPLogon
index_row = 2
Do While ActiveSheet.Cells(index_row, colPostingDate) <> ""
If ActiveSheet.Cells(index_row, colDocumentKey) = "" And _
ActiveSheet.Cells(index_row, colReversalDocumentKey) = "" Then
Call PostSingleDocument(index_row)
End If
index_row = index_row + 1
Loop
Call SAPLogoff
End Sub
В полях Document Key и Error Message будет то, что вернет SAP, номер созданного документа и текст сообщения.
Не забудьте сделать настройки, которые описаны в начале макроса.