SAP VBA - чтение текста в структуре типа табуляции такси VA02

Я новичок в программировании в целом, и это мой первый пост, поэтому, пожалуйста, простите меня, если моя терминология неверна. У меня проблема с SAP VA02, когда я хочу определить строку строки, в которой находится конкретная метка. В этом случае метка / текст - «Таможенная ожидаемая цена». Я пытаюсь изменить данные рядом с этой строкой, проблема в том, что это не всегда одна и та же строка, иногда это 16, 18 и т. Д. Я пытаюсь найти способ перебрать каждую строку в столбце 2 в структуре , прочтите текст и найдите, в какой строке находится метка, затем используйте строку в качестве переменной, чтобы вставить цену в правильную ячейку. Ниже я вставил некоторый работающий код. Я ввожу здесь правильную цену: Мой главный вопрос, например, как читать, какой текст в каждой ячейке , Я, вероятно, смогу выяснить остальное оттуда. Мне не удалось найти много информации об этой конкретной структуре, любой вклад приветствуется. Я также выложу скриншот страницы для справки. Спасибо!

Рассматриваемая страница

      Sub OrderRelease()

Dim Order As String
Dim RowCount As Integer
Dim Item As Integer
Dim sh As Worksheet
Dim rw As Range
Dim Sroll As Integer
Dim Price As Double

On Error Resume Next


RowCount = 0
Set sh = ActiveSheet
For Each rw In sh.Rows

  If sh.Cells(rw.Row, 6).Value = "" Then
    Exit For
  End If

  RowCount = RowCount + 1

Next rw

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 session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject SAP_session, "on"
   WScript.ConnectObject SAPGuiApp, "on"
End If

session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nva02"
session.findById("wnd[0]").sendVKey 0

For i = 2 To RowCount
    Order = Cells(i, "F")
    
    session.findById("wnd[0]/usr/ctxtVBAK-VBELN").Text = Order
    session.findById("wnd[0]/usr/ctxtVBAK-VBELN").caretPosition = 9
    session.findById("wnd[0]").sendVKey 0
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    
Continue:

    Item = Cells(i, "G") / 10 - 1
    Scroll = Item - 1
    Price = Cells(i, "H")

    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900/tblSAPMV45ATCTRL_U_ERF_AUFTRAG").verticalScrollbar.Position = Scroll
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900/tblSAPMV45ATCTRL_U_ERF_AUFTRAG").getAbsoluteRow(Item).Selected = True
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900/tblSAPMV45ATCTRL_U_ERF_AUFTRAG/txtVBAP-POSNR[0,8]").SetFocus
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900/tblSAPMV45ATCTRL_U_ERF_AUFTRAG/txtVBAP-POSNR[0,8]").caretPosition = 4
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\02/ssubSUBSCREEN_BODY:SAPMV45A:4401/subSUBSCREEN_TC:SAPMV45A:4900/subSUBSCREEN_BUTTONS:SAPMV45A:4050/btnBT_PKON").press
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN").verticalScrollbar.Position = 8
'The below line is what I need to find. In this case, Cust. expected price would be 2,16, but I have not found a way to actually read the text in that cell.
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[3,16]").Text = Price
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[3,16]").SetFocus
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\05/ssubSUBSCREEN_BODY:SAPLV69A:6201/tblSAPLV69ATCTRL_KONDITIONEN/txtKOMV-KBETR[3,16]").caretPosition = 16
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\11").Select
    session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_ITEM/tabpT\11/ssubSUBSCREEN_BODY:SAPMV45A:4456/cmbVBAP-ABGRU").Key = " "
    session.findById("wnd[0]/tbar[0]/btn[3]").press
    session.findById("wnd[0]/usr/btnBUT2").press
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[0]").sendVKey 0

    If Cells(i, "F") = Cells(i + 1, "F") Then
        i = i + 1
        GoTo Continue
    End If

    session.findById("wnd[0]").sendVKey 11
    session.findById("wnd[1]/tbar[0]/btn[0]").press
    session.findById("wnd[1]/usr/btnSPOP-VAROPTION1").press

Next i

End Sub


1 ответ

Вот как ссылаться на значение ячейки в заданной строке и заданном столбце, которые оба представлены в переменных:

      row = 0
column = 1
cellText = session.findById(".../tblXXXXX/columnFieldName[" & column & "," & row & "]").text

Более эффективный способ - использовать метод GetCell для объекта Table Control:

      cellText = session.findById(".../tblXXXXX").GetCell(row,column).text

NB: обратите внимание, что аргументы строки и столбца переключаются.

Чтобы узнать, какие значения использовать для «... / tblXXXXX / columnFieldName[...], самый простой способ - записать сценарий, просто переместив курсор в нужный столбец. Сгенерированный сценарий вернет что-то подобное (test с демонстрационной программой):

      session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS/ctxtDEMO_CONN-CITYFROM[2,1]").setFocus
