我为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
答案 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