Сетка ALV загружает только первые 64 строки, как изменить загрузку по умолчанию
ситуация
Я создал функцию поиска для сценариев SAP GUI.
Если строка сетки имеет определенные значения в определенных столбцах, то по ней дважды щелкают (это вызывает загрузку определенных зависимых данных).
Моя сетка содержит менее 300 строк, поэтому загрузка такого большого количества данных не должна напрягать современный компьютер.
вопрос
У меня проблема в том, что из SAPGrid Row 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
1 ответ
GuiGridView / ALV Grid Control: для больших объемов данных перезагрузка контента происходит только после прокрутки, в противном случае вполне вероятно, что в результате будет возвращена только одна пустая строка - даже без исключения.
Следовательно SetCurrentCell
всегда следует использовать для фокусировки и загрузки набора данных для чтения.
Пожалуйста, проверьте, например SAPGrid.SetCurrentCell(k, 1)
Может быть, достаточно загрузить все новые 64 строки (я не могу проверить это):
If k Mod 64 = 63 Then ' at least if 1 row before each 64 rows
SAPGrid.SetCurrentCell (k, criteria(0, LBound(criteria, 2)))
End If