使用PRELIMINARY_POSTING_POST_ALL发布的停放文档,但在SM13中留下错误

2020-08-31 03:40发布

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

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


你好!

我开发了一个程序来使用BAPI_ACC_DOCUMENT_POST存放文档并正常工作。

开发了另一个程序,该程序仅显示所有停放的文档,用户将选择一个文档,也可以选择多个文档并发布它们。 我在程序内部使用了PRELIMINARY_POSTING_POST_ALL功能模块。 文档已成功过帐,各个数据已正确保存在BKPF,BSEG及其相关表中。

但是在使用PRELIMINARY_POSTING_POST_ALL进行发布时,错误日志作为更新失败记录在SM13中。 每天都有BASIS人员报告相同的情况。

我已经解决了这个问题,发现这是由于重新处理已经过帐的文档而发生的。 PRELIMINARY_POSTING_POST_ALL内部有一项检查,用于检查文档是否为驻留文档。 如果是停放的文件,它将过帐该文件。 如果它不是驻留的文档,它将通过ERROR出现,并且由于更新失败而将落入SM13。

我采取了所有预防措施,例如清除导出参数,表参数。 供您参考的以下是我使用的代码。 请帮助我如何使用PRELIMINARY_POSTING_POST_ALL,我是否需要清除任何缓冲区或需要调用任何其他FM?

在lt_final INTO gs_final中循环。

清除:gs_post,gs_vbkpf_alv,gt_post,gt_msg,gt_msg_tab,gs_msg,gs_t100。

读取表gt_vbkpf_alv使用键ausbk = gs_final-bukrs进入gs_vbkpf_alv
belnr = gs_final-belnr
gjahr = gs_final-gjahr
二进制搜索。
如果sy-subrc = 0。 清除:gs_post,gt_post,gt_msg,gt_msg_tab。

将gs_vbkpf_alv移动到gs_post。

APPEND gs_post到gt_post。

导出gv_tcode以共享缓冲区indx(zt)ID'ZPOST'。
导出gv_tcode1以共享缓冲区indx(zu)ID'ZPOS1'。
导出gv_tcode2以共享缓冲区indx(zv)ID'ZPOS2' 。

呼叫功能'PRELIMINARY_POSTING_POST_ALL'
导出
nomsg ='X'

t_vbkpf = gt_post
t_msg = gt_msg
t_msg_tab = gt_msg_tab。

gt_msg不是初始值。
等待最多1秒。
清除:gs_msg,gs_t100。
读取表gt_msg到gs_msg索引1。
如果sy-subrc =0。
选择单个* 从t100到gs_t100,其中sprsl EQ'E'
和arbgb EQ gs_msg-msgid
和msgnr EQ gs_msg-msgno。

gs_log-bukrs = gs_post-bukrs。
gs_log-belnr = gs_post-belnr。
gs_log-gjahr = gs_post-gjahr。
在gs_t100-text中用'替换所有'&'的出现。
gs_log-text = gs_t100-text。
附加gs_log至 gt_log。
清除:gs_log。
ENDIF。
ENDIF。
ENDIF。

清除:gs_post,gs_final,gs_vbkpf_alv,gt_post,gt_msg,gt_msg_tab,
gs_msg,gs_t100。
ENDLOOP。

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

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


你好!

我开发了一个程序来使用BAPI_ACC_DOCUMENT_POST存放文档并正常工作。

开发了另一个程序,该程序仅显示所有停放的文档,用户将选择一个文档,也可以选择多个文档并发布它们。 我在程序内部使用了PRELIMINARY_POSTING_POST_ALL功能模块。 文档已成功过帐,各个数据已正确保存在BKPF,BSEG及其相关表中。

但是在使用PRELIMINARY_POSTING_POST_ALL进行发布时,错误日志作为更新失败记录在SM13中。 每天都有BASIS人员报告相同的情况。

