Ситуация
Я создал функцию поиска для сценариев SAP GUI.
Если в строке сетки есть определенные значения в определенных столбцах, то выполняется двойной щелчок (это вызывает загрузку определенных зависимых данных).
Моя сетка содержит менее 300 строк, поэтому загрузка такого большого количества данных не должна напрягать современный компьютер.
Проблема
Проблема, с которой я столкнулся, состоит в том, что из строки SAPGrid 64 она возвращает "" для каждой ячейки.Если я вхожу в отладку и прокручиваю вниз в сетке ALV, то строка сетки загружается, и результаты найдены.
Возможные решения
Можно ли изменить количество строк, загружаемых по умолчанию?
Существует ли метод для извлечения полного набора записей?
Альтернативные варианты включают прокрутку вверх и вниз с помощьюсоздание сценариев или настройка фильтров.
Код
Sub FindGridLine(SAPGrid As Object, criteria() As String)
SAPGrid.ClearSelection 'first it deselects what has been selected
For k = 0 To (SAPGrid.RowCount - 1) 'for each grid row
For i = 1 To UBound(criteria, 1) ' for each criteria row except for the first (should be only 1)
For j = LBound(criteria, 2) To UBound(criteria, 2) 'and for each column
tempstr = SAPGrid.GetCellValue(k, criteria(0, j))
If tempstr <> criteria(i, j) Then 'if the criterion doesn't match
GoTo nextrow 'then go to the next row
End If
Next j
Next i
'if it passed the criteria then doubleclick it
SAPGrid.DoubleClick k, criteria(0, 0)
Exit Sub
nextrow:
Next k
'in case no results were found
MsgBox "No line was found in grid!"
End Sub
Обновленный код
Код обновлен на основе правильного ответа от @ Asger.
Поскольку поиски в основном работают с первичными ключамиЯ пошел за безопасное решение SAPGrid.GetCellValue(k, criteria(0, j)) = ""
, но решение на самом деле SAPGrid.SetCurrentCell k, criteria(0, j)
.
Sub FindGridLine(SAPGrid As Object, criteria() As String)
' SAPGrid.SelectAll 'first it selects everything as to load the full grid
SAPGrid.ClearSelection 'first it deselects what has been selected
For k = 0 To (SAPGrid.RowCount - 1) 'for each grid row
For i = 1 To UBound(criteria, 1) ' for each criteria row except for the first (should be only 1)
For j = LBound(criteria, 2) To UBound(criteria, 2) 'and for each column
tempstr = SAPGrid.GetCellValue(k, criteria(0, j))
If tempstr = "" Then SAPGrid.SetCurrentCell k, criteria(0, j) 'this solution only works if the search is done in a non-empty field
tempstr = SAPGrid.GetCellValue(k, criteria(0, j))
If tempstr <> criteria(i, j) Then 'if the criterion doesn't match
GoTo nextrow 'then go to the next row
End If
Next j
Next i
'if it passed the criteria then doubleclick it
SAPGrid.DoubleClick k, criteria(0, 0)
Exit Sub
nextrow:
Next k
'in case no results were found
For i = 0 To UBound(criteria, 1) ' for each criteria row except for the first (should be only 1)
For j = LBound(criteria, 2) To UBound(criteria, 2) 'and for each column
tempstr = tempstr & "|" & criteria(i, j)
Next j
If i <> UBound(criteria, 1) Then
tempstr = tempstr & vbNewLine
End If
Next i
MsgBox "No line was found in grid!" & vbNewLine & "Please select line" & tempstr & vbNewLine & "manually and press 'OK'" & vbNewLine & "or enter debug mode."
End Sub