情况
我已经为 SAP GUI 脚本创建了一个查找功能。
如果网格行在特定列中具有特定值,则双击它(这会触发加载特定的相关数据)。
我的网格少于 300 行,因此加载如此多的数据不会对现代计算机造成压力。
Issue
我遇到的问题是,从 SAPGrid Row 64 中,它为每个单元格返回“”。如果我进入调试并在 ALV 网格中向下滚动,则网格行会加载并找到结果。
可能的解决方案
我可以更改默认加载的行数吗?
有没有一种方法可以提取完整的记录集?
替代选项包括使用脚本上下滚动或设置过滤器。
Code
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