ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SAP ABAP实用技巧介绍系列之 关于View framework处理Before save event的讨论

2019-07-04 11:27:24  阅读:306  来源: 互联网

标签:实用技巧 githubusercontent img framework user entry save 5464


Created by Jerry Wang, last modified on Jul 17, 2014

点击New Entries后,

[外链图片转存失败(img-0Co1I8jG-1562209890702)(https://user-images.githubusercontent.com/5669954/27263153-2feebfbc-5464-11e7-9fde-fddcec97a122.png)]

输入会触发validation 逻辑的entry:

clipboard2

Maintenance view生成的function module 会被call到,

[外链图片转存失败(img-oChB4GCP-1562209890703)(https://user-images.githubusercontent.com/5669954/27263156-2fffdfb8-5464-11e7-9fe1-9c6ca54576c0.png)]

在里面会call 到screen 0001的PAI Module:

clipboard4

 

<status>-upd_flag会决定是否真正实行database update。如果其值为false,end user点击Save button后,将不会触发真正的database 更新,在UI上会得到Data already saved的信息。

 

 

F8之后,会发现<STATUS>-UPD_FLAG已经在某处被clear了,在CHECK_UPD重新判断是否该填充:

clipboard5

判断的逻辑是TOTAL internal table里是否有action不为space的entry。 如下图,row 3即为在UI上通过点击New Entries后输入的entry,action为N ( New )

clipboard6

因此此种情况下update flag置为X:

clipboard7

然后进入SAVE相应的逻辑:

[外链图片转存失败(img-4ag8eF0p-1562209890705)(https://user-images.githubusercontent.com/5669954/27263161-300ae3ea-5464-11e7-9ad1-286bab9eaeb6.png)]

这里能发现如果status update flag为false,则直接在UI上显示Data already saved的提示信息:

[外链图片转存失败(img-v16b1coT-1562209890705)(https://user-images.githubusercontent.com/5669954/27263162-30166440-5464-11e7-8c0c-c7fb5aba688b.png)]


这里能call 到developer在before save event上实现的callback:

[外链图片转存失败(img-1aNJBvzR-1562209890705)(https://user-images.githubusercontent.com/5669954/27263163-301a0186-5464-11e7-9bce-781cec75c7d7.png)]

Table参数EXTRACT包含了New Entries screen上Table control里的值( 包含end user输入的entry和其他空行)

clipboard11

空行一共20条,是在下面这个代码里生成的:

clipboard12

通过实验,只要将新建entry的action由N改为L,即能实现即使UI报错之后,该entry仍然处于可编辑状态的效果:

[外链图片转存失败(img-gAWZBjkj-1562209890706)(https://user-images.githubusercontent.com/5669954/27263135-2fa82124-5464-11e7-99df-47771a231a31.png)]

效果如下:

clipboard14

此时将Product type改为03,期望的效果是 03 - CRMM_PR_TAX能够成功保存:

clipboard15

此时第二次进入<status>-update的判断逻辑:

clipboard16

total internal table里的entry,蓝色的是直接invalid的输入,红色是纠正后的输入, 因此我们发现我们在UI上将product type由02改为03之后,之前02 对应的entry仍然存储在total里没有被框架删除,因此需要我们手动在BEFORE SAVE的module里完成这个删除动作。

clipboard17

因此在before save的处理逻辑里将invalid entry手动删除:

clipboard18

 

之所以用flag si_pend_delete控制,是为了避免在第一次新建entry时,错误地那些action = N的entry也删掉。

 

 

然后,有时候会发现view framework并不能将用户修改了invalid entry之后第二次重新输入的值写入到total table里,例如user 将product type修正为05之后,点save button:

clipboard19

从callstack能清楚发现开始执行save 操作:

[外链图片转存失败(img-EgKcbAPQ-1562209890710)(https://user-images.githubusercontent.com/5669954/27263140-2fbf9ebc-5464-11e7-80b9-9b03e72a6204.png)]

然而,在before save的callback里,并不包含最新输入的05 entry:

clipboard21

相反,这个05 entry包含在extract internal table里,因此需要developer在before save subroutine里手动做一个merge:

clipboard22

merge代码如下:

clipboard23

如果直接在第一次before save callback执行体内删除invalid entry( line 50), 会导致即使第二次纠正了invalid entry(例如product type从02改正为03)后点击save button,由于<status>-update判断为space,此时将不会有database update,而是直接报"Data already saved"的信息。

clipboard24

 

 在同时输入多行且部分行valid,部分行不valid时,上述solution将很难正确处理所有可能的情况。

 

 

例如:

clipboard25

此时row 3应该删除,因为其不valid,但是 row 5和 row 7应该保留,因为是新输入的entry:

clipboard26

目前的实现这种粗暴的删除所有action为N的做法不能区分出invalid record和新输入的record

clipboard27

前两行检查通过,此时我将第三行entry改成 04-401-CRMM_PR_TAX:

clipboard28

然后选中第二行,点delete button:

clipboard29

然后再点save:

clipboard30

clipboard31

然而最后存储到数据库的结果如下:

clipboard32

标签:实用技巧,githubusercontent,img,framework,user,entry,save,5464
来源: https://blog.csdn.net/i042416/article/details/94601046

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有