屏幕刷新后,在按钮上执行脚本。

2020-08-30 04:14发布

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

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


在"联系人"选项卡上"项目详细信息"级别的事务ME52N中,有一个用于请求者或请求者的字段。 我在角色角色上添加了两个其他字段,以根据通过RFC传递的此申请者字段显示用户的全名和电话号码。 我已在项目级别的向上和向下箭头中添加了一个脚本,该脚本将检查是否选择了"联系人"选项卡,如果已选中,则在"申请者"字段中获取值并将该信息传递给RFC并返回 将两个值粘贴到自定义字段。 我的问题是,执行此脚本(用户单击向上或向下箭头以导航到上一个/下一个订单项)时,系统会在屏幕刷新为新的订单项信息之前捕获请求者字段中的值。 是否可以在屏幕刷新后不实际使用屏幕事件onAfterRefresh之后执行此脚本?

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

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


在"联系人"选项卡上"项目详细信息"级别的事务ME52N中,有一个用于请求者或请求者的字段。 我在角色角色上添加了两个其他字段,以根据通过RFC传递的此申请者字段显示用户的全名和电话号码。 我已在项目级别的向上和向下箭头中添加了一个脚本,该脚本将检查是否选择了"联系人"选项卡,如果已选中,则在"申请者"字段中获取值并将该信息传递给RFC并返回 将两个值粘贴到自定义字段。 我的问题是,执行此脚本(用户单击向上或向下箭头以导航到上一个/下一个订单项)时,系统会在屏幕刷新为新的订单项信息之前捕获请求者字段中的值。 是否可以在屏幕刷新后不实际使用屏幕事件onAfterRefresh之后执行此脚本?

付费偷看设置
发送
5条回答
蓋茨
1楼-- · 2020-08-30 04:54

嗨,

在读取新值之前尝试刷新屏幕。 也许这有帮助...

 sap.personas.scripting.executeScriptInternal({src:''});  

最诚挚的问候,

Thomas

SAP浪
2楼-- · 2020-08-30 04:54

Hello Brian,

我确定这个问题会出现,这是一项性能要求。 当我们甚至将最简单的代码添加到onAfterRefresh时,都会减慢系统速度。 即使使用简单的if语句查看字段是否在视野中,每单击一次按钮至少要延迟1秒钟,这将导致屏幕重新加载。 如果您考虑用户可以单击以查看信息的所有不同选项卡,则对于ME22N这样的交易,对于用户而言,这种情况会多次发生。 对于这种情况(单击项目导航箭头),延迟对于用户来说是有意义的,但问题是,每次屏幕刷新事件启动时,都会对此代码进行分析,而这就是我们希望将其最小化的原因。

我的情况是,无论我是否希望单击向上或向下箭头,都会发生屏幕刷新事件。 问题在于捕获新信息的代码在刷新发生之前就已启动,并且在运行RFC之前我没有得到新信息。

My梦
3楼-- · 2020-08-30 05:07

嗨,Ed,

对RFC功能模块的调用是否可能导致1秒钟的延迟? 在我的测试中,我在onAfterRefresh上放置了一个脚本,并且在不延迟的情况下按了项目详细信息上的向下或向上箭头按钮,便能够获得正确的"请求者"。

如果是RFC功能模块引起延迟或每次调用onAfterRefresh时都被调用的情况,那么我将创建一个RFC功能模块,该模块查找所有"请求者"并将它们放入数组中。 在onLoad事件期间调用此RFC功能模块,因此在开始时仅执行一次。 当用户选择新的采购申请时,onLoad将使用新数据再次自动执行。

然后在onAfterRefresh脚本中,可以将"请求者"与数组进行比较,并填充适当的变量。

这是我在onAfterRefresh测试中使用的代码:

//onAfterRefresh 
session.utils.log(" onAfterRefresh"); if(session.idExists(" wnd [0]/usr/subSUB0:SAPLMEGUI:*/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQSTRIP/CONTROL SAPLMEGUI:3328/txtMEREQ3328-AFNAM"))
{
var requisitioner = session.findById(" wnd [0]/usr/subSUB0:SAPLMEGUI:*/subSUB3:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1301/subSUB2:SAPLMEGUI:3303/tabsREQ_ITEM_DETAIL/tabpTABREQDT11/ssubTABSTRIPCONTROL1SUB:SAPLMEGUI:3328/txtMEREQ3328-AFNAM")。text;
session.utils.log('requisitioner =>') //将您的比较代码放在此处,然后将相应的Personas字段填充为 必需。
}

它使用" idExists"而不是检查突出显示的选项卡。 我认为这样效果更好。

让我知道是否需要更多说明。 让我知道它如何为您工作。

谢谢,布莱恩

土豆飞人
4楼-- · 2020-08-30 05:13

你好,布莱恩,我知道了我的问题。 :)一直是我。 我的问题是我试图使用标准sap按钮的"脚本事件"运行脚本。 我认为发生了什么事,通过将我的脚本添加到标准按钮中,Personas在标准按钮的按钮单击事件之前执行了我的脚本。 为了解决该问题,我创建了两个新按钮(更改了图标以使其与箭头匹配),然后将脚本添加到了这些按钮中。 但是,第一行代码是单击"隐藏"标准按钮,然后执行我的代码。 这样,屏幕现在首先刷新,我的代码接收到新的申请者。 这也有助于我满足不使用onafter刷新事件的要求。

感谢您的帮助。 我想更好地理解Thomas在下面提到的代码,因为我无法在网上找到任何有关此代码的信息。 我需要添加任何内容还是直接复制他提供的内容?

Tong__Ming
5楼-- · 2020-08-30 04:56

是否需要使用风味ID或其他信息来更改或修改该代码? 当我按原样添加该行时,结果没有任何差异。

/*全局树液*/
 var selectedTab = session.findById(" ...")。selectedTab.text;
 如果(selectedTab =="联系人"){
 sap.personas.scripting.executeScriptInternal({src:''});
 var user = session.findById(" ...")。text;
 /*运行RFC以获取用户名*/
 var rfc = session.createRFC(" BAPI_USER_GET_DETAIL");
 rfc.setParameter(" USERNAME",用户);
 rfc.requestResults(JSON.stringify([" ADDRESS"," ADDTEL"," RETURN"])));
 rfc.send();
 var address = JSON.parse(rfc.getResult(" ADDRESS"));
/*将RFC结果粘贴到标签字段*/
 session.findById(" ...")。text = address.FULLNAME;
 session.findById(" ...")。text = address.TEL1_NUMBR;
 }
 

一周热门 更多>