首页 > 解决方案 > 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

标签: excelvbasap-guialv

解决方案


GuiGridView / ALV 网格控件:对于大量数据,只有在滚动后才会重新加载内容,否则很可能只返回一个空字符串作为结果——即使没有导致异常。

因此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

推荐阅读