当用户退出测试失败时取消 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 中。