当用户退出测试失败时取消 Post 好问题的处理
Cancel Processing of Post Good Issue when test in User-Exit fails
我目前正在对 SAP 事务进行一些检查 vl02n 我想检查批次以及它们的到期日期是否符合某些条件。
为此,我使用用户退出 SAVE_DOCUMENT_PREPARE。如果检查失败,将有一个包含错误位置的 ALV 网格。 必须中断PGI的处理。
我的问题是在测试这些有问题的批次时出现如下错误:
Risk of posting several mat.documents for one delivery->long text.
我读了一篇文章,其中说您应该使用命令 ROLLBACK WORK,但我不太确定这是否可行,我认为在知道之前没有 COMMIT...
这是我目前得到的(ROLLBACK WORK 目前还没有测试)。
[...]
IF lt_faulty_lips IS NOT INITIAL.
" Titel des ALV-Grid abhaengig von der Sprache festlegen
IF sy-langu EQ 'D'.
lv_grid_title = 'Verfallsdatum folgender Positionen zu klein.'.
ELSE.
lv_grid_title = 'Expiration date of the following items too small.'.
ENDIF.
" Grid-Title setzen
MESSAGE s001(zamm) INTO lv_grid_title.
" Fehler-Message ausgeben
MESSAGE s000(zamm) DISPLAY LIKE 'E'.
" is this possible?
"ROLLBACK WORK.
" ALV-Grid mit fehlerhaften Positionen ausgeben
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_grid_title = lv_grid_title
i_callback_program = 'SY-REPID'
i_structure_name = 'LIPSVB'
is_layout = gs_alv_layout
TABLES
t_outtab = lt_faulty_lips
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
" Implement suitable error handling here
ENDIF.
" nochmals Message-Ausgabe im Hauptbild
MESSAGE e000(zamm) DISPLAY LIKE 'E'.
我该如何解决这个问题?
非常感谢,感谢每一个提示!
你提出了一条类型为 E 的消息。这将退出程序,你甚至没有达到你的 ALV。
将消息更改为:MESSAGE s001(zamm) TYPE 'I' DISPLAY LIKE 'E'.
如果这没有帮助,请将消息更改为 ...DISPLAY LIKE I,在用户确认后,报告应该会继续进行。
问候
就像我承诺的那样,这是我的解决方案:
我们使用了一个已经存在的接口实现
IF_EX_LE_SHP_GOODSMOVEMENT.
在这个接口中有一个名为 CHANGE_INPUT_HEADER_AND_ITEMS 的方法。
在这里,我们对特定条件进行检查。在此之后,我们用错误的位置填充类型为 SHP_BADI_ERROR_LOG 的已声明结构 ls_errlog。
重要字段如下:
ls_errlog-msgty = 'E'.
ls_errlog-msgid = '<message-class>'.
ls_errlog-msgno = '<message-number'.
然后我们将这个结构追加到table ct_log.
结果是,如果有不符合我们标准的位置,PGI 将被中断,错误的位置将显示在 ALV-Grid 中。
我目前正在对 SAP 事务进行一些检查 vl02n 我想检查批次以及它们的到期日期是否符合某些条件。
为此,我使用用户退出 SAVE_DOCUMENT_PREPARE。如果检查失败,将有一个包含错误位置的 ALV 网格。 必须中断PGI的处理。
我的问题是在测试这些有问题的批次时出现如下错误:
Risk of posting several mat.documents for one delivery->long text.
我读了一篇文章,其中说您应该使用命令 ROLLBACK WORK,但我不太确定这是否可行,我认为在知道之前没有 COMMIT...
这是我目前得到的(ROLLBACK WORK 目前还没有测试)。
[...]
IF lt_faulty_lips IS NOT INITIAL.
" Titel des ALV-Grid abhaengig von der Sprache festlegen
IF sy-langu EQ 'D'.
lv_grid_title = 'Verfallsdatum folgender Positionen zu klein.'.
ELSE.
lv_grid_title = 'Expiration date of the following items too small.'.
ENDIF.
" Grid-Title setzen
MESSAGE s001(zamm) INTO lv_grid_title.
" Fehler-Message ausgeben
MESSAGE s000(zamm) DISPLAY LIKE 'E'.
" is this possible?
"ROLLBACK WORK.
" ALV-Grid mit fehlerhaften Positionen ausgeben
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_grid_title = lv_grid_title
i_callback_program = 'SY-REPID'
i_structure_name = 'LIPSVB'
is_layout = gs_alv_layout
TABLES
t_outtab = lt_faulty_lips
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
" Implement suitable error handling here
ENDIF.
" nochmals Message-Ausgabe im Hauptbild
MESSAGE e000(zamm) DISPLAY LIKE 'E'.
我该如何解决这个问题?
非常感谢,感谢每一个提示!
你提出了一条类型为 E 的消息。这将退出程序,你甚至没有达到你的 ALV。 将消息更改为:MESSAGE s001(zamm) TYPE 'I' DISPLAY LIKE 'E'.
如果这没有帮助,请将消息更改为 ...DISPLAY LIKE I,在用户确认后,报告应该会继续进行。
问候
就像我承诺的那样,这是我的解决方案:
我们使用了一个已经存在的接口实现 IF_EX_LE_SHP_GOODSMOVEMENT.
在这个接口中有一个名为 CHANGE_INPUT_HEADER_AND_ITEMS 的方法。
在这里,我们对特定条件进行检查。在此之后,我们用错误的位置填充类型为 SHP_BADI_ERROR_LOG 的已声明结构 ls_errlog。 重要字段如下:
ls_errlog-msgty = 'E'.
ls_errlog-msgid = '<message-class>'.
ls_errlog-msgno = '<message-number'.
然后我们将这个结构追加到table ct_log.
结果是,如果有不符合我们标准的位置,PGI 将被中断,错误的位置将显示在 ALV-Grid 中。