我已经解决了这个问题,发现这是由于重新处理已经过帐的文档而发生的。 PRELIMINARY_POSTING_POST_ALL内部有一项检查,用于检查文档是否为驻留文档。 如果是停放的文件,它将过帐该文件。 如果它不是驻留的文档,它将通过ERROR出现,并且由于更新失败而将落入SM13。

我采取了所有预防措施,例如清除导出参数,表参数。 供您参考的以下是我使用的代码。 请帮助我如何使用PRELIMINARY_POSTING_POST_ALL,我是否需要清除任何缓冲区或需要调用任何其他FM?

在lt_final INTO gs_final中循环。

清除:gs_post,gs_vbkpf_alv,gt_post,gt_msg,gt_msg_tab,gs_msg,gs_t100。

读取表gt_vbkpf_alv使用键ausbk = gs_final-bukrs进入gs_vbkpf_alv
belnr = gs_final-belnr
gjahr = gs_final-gjahr
二进制搜索。
如果sy-subrc = 0。 清除:gs_post,gt_post,gt_msg,gt_msg_tab。

将gs_vbkpf_alv移动到gs_post。

APPEND gs_post到gt_post。

导出gv_tcode以共享缓冲区indx(zt)ID'ZPOST'。
导出gv_tcode1以共享缓冲区indx(zu)ID'ZPOS1'。
导出gv_tcode2以共享缓冲区indx(zv)ID'ZPOS2' 。

呼叫功能'PRELIMINARY_POSTING_POST_ALL'
导出
nomsg ='X'

t_vbkpf = gt_post
t_msg = gt_msg
t_msg_tab = gt_msg_tab。

gt_msg不是初始值。
等待最多1秒。
清除:gs_msg,gs_t100。
读取表gt_msg到gs_msg索引1。
如果sy-subrc =0。
选择单个* 从t100到gs_t100,其中sprsl EQ'E'
和arbgb EQ gs_msg-msgid
和msgnr EQ gs_msg-msgno。

gs_log-bukrs = gs_post-bukrs。
gs_log-belnr = gs_post-belnr。
gs_log-gjahr = gs_post-gjahr。
在gs_t100-text中用'替换所有'&'的出现。
gs_log-text = gs_t100-text。
附加gs_log至 gt_log。
清除:gs_log。
ENDIF。
ENDIF。
ENDIF。

清除:gs_post,gs_final,gs_vbkpf_alv,gt_post,gt_msg,gt_msg_tab,
gs_msg,gs_t100。
ENDLOOP。

付费偷看设置
发送
3条回答
Cikesha
1楼 · 2020-08-31 03:54.采纳回答

不要检查g_log_handle是否为INITIAL。

呼叫功能'BAL_LOG_DELETE'
导出
i_log_handle = g_log_handle
例外情况
log_not_found = 0
其他= 0。


清除g_log_handle。

Doze时光
2楼-- · 2020-08-31 03:49

嗨Gaurav,

感谢您的回复。

实际上,我只显示BKPF中状态为V的停放文档。

无论如何,我在调用PRELIMINARY_POSTING_POST_ALL并进行测试时都做了一些更改。 让我们看看是否重复同样的错误?

之前,我没有传递appl_log,也没有从功能模块接收e_log_handle。 现在,我在调用功能模块之前和之后通过并获取日志并删除日志,如下所示:

通话功能'PRELIMINARY_POSTING_POST_ALL'
导出
nomsg ='X'
synch = char_x
appl_log = l_appl_log
IMPORTING
e_log_handle = g_log_handle
es_display_profile = gs_display_profile = >表格
t_vbkpf = gt_post
t_msg = gt_msg
t_msg_tab = gt_msg_tab。

SAP砖家
3楼-- · 2020-08-31 04:07

您好,Sunil,

我建议您检查一下 在您提供自定义程序的自定义程序中仅显示停放的文档,而不显示已发布的文档。

您可以使用相同的逻辑来检查已在PRELIMINARY_POSTING_POST_ALL中使用的停放/已发布文档

这种方法有问题吗?

GK

一周热门 更多>