Excel SAP GUI脚本:选择表控件的行(ALV sort SM37)

Excel SAP GUI脚本:选择表控件的行(ALV sort SM37),excel,vba,sap-gui,alv,Excel,Vba,Sap Gui,Alv,以下SAP 740的SAP GUI脚本将SM37列表保存为文本文件 在保存列表之前,我想按开始日期和开始时间对列表进行排序 我可以显示弹出窗口来选择排序字段。在左侧有一个带有当前排序列(作业名称、创建人、进度、计划开始日期、计划开始时间)的表控件,在右侧有一个带有所有可能的排序列的表控件,可以选择这些左、右排序列,在两个表控件之间,有一些按钮可以将排序列从左向右移动,反之亦然 现在,要选择排序列,我必须选择表控件的行,但我不知道怎么做。你能帮我吗 Public Sub RunSM37Cancel

以下SAP 740的SAP GUI脚本将SM37列表保存为文本文件

在保存列表之前,我想按开始日期和开始时间对列表进行排序

我可以显示弹出窗口来选择排序字段。在左侧有一个带有当前排序列(作业名称、创建人、进度、计划开始日期、计划开始时间)的表控件,在右侧有一个带有所有可能的排序列的表控件,可以选择这些左、右排序列,在两个表控件之间,有一些按钮可以将排序列从左向右移动,反之亦然

现在,要选择排序列,我必须选择表控件的行,但我不知道怎么做。你能帮我吗

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
公共子运行SM37Cancelled()
Dim W_Ret作为布尔值
W_Ret=连接会话
如果不是,那么
出口接头
如果结束
关于错误转到disperr
objSess.findById(“wnd[0]”)。最大化
objSess.findById(“wnd[0]/tbar[0]/okcd”).Text=“sm37”
objSess.findById(“wnd[0]”)。sendVKey 0
objSess.findById(“wnd[0]/usr/txtBTCH2170作业名”).Text=“*”
objSess.findById(“wnd[0]”)。sendVKey 0
objSess.findById(“wnd[0]/usr/txtBTCH2170 USERNAME”).Text=“*”
objSess.findById(“wnd[0]/usr/txtbch2170 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正在运行”)。Selected=False
objSess.findById(“wnd[0]/usr/chkBTCH2170 FINISHED”)。Selected=False
objSess.findById(“wnd[0]/usr/chkBTCH2170中止”)。Selected=True
objSess.findById(“wnd[0]/usr/ctxtBTCH2170-FROM_DATE”).Text=格式(Now()-1,“mm/dd/yyyyy”)
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=格式(Now(),“mm/dd/yyyyy”)
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]”。按
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
'显示排序对话框(41=Ctrl+Shift+F5=菜单编辑>升序排序)
objSess.findById(“wnd[0]/tbar[1]/btn[41]”。按

“要根据行在表控件中的位置选择行,需要确定表控件的名称,然后使用方法
tableControl.getAbsoluteRow(row)
获取行的实例,并设置其属性
Selected=True
。例如:

tableControl = objSess.findById("wnd[1]/usr/tblSAPLSKBHTC_FIELD_LIST_820")
tableControl.getAbsoluteRow(6).Selected = True
现在,要回答您的特定问题(SM37中的ALV排序),您还需要按其他按钮来选择排序字段

排序对话框屏幕由两个表格控件组成。您可以先按“隐藏所有字段”按钮将所有字段移动到右侧表格控件(未选择字段),然后选择右侧表格控件上的字段(如第一段所述),然后按“显示选择字段(Ctrl+F3)”和“复制(Enter)”按钮

您需要知道要在右表控件中选择的字段的行号。在ABAP 7.52系统中,这些字段按此顺序列出(第一个字段是第1行,第二个字段是第2行,依此类推):

  • 职务名称
  • 假脱机列表
  • 工作文件
  • 创建人
  • 地位
  • 开始日期
  • 开始时间
  • 持续时间
  • 您还需要知道正确的表控件的名称。为此,您可以选择菜单系统>状态,双击显示屏幕元素技术名称的“屏幕/dynpro”编号。在您的例子中,您会看到
    TC\u FIELD\u LIST\u 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
    

    我编辑这个问题是为了让它更清晰,对未来的访问者更有用。我编辑答案是为了解释代码。我之前对问题进行了编辑,以澄清问题,假设主要问题是如何在表控件中选择行。