Я пытаюсь создать скрипт для SAP через VBA, который ищет значение сегмента на основе файла экспорта, сгенерированного из Tcode / bd87, а затем выполняет макрос для изменения Idoc.
Каждый раз, когда мы обрабатываем счетав другом приложении и отправить его в Sap через Idocs, мы сталкиваемся с ошибкой.
Изменяя код НДС с V0 на VZ, мы можем опубликовать документ.
Каждую неделю у нас есть более 70 идентификаторов для изменения, и их выполнение вручную занимает слишком много времени.
Например, у нас есть idoc с 16 сегментами.Исходя из этого, мы должны изменить Сегмент 11 и Сегмент 15. Это всегда одно и то же, поэтому я пытаюсь автоматизировать его.
Я создал скрипт для каждого типа сегмента (13 сегментов, 16, 20 ..так далее).По сути, в настоящее время я выбираю Idoc и запускаю скрипт на основе сегмента.У меня есть 10 различных сценариев в зависимости от количества сегментов.
Я хочу создать сценарий, который считывает значение сегмента и выполняет один из 10 сценариев в зависимости от значения сегмента
Это то, что я могу экспортировать в SAP в Excel
В столбце I вы можете увидеть значение сегмента.Наличие 16 сегментов означает, что я должен запустить свой сценарий 16 сегмента.Теперь у следующего Idoc есть 13 сегментов, и это означает, что мне нужно запустить сценарий 13 сегмента.
Чтобы отредактировать Idoc, мне нужно дважды щелкнуть Idoc, что переводится как .doubleclickcurrentcell в скрипте SAP.
Макрос моего сегмента 13 Выглядит так:
If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").doubleClickCurrentCell
session.findById("wnd[0]/shellcont/shell").expandNode "Datarecords"
session.findById("wnd[0]/shellcont/shell").topNode = "IDoc"
session.findById("wnd[0]/shellcont/shell").expandNode "000001"
session.findById("wnd[0]/shellcont/shell").topNode = "IDoc"
session.findById("wnd[0]/shellcont/shell").selectedNode = "000008"
session.findById("wnd[0]/shellcont/shell").doubleClickNode "000008"
session.findById("wnd[0]/mbar/menu[0]/menu[0]").select
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,10]").text = "VZ"
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,10]").setFocus
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,10]").caretPosition = 2
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG").verticalScrollbar.position = 3
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG").verticalScrollbar.position = 6
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG").verticalScrollbar.position = 9
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG").verticalScrollbar.position = 12
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,9]").text = "VST"
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,9]").setFocus
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,9]").caretPosition = 3
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]").sendVKey 12
session.findById("wnd[0]").sendVKey 12
session.findById("wnd[0]/shellcont/shell").selectedNode = "000012"
session.findById("wnd[0]/shellcont/shell").doubleClickNode "000012"
session.findById("wnd[0]/mbar/menu[0]/menu[0]").select
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,1]").text = "VZ"
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,9]").text = "VST"
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,9]").setFocus
session.findById("wnd[0]/usr/tblSAPLEDI5TCTRL_INT_SEG/ctxtINT_SEG-STRING[1,9]").caretPosition = 3
session.findById("wnd[0]").sendVKey 11
session.findById("wnd[0]").sendVKey 12
session.findById("wnd[0]").sendVKey 12
session.findById("wnd[0]").sendVKey 12
Можно ли вообще создать дополнительный макрос на основе значения сегмента в Excel?Самая сложная проблема, с которой я сталкиваюсь, находится в самом списке.Если у вас есть 10 Idoc, вы дважды щелкните первый, измените значения и вернитесь на главный экран.Затем вам нужно выбрать следующую ячейку и снова дважды щелкнуть.Нет другого способа сделать это.Каждую неделю количество idoc меняется, поэтому если я создам сценарий на основе 50 записей и 10 записей на следующей неделе, он не будет работать.
Это то, что у меня сейчас есть:
Public Sub Export()
If Not IsObject(SapGuiApp) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set SapGuiApp = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = SapGuiApp.Children(0)
End If
If Not IsObject(SAP_session) Then
Set SAP_session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject SAP_session, "on"
WScript.ConnectObject SapGuiApp, "on"
End If
SAP_session.findById("wnd[0]").resizeWorkingPane 127, 30, False
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").setCurrentCell -1, ""
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").SelectAll
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").selectContextMenuItem "&XXL"
SAP_session.findById("wnd[1]/tbar[0]/btn[0]").press
SAP_session.findById("wnd[1]/tbar[0]/btn[11]").press
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").setCurrentCell 0, "DOCNUM"
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").clearSelection
If Range("I2") = "16" Then Call Macro_Idoc_16
End If
If Range("I2") = "13" Then Call Macro_Idoc_13
End If
If Range("I2") = "20" Then Call Macro_Idoc_20
End If
If Range("I2") = "23" Then Call Macro_Idoc_23
End If
SAP_session.findById("wnd[0]/tbar[0]/btn[3]").press
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").currentCellRow = 1
If Range("I3") = "16" Then Call Macro_Idoc_16
End If
If Range("I3") = "13" Then Call Macro_Idoc_13
End If
If Range("I3") = "20" Then Call Macro_Idoc_20
End If
If Range("I3") = "23" Then Call Macro_Idoc_23
End If
SAP_session.findById("wnd[0]/tbar[0]/btn[3]").press
SAP_session.findById("wnd[0]/usr/cntlCUST_200/shellcont/shell").currentCellRow = 2
If Range("I4") = "16" Then Call Macro_Idoc_16
End If
If Range("I4") = "13" Then Call Macro_Idoc_13
End If
If Range("I4") = "20" Then Call Macro_Idoc_20
End If
If Range("I4") = "23" Then Call Macro_Idoc_23
End If
SAP_session.findById("wnd[0]/tbar[0]/btn[3]").press
End Sub
Я также определенно не согласен с созданием 50 подобных записей, как описано выше, нельзя ли создать для этого один код?
С уважением
Джошуа