通过 GUI 脚本通过排序保存 SM37 行?
Save SM37 rows with sorting via GUI Script?
以下 SAP 740 的 SAP GUI 脚本将 SM37 列表保存到文本文件。
在保存列表之前,我想按开始日期和开始时间对列表进行排序。
我可以显示 select 排序字段的弹出窗口。左侧有一个 table 控件,其中包含当前排序列(作业名称、创建者、进度、计划开始日期、计划开始时间),右侧有一个 table 控件,其中包含所有可能的排序列,这些左右排序列中的每一个都可以 selected,并且在两个 table 控件之间有按钮可以将排序列从左移动到右,反之亦然。
现在,要对列进行 select 排序,我必须 select 行 table 控件,但我不知道该怎么做。你能帮帮我吗?
Public Sub RunSM37Cancelled()
Dim W_Ret As Boolean
W_Ret = Attach_Session
If Not W_Ret Then
Exit Sub
End If
On Error GoTo disperr
objSess.findById("wnd[0]").maximize
objSess.findById("wnd[0]/tbar[0]/okcd").Text = "sm37"
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/txtBTCH2170-JOBNAME").Text = "*"
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/txtBTCH2170-USERNAME").Text = "*"
objSess.findById("wnd[0]/usr/txtBTCH2170-USERNAME").SetFocus
objSess.findById("wnd[0]/usr/txtBTCH2170-USERNAME").caretPosition = 1
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/chkBTCH2170-SCHEDUL").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-READY").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-RUNNING").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-FINISHED").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-ABORTED").Selected = True
objSess.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = Format(Now()-1,"mm/dd/yyyy")
objSess.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").SetFocus
objSess.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").caretPosition = 10
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = Format(Now(), "mm/dd/yyyy")
objSess.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").SetFocus
objSess.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").caretPosition = 10
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/tbar[1]/btn[8]").press
objSess.findById("wnd[0]/usr/lbl[80,10]").SetFocus
objSess.findById("wnd[0]/usr/lbl[80,10]").caretPosition = 5
objSess.findById("wnd[0]").sendVKey 2
objSess.findById("wnd[0]/usr/lbl[91,10]").SetFocus
objSess.findById("wnd[0]/usr/lbl[91,10]").caretPosition = 4
objSess.findById("wnd[0]").sendVKey 2
' Display sort dialog (41 = Ctrl+Shift+F5 = menu Edit > Sort in ascending order)
objSess.findById("wnd[0]/tbar[1]/btn[41]").press
' <<<< Here, how to select lines in left and right table controls?
' Downloading the file
fileobjSess.findById("wnd[0]/mbar/menu[5]/menu[5]/menu[2]/menu[1]").Select
objSess.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").Select
objSess.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").SetFocus
objSess.findById("wnd[1]/tbar[0]/btn[0]").press
objSess.findById("wnd[1]/usr/ctxtDY_PATH").Text = ffilepath
objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = ffilename
objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 8
objSess.findById("wnd[1]/tbar[0]/btn[11]").press
Exit Sub
disperr:
MsgBox "Error occured while retrieving data", vbCritical + vbOKOnly
End Sub
要select一行在table控件中的位置,需要确定table控件的名称,然后使用方法tableControl.getAbsoluteRow(row)
获取该行的实例,并设置其属性Selected = True
。示例:
tableControl = objSess.findById("wnd[1]/usr/tblSAPLSKBHTC_FIELD_LIST_820")
tableControl.getAbsoluteRow(6).Selected = True
现在,要回答您的具体问题(SM37 中的 ALV 排序),您还需要按其他按钮 select 排序字段。
排序对话框屏幕由两个 table 控件组成。您可以先按按钮 "Hide all fields" 将所有字段移动到右侧 table 控件(未 select 的字段),然后 select 右侧的字段 table 控件(如第一段所述)并按下按钮 "Show sel. fields (Ctrl+F3)" 和 "Copy (Enter)".
您需要知道您要在右侧 table 控件中 select 的字段的行号。在 ABAP 7.52 系统中,这些字段按以下顺序列出(第一个是第 1 行,第二个是第 2 行,依此类推):
- 职位名称
- 假脱机列表
- 工作文档
- 创建者
- 状态
- 开始日期
- 开始时间
- 持续时间
- ...
您还需要知道右侧 table 控件的名称。为此,您可以 select 菜单系统 > 状态,双击显示屏幕元素技术名称的 "screen/dynpro" 数字。在您的例子中,您会看到 TC_FIELD_LIST_820
。您还看到屏幕属于程序 SAPLSKBH
.
最终程序如下所示:
ffilepath = "your path here"
ffilename = "Test.txt"
With objSess
.findById("wnd[0]").Maximize
.findById("wnd[0]/tbar[0]/okcd").Text = "/nsm37"
.findById("wnd[0]").sendVKey 0
.findById("wnd[0]/usr/txtBTCH2170-JOBNAME").Text = "*"
.findById("wnd[0]/usr/txtBTCH2170-USERNAME").Text = "*"
.findById("wnd[0]/usr/chkBTCH2170-SCHEDUL").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-READY").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-RUNNING").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-FINISHED").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-ABORTED").Selected = True
.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = Format(Now() - 1, "mm/dd/yyyy")
' .findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = Format(Now() - 1, "dd/mm/yyyy")
.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = Format(Now(), "mm/dd/yyyy")
' .findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = Format(Now(), "dd/mm/yyyy")
.findById("wnd[0]/tbar[1]/btn[8]").press
' Display sort dialog (41 = Ctrl+Shift+F5 = menu Edit > Sort in ascending order)
.findById("wnd[0]/tbar[1]/btn[41]").press
' Remove all previous sort fields (press pushbutton named "APP_FL_ALL")
.findById("wnd[1]/usr/btnAPP_FL_ALL").press
' Select sort field(s) (row 6=start date, row 7=start time)
with .findById("wnd[1]/usr/tblSAPLSKBHTC_FIELD_LIST_820")
.getAbsoluteRow(6).Selected = True
.getAbsoluteRow(7).Selected = True
end with
' Press pushbutton "Show sel. fields"
.findById("wnd[1]/usr/btnAPP_WL_SING").press
' Press key "Enter" (corresponds to pushbutton "Copy (Enter)")
.findById("wnd[1]/tbar[0]/btn[0]").press
' Downloading the file
.findById("wnd[0]/mbar/menu[5]/menu[5]/menu[2]/menu[1]").Select
.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").Select
.findById("wnd[1]/tbar[0]/btn[0]").press
.findById("wnd[1]/usr/ctxtDY_PATH").Text = ffilepath
.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = ffilename
.findById("wnd[1]/tbar[0]/btn[11]").press
End With
以下 SAP 740 的 SAP GUI 脚本将 SM37 列表保存到文本文件。
在保存列表之前,我想按开始日期和开始时间对列表进行排序。
我可以显示 select 排序字段的弹出窗口。左侧有一个 table 控件,其中包含当前排序列(作业名称、创建者、进度、计划开始日期、计划开始时间),右侧有一个 table 控件,其中包含所有可能的排序列,这些左右排序列中的每一个都可以 selected,并且在两个 table 控件之间有按钮可以将排序列从左移动到右,反之亦然。
现在,要对列进行 select 排序,我必须 select 行 table 控件,但我不知道该怎么做。你能帮帮我吗?
Public Sub RunSM37Cancelled()
Dim W_Ret As Boolean
W_Ret = Attach_Session
If Not W_Ret Then
Exit Sub
End If
On Error GoTo disperr
objSess.findById("wnd[0]").maximize
objSess.findById("wnd[0]/tbar[0]/okcd").Text = "sm37"
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/txtBTCH2170-JOBNAME").Text = "*"
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/txtBTCH2170-USERNAME").Text = "*"
objSess.findById("wnd[0]/usr/txtBTCH2170-USERNAME").SetFocus
objSess.findById("wnd[0]/usr/txtBTCH2170-USERNAME").caretPosition = 1
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/chkBTCH2170-SCHEDUL").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-READY").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-RUNNING").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-FINISHED").Selected = False
objSess.findById("wnd[0]/usr/chkBTCH2170-ABORTED").Selected = True
objSess.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = Format(Now()-1,"mm/dd/yyyy")
objSess.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").SetFocus
objSess.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").caretPosition = 10
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = Format(Now(), "mm/dd/yyyy")
objSess.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").SetFocus
objSess.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").caretPosition = 10
objSess.findById("wnd[0]").sendVKey 0
objSess.findById("wnd[0]/tbar[1]/btn[8]").press
objSess.findById("wnd[0]/usr/lbl[80,10]").SetFocus
objSess.findById("wnd[0]/usr/lbl[80,10]").caretPosition = 5
objSess.findById("wnd[0]").sendVKey 2
objSess.findById("wnd[0]/usr/lbl[91,10]").SetFocus
objSess.findById("wnd[0]/usr/lbl[91,10]").caretPosition = 4
objSess.findById("wnd[0]").sendVKey 2
' Display sort dialog (41 = Ctrl+Shift+F5 = menu Edit > Sort in ascending order)
objSess.findById("wnd[0]/tbar[1]/btn[41]").press
' <<<< Here, how to select lines in left and right table controls?
' Downloading the file
fileobjSess.findById("wnd[0]/mbar/menu[5]/menu[5]/menu[2]/menu[1]").Select
objSess.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").Select
objSess.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").SetFocus
objSess.findById("wnd[1]/tbar[0]/btn[0]").press
objSess.findById("wnd[1]/usr/ctxtDY_PATH").Text = ffilepath
objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = ffilename
objSess.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 8
objSess.findById("wnd[1]/tbar[0]/btn[11]").press
Exit Sub
disperr:
MsgBox "Error occured while retrieving data", vbCritical + vbOKOnly
End Sub
要select一行在table控件中的位置,需要确定table控件的名称,然后使用方法tableControl.getAbsoluteRow(row)
获取该行的实例,并设置其属性Selected = True
。示例:
tableControl = objSess.findById("wnd[1]/usr/tblSAPLSKBHTC_FIELD_LIST_820")
tableControl.getAbsoluteRow(6).Selected = True
现在,要回答您的具体问题(SM37 中的 ALV 排序),您还需要按其他按钮 select 排序字段。
排序对话框屏幕由两个 table 控件组成。您可以先按按钮 "Hide all fields" 将所有字段移动到右侧 table 控件(未 select 的字段),然后 select 右侧的字段 table 控件(如第一段所述)并按下按钮 "Show sel. fields (Ctrl+F3)" 和 "Copy (Enter)".
您需要知道您要在右侧 table 控件中 select 的字段的行号。在 ABAP 7.52 系统中,这些字段按以下顺序列出(第一个是第 1 行,第二个是第 2 行,依此类推):
- 职位名称
- 假脱机列表
- 工作文档
- 创建者
- 状态
- 开始日期
- 开始时间
- 持续时间
- ...
您还需要知道右侧 table 控件的名称。为此,您可以 select 菜单系统 > 状态,双击显示屏幕元素技术名称的 "screen/dynpro" 数字。在您的例子中,您会看到 TC_FIELD_LIST_820
。您还看到屏幕属于程序 SAPLSKBH
.
最终程序如下所示:
ffilepath = "your path here"
ffilename = "Test.txt"
With objSess
.findById("wnd[0]").Maximize
.findById("wnd[0]/tbar[0]/okcd").Text = "/nsm37"
.findById("wnd[0]").sendVKey 0
.findById("wnd[0]/usr/txtBTCH2170-JOBNAME").Text = "*"
.findById("wnd[0]/usr/txtBTCH2170-USERNAME").Text = "*"
.findById("wnd[0]/usr/chkBTCH2170-SCHEDUL").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-READY").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-RUNNING").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-FINISHED").Selected = False
.findById("wnd[0]/usr/chkBTCH2170-ABORTED").Selected = True
.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = Format(Now() - 1, "mm/dd/yyyy")
' .findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = Format(Now() - 1, "dd/mm/yyyy")
.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = Format(Now(), "mm/dd/yyyy")
' .findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = Format(Now(), "dd/mm/yyyy")
.findById("wnd[0]/tbar[1]/btn[8]").press
' Display sort dialog (41 = Ctrl+Shift+F5 = menu Edit > Sort in ascending order)
.findById("wnd[0]/tbar[1]/btn[41]").press
' Remove all previous sort fields (press pushbutton named "APP_FL_ALL")
.findById("wnd[1]/usr/btnAPP_FL_ALL").press
' Select sort field(s) (row 6=start date, row 7=start time)
with .findById("wnd[1]/usr/tblSAPLSKBHTC_FIELD_LIST_820")
.getAbsoluteRow(6).Selected = True
.getAbsoluteRow(7).Selected = True
end with
' Press pushbutton "Show sel. fields"
.findById("wnd[1]/usr/btnAPP_WL_SING").press
' Press key "Enter" (corresponds to pushbutton "Copy (Enter)")
.findById("wnd[1]/tbar[0]/btn[0]").press
' Downloading the file
.findById("wnd[0]/mbar/menu[5]/menu[5]/menu[2]/menu[1]").Select
.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[1,0]").Select
.findById("wnd[1]/tbar[0]/btn[0]").press
.findById("wnd[1]/usr/ctxtDY_PATH").Text = ffilepath
.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = ffilename
.findById("wnd[1]/tbar[0]/btn[11]").press
End With