访问事务SU3中的GuiGridView单元时出错

2020-08-17 04:14发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我正在尝试使用屏幕角色(3.0 SP 11)来简化最终用户的用户个人资料屏幕。 我正在努力访问参数表中的某个单元格。

如您所见,我完成了一些标签合并并添加了一些新字段。 我相信我需要使用javascript将一些参数从参数表中拉到新字段中(如果有更简单的方法,我很高兴)。 我觉得自己已经走了很多路,但是我无法获取某些单元格的内容,这对我来说没有任何意义。

这是我到目前为止的代码。 该代码在onLoad屏幕事件期间触发。

//打开参数选项卡(如果尚未选择)
 如果(session.findById(" wnd [0]/usr/tabsTABSTRIP1")。selectedTab!== session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM")){
   session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM")。select();
   session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpDEFA/ssubMAINAREA:SAPLSUID_MAINTENANCE:1105/ctxtSUID_ST_NODE_DEFAULTS-SPLD")。setFocus();
 }


//将网格视图表转换为变量。
 var pTable = session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM/ssubMAINAREA:SAPLSUID_MAINTENANCE:1104/cntlG_PARAMETER_CONTAINER/shellcont/shell");

//获取表中的总行数
 var numRows = pTable.rowCount;


//获取保存变量的列名
 var columnNames = pTable.getColumnName(0);
 var columnValues = pTable.getColumnName(1);

//在表格下翻页,确保所需的行可见-不确定是否有必要
 pTable.firstVisibleRow = 25;

//将当前单元格设置为29-这可行
 pTable.setCurrentCell(29,columnNames);

//获取单元格29的值-这不起作用。
 var pid = pTable.getCellValue(29,columnNames);
 session.utils.alert(pid);


//尝试找到VKB参数的索引

//var i = 0;
//while(i 
 

我的目的是查看表第一列中的每一行,找到所需参数的索引,然后从第二列中获取这些单元格。 您可以在末尾的注释部分中看到开头。 但是,由于某种原因,无论何时代码调用getCellValue方法调用的索引为29,都会引发错误。 将29设置为当前单元格可以很好地工作,但是获取其内容失败(您可以在错误消息后面的屏幕截图中看到已选择它)。 我在这里做错什么了吗?

谢谢。

布莱恩

(58.4 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我正在尝试使用屏幕角色(3.0 SP 11)来简化最终用户的用户个人资料屏幕。 我正在努力访问参数表中的某个单元格。

如您所见,我完成了一些标签合并并添加了一些新字段。 我相信我需要使用javascript将一些参数从参数表中拉到新字段中(如果有更简单的方法,我很高兴)。 我觉得自己已经走了很多路,但是我无法获取某些单元格的内容,这对我来说没有任何意义。

这是我到目前为止的代码。 该代码在onLoad屏幕事件期间触发。

//打开参数选项卡(如果尚未选择)
 如果(session.findById(" wnd [0]/usr/tabsTABSTRIP1")。selectedTab!== session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM")){
   session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM")。select();
   session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpDEFA/ssubMAINAREA:SAPLSUID_MAINTENANCE:1105/ctxtSUID_ST_NODE_DEFAULTS-SPLD")。setFocus();
 }


//将网格视图表转换为变量。
 var pTable = session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM/ssubMAINAREA:SAPLSUID_MAINTENANCE:1104/cntlG_PARAMETER_CONTAINER/shellcont/shell");

//获取表中的总行数
 var numRows = pTable.rowCount;


//获取保存变量的列名
 var columnNames = pTable.getColumnName(0);
 var columnValues = pTable.getColumnName(1);

//在表格下翻页,确保所需的行可见-不确定是否有必要
 pTable.firstVisibleRow = 25;

//将当前单元格设置为29-这可行
 pTable.setCurrentCell(29,columnNames);

//获取单元格29的值-这不起作用。
 var pid = pTable.getCellValue(29,columnNames);
 session.utils.alert(pid);


//尝试找到VKB参数的索引

//var i = 0;
//while(i 
 

我的目的是查看表第一列中的每一行,找到所需参数的索引,然后从第二列中获取这些单元格。 您可以在末尾的注释部分中看到开头。 但是,由于某种原因,无论何时代码调用getCellValue方法调用的索引为29,都会引发错误。 将29设置为当前单元格可以很好地工作,但是获取其内容失败(您可以在错误消息后面的屏幕截图中看到已选择它)。 我在这里做错什么了吗?

谢谢。

布莱恩

(58.4 kB)
付费偷看设置
发送
6条回答
Cikesha
1楼 · 2020-08-17 04:44.采纳回答

你好,布莱恩,

您只能遍历当前从后端系统加载的行。

您需要考虑3个相关属性:

1)oTableControl.rowCount-表中的总行数

