二维码

ZLMT033中间表中订购原因丢失数据批量维护程序

Twilight发表于 2014-03-18 20:57Twilight 最后回复于 2014-03-18 20:57 [复制链接] 2195 0

需求:OMS二期上线后,ERP系统中部分物流ZLMT033表中异常状态的数据订购原因丢失批量维护

设计方案:
1.定义选择屏幕
处理状态一般情况下都为H,不需要修改。
勾选“是否根据zlmt033处理H状态数据”时,先检查vbuv表,再修改vbak表中的augru字段;不勾选,直接修改vbak中的augru字段。
退货申请为手动输入需要修改vbak-augru的值。
2.取数
3.用BAPI_SALESORDER_CHANGE批量更新SO订单数据
4.收集消息并记录到日志表中

选择屏幕:
ZLMT033中间表中订购原因丢失数据批量维护选择屏幕.jpg
注:勾选:不给出消息提示,直接记录到日志中,因为业务需要后台定义JOB

日志表:
ZDQSD_166日志表.jpg

主程序代码:
  1. *&---------------------------------------------------------------------*
  2. *& 程序名: ZDQSD_166                                                   *
  3. *&                                                                     *
  4. *&---------------------------------------------------------------------*
  5. *& 抬头     : ZLMT033中间表中订购原因丢失数据批量维护报表              *
  6. *& 模块     : SD                                                       *
  7. *& 作者     : XXX                                                   *
  8. *& 创建日期 : 2014/03/13                                               *
  9. *& 程序类型 : 报表/表单/批导入/后台作业                                *
  10. *& 消息类   : 00                                                       *
  11. *& 描述     : ZLMT033中间表中订购原因丢失数据批量维护报表              *
  12. *&                                                                     *
  13. *& 修改记录 :                                                          *
  14. *& 日期    修改人 修改内容                                             *
  15. *& YYYY/MM/DD修改人员名说明                                            *
  16. *&---------------------------------------------------------------------*
  17. REPORT  zdqsd_166 MESSAGE-ID 00.

  18. *&---------------------------------------------------------------------*
  19. *& INCLUDE
  20. *&---------------------------------------------------------------------*
  21. INCLUDE zdqsd_166_top.    "Type/Data
  22. *INCLUDE zxxxxxxxx_class.        "Class
  23. INCLUDE zdqsd_166_selscr.        "Selection screen
  24. INCLUDE zdqsd_166_form.   "Form
  25. *INCLUDE zxxxxxxxx_module.  "Module

  26. *&---------------------------------------------------------------------*
  27. *& 初始化处理
  28. *&---------------------------------------------------------------------*
  29. INITIALIZATION.
  30. *  PERFORM xxxxxxx.

  31. *&---------------------------------------------------------------------*
  32. *& 选择屏幕控制
  33. *&---------------------------------------------------------------------*
  34. AT SELECTION-SCREEN OUTPUT.
  35. *  PERFORM xxxxxxx.

  36. *&---------------------------------------------------------------------*
  37. *& 参数输入检查
  38. *&---------------------------------------------------------------------*
  39. AT SELECTION-SCREEN.
  40.   PERFORM f_authority_check."权限检查
  41.   PERFORM f_check_screen."选择屏幕条件控制校验
  42. *  PERFORM xxxxxxx.

  43. *&---------------------------------------------------------------------*
  44. *& 程序开始处理
  45. *&---------------------------------------------------------------------*
  46. START-OF-SELECTION.
  47.   PERFORM f_get_data. "取数逻辑
  48.   PERFORM f_process_data. "处理逻辑
  49. *&---------------------------------------------------------------------*
  50. *& 程序结束处理
  51. *&---------------------------------------------------------------------*
  52. END-OF-SELECTION.
  53. *  PERFORM XXXXXX.
