二维码

货到付款退货已入库且未冲红订单查询报表

Twilight发表于 2014-07-23 16:16Twilight 最后回复于 2014-07-23 16:16 [复制链接] 2538 0

程序执行效果:
货到付款退货已入库且未冲红订单查询报表.png

NOTE:当数据库表数据达到数亿级别时,不走索引或主键,几乎跑不出来,会超时报错。当不能建索引时,我们可以将日期拆分成单天的方式去关联vbak,这样select就会很快了,在loop这个select就能查出全部数据了。

程序代码:
  1. *&---------------------------------------------------------------------*
  2. *& INCLUDE
  3. *&---------------------------------------------------------------------*
  4. INCLUDE zdqsd_195_top.                "Type/Data
  5. INCLUDE zdqsd_195_selscr.        "Selection screen
  6. INCLUDE zdqsd_195_form.                "Form

  7. *&---------------------------------------------------------------------*
  8. *& 初始化处理
  9. *&---------------------------------------------------------------------*
  10. INITIALIZATION.
  11. PERFORM f_assignment.

  12. *&---------------------------------------------------------------------*
  13. *& 选择屏幕控制
  14. *&---------------------------------------------------------------------*
  15. AT SELECTION-SCREEN OUTPUT.
  16. *  PERFORM xxxxxxx.

  17. *&---------------------------------------------------------------------*
  18. *& 参数输入检查
  19. *&---------------------------------------------------------------------*
  20. AT SELECTION-SCREEN.

  21. *&---------------------------------------------------------------------*
  22. *& 程序开始处理
  23. *&---------------------------------------------------------------------*
  24. START-OF-SELECTION.
  25.   PERFORM f_get_data. "取数逻辑
  26.   PERFORM f_displsy_data. "处理逻辑

  27. *&---------------------------------------------------------------------*
  28. *& 程序结束处理
  29. *&---------------------------------------------------------------------*
  30. END-OF-SELECTION.
  31. *  PERFORM xxxxxxx.
复制代码
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZDQSD_195_TOP
  3. *&---------------------------------------------------------------------*
  4. TABLES:vbak.
  5. TYPE-POOLS:slis.

  6. DATA:BEGIN OF gt_vbak OCCURS 0,
  7.       box,
  8.       vbeln_be TYPE vbfa-vbelv,           "原单SAP单号
  9.       erdat_be TYPE vbak-erdat,           "原单创建日期
  10.       p_omsorder_be TYPE vbak-zzfhqzlx,   "原单OMS单号
  11.       vsbed_be TYPE vbak-vsbed,           "原单装运条件
  12.       vbeln_ny TYPE vbfa-vbelv,           "另约换货单SAP单号
  13.       erdat_ny TYPE vbak-erdat,           "另约换货单创建时间
  14.       p_omsorder_ny TYPE vbak-zzfhqzlx,   "另约换货单oms单号
  15.       vbeln_ne TYPE vbak-vbeln,           "退货单号
  16.       erdat_ne TYPE vbak-erdat,           "退单创建日期
  17.       p_omsorder_ne TYPE vbak-zzfhqzlx,   "退单OMS单号
  18.       zhkfs TYPE vbak-zhkfs,              "还款标识
  19.      END OF gt_vbak.
  20. TYPES:BEGIN OF ty_vbak_be,
  21.        vbeln TYPE vbak-vbeln,             "原单
  22.        auart TYPE vbak-auart,             "订单类型
  23.        erdat TYPE vbak-erdat,             "原单创建日期
  24.        zzfhqzlx TYPE vbak-zzfhqzlx,       "原单OMS单号
  25.        vsbed TYPE vbak-vsbed,             "原单装运条件
  26.        END OF ty_vbak_be.
  27. TYPES:BEGIN OF ty_vbfa,"前续凭证结构
  28.        vbelv TYPE vbfa-vbelv,
  29.       END OF ty_vbfa.
  30. TYPES:BEGIN OF ty_vbfa_fa,"后续凭证结构
  31.        vbelv_fa TYPE vbfa-vbelv,
  32.        vbeln_fa TYPE vbfa-vbeln,
  33.       END OF ty_vbfa_fa.

  34. DATA: gt_vbfa1 TYPE TABLE OF ty_vbfa WITH HEADER LINE.
  35. DATA: gt_vbfa2 TYPE TABLE OF ty_vbfa WITH HEADER LINE.
  36. DATA: gt_vbfa_fa TYPE TABLE OF ty_vbfa_fa WITH HEADER LINE.
  37. DATA: gt_vbak_be TYPE TABLE OF ty_vbak_be WITH HEADER LINE.
