? BDC录屏实现MIRO采购订单发票过账 - SAP顾问圈 亚博体育娱乐 ,亚博体育app怎么样,亚博2018网上投注
二维码

[BDC] BDC录屏实现MIRO采购订单发票过账

Twilight发表于 2019-08-07 10:59Twilight 最后回复于 2019-08-07 10:59 [复制链接] 225 0

采购订单发票过账SAP提供了标准BAPI:BAPI_INCOMINGINVOICE_POST,请参考MIRO过账采购订单发票BAPI_INCOMINGINVOICE_POST

为什么还使用BDC呢?为了在过账时填写参考、抬头文本等备注信息,录屏时注意公司代码,界面使用了SAP内存,所以录屏不一定会有公司代码弹框。

程序代码:
  1. FUNCTION zpufm023.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口
  4. *"??IMPORTING
  5. *"? ???VALUE(I_BELNR) TYPE??RE_BELNR
  6. *"? ???VALUE(I_GJAHR) TYPE??GJAHR
  7. *"? ???VALUE(I_XBLNR) TYPE??XBLNR1 OPTIONAL
  8. *"? ???VALUE(I_BKTXT) TYPE??BKTXT OPTIONAL
  9. *"??EXPORTING
  10. *"? ???VALUE(E_MESSAGE) TYPE??ZOTS001
  11. *"----------------------------------------------------------------------
  12. ??DATA:lt_messtab TYPE TABLE OF bdcmsgcoll.
  13. ??DATA:lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
  14. ??DATA:ls_rbkp TYPE rbkp.

  15. ??PERFORM frm_re_belnr_input CHANGING i_belnr.

  16. ??SELECT SINGLE * INTO ls_rbkp FROM rbkp WHERE belnr = i_belnr AND gjahr = i_gjahr.
  17. ??IF sy-subrc = 0.
  18. ? ? IF ls_rbkp-rbstat = '5'.??"5??已过账
  19. ? ?? ?e_message-type? ? = 'S'.
  20. ? ?? ?e_message-message = 'PO预制发票已经过账!'.
  21. ? ?? ?EXIT.
  22. ? ? ENDIF.
  23. ??ELSE.
  24. ? ? e_message-type? ? = 'E'.
  25. ? ? e_message-message = 'PO预制发票不存在!'.
  26. ? ? EXIT.
  27. ??ENDIF.

  28. ??SET PARAMETER ID 'BUK' FIELD ls_rbkp-bukrs.

  29. *MIRO 菜单-显示
  30. ??PERFORM bdc_dynpro? ?? ?USING 'SAPLMR1M' '6000'.
  31. ??PERFORM bdc_field? ?? ? USING 'BDC_OKCODE'
  32. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???'/EMR3M'.
  33. *输入PO发票号码
  34. ??PERFORM bdc_dynpro? ?? ?USING 'SAPLMR1M' '6150'.
  35. ??PERFORM bdc_field? ?? ? USING 'BDC_OKCODE'
  36. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???'/00'.
  37. ??PERFORM bdc_field? ?? ? USING 'RBKP-BELNR'
  38. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???i_belnr.
  39. ??PERFORM bdc_field? ?? ? USING 'RBKP-GJAHR'
  40. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???i_gjahr.
  41. *MIRO 菜单-修改
  42. ??PERFORM bdc_dynpro? ?? ?USING 'SAPLMR1M' '6000'.
  43. ??PERFORM bdc_field? ?? ? USING 'BDC_OKCODE'
  44. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???'/EPPCH'.
  45. *参考单号
  46. ??PERFORM bdc_dynpro? ?? ?USING 'SAPLMR1M' '6000'.
  47. ??PERFORM bdc_field? ?? ? USING 'BDC_OKCODE'
  48. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???'=HEADER_FI'.
  49. ??IF i_xblnr IS NOT INITIAL.
  50. ? ? PERFORM bdc_field? ?? ? USING 'INVFO-XBLNR'
  51. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? i_xblnr.
  52. ??ENDIF.

  53. *抬头文本
  54. ??PERFORM bdc_dynpro? ?? ?USING 'SAPLMR1M' '6000'.
  55. ??PERFORM bdc_field? ?? ? USING 'BDC_OKCODE'
  56. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???'=BU'.
  57. ??IF i_bktxt IS NOT INITIAL.
  58. ? ? PERFORM bdc_field? ?? ? USING 'INVFO-BKTXT'
  59. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? i_bktxt.
  60. ??ENDIF.


  61. ??PERFORM bdc_transaction TABLES lt_messtab
  62. ? ?? ?? ?? ?? ?? ?? ?? ???USING??'MIRO'
  63. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 'X' "CALL TRANSACTION 方式
  64. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 'N'
  65. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 'S'.
  66. ??IF sy-subrc NE 0.
  67. ? ? e_message-type? ? = 'E'.

  68. ? ? CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
  69. ? ?? ?TABLES
  70. ? ?? ???imt_bdcmsgcoll = lt_messtab
  71. ? ?? ???ext_return? ???= lt_return.
  72. ? ? LOOP AT lt_return??WHERE type CA 'AEX'.
  73. ? ?? ?IF e_message-message IS INITIAL.
  74. ? ?? ???e_message-message? ?= lt_return-message.
  75. ? ?? ?ELSE.
  76. ? ?? ???CONCATENATE e_message-message lt_return-message INTO e_message-message SEPARATED BY '/'.
  77. ? ?? ?ENDIF.
  78. ? ? ENDLOOP.
  79. ??ELSE.
  80. ? ? e_message-type? ? = 'S'.
  81. ? ? e_message-message = 'PO预制发票过账成功!'.
  82. ??ENDIF.

  83. ENDFUNCTION.
  84. INCLUDE bdcrecxy .