复制代码
  1. *&---------------------------------------------------------------------*
  2. *&  包括              ZDQSD_166_TOP
  3. *&---------------------------------------------------------------------*
  4. TABLES:zlmt033.
  5. DATA:wa_zsd_conf02 TYPE zsd_conf02.
  6. DATA:wa_zdqsd_166_log TYPE zdqsd_166_log.
  7. DATA:it_zdqsd_166_log TYPE TABLE OF zdqsd_166_log.
  8. DATA:gs_tvau TYPE tvau.

  9. TYPES:BEGIN OF ty_vbuv,
  10.         vbeln TYPE vbuv-vbeln,
  11.         posnr TYPE vbuv-posnr,
  12.         etenr TYPE vbuv-etenr,
  13.         parvw TYPE vbuv-parvw,
  14.         tdid  TYPE vbuv-tdid ,
  15.         tbnam TYPE vbuv-tbnam,
  16.         fdnam TYPE vbuv-fdnam,
  17.      END OF ty_vbuv.
  18. TYPES:BEGIN OF ty_vbak,
  19.         vbeln    TYPE vbak-vbeln ,
  20.         augru    TYPE vbak-augru ,
  21.         zzfhqzlx TYPE vbak-zzfhqzlx,
  22.      END OF ty_vbak.
  23. TYPES: BEGIN OF ty_zlmt033,
  24.         omsorder TYPE zlmt033-omsorder,
  25.         vbeln TYPE zlmt033-vbeln,
  26.        END OF ty_zlmt033.

  27. DATA: it_vbuv TYPE TABLE OF ty_vbuv WITH HEADER LINE.
  28. DATA: it_vbak TYPE TABLE OF ty_vbak WITH HEADER LINE.
  29. DATA:wa_zlmt033 TYPE ty_zlmt033,
  30.       it_zlmt033 TYPE STANDARD TABLE OF ty_zlmt033.
复制代码
  1. *&---------------------------------------------------------------------*
  2. *&  包括              ZDQSD_166_SELSCR
  3. *&---------------------------------------------------------------------*
  4. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
  5. SELECT-OPTIONS: s_omsor FOR zlmt033-omsorder,"OMS订单号
  6.                 s_vbeln FOR zlmt033-vbeln," 销售凭证
  7.                 s_datum FOR zlmt033-zdatum  OBLIGATORY. "记录创建日期
  8. PARAMETERS:p_sataus TYPE zlmt033-zstatus DEFAULT 'H' OBLIGATORY."处理状态
  9. PARAMETERS: p_flag  AS CHECKBOX DEFAULT 'X'.
  10. SELECTION-SCREEN END OF BLOCK b1.

  11. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
  12. PARAMETERS: p_augru TYPE vbak-augru DEFAULT '026' OBLIGATORY. " 退货申请
  13. SELECTION-SCREEN END OF BLOCK b2.
复制代码
  1. *&---------------------------------------------------------------------*
  2. *&  包括              ZDQSD_166_FORM
  3. *&---------------------------------------------------------------------*
  4. *&---------------------------------------------------------------------*
  5. *&      Form  GET_DATA
  6. *&---------------------------------------------------------------------*
  7. *       text
  8. *----------------------------------------------------------------------*
  9. *  -->  p1        text
  10. *  <--  p2        text
  11. *----------------------------------------------------------------------*
  12. FORM f_get_data .
  13.   IF p_flag = 'X'."选择屏幕中 勾选时的取数逻辑
  14.     SELECT omsorder
  15.            vbeln
  16.     INTO TABLE it_zlmt033
  17.     FROM zlmt033
  18.     WHERE omsorder IN s_omsor AND
  19.           vbeln IN s_vbeln AND
  20.           zdatum IN s_datum AND
  21.           zstatus = p_sataus.
  22.     SORT it_zlmt033 BY vbeln.
  23.     DELETE it_zlmt033[] WHERE vbeln = space.
  24.     DELETE ADJACENT DUPLICATES FROM it_zlmt033[] COMPARING vbeln.

  25.     LOOP AT it_zlmt033 INTO wa_zlmt033."添加前导零
  26.       CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  27.         EXPORTING
  28.           input  = wa_zlmt033-vbeln
  29.         IMPORTING
  30.           output = wa_zlmt033-vbeln.
  31.       MODIFY it_zlmt033 FROM wa_zlmt033 TRANSPORTING vbeln.
  32.     ENDLOOP.

  33.     IF it_zlmt033[] IS NOT INITIAL.
  34.       SELECT vbeln
  35.              posnr
  36.              etenr
  37.              parvw
  38.              tdid
  39.              tbnam
  40.              fdnam
  41.        INTO TABLE it_vbuv
  42.        FROM vbuv
  43.        FOR ALL ENTRIES IN it_zlmt033
  44.        WHERE vbeln = it_zlmt033-vbeln AND fdnam = 'AUGRU'.
  45.     ENDIF.

  46.     LOOP AT it_vbuv."添加前导零
  47.       CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  48.         EXPORTING
  49.           input  = it_vbuv-vbeln
  50.         IMPORTING
  51.           output = it_vbuv-vbeln.
  52.       MODIFY it_vbuv TRANSPORTING vbeln.
  53.     ENDLOOP.

  54.     DELETE it_vbuv[] WHERE vbeln = space.
  55.     IF it_vbuv[] IS NOT INITIAL.
  56.       SORT it_vbuv[] BY vbeln.
  57.       DELETE ADJACENT DUPLICATES FROM it_vbuv COMPARING vbeln.
  58.       SELECT vbeln
  59.              augru
  60.              zzfhqzlx
  61.         INTO TABLE it_vbak
  62.         FROM vbak
  63.         FOR ALL ENTRIES IN it_vbuv
  64.         WHERE vbeln = it_vbuv-vbeln.
  65.     ENDIF.
  66.   ELSE."选择屏幕中 不勾选时的取数逻辑
  67.     SELECT vbeln
  68.            augru
  69.            zzfhqzlx
  70.       INTO TABLE it_vbak
  71.       FROM vbak
  72.       WHERE zzfhqzlx IN s_omsor AND "签章类型
  73.             vbeln IN s_vbeln AND "销售凭证
  74.             erdat IN s_datum."记录建立日期
  75.     SORT it_vbak BY vbeln.
  76.   ENDIF.

  77.   IF it_vbak[] IS INITIAL.
  78.     MESSAGE i001(00) WITH '没有符合条件的数据要更新!'.
  79.     LEAVE LIST-PROCESSING.
  80.   ENDIF.
  81. ENDFORM.              " F_GET_DATA
  82. *&---------------------------------------------------------------------*
  83. *&      Form  f_AUTHORITY_CHECK
  84. *&---------------------------------------------------------------------*
  85. *       text
  86. *----------------------------------------------------------------------*
  87. *  -->  p1        text
  88. *  <--  p2        text
  89. *----------------------------------------------------------------------*
  90. FORM f_authority_check .
  91.   SELECT SINGLE *
  92.     INTO wa_zsd_conf02
  93.     FROM zsd_conf02
  94.     WHERE zpara = 'ZSD166'
  95.      AND zchar = sy-uname.
  96.   IF sy-subrc <> 0.
  97.     MESSAGE e001(00) WITH '您没有权限操作'.
  98.   ENDIF.
  99. ENDFORM.        "f_A     UTHORITY_CHECK
  100. *&---------------------------------------------------------------------*
  101. *&      Form  f_process_data
  102. *&---------------------------------------------------------------------*
  103. *       text
  104. *----------------------------------------------------------------------*
  105. *  -->  p1        text
  106. *  <--  p2        text
  107. *----------------------------------------------------------------------*
  108. FORM f_process_data .
  109.   DATA: lt_return  TYPE STANDARD TABLE OF bapiret2,
  110.         ls_return  TYPE bapiret2,
  111.         ls_headerx TYPE bapisdh1x, "表头标志
  112.         ls_header  TYPE bapisdh1.

  113.   ls_headerx-updateflag = 'U'.     "Update
  114.   ls_header-ord_reason = p_augru.
  115.   ls_headerx-ord_reason = 'X'.

  116.   DATA:l_vbak_augru TYPE vbak-augru.
  117.   DATA:l_message TYPE bapiret2-message.
  118.   DATA:l_error(1) TYPE c.
  119. *-->调用bapi批处理augru
  120.   LOOP AT  it_vbak.
  121.     CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
  122.       EXPORTING
  123.         salesdocument    = it_vbak-vbeln
  124.         order_header_in  = ls_header
  125.         order_header_inx = ls_headerx
  126.       TABLES
  127.         return           = lt_return.

  128.     CLEAR:l_error.
  129.     LOOP AT lt_return INTO ls_return WHERE  type EQ 'E' OR type = 'A'.
  130.       l_error = 'X'.
  131.     ENDLOOP.

  132.     IF l_error = 'X'.
  133.       CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
  134. *-->收集失败的消息
  135.       l_vbak_augru = it_vbak-augru.
  136.       l_message = '修改失败'.
  137.       PERFORM f_add_message USING l_vbak_augru
  138.                                   l_message.
  139.     ELSE.
  140.       CALL FUNCTION'BAPI_TRANSACTION_COMMIT'
  141.             EXPORTING
  142.               wait = 'X'.
  143. *-->收集成功的消息
  144.       l_vbak_augru = p_augru.
  145.       l_message = '修改成功'.
  146.       PERFORM f_add_message USING l_vbak_augru
  147.                                   l_message.
  148.     ENDIF.
  149.   ENDLOOP.

  150.   IF p_flag = space.
  151.     MESSAGE s001(00) WITH '数据已被修改请查看日志表!'.
  152.   ENDIF.
  153. *-->收集消息记录到日志表中
  154.   IF it_zdqsd_166_log IS NOT INITIAL.
  155.     MODIFY zdqsd_166_log FROM TABLE it_zdqsd_166_log.
  156.     IF sy-subrc = 0.
  157.       COMMIT WORK AND WAIT.
  158.     ELSE.
  159.       ROLLBACK WORK.
  160.     ENDIF.
  161.   ENDIF.
  162. ENDFORM.                    " f_process_data
  163. *&---------------------------------------------------------------------*
  164. *&      Form  F_CHECK_SCREEN
  165. *&---------------------------------------------------------------------*
  166. *       text
  167. *----------------------------------------------------------------------*
  168. *  -->  p1        text
  169. *  <--  p2        text
  170. *----------------------------------------------------------------------*
  171. FORM f_check_screen .
  172.   IF  p_flag = space AND s_vbeln[] IS INITIAL  AND  s_omsor[] IS INITIAL .
  173.     MESSAGE e001(00) WITH 'OMS单号和销售凭证号至少输入一项'.
  174.   ENDIF.

  175.   SELECT SINGLE *
  176.     INTO gs_tvau
  177.     FROM tvau
  178.     WHERE augru = p_augru.
  179.   IF sy-subrc <> 0.
  180.     MESSAGE e001(00) WITH '退货申请' p_augru  '不存在!'.
  181.   ENDIF.
  182. ENDFORM.                    "f_check_screen
  183. " F_CHECK_SCREEN
  184. *&---------------------------------------------------------------------*
  185. *&      Form  f_add_message
  186. *&---------------------------------------------------------------------*
  187. *       text
  188. *----------------------------------------------------------------------*
  189. *      -->L_P_VBAK_AUGRU  text
  190. *      -->L_P_MESSAGE  text
  191. *----------------------------------------------------------------------*
  192. FORM f_add_message  USING    l_p_vbak_augru
  193.                              l_p_message.
  194.   wa_zdqsd_166_log-mandt = sy-mandt.
  195.   wa_zdqsd_166_log-zzfhqzlx = it_vbak-zzfhqzlx.
  196.   wa_zdqsd_166_log-vbeln =  it_vbak-vbeln.
  197.   wa_zdqsd_166_log-erdat = sy-datum.
  198.   wa_zdqsd_166_log-erzet = sy-uzeit.
  199.   wa_zdqsd_166_log-augru = l_p_vbak_augru.
  200.   wa_zdqsd_166_log-uname = sy-uname.
  201.   wa_zdqsd_166_log-message = l_p_message.
  202.   APPEND wa_zdqsd_166_log TO it_zdqsd_166_log.
  203.   CLEAR wa_zdqsd_166_log.
  204. ENDFORM.                    " f_add_message
复制代码
回复

使用道具 举报

快速回帖

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

快速回复 返回顶部 返回列表