复制代码
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZDQSD_195_SELSCR
  3. *&---------------------------------------------------------------------*
  4. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
  5. SELECT-OPTIONS: s_erdat FOR vbak-erdat OBLIGATORY NO-EXTENSION, "创建日期
  6.                 s_auart FOR vbak-auart OBLIGATORY DEFAULT 'ZRE',            "销售凭证类型
  7.                 s_zhkfs FOR vbak-zhkfs.                           "还款方式
  8. SELECTION-SCREEN END OF BLOCK b1.
复制代码
  1. *&---------------------------------------------------------------------*
  2. *&  Include           ZDQSD_195_FORM
  3. *&---------------------------------------------------------------------*

  4. *&---------------------------------------------------------------------*
  5. *&      Form  f_assignment
  6. *&---------------------------------------------------------------------*
  7. *       text
  8. *----------------------------------------------------------------------*
  9. *  -->  p1        text
  10. *  <--  p2        text
  11. *----------------------------------------------------------------------*
  12. FORM f_assignment .
  13.   s_zhkfs-sign = 'I'.
  14.   s_zhkfs-option = 'EQ'.
  15.   s_zhkfs-low = '02'.
  16.   APPEND s_zhkfs.
  17.   s_zhkfs-sign = 'I'.
  18.   s_zhkfs-option = 'EQ'.
  19.   s_zhkfs-low = '03'.
  20.   APPEND s_zhkfs.
  21.   s_zhkfs-sign = 'I'.
  22.   s_zhkfs-option = 'EQ'.
  23.   s_zhkfs-low = '04'.
  24.   APPEND s_zhkfs.
  25.   s_zhkfs-sign = 'I'.
  26.   s_zhkfs-option = 'EQ'.
  27.   s_zhkfs-low = '05'.
  28.   APPEND s_zhkfs.
  29. ENDFORM.                    " f_assignment
  30. *&---------------------------------------------------------------------*
  31. *&      Form  f_get_data
  32. *&---------------------------------------------------------------------*
  33. *       text
  34. *----------------------------------------------------------------------*
  35. *  -->  p1        text
  36. *  <--  p2        text
  37. *----------------------------------------------------------------------*
  38. FORM f_get_data .
  39. *--> 将日期分成单天循环从vbak取数
  40.   DATA:ls_erdat TYPE vbak-erdat.
  41.   DATA:lv_erdat TYPE vbak-erdat.
  42.   DATA:lt_erdat LIKE TABLE OF ls_erdat.
  43.   IF s_erdat-high IS INITIAL.
  44.     APPEND s_erdat-low TO lt_erdat.
  45.   ELSE.
  46.     DO.
  47.       IF sy-tabix = 1.
  48.         lv_erdat = s_erdat-low.
  49.       ENDIF.
  50.       IF  lv_erdat > s_erdat-high.
  51.         EXIT.
  52.       ENDIF.
  53.       APPEND lv_erdat TO lt_erdat.
  54.       lv_erdat = lv_erdat + 1.
  55.     ENDDO.
  56.   ENDIF.
  57.   LOOP AT lt_erdat INTO ls_erdat.
  58.     PERFORM f_get_vbak TABLES gt_vbak USING ls_erdat.
  59.   ENDLOOP.

  60.   SORT gt_vbak BY vbeln_ne.
  61.   IF gt_vbak[] IS NOT INITIAL.
  62.     SELECT vbelv
  63.     INTO TABLE gt_vbfa1
  64.     FROM vbfa
  65.     FOR ALL ENTRIES IN gt_vbak
  66.     WHERE vbtyp_n = 'O'
  67.       AND vbelv = gt_vbak-vbeln_ne.

  68.     SELECT vbeln AS vbelv
  69.     INTO TABLE gt_vbfa2
  70.     FROM vbap
  71.     FOR ALL ENTRIES IN gt_vbak
  72.     WHERE abgru = '01'
  73.       AND vbeln = gt_vbak-vbeln_ne.
  74.   ENDIF.

  75.   SORT gt_vbfa1 BY vbelv.
  76.   SORT gt_vbfa2 BY vbelv.
  77.   LOOP AT gt_vbak.
  78.     READ TABLE gt_vbfa1 WITH KEY vbelv = gt_vbak-vbeln_ne BINARY SEARCH.
  79.     IF sy-subrc = 0.
  80.       DELETE gt_vbak.
  81.     ENDIF.
  82.     READ TABLE gt_vbfa2 WITH KEY vbelv = gt_vbak-vbeln_ne BINARY SEARCH.
  83.     IF sy-subrc = 0.
  84.       DELETE gt_vbak.
  85.     ENDIF.
  86.   ENDLOOP.
  87.   IF gt_vbak[] IS INITIAL.
  88.     MESSAGE '没有符和条件的数据!' TYPE 'S' DISPLAY LIKE 'E'.
  89.     LEAVE LIST-PROCESSING.
  90.   ENDIF.
  91. *-->根据后续凭证找前续凭证(原单SAP单号和另约换货单SAP单号)
  92.   IF gt_vbak[] IS NOT INITIAL.
  93.     SORT gt_vbak BY vbeln_ne.
  94.     SELECT  vbelv AS vbelv_fa "前续凭证
  95.             vbeln AS vbeln_fa "后续凭证
  96.     INTO TABLE gt_vbfa_fa
  97.     FROM vbfa
  98.     FOR ALL ENTRIES IN gt_vbak
  99.     WHERE vbtyp_n = 'H'
  100.       AND vbeln = gt_vbak-vbeln_ne.
  101.   ENDIF.
  102.   IF gt_vbfa_fa[] IS NOT INITIAL.
  103.     SORT gt_vbfa_fa BY vbelv_fa.
  104.     SELECT  vbeln      "原单
  105.             auart      "订单类型
  106.             erdat      "原单创建日期
  107.             zzfhqzlx   "原单OMS单号
  108.             vsbed      "装运条件
  109.     INTO TABLE gt_vbak_be
  110.     FROM vbak
  111.     FOR ALL ENTRIES IN gt_vbfa_fa
  112.     WHERE vbeln = gt_vbfa_fa-vbelv_fa.
  113.   ENDIF.
  114. *-->将原单数据挂到退单上
  115.   SORT gt_vbfa_fa BY vbeln_fa.
  116.   SORT gt_vbak_be BY vbeln.
  117.   LOOP AT gt_vbak.
  118.     READ TABLE gt_vbfa_fa WITH KEY vbeln_fa = gt_vbak-vbeln_ne BINARY SEARCH.
  119.     IF sy-subrc = 0.
  120.       gt_vbak-vbeln_be = gt_vbfa_fa-vbelv_fa.
  121.       MODIFY gt_vbak TRANSPORTING vbeln_be.
  122.       READ TABLE gt_vbak_be WITH KEY vbeln = gt_vbfa_fa-vbelv_fa BINARY SEARCH.
  123.       IF sy-subrc = 0.
  124.         IF gt_vbak_be-auart = 'ZORE' AND gt_vbak_be-vsbed NE 3.
  125.           DELETE gt_vbak.
  126.         ELSE.
  127.           gt_vbak-erdat_be = gt_vbak_be-erdat.
  128.           gt_vbak-p_omsorder_be = gt_vbak_be-zzfhqzlx.
  129.           gt_vbak-vsbed_be = gt_vbak_be-vsbed.
  130.           MODIFY gt_vbak TRANSPORTING erdat_be p_omsorder_be vsbed_be.
  131.         ENDIF.
  132.       ENDIF.
  133.     ENDIF.
  134.   ENDLOOP.
  135. *-->将原单SAP单号和另约换货单SAP单号分开
  136.   LOOP AT gt_vbak WHERE vsbed_be = 3.
  137.     gt_vbak-vbeln_ny = gt_vbak-vbeln_be.
  138.     gt_vbak-erdat_ny = gt_vbak-erdat_be.
  139.     gt_vbak-p_omsorder_ny = gt_vbak-p_omsorder_be.
  140.     CLEAR:gt_vbak-vbeln_be,gt_vbak-erdat_be,gt_vbak-p_omsorder_be.
  141.     MODIFY gt_vbak TRANSPORTING vbeln_ny erdat_ny p_omsorder_ny vbeln_be erdat_be p_omsorder_be.
  142.   ENDLOOP.
  143. *-->根据后续凭证找前续凭证(另约换货单SAP单号找原单号)
  144.   REFRESH:gt_vbfa_fa,gt_vbak_be.
  145.   IF gt_vbak[] IS NOT INITIAL.
  146.     SORT gt_vbak BY vbeln_ny.
  147.     SELECT  vbelv AS vbelv_fa "前续凭证
  148.             vbeln AS vbeln_fa "后续凭证
  149.     INTO TABLE gt_vbfa_fa
  150.     FROM vbfa
  151.     FOR ALL ENTRIES IN gt_vbak
  152.     WHERE vbtyp_n = 'I'
  153.       AND vbeln = gt_vbak-vbeln_ny.
  154.   ENDIF.
  155.   IF gt_vbfa_fa[] IS NOT INITIAL.
  156.     SORT gt_vbfa_fa BY vbelv_fa.
  157.     SELECT  vbeln      "原单
  158.             auart      "订单类型
  159.             erdat      "原单创建日期
  160.             zzfhqzlx   "原单OMS单号
  161.             vsbed      "装运条件
  162.     INTO TABLE gt_vbak_be
  163.     FROM vbak
  164.     FOR ALL ENTRIES IN gt_vbfa_fa
  165.     WHERE vbeln = gt_vbfa_fa-vbelv_fa.
  166.   ENDIF.
  167. *-->将原单数据挂到另约换货单上
  168.   SORT gt_vbfa_fa BY vbeln_fa.
  169.   SORT gt_vbak_be BY vbeln.
  170.   LOOP AT gt_vbak.
  171.     READ TABLE gt_vbfa_fa WITH KEY vbeln_fa = gt_vbak-vbeln_ny BINARY SEARCH.
  172.     IF sy-subrc = 0.
  173.       gt_vbak-vbeln_be = gt_vbfa_fa-vbelv_fa.
  174.       MODIFY gt_vbak TRANSPORTING vbeln_be.
  175.       READ TABLE gt_vbak_be WITH KEY vbeln = gt_vbfa_fa-vbelv_fa BINARY SEARCH.
  176.       IF sy-subrc = 0.
  177.         gt_vbak-erdat_be = gt_vbak_be-erdat.
  178.         gt_vbak-p_omsorder_be = gt_vbak_be-zzfhqzlx.
  179.         gt_vbak-vsbed_be = gt_vbak_be-vsbed.
  180.         MODIFY gt_vbak TRANSPORTING erdat_be p_omsorder_be vsbed_be.
  181.       ENDIF.
  182.     ENDIF.
  183.   ENDLOOP.
  184. ENDFORM.                    " f_get_data
  185. *&---------------------------------------------------------------------*
  186. *&      Form  f_get_vbak
  187. *&---------------------------------------------------------------------*
  188. *       将日期分成单天循环从vbak取数 子过程
  189. *----------------------------------------------------------------------*
  190. FORM f_get_vbak  TABLES p_gt_vbak
  191.                  USING  p_s_erdat.
  192.   DATA:lv_erdat TYPE vbak-erdat.
  193.   lv_erdat = p_s_erdat.
  194.   SELECT  vbeln AS vbeln_ne         "退货订单
  195.           erdat AS erdat_ne         "退货订单创建日期
  196.           zhkfs                     "还款标识
  197.           zzfhqzlx AS p_omsorder_ne "退单OMS单号
  198.   APPENDING CORRESPONDING FIELDS OF TABLE p_gt_vbak
  199.   FROM vbak
  200.   WHERE erdat = lv_erdat
  201.     AND auart IN s_auart
  202.     AND zhkfs IN s_zhkfs.
  203. ENDFORM.                    " f_get_vbak
  204. *&---------------------------------------------------------------------*
  205. *&      Form  f_displsy_data
  206. *&---------------------------------------------------------------------*
  207. *       text
  208. *----------------------------------------------------------------------*
  209. *  -->  p1        text
  210. *  <--  p2        text
  211. *----------------------------------------------------------------------*
  212. FORM f_displsy_data .
  213.   DATA: lt_fieldcat_lvc TYPE lvc_t_fcat.
  214.   DATA: ls_layout_lvc TYPE lvc_s_layo.
  215.   ls_layout_lvc-cwidth_opt = 'X'.
  216.   ls_layout_lvc-box_fname = 'BOX'.
  217.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '1' 'VBELN_BE' '原单SAP单号'.
  218.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '2' 'ERDAT_BE' '原单创建日期'.
  219.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '3' 'P_OMSORDER_BE' '原单OMS单号'.
  220.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '4' 'VBELN_NY' '另约换货单SAP单号'.
  221.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '5' 'ERDAT_NY' '另约换货单创建日期'.
  222.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '6' 'P_OMSORDER_NY' '另约换货单OMS单号'.
  223.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '7' 'VBELN_NE' '退货单号'.
  224.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '8' 'ERDAT_NE' '退单创建日期'.
  225.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '9' 'P_OMSORDER_NE' '退单OMS单号'.
  226.   PERFORM f_fieldcate_lvc TABLES lt_fieldcat_lvc  USING '10' 'ZHKFS' '还款标识'.

  227.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  228.     EXPORTING
  229. *   I_INTERFACE_CHECK                 = ' '
  230. *   I_BYPASSING_BUFFER                =
  231. *   I_BUFFER_ACTIVE                   =
  232.     i_callback_program                = sy-repid
  233. *   I_CALLBACK_PF_STATUS_SET          = ' '
  234. *   I_CALLBACK_USER_COMMAND           = ' '
  235.     i_callback_top_of_page            = 'TOP_OF_PAGE'
  236. *   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
  237. *   I_CALLBACK_HTML_END_OF_LIST       = ' '
  238. *   I_STRUCTURE_NAME                  =
  239. *   I_BACKGROUND_ID                   = ' '
  240. *   I_GRID_TITLE                      =
  241. *   I_GRID_SETTINGS                   =
  242.     is_layout_lvc                     = ls_layout_lvc
  243.     it_fieldcat_lvc                   = lt_fieldcat_lvc
  244. * IMPORTING
  245. *   E_EXIT_CAUSED_BY_CALLER           =
  246. *   ES_EXIT_CAUSED_BY_USER            =
  247.     TABLES
  248.       t_outtab                          = gt_vbak[]
  249. * EXCEPTIONS
  250. *   PROGRAM_ERROR                     = 1
  251. *   OTHERS                            = 2
  252.             .
  253. ENDFORM.                    " f_displsy_data
  254. *&---------------------------------------------------------------------*
  255. *&      Form  f_fieldcate_lvc
  256. *&---------------------------------------------------------------------*
  257. *       alv的fieldcate子过程
  258. *----------------------------------------------------------------------*
  259. FORM f_fieldcate_lvc TABLES pt_fieldcat_lvc TYPE lvc_t_fcat
  260.                      USING p_col_pos TYPE i
  261.                            p_fieldname TYPE c
  262.                            p_scrtext_m TYPE c.
  263.   DATA: ps_fieldcat_lvc TYPE lvc_s_fcat.
  264.   CLEAR ps_fieldcat_lvc.
  265.   ps_fieldcat_lvc-col_pos     = p_col_pos.
  266.   ps_fieldcat_lvc-fieldname   = p_fieldname.
  267.   ps_fieldcat_lvc-scrtext_l   = p_scrtext_m.
  268.   APPEND ps_fieldcat_lvc TO pt_fieldcat_lvc.
  269. ENDFORM.                    " f_fieldcate_lvc
  270. *&---------------------------------------------------------------------*
  271. *&      Form  TOP_OF_LIST
  272. *&---------------------------------------------------------------------*
  273. *       text
  274. *----------------------------------------------------------------------*
  275. FORM top_of_page.
  276.   DATA:lt_list_comments TYPE slis_t_listheader,  "alv表单标题区域设置
  277.        ls_list_comments LIKE LINE OF lt_list_comments.
  278.   DATA: lv_tabline    TYPE i.  "存储内表行数

  279.   CLEAR: lt_list_comments.
  280.   ls_list_comments-typ = 'H'.
  281.   ls_list_comments-key = ''.
  282.   ls_list_comments-info = '货到付款退货已入库且未冲红订单查询报表'.
  283.   APPEND ls_list_comments TO lt_list_comments.
  284.   CLEAR ls_list_comments.

  285.   DATA: lv_data_temp(22).
  286.   WRITE sy-datum TO: lv_data_temp USING EDIT MASK '____年__月__日'.
  287.   CONCATENATE '当前日期: ' lv_data_temp INTO lv_data_temp.
  288.   ls_list_comments-typ = 'S'.
  289.   ls_list_comments-key = ''.
  290.   ls_list_comments-info = lv_data_temp.
  291.   APPEND ls_list_comments TO lt_list_comments.
  292.   CLEAR ls_list_comments.

  293.   DESCRIBE TABLE gt_vbak LINES lv_tabline.
  294.   DATA:lv_sum_line(20) TYPE c .
  295.   lv_sum_line = lv_tabline.
  296.   CONDENSE lv_sum_line NO-GAPS.
  297.   CONCATENATE '记录总数: ' lv_sum_line INTO lv_sum_line.
  298.   ls_list_comments-typ = 'S'.
  299.   ls_list_comments-key = ''.
  300.   ls_list_comments-info = lv_sum_line.
  301.   APPEND ls_list_comments TO lt_list_comments.
  302.   CLEAR ls_list_comments.

  303.   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'   "T-CODE : OAER    PARAMENTS: PICTURES OT
  304.     EXPORTING
  305.       it_list_commentary       = lt_list_comments
  306.       i_logo                   = 'ENJOYSAP_LOGO'
  307.       i_end_of_list_grid       = 'X'
  308. *     I_ALV_FORM               =
  309.             .
  310. ENDFORM.                    "TOP_OF_PAGE
复制代码
回复

使用道具 举报

快速回帖

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

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