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.
Номер столбца основан на порядке столбцов, показанном в элементе управления таблицей, независимо от того, какие столбцы видны сразу или видимы после горизонтальной прокрутки. Скрипту не нужно выполнять горизонтальную прокрутку для чтения значений невидимых столбцов. 0 - крайний левый столбец, а номер крайнего правого столбца равен двум свойствам элемента управления таблицей.
- Список столбцов и их порядок могут отличаться в зависимости от активной конфигурации управления таблицей. Вы можете определить номер столбца на основе имени столбца во время выполнения, для этого см. Главу ниже.
- Могут быть предложены другие столбцы с помощью функции администратора 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 (