vbscript - SAP GUI 脚本通过警告消息循环
问题描述
下面是用于删除源列表中特定行的 SAP 脚本。输入材料编号和工厂后,可能会出现警告消息(待处理,需要豁免)- 要继续下一步,需要输入session.findById("wnd[0]").sendVKey 0
一次、两次甚至 3 次。同样,它取决于材料上警告消息的数量。
在下面的示例中,我有 Enter 3 次,但不是默认使用 Enter 3 次,我希望它更具动态性。如果或只要有警告消息,就应该使用 Enter 否则移动到脚本中的下一步。
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
Dim objExcel
Dim objSheet, intRow, i
Set objExcel = GetObject(,"Excel.Application")
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet
For i = 2 to objSheet.UsedRange.Rows.Count
If IsEmpty(objSheet.Cells(i, 4)) Then
COL1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
COL2 = Trim(CStr(objSheet.Cells(i, 2).Value)) 'Column2
COL3 = Trim(CStr(objSheet.Cells(i, 3).Value)) 'Column3
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "/nme01"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtEORD-MATNR").text = COL1 'Material number
session.findById("wnd[0]/usr/ctxtEORD-WERKS").text = COL2 'Plant
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tblSAPLMEORTC_0205").getAbsoluteRow(COL3-1).selected = true 'Row to delete in SL
session.findById("wnd[0]/usr/tblSAPLMEORTC_0205/ctxtEORD-VDATU[0,6]").setFocus
session.findById("wnd[0]/usr/tblSAPLMEORTC_0205/ctxtEORD-VDATU[0,6]").caretPosition = 0
session.findById("wnd[0]/tbar[1]/btn[14]").press
session.findById("wnd[1]/usr/btnSPOP-OPTION1").press
session.findById("wnd[0]/tbar[0]/btn[11]").press
objSheet.Cells(i, 4) = "Deleted"
aux=COL1 & " " & COL2 & " " & COL3
CreateObject("WScript.Shell").run("cmd /c @echo %date% %time% " & aux & " >> C:\SCRIPT\PlOrCreationLog.txt")
End If
next
msgbox "Process Completed"
解决方案
试试这个代码
Do While session.findById("wnd[0]/sbar").messageType = "W"
session.findById("wnd[0]").sendVKey 0
Loop
完整的代码应该看起来像这样
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
Dim objExcel
Dim objSheet, intRow, i
Set objExcel = GetObject(,"Excel.Application")
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet
For i = 2 to objSheet.UsedRange.Rows.Count
If IsEmpty(objSheet.Cells(i, 4)) Then
COL1 = Trim(CStr(objSheet.Cells(i, 1).Value)) 'Column1
COL2 = Trim(CStr(objSheet.Cells(i, 2).Value)) 'Column2
COL3 = Trim(CStr(objSheet.Cells(i, 3).Value)) 'Column3
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "/nme01"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtEORD-MATNR").text = COL1 'Material number
session.findById("wnd[0]/usr/ctxtEORD-WERKS").text = COL2 'Plant
session.findById("wnd[0]").sendVKey 0 ' <= You need to press Enter at least once before you check for a warning in the statu bar
Do While session.findById("wnd[0]/sbar").messageType = "W"
session.findById("wnd[0]").sendVKey 0
Loop
session.findById("wnd[0]/usr/tblSAPLMEORTC_0205").getAbsoluteRow(COL3-1).selected = true 'Row to delete in SL
session.findById("wnd[0]/usr/tblSAPLMEORTC_0205/ctxtEORD-VDATU[0,6]").setFocus
session.findById("wnd[0]/usr/tblSAPLMEORTC_0205/ctxtEORD-VDATU[0,6]").caretPosition = 0
session.findById("wnd[0]/tbar[1]/btn[14]").press
session.findById("wnd[1]/usr/btnSPOP-OPTION1").press
session.findById("wnd[0]/tbar[0]/btn[11]").press
objSheet.Cells(i, 4) = "Deleted"
aux=COL1 & " " & COL2 & " " & COL3
CreateObject("WScript.Shell").run("cmd /c @echo %date% %time% " & aux & " >> C:\SCRIPT\PlOrCreationLog.txt")
End If
next
msgbox "Process Completed"
推荐阅读
- java - 如何在java中将PDF(它只包含tiff图像)转换为JPG图像
- vue.js - 将 Vue Quill Editor 中的文本保存为 markdown 格式
- python - 如何用 plotly 可视化时间序列?
- python - SWIG TypeError:在“B_create”方法中,“A const &”类型的参数 1
- python - 在集合字典中切换键和值
- websocket - Pysyft 客户端和服务器
- javascript - 如何检查是否已经生成了 HTMLElement?
- ios - 如何在swift ios的应用程序委托中使用两个条带键
- c - 在Linux中创建N个进程,并在当前目录下为每个进程创建一个文件
- mysql - MySQL/MariaDB - 从查询的 HAVING 部分覆盖 SELECT 查询中的字段值