session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS/ctxtDEMO_CONN-CITYFROM[2,1]").caretPosition = 1

Номер строки соответствует порядку видимых строк, начиная с 0 (0 = первая видимая строка). Последняя видимая строка имеет номер, равный свойству Table Control. минус 1. Строки, которые не видны (вверху и внизу), можно получить, заставив ваш скрипт прокручивать вертикально, для получения дополнительной информации о программной прокрутке см. ниже главу.

Номер столбца основан на порядке столбцов, показанном в элементе управления таблицей, независимо от того, какие столбцы видны сразу или видимы после горизонтальной прокрутки. Скрипту не нужно выполнять горизонтальную прокрутку для чтения значений невидимых столбцов. 0 - крайний левый столбец, а номер крайнего правого столбца равен двум свойствам элемента управления таблицей. минус 1.

  • Список столбцов и их порядок могут отличаться в зависимости от активной конфигурации управления таблицей. Вы можете определить номер столбца на основе имени столбца во время выполнения, для этого см. Главу ниже.
  • Могут быть предложены другие столбцы с помощью функции администратора Table Control с установленным флажком «скрытый». Сценарии SAP GUI полностью игнорируют эти столбцы. Если вам нужно с ними работать, необходимо вызвать метод управления таблицей , чтобы отобразить экран администратора, а затем вы можете работать с настройками, как с любым другим экраном.

Прокрутка строк

Для элемента управления таблицей SAP GUI Scripting известны только данные в строках, которые в данный момент видны на экране, поскольку из соображений производительности внутренняя программа ABAP отправляет только эти строки во внешний интерфейс. Сценарии SAP GUI не могут узнать значения из невидимых строк. Требуется, чтобы сценарий прокручивал вертикально, чтобы получить другие строки. Внимание , прокрутка означает перезагрузку всего экрана, поэтому необходимо повторно создать экземпляры элементов экрана. В следующем примере выполняется прокрутка всего списка для отображения всех значений в первом столбце (использование демонстрационной программы ):

      Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
' Make the first row visible (show the top of the list) -> that calls the back-end system and screen is reloaded.
' ATTENTION: when the back-end is called, to continue working with screen elements, they must be re-instantiated.
tbl.VerticalScrollbar.Position = 0

TextsOfAllCellsInColumnZero = ""
Do While True
  ' Re-instantiate the Table Control element (mandatory each time the back-end is called)
  Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
  visibleRow = 0
  currentScrollbarPosition = tbl.VerticalScrollbar.Position
  While visibleRow < tbl.VisibleRowCount And currentScrollbarPosition <= tbl.VerticalScrollbar.Maximum
    TextsOfAllCellsInColumnZero = TextsOfAllCellsInColumnZero & tbl.GetCell(visibleRow,0).Text & Chr(10)
    visibleRow = visibleRow + 1
    currentScrollbarPosition = currentScrollbarPosition + 1
  Wend
  If currentScrollbarPosition > tbl.VerticalScrollbar.Maximum Then
    Exit Do
  End If
  tbl.VerticalScrollbar.Position = currentScrollbarPosition
Loop
MsgBox TextsOfAllCellsInColumnZero

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

Определите номер столбца по имени столбца во время выполнения

Как объяснялось выше, номер столбца может варьироваться в зависимости от порядка столбцов и скрытых столбцов. Если они изменяются неопределенным образом во время выполнения, следующий код позволяет определить номер столбца на основе имени столбца (обратите внимание, что префикс в нижнем регистре имени поля должен быть удален, например, «ctxt» в «ctxtDEMO_CONN-CITYFROM» "), но он работает только при наличии хотя бы одной строки (решение не найдено, если оно необходимо, когда элемент управления таблицей пуст):

      Set tbl = session.findById("wnd[0]/usr/tblDEMO_DYNPRO_TABCONT_LOOPFLIGHTS")
column = GetColumnNumberByName(tbl,"DEMO_CONN-CITYFROM")
msgbox tbl.GetCell(row,column).text

Function GetColumnNumberByName( TableControl, ColumnName )
  If TableControl.Rows.Count > 0 Then
    For i = 0 To TableControl.Columns.Count - 1
      If TableControl.Columns(i)(0).Name = ColumnName Then
        GetColumnNumberByName = i
        Exit Function
      End If
    Next
  End If
  GetColumnNumberByName = -1
End Function

Приложение

Для получения дополнительной информации, пожалуйста, обратитесь к документации «объекта GuiTableControl» в библиотеке SAP .

NB: если вы посмотрите на другие вопросы, имейте в виду, что Table Control ( ) совершенно не связано с представлением сетки ( ), так что не путайте.

Другие вопросы по тегам