2)oTableControl.visibleRowCount-在Slipstream Engine中加载并可以遍历的总行数

3)oTableControl.firstVisibleRow-第一个可见行的索引

1)利用oTableControl.firstVisibleRow属性来(1)获取第一个可见表行的索引,并(2)从脚本中进行更改以根据总rowCount值从后端动态加载更多行

2)利用visibleRowCount设置循环边界

去年TechEd场景中的示例脚本:

如果(selectedTable.rowCount> 0){
     selectedTable.firstVisibleRow = 0;
     var topRow = selectedTable.visibleRowCount-1;
     for(var rowIdx = 0; rowIdx  topRow){
             如果(topRow + selectedTable.visibleRowCount> selectedTable.rowCount){
                 selectedTable.firstVisibleRow = selectedTable.rowCount-selectedTable.visibleRowCount;
             }其他{
                 selectedTable.firstVisibleRow = topRow +1;
             }
             topRow + = selectedTable.visibleRowCount;
         }
         for(var i = 0; i 
 

最好

Krists Magons

SAP Screen Personas开发团队

半个程序猿
2楼-- · 2020-08-17 04:45

感谢Krists,这确实是问题所在。

我发现的一件事-看来我的JavaScript执行得比我的SAP系统快。 当我设置firstVisibleRow属性时,它通常在读取下一行时会失败。 我实现了睡眠功能,使其在尝试下一行之前等待50ms。

那正常吗?

为以后寻找的任何人编辑-这是最终有效的脚本:

功能睡眠(毫秒){
   var start = new Date()。getTime();
   对于(var i = 0; i <1e7; i ++){
     如果(new Date()。getTime()-开始>毫秒){
       打破;
     }
   }
 }


//打开参数选项卡(如果尚未选择)
 如果(session.findById(" wnd [0]/usr/tabsTABSTRIP1")。selectedTab!== session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM")){
   session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM")。select();
   session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM/ssubMAINAREA:SAPLSUID_MAINTENANCE:1104/txtPersonas_159180273757685")。setFocus();
 }


//将网格视图表转换为变量。
 var pTable = session.findById(" wnd [0]/usr/tabsTABSTRIP1/tabpPARAM/ssubMAINAREA:SAPLSUID_MAINTENANCE:1104/cntlG_PARAMETER_CONTAINER/shellcont/shell");


//获取表中的行数
 var numRows = pTable.rowCount;


//获取保存变量的列名
 var columnNames = pTable.getColumnName(0);
 var columnValues = pTable.getColumnName(1);


//获取表格的最大可见行。 如果我们不向下翻页,我们将无法获得所有价值
 var maxRows = pTable.maxRows;


 var i = 0;
 而(i                                                                     
wang628962
3楼-- · 2020-08-17 04:50

嗨,布莱恩,

我不确定此Wiki页面可以提供帮助(即使该页面似乎已损坏,展开代码也可以使用)。

我也 在玩游戏时,请考虑史蒂夫的博客

致谢

Cris

土豆飞人
4楼-- · 2020-08-17 04:49

谢谢。

我看过史蒂夫的博客。 我看不到他的工作方式与我的工作有很大不同,除了他动态地查看各列而不是仅查看前两列。 除非我错过了某些东西,否则肯定是可能的。

与Wiki相同-他们使用的是相同的getCellValue函数-在某些情况下对我来说不起作用。

Nir深蓝
5楼-- · 2020-08-17 04:55

Bryan ...开始时我也遇到了类似的挑战 使用Personas SP6(我正在尝试对Tcode SU3建模),我已经放弃了ALV表方法。 作为一种解决方法,我编写了一个RFC调用,Persona可以使用该调用来获取\设置用户参数。 可以用于SET \ GET的SAP功能模块如下:

HTH ...

-CACS_SET_USER_PARAMETER =>为任何给定用户设置特定的用户参数 CACS_GET_USER_PARAMETER =>获取任何给定用户的特定用户参数 -SUSR_USER_PARAMETERS_GET-> =>获取所有给定用户的ALL参数 -SUSR_USER_PARAMETERS_PUT-> =>为任何给定的用户输入多个参数

打一壶酱油
6楼-- · 2020-08-17 04:39

谢谢-我有同样的想法。 到目前为止,我实在太顽固而无法实施它。 如果需要的话,我可能会走这条路。

一周热门 更多>