复制代码

分析的好有道理,但是最后测试发现dump:CNTL_ERROR异常,SAP给出解释:
  1. miro is an enjoy transaction, so it will fail in background, though it runs in foreground. so try to use BAPI inplace of it.
复制代码

替代方案:
  1. FUNCTION zpufm020.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *"??IMPORTING
  5. *"? ???VALUE(I_BELNR) TYPE??RE_BELNR
  6. *"? ???VALUE(I_GJAHR) TYPE??GJAHR
  7. *"? ???VALUE(I_XBLNR) TYPE??XBLNR1 OPTIONAL
  8. *"? ???VALUE(I_BKTXT) TYPE??BKTXT OPTIONAL
  9. *"??EXPORTING
  10. *"? ???VALUE(E_MESSAGE) TYPE??ZOTS001
  11. *"----------------------------------------------------------------------
  12. ??DATA:lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.
  13. ??DATA:ls_headerdata_change??TYPE bapi_incinv_chng_header.
  14. ??DATA:ls_headerdata_changex TYPE bapi_incinv_chng_headerx.
  15. ??DATA:ls_rbkp??TYPE rbkp.

  16. ??PERFORM frm_re_belnr_input CHANGING i_belnr.

  17. ??SELECT SINGLE * INTO ls_rbkp FROM rbkp WHERE belnr = i_belnr AND gjahr = i_gjahr.
  18. ??IF sy-subrc = 0.
  19. ? ? IF ls_rbkp-rbstat = '5'.??"5??已过账
  20. ? ?? ?e_message-type? ? = 'S'.
  21. ? ?? ?e_message-message = 'PO预制发票已经过账!'.
  22. ? ?? ?EXIT.
  23. ? ? ENDIF.
  24. ??ELSE.
  25. ? ? e_message-type? ? = 'E'.
  26. ? ? e_message-message = 'PO预制发票不存在!'.
  27. ? ? EXIT.
  28. ??ENDIF.

  29. *-->BAPI_INCOMINGINVOICE_CHANGE
  30. ??ls_headerdata_change-ref_doc_no = '00100653'.
  31. ??ls_headerdata_change-header_txt = '确认发票自动生成的过账凭证'.

  32. ??ls_headerdata_changex-ref_doc_no = 'X'.
  33. ??ls_headerdata_changex-header_txt = 'X'.

  34. ??CALL FUNCTION 'BAPI_INCOMINGINVOICE_CHANGE'
  35. ? ? EXPORTING
  36. ? ?? ?invoicedocnumber? ?= i_belnr
  37. ? ?? ?fiscalyear? ?? ?? ?= i_gjahr
  38. ? ?? ?headerdata_change??= ls_headerdata_change
  39. ? ?? ?headerdata_changex = ls_headerdata_changex
  40. ? ? TABLES
  41. ? ?? ?return? ?? ?? ?? ? = lt_return.

  42. ??LOOP AT lt_return WHERE type CA 'AEX'.
  43. ? ? IF e_message-message IS INITIAL.
  44. ? ?? ?e_message-message? ?= lt_return-message.
  45. ? ? ELSE.
  46. ? ?? ?CONCATENATE e_message-message lt_return-message INTO e_message-message SEPARATED BY '/'.
  47. ? ? ENDIF.
  48. ??ENDLOOP.
  49. ??IF sy-subrc = 0.
  50. ? ? CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  51. ? ? e_message-type? ?= 'E'.
  52. ? ? EXIT.
  53. ??ELSE.
  54. ? ? CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  55. ? ?? ?EXPORTING
  56. ? ?? ???wait = 'X'.
  57. *-->BAPI_INCOMINGINVOICE_POST
  58. ? ? CLEAR:lt_return[].
  59. ? ? CALL FUNCTION 'BAPI_INCOMINGINVOICE_POST'
  60. ? ?? ?EXPORTING
  61. ? ?? ???invoicedocnumber = i_belnr
  62. ? ?? ???fiscalyear? ?? ? = i_gjahr
  63. ? ?? ?TABLES
  64. ? ?? ???return? ?? ?? ???= lt_return.

  65. ? ? LOOP AT lt_return WHERE type CA 'AEX'.
  66. ? ?? ?IF e_message-message IS INITIAL.
  67. ? ?? ???e_message-message? ?= lt_return-message.
  68. ? ?? ?ELSE.
  69. ? ?? ???CONCATENATE e_message-message lt_return-message INTO e_message-message SEPARATED BY '/'.
  70. ? ?? ?ENDIF.
  71. ? ? ENDLOOP.
  72. ? ? IF sy-subrc = 0.
  73. ? ?? ?CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  74. ? ?? ?e_message-type? ?= 'E'.
  75. ? ?? ?EXIT.
  76. ? ? ELSE.
  77. ? ?? ?CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  78. ? ?? ???EXPORTING
  79. ? ?? ?? ? wait = 'X'.
  80. ? ?? ?e_message-type? ? = 'S'.
  81. ? ?? ?e_message-message = 'PO预制发票过账成功!'.
  82. ? ? ENDIF.
  83. ??ENDIF.

  84. ENDFUNCTION.
  85. FORM frm_re_belnr_input CHANGING pc_belnr TYPE re_belnr.

  86. ??CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  87. ? ? EXPORTING
  88. ? ?? ?input??= pc_belnr
  89. ? ? IMPORTING
  90. ? ?? ?output = pc_belnr.

  91. ENDFORM.
复制代码

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 亚博体育娱乐