Сетка 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
Другие вопросы по тегам