ALV 网格仅加载前 64 行,如何更改默认加载
ALV grid only loads first 64 rows, how to change default load
情况
我已经为 SAP GUI 脚本创建了查找功能。
如果网格行在特定列中具有特定值,则双击它(这会触发加载特定的相关数据)。
我的网格只有不到 300 行,因此加载如此多的数据应该不会对现代计算机造成压力。
问题
我遇到的问题是,从 SAPGrid 的第 64 行开始,它 returns 每个单元格都是“”。如果我进入调试并在 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
GuiGridView / ALV Grid Control: 对于大量数据,只有在滚动后才会重新加载内容,否则很可能只会返回一个空字符串作为结果 - 即使不会导致异常。
因此应始终使用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
情况
我已经为 SAP GUI 脚本创建了查找功能。
如果网格行在特定列中具有特定值,则双击它(这会触发加载特定的相关数据)。
我的网格只有不到 300 行,因此加载如此多的数据应该不会对现代计算机造成压力。
问题
我遇到的问题是,从 SAPGrid 的第 64 行开始,它 returns 每个单元格都是“”。如果我进入调试并在 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
GuiGridView / ALV Grid Control: 对于大量数据,只有在滚动后才会重新加载内容,否则很可能只会返回一个空字符串作为结果 - 即使不会导致异常。
因此应始终使用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