ALV网格仅加载前64行,如何更改默认加载

时间:2019-02-15 12:43:04

标签: excel vba sap sap-gui alv

情况

我为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 :(得分:2)

GuiGridView / ALV网格控件:对于大量数据,仅在滚动后才进行内容的重新加载,否则可能仅返回一个空字符串作为结果-即使没有引起异常。

因此,SetCurrentCell应该始终用于聚焦和加载要读取的数据集。

请测试e。 G。 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