В сценариях SAP можно ли выбрать столбец по имени, а не по позиции строки? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть скрипт, который успешно создает вариант макета.Я выбираю столбцы, которые я хотел бы видеть в отчете, выбирая номер строки, в которой находится имя столбца в списке, например:

 session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/cntlCONTAINER1_LAYO/shellcont/shell").selectedRows = "142"

Поскольку возможно, что когда-нибудь в будущем,мой элемент в строке 142 может перемещаться вверх или вниз по списку, я хотел бы выбрать его по имени, в данном случае по имени «Заказ».Я пробовал различные методы, используя .select или .selected, но не нашел ничего, что работает.В идеале это будет выглядеть примерно так:

 session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/cntlCONTAINER1_LAYO/shellcont/shell").selectedName = "Order"

Возможно ли что-то подобное?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Мне тоже нужно было это сделать, потому что мне нужны были только определенные столбцы в моем макете.Вместо этого я выбрал свой макет, сохранил его как вариант, а затем просто позвонил, чтобы получить макет.Практически тот же метод, что и у joe, но ищет вариант макета вместо полей столбцов.

'open layout list
session.findById("wnd[0]/mbar/menu[5]/menu[2]/menu[1]").Select

'set list of all layouts
Set Layout = session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell")

'find Layout name in all the rows and choose it
iRows = Layout.RowCount()

For i = 0 To iRows - 1

  LayoutVariant = Layout.getCellValue(i, "VARIANT")

  If LayoutVariant = "/YourLayoutNameGoesHere" Then

    Layout.currentCellRow = i

    Layout.clickCurrentCell

    Exit For

  End If

Next
End Sub

изменил это из этого SAP-потока

0 голосов
/ 08 ноября 2018

Можно выбрать из списка SAP, не зная, какая строка содержит поле, которое вы хотите использовать.По сути, вы можете шагать по строкам по номеру строки и видеть, равно ли значение текущей строки полю, которое вы хотите отобразить.Поскольку SAP использует для этого несколько процессов, это решение работает только для простых списков.У меня есть решения для списков отображения таблиц.Если вы хотите увидеть это решение, дайте мне знать.

Когда я впервые написал этот код, я каждый раз начинал с нулевой строки и шел к нижней части списка, чтобы найти каждый последующий элемент.Это более поздняя версия, процесс меняет направление поиска с прогнозирования на основе текущей строки, если имя следующего поля находится выше или ниже в алфавитном порядке.

Создание объекта для списка SAP:

    Public gridView As Object

Поместите список SAP в gridView и вызовите подпрограмму, чтобы просмотреть элементы в списке.Именованный диапазон «mnHead» - это расположение первого имени поля, требуемого в макете, а остальные следуют в том же столбце.

    Set gridView = session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/cntlCONTAINER1_LAYO/shellcont/shell")
    Call getFields("mnhead")

Подпрограмма:

Sub getFields(fNames As String)
Dim i, j, k, m, n As Integer
Dim str1, str2, str3, str4, str5 As String
j = 0                                                      ' j is counter for loop - it points at the current desired field name
k = 0                                                      ' k is start for the item to check
m = 1                                                      ' m is counter step 1 for alpha, -1 for anti-alpha
str3 = "0000000000000000"                                  ' padding for later compare
n = gridView.rowcount - 1                                  ' n = the number of rows in the listbox, it starts at row zero, so take one away
Do While Range(fNames).Offset(j, 0) <> ""                  ' loop to get all the fields
  str2 = Range(fNames).Offset(j, 0)                        ' put the desired field name in string var str2
  For i = k To n Step m                                    ' loop through the rows in the listbox
    gridView.currentCellRow = i                            ' scroll to the row number i
    gridView.SetCurrentCell i, "SELTEXT"                   ' select the item in row i
    If gridView.GetCellValue(i, "SELTEXT") = str2 Then     ' get the value in row I and see if it's the same as the field name wanted
      str1 = str2                                          ' it's the same so save the heading in temp variable str1
      Exit For                                             ' found so exit the loop
      End If
    Next i
  If i >= gridView.rowcount Then                           ' if we went all the way to the bottom with no match, give a message
    MsgBox ("Match not found for " & str2)
    Stop
    End If
  gridView.doubleClickCurrentCell                          ' double click on the row to send it to the left listbox
  str4 = Left(LCase(Left(Replace(str2, " ", ""), 14)) & str3, 15)
  str5 = Left(LCase(Left(Replace(Range(fNames).Offset(j + 1, 0), " ", ""), 14)) & str3, 15)
  If str4 <= str5 Then                                     ' continue alphabetically the list in next search
    If i < 0 Then k = 0 Else k = i                         ' check to see if we're below the first item and reset to first if we are
    m = 1                                                  ' count step is plus one
    n = gridView.rowcount - 1                              ' endpoint is the end of the alphabet
    Else
    If i > gridView.rowcount - 1 Then k = gridView.rowcount - 1 Else k = i      ' if we're past the end then reset to the end
    m = -1                                                 ' count step is minus one - anti-alpha
    n = 0                                                  ' endpoint is the beginning
    End If
  j = j + 1                                                ' increment j and reloop
  Loop
...