Сетка ALV загружает только первые 64 строки, как изменить загрузку по умолчанию - PullRequest
0 голосов
/ 15 февраля 2019

Ситуация

Я создал функцию поиска для сценариев 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

1 Ответ

0 голосов
/ 18 февраля 2019

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
...