通过俄罗斯报表生成库存账龄表 三

需求

CSDN

已经完成项目

图一需求完成。 图一种详细明细已完成。

待完成任务

批次管理物料汇总表更新

从起初期末表中进行汇总,根据zduration_days和对应的账龄天数进行汇总填入对应区间。

非批次管理物料汇总表更新

显示按照FIFO原则生成的“非批次物料收货明细表”。

gt_gr_endstock表ALV显示即可。

非批次物料汇总显示。

根据gt_gr_endstock表汇总显示。根据zduration_days和对应的账龄天数进行汇总填入对应区间。

实现过程:

子例程流程


START-OF-SELECTION.
  PERFORM get_beg_end_date.
  PERFORM get_J3RFLVMOBVEDH_data.
  PERFORM paint_gt_qcqm_batch_material.
  PERFORM paint_gt_qcqm_nonbatchmat.
  IF r_pc = 'X'.   " 俄罗斯报表明细
    PERFORM get_fieldcat.
    PERFORM display_data.
  ENDIF.
  IF r_fpc = 'X'.  " 零件号汇总
    PERFORM paint_batchmat_subtl.
    PERFORM paint_nonbatch_subtal.
    PERFORM get_fc_subtl.
    PERFORM display_subtl.
  ENDIF.
  IF r_npc_gr = 'X'. "FIFO原则计算非批次物期末库存“收货明细表”
    PERFORM get_fc_gr_nbatch.
    PERFORM display_gr_nbatch.
  ENDIF.

批次管理物料汇总表更新

类型定义

表名: gt_subtl_alv(非批次物料也适用这个表)

字段定义:

字段描述 定义用的注释 字段名称 表名 数据元素
公司 "公司     bukrs gt_subtl_alv bukrs
工厂 "工厂     werks gt_subtl_alv werks_d
存储地点 "存储地点     lgort gt_subtl_alv lgort_d
存储地点描述 "存储地点描述     lgobe gt_subtl_alv lgobe
特殊库存 "特殊库存     sobkz gt_subtl_alv sobkz
物料编码 "物料编码     matnr gt_subtl_alv matnr
名称 "名称     maktx gt_subtl_alv maktx
期初数量 "期初数量     zqckcsl gt_subtl_alv j_3rm_begstock
期初金额 "期初金额     zqckcje gt_subtl_alv j_3rm_begval
入库数量 "入库数量     zqjshsl gt_subtl_alv j_3rm_recptstock
入库金额 "入库金额     zqjshje gt_subtl_alv j_3rm_recptval
出库数量 "出库数量     zqjfhsl gt_subtl_alv j_3rm_isustock
出库金额 "出库金额     zqjfhje gt_subtl_alv j_3rm_isuval
期末库存 "期末库存     zqmkcsl gt_subtl_alv j_3rm_endstock
期末金额 "期末金额     zqmkcje gt_subtl_alv j_3rm_endval
单价 "单价     zun_pr gt_subtl_alv j_3rm_isuval
数量1 "     1个月数量1     Zqty1 gt_subtl_alv j_3rm_endstock
金额1 "     1个月金额1     Zvalue1 gt_subtl_alv j_3rm_isuval
数量2 "     2个月数量2     zqty2 gt_subtl_alv j_3rm_endstock
金额2 "     2个月金额2     zvalue2 gt_subtl_alv j_3rm_endval
数量3 "    3个月数量3     zqty3 gt_subtl_alv j_3rm_endstock
金额3 "     3个月金额3     zvalue3 gt_subtl_alv j_3rm_isuval
数量4 "4~6个月数量4     zqty4 gt_subtl_alv j_3rm_endstock
金额4 "4~6个月金额4     zvalue4 gt_subtl_alv j_3rm_endval
数量5 "7--12个月数量5     zqty5 gt_subtl_alv j_3rm_endstock
金额5 "7--12个月金额5     zvalue5 gt_subtl_alv j_3rm_isuval
数量6 "13--18个月数量6     zqty6 gt_subtl_alv j_3rm_endstock
金额6 "13--18个月金额6     zvalue6 gt_subtl_alv j_3rm_endval
数量7 "19--24个月数量7     zqty7 gt_subtl_alv j_3rm_endstock
金额7 "19--24个月金额7     zvalue7 gt_subtl_alv j_3rm_isuval
数量8 ">24个月数量8     zqty8 gt_subtl_alv j_3rm_endstock
金额8 ">24个月金额8     zvalue8 gt_subtl_alv j_3rm_endval

* 定义物料汇总显示表gt_subtl_alv

TYPES: BEGIN OF ty_subtl_alv,  " 用于汇总显示
         bukrs   TYPE    bukrs ,    "公司
         werks   TYPE    werks_d ,    "工厂
         lgort   TYPE    lgort_d ,    "存储地点
         lgobe   TYPE    lgobe ,    "存储地点描述
         sobkz   TYPE    sobkz ,    "特殊库存
         matnr   TYPE    matnr ,    "物料编码
         maktx   TYPE    maktx ,    "名称
         zqckcsl TYPE    j_3rm_begstock ,    "期初数量
         zqckcje TYPE    j_3rm_begval ,    "期初金额
         zqjshsl TYPE    j_3rm_recptstock ,    "入库数量
         zqjshje TYPE    j_3rm_recptval ,    "入库金额
         zqjfhsl TYPE    j_3rm_isustock ,    "出库数量
         zqjfhje TYPE    j_3rm_isuval ,    "出库金额
         zqmkcsl TYPE    j_3rm_endstock ,    "期末库存
         zqmkcje TYPE    j_3rm_endval ,    "期末金额
         zun_pr  TYPE    j_3rm_isuval ,    "单价
         Zqty1   TYPE    j_3rm_endstock ,    "     1个月数量1
         Zvalue1 TYPE    j_3rm_isuval ,    "     1个月金额1
         zqty2   TYPE    j_3rm_endstock ,    "     2个月数量2
         zvalue2 TYPE    j_3rm_endval ,    "     2个月金额2
         zqty3   TYPE    j_3rm_endstock ,    "    3个月数量3
         zvalue3 TYPE    j_3rm_isuval ,    "     3个月金额3
         zqty4   TYPE    j_3rm_endstock ,    "4~6个月数量4
         zvalue4 TYPE    j_3rm_endval ,    "4~6个月金额4
         zqty5   TYPE    j_3rm_endstock ,    "7--12个月数量5
         zvalue5 TYPE    j_3rm_isuval ,    "7--12个月金额5
         zqty6   TYPE    j_3rm_endstock ,    "13--18个月数量6
         zvalue6 TYPE    j_3rm_endval ,    "13--18个月金额6
         zqty7   TYPE    j_3rm_endstock ,    "19--24个月数量7
         zvalue7 TYPE    j_3rm_isuval ,    "19--24个月金额7
         zqty8   TYPE    j_3rm_endstock ,    ">24个月数量8
         zvalue8 TYPE    j_3rm_endval ,    ">24个月金额8
       END OF ty_subtl_alv.
DATA gs_subtl_alv TYPE ty_subtl_alv.
DATA gt_subtl_alv LIKE TABLE OF gs_subtl_alv.

批次管理物料汇总表数据更新

全局表单:gt_subtl_alv, gt_qcqm。

子例程:

FORM paint_batchmat_subtl .

局部表: lt_qcqm_alv: 为gt_qcqm的哈希表。用于select from

lt_qcqm_temp: gt_qcqm表去除非批次物料,根据汇总则去重。并写入到gt_subtl_alv。

gt_subtl_alv 循环。

        计算单价。

        从lt_qcqm表中select数据汇总(期初,期间,期末),

        qty1 到 qty 8 用8个select语句。

        单件 = 期末金额 / 期末数量。 金额1到8  = 单价 * 数量。

代码:



* 写入汇总值
    SELECT  SUM( a~zqckcsl ) AS zqckcsl, SUM( a~zqckcje ) AS zqckcje,  SUM( a~zqjshsl ) AS zqjshsl, SUM( a~zqjshje ) AS zqjshje,
            SUM( a~zqjfhsl ) AS zqjfhsl, SUM( a~zqjfhje ) AS zqjfhje,  SUM( a~zqmkcsl ) AS zqmkcsl, SUM( a~zqmkcje ) AS zqmkcje
    FROM @lt_qcqm AS a
    WHERE matnr = @-matnr    AND sobkz = @-sobkz    AND lgort = @-lgort
    INTO CORRESPONDING FIELDS OF   @.

*写入数量1 到数量8

    SELECT    SUM( a~zqmkcsl ) AS zqty1      FROM @lt_qcqm AS a
    WHERE matnr = @-matnr     AND sobkz = @-sobkz     AND lgort = @-lgort     AND zduration_days >= @day_from1     AND zduration_days <= @day_to1
    INTO CORRESPONDING FIELDS OF   @.

...

按照上面的方法运行成功,但是效率极低。

select from @ 哈希表单条运行直接就超时了。调成标准表单个运行还是OK的但是在循环过程中超时。

因此用内表作为基础表进行select看起来不是好方法。

重新看内表操作的命令,发现内表数字字段的汇总通过collect wa into itab. 就可以完成,完全不用执行select。

gt_qcqm表管道lt_qcqm_temp表,删除非批次管理物料。

将期末数量金额根据day_from 和day_to通过if语句写入到数量金额1到8。

构造gt_subtl_alv的行项目gs_subtl_alv. 所有的数字字段都需要汇总。直接用collect 语句就可以自动完成了。

这样代码简单,效率高。 这个loop语句执行的效率奇高,应该是SAP对loop语句进行了并行处理的原因吧。 这个只是猜测。

代码如下:

FORM paint_batchmat_subtl .


  DATA(lt_qcqm_temp) = gt_qcqm.
  DELETE lt_qcqm_temp WHERE charg = ''.
  SORT lt_qcqm_temp BY matnr sobkz lgort zduration_days .

  LOOP AT lt_qcqm_temp ASSIGNING FIELD-SYMBOL().

    MOVE-CORRESPONDING   TO gs_subtl_alv.
    IF -zduration_days >= day_from1 AND -zduration_days <= day_to1.
      gs_subtl_alv-zqty1 = -zqmkcsl.
      gs_subtl_alv-zvalue1 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from2 AND -zduration_days <= day_to2.
      gs_subtl_alv-zqty2 = -zqmkcsl.
      gs_subtl_alv-zvalue2 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from3 AND -zduration_days <= day_to3.
      gs_subtl_alv-zqty3 = -zqmkcsl.
      gs_subtl_alv-zvalue3 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from4 AND -zduration_days <= day_to4.
      gs_subtl_alv-zqty4 = -zqmkcsl.
      gs_subtl_alv-zvalue4 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from5 AND -zduration_days <= day_to5.
      gs_subtl_alv-zqty5 = -zqmkcsl.
      gs_subtl_alv-zvalue5 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from6 AND -zduration_days <= day_to6.
      gs_subtl_alv-zqty6 = -zqmkcsl.
      gs_subtl_alv-zvalue6 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from7 AND -zduration_days <= day_to7.
      gs_subtl_alv-zqty7 = -zqmkcsl.
      gs_subtl_alv-zvalue7 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from8 .
      gs_subtl_alv-zqty8 = -zqmkcsl.
      gs_subtl_alv-zvalue8 = -zqmkcje.
    ENDIF.
    COLLECT gs_subtl_alv INTO gt_subtl_alv.

    CLEAR gs_subtl_alv.

  ENDLOOP.

ENDFORM

非批次管理物料汇总表数据更新

非批次物料汇总数据通过三个部分完成。

1, gt_qcqm表中获取期初期末和期间的数据汇总到lt_subtl_nbc。

2,gt_gr_nonbatch表中获取数量1到8的汇总到 lt_nbcgr_subtl。

3,循环lt_subtl_nbc,读的 lt_nbcgr_subtl的相关数据。每条数据写入gt_subtl_alv中。

第一部分 lt_subtl_nbc汇总代码如下:

*&  第一部分
*&  gt_qcqm转到lt_qcqm_nbt临时表中。
*&*& 删除有批次号的。
*&  循环 lt_qcqm_nbt表,
*   通过collect 实现 对期初期末期间数字的汇总。数据写入lt_subtl_alv. 局部表中。
*& 循环中构造ls_subtl_alv,
*& bukrs , werks, matnr, maktx 直接写入。
*& lgort = 空, lgobe = '所有库存' , sobkz = '',
*& 期间数据 通过collect完成
* 通过 collect 实现所有库存的汇总。 生成 lt_subtl_nbc的期间数据。
  DATA(lt_qcqm_nbc_temp) = gt_qcqm.
  DELETE lt_qcqm_nbc_temp WHERE charg NE ''.
  DATA ls_subtl_nbc LIKE gs_subtl_alv.
  DATA lt_subtl_nbc LIKE TABLE OF ls_subtl_nbc.

  IF NOT lt_qcqm_nbc_temp IS INITIAL.
    LOOP AT lt_qcqm_nbc_temp ASSIGNING FIELD-SYMBOL().
      MOVE-CORRESPONDING  TO ls_subtl_nbc.
      ls_subtl_nbc-lgort = ''.
      ls_subtl_nbc-lgobe = '所有库存'.
      ls_subtl_nbc-sobkz = ''.
      COLLECT ls_subtl_nbc INTO lt_subtl_nbc.
      CLEAR ls_subtl_nbc.
    ENDLOOP.
  ENDIF.

第二部分 2,gt_gr_nonbatch表中获取数量1到8的汇总到 lt_nbcgr_subtl。

* 第二部分:
* 定义 局部表 lt_nbcgr_subtl 公司, 工厂,matnr 数量 1, 到 8 。
*& 循环 全局表 gt_gr_nonbatch,通过if 语句写如数量1到8
* 通过collect 对零件号汇总。
* 在对gt_gr_nonbatch表的循环中生成 lt_nbcgr_subtl表。

  TYPES: BEGIN OF ty_nbcgr_subtlv,  " matdoc 收货数据汇总显示。
           bukrs TYPE    bukrs ,    "公司
           werks TYPE    werks_d ,    "工厂
           matnr TYPE    matnr ,    "物料编码
           Zqty1 TYPE    j_3rm_endstock ,    "     1个月数量1
           zqty2 TYPE    j_3rm_endstock ,    "     2个月数量2
           zqty3 TYPE    j_3rm_endstock ,    "    3个月数量3
           zqty4 TYPE    j_3rm_endstock ,    "4~6个月数量4
           zqty5 TYPE    j_3rm_endstock ,    "7--12个月数量5
           zqty6 TYPE    j_3rm_endstock ,    "13--18个月数量6
           zqty7 TYPE    j_3rm_endstock ,    "19--24个月数量7
           zqty8 TYPE    j_3rm_endstock ,    ">24个月数量8
         END OF ty_nbcgr_subtlv.
  DATA ls_nbcgr_subtl TYPE ty_nbcgr_subtlv.
  DATA lt_nbcgr_subtl LIKE TABLE OF ls_nbcgr_subtl.

  LOOP AT  gt_gr_nonbatch ASSIGNING FIELD-SYMBOL().

    MOVE-CORRESPONDING  TO ls_nbcgr_subtl.
    IF -zduration_days >= day_from1 AND -zduration_days <= day_to1.       ls_nbcgr_subtl-zqty1 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from2 AND -zduration_days <= day_to2.       ls_nbcgr_subtl-zqty2 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from3 AND -zduration_days <= day_to3.       ls_nbcgr_subtl-zqty3 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from4 AND -zduration_days <= day_to4.       ls_nbcgr_subtl-zqty4 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from5 AND -zduration_days <= day_to5.       ls_nbcgr_subtl-zqty5 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from6 AND -zduration_days <= day_to6.       ls_nbcgr_subtl-zqty6 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from7 AND -zduration_days <= day_to7.       ls_nbcgr_subtl-zqty7 = -zqty_consum.       ENDIF.
    IF -zduration_days >= day_from8 .     ls_nbcgr_subtl-zqty8 = -zqty_consum.       ENDIF.
    COLLECT ls_nbcgr_subtl  INTO lt_nbcgr_subtl.
    CLEAR ls_nbcgr_subtl.
  ENDLOOP.

第三部分:3,循环lt_subtl_nbc,读的 lt_nbcgr_subtl的相关数据。每条数据写入gt_subtl_alv中。

代码如下:

*& 第三部分
* 循环 lt_subtl_nbc
*& 将lt_nbcgr_subtl的数据 根据公司,工厂,matnr 写入 lt_subtl_nbc的数量1到数量8 。
* 计算 金额 1 到金额 8 。
* lt_subtl_nbc 写入 gt_subtl_alv。

  IF not lt_nbcgr_subtl is INITIAL .
    SORT lt_nbcgr_subtl BY bukrs werks matnr.
    LOOP AT lt_subtl_nbc ASSIGNING FIELD-SYMBOL().
      IF  IS ASSIGNED.
        READ TABLE lt_nbcgr_subtl WITH TABLE KEY bukrs = -bukrs werks = -werks matnr = -matnr INTO ls_nbcgr_subtl .
        IF sy-subrc EQ 0 .
          MOVE-CORRESPONDING ls_nbcgr_subtl TO . CLEAR ls_nbcgr_subtl.
        ENDIF.

        IF -zqmkcsl NE 0 .
          -zvalue1 = -zqty1 * -zqmkcje / -zqmkcsl.
          -zvalue2 = -zqty2 * -zqmkcje / -zqmkcsl.
          -zvalue3 = -zqty3 * -zqmkcje / -zqmkcsl.
          -zvalue4 = -zqty4 * -zqmkcje / -zqmkcsl.
          -zvalue5 = -zqty5 * -zqmkcje / -zqmkcsl.
          -zvalue6 = -zqty5 * -zqmkcje / -zqmkcsl.
          -zvalue7 = -zqty7 * -zqmkcje / -zqmkcsl.
          -zvalue8 = -zqty8 * -zqmkcje / -zqmkcsl.
        ENDIF.

        MOVE-CORRESPONDING  TO gs_subtl_alv.
        APPEND gs_subtl_alv TO gt_subtl_alv.
        CLEAR gs_subtl_alv.
      ENDIF.
    ENDLOOP.
  ENDIF.

定义表头

代码如下, 重新构造了批处理程序。

FORM get_fc_subtl .

  DEFINE alv_fcat_subtl.
    gs_fc_subtl-fieldname = &1.
    gs_fc_subtl-tabname = 'GT_SUBTL_ALV' .
    gs_fc_subtl-coltext =   gs_fc_subtl-scrtext_l =   gs_fc_subtl-scrtext_m =  &2.
    gs_fc_subtl-rollname = &3.
    gs_fc_subtl-no_out = 'X'.
    gs_fc_subtl-col_opt   = 'X'.
    gs_fc_subtl-no_zero =  &4.
    APPEND gs_fc_subtl TO gt_fc_subtl.
    CLEAR gs_fc_subtl.
  END-OF-DEFINITION.

  alv_fcat_subtl    'BUKRS'      TEXT-101             'BUKRS'            'X'            .
  alv_fcat_subtl    'WERKS'      TEXT-102             'WERKS_D'            'X'            .
  alv_fcat_subtl    'LGORT'      TEXT-103             'LGORT_D'            'X'            .
  alv_fcat_subtl    'LGOBE'      TEXT-104             'LGOBE'            'X'            .
  alv_fcat_subtl    'SOBKZ'      TEXT-108             'SOBKZ'            'X'            .
  alv_fcat_subtl    'MATNR'      TEXT-105             'MATNR'            'X'            .
  alv_fcat_subtl    'MAKTX'      TEXT-106             'MAKTX'            'X'            .
  alv_fcat_subtl    'ZQCKCSL'      TEXT-109             'J_3RM_BEGSTOCK'            ''      .
  alv_fcat_subtl    'ZQCKCJE'      TEXT-110             'J_3RM_BEGVAL'            ''      .
  alv_fcat_subtl    'ZQJSHSL'      TEXT-111             'J_3RM_RECPTSTOCK'            ''      .
  alv_fcat_subtl    'ZQJSHJE'      TEXT-112             'J_3RM_RECPTVAL'            ''      .
  alv_fcat_subtl    'ZQJFHSL'      TEXT-113             'J_3RM_ISUSTOCK'            ''      .
  alv_fcat_subtl    'ZQJFHJE'      TEXT-114             'J_3RM_ISUVAL'            ''      .
  alv_fcat_subtl    'ZQMKCSL'      TEXT-115             'J_3RM_ENDSTOCK'            ''      .
  alv_fcat_subtl    'ZQMKCJE'      TEXT-116             'J_3RM_ENDVAL'            ''      .
*  alv_fcat_subtl    'ZUN_PR'      TEXT-159    ''            'X'            .
  alv_fcat_subtl    'ZQTY1'      TEXT-160    ''            'X'            .
  alv_fcat_subtl    'ZVALUE1'      TEXT-161    ''            'X'            .
  alv_fcat_subtl    'ZQTY2'      TEXT-162    ''            'X'            .
  alv_fcat_subtl    'ZVALUE2'      TEXT-163    ''            'X'            .
  alv_fcat_subtl    'ZQTY3'      TEXT-164    ''            'X'            .
  alv_fcat_subtl    'ZVALUE3'      TEXT-165    ''            'X'            .
  alv_fcat_subtl    'ZQTY4'      TEXT-166    ''            'X'            .
  alv_fcat_subtl    'ZVALUE4'      TEXT-167    ''            'X'            .
  alv_fcat_subtl    'ZQTY5'      TEXT-168    ''            'X'            .
  alv_fcat_subtl    'ZVALUE5'      TEXT-169    ''            'X'            .
  alv_fcat_subtl    'ZQTY6'      TEXT-170    ''            'X'            .
  alv_fcat_subtl    'ZVALUE6'      TEXT-171    ''            'X'            .
  alv_fcat_subtl    'ZQTY7'      TEXT-172    ''            'X'            .
  alv_fcat_subtl    'ZVALUE7'      TEXT-173    ''            'X'            .
  alv_fcat_subtl    'ZQTY8'      TEXT-174    ''            'X'            .
  alv_fcat_subtl    'ZVALUE8'      TEXT-175    ''            'X'            .


ENDFORM.

展示数据:

FORM display_subtl .
  DATA:alv_variant      LIKE disvariant.
  alv_variant-report = sy-repid.
  alv_variant-handle = '1'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = sy-repid
      is_layout_lvc      = gs_layout
      it_fieldcat_lvc    = gt_fc_subtl
      i_save             = 'A'
      is_variant         = alv_variant
    TABLES
      t_outtab           = gt_subtl_alv.

ENDFORM.

学到的:

根据屏幕输入数据动态生成表头描述

动态数据来源:

对应的字段p_d1, p_d2.  由于选择屏幕要求,输入不能为整数类型(i类型)。定义为数字文本字段(N 类型)。

直接显示为“0030”。

需要输出的字段格式为: 库存 1- 30 天数量   库存 31- 61天数量。需要进行计算,并且对数据(0030)进行 + 1的计算。

选择代码:

  SELECTION-SCREEN COMMENT (31) TEXT-004 FOR FIELD p_d1.
    PARAMETERS p_d1(4) TYPE n DEFAULT '30'.
    PARAMETERS p_d2(4) TYPE n DEFAULT '61'.
    PARAMETERS p_d3(4) TYPE n DEFAULT '91'.
    PARAMETERS p_d4(4) TYPE n DEFAULT '182'.
    PARAMETERS p_d5(4) TYPE n DEFAULT '365'.
    PARAMETERS p_d6(4) TYPE n DEFAULT '547'.
    PARAMETERS p_d7(4) TYPE n DEFAULT '730'.
    PARAMETERS p_d8(4) TYPE n DEFAULT '1825'.

根据动态输入形成变量

day_from = 1. day_to = p_d1.
cday_from = day_from. cday_to = day_to.
  CONCATENATE '库存' cday_from '-' cday_to '天数量' INTO DATA(text1).
day_from = p_d1 + 1. day_to = p_d2.
cday_from = day_from. cday_to = day_to.
  CONCATENATE '库存' cday_from '-' cday_to '天数量' INTO DATA(text2).

结果:

通过俄罗斯报表生成库存账龄表 三_第1张图片

使用一下哈希表:(失败了)

哈希表要定义唯一值。 unique字段定义的时候,类型定义时的顺序是有关系的。

比如 linkk 字段在 类型定义的时候比较靠后,系统要求在linkk之前定义的所有字段都要作为 unique key 的字段。

在select语句中的使用和标准表一致。

 DATA lt_qcqm LIKE HASHED TABLE OF gs_qcqm WITH UNIQUE KEY bukrs werks lgort sobkz matnr charg linkk.

  MOVE-CORRESPONDING gt_qcqm TO lt_qcqm.


  LOOP AT gt_subtl_alv ASSIGNING FIELD-SYMBOL().

    SELECT SUM( a~zqmkcsl )
      FROM @lt_qcqm AS a
      WHERE matnr = @-matnr
      AND sobkz = @-sobkz
      AND lgort = @-lgort
      INTO @-zqmkcsl.

  ENDLOOP.

利用collect完成内表数据汇总。

collect wa into itab。 可以对所有的数字类型字段进行求和运算。

 代码:



* 写入汇总值
    SELECT  SUM( a~zqckcsl ) AS zqckcsl, SUM( a~zqckcje ) AS zqckcje,  SUM( a~zqjshsl ) AS zqjshsl, SUM( a~zqjshje ) AS zqjshje,
            SUM( a~zqjfhsl ) AS zqjfhsl, SUM( a~zqjfhje ) AS zqjfhje,  SUM( a~zqmkcsl ) AS zqmkcsl, SUM( a~zqmkcje ) AS zqmkcje
    FROM @lt_qcqm AS a
    WHERE matnr = @-matnr    AND sobkz = @-sobkz    AND lgort = @-lgort
    INTO CORRESPONDING FIELDS OF   @.

*写入数量1 到数量8

    SELECT    SUM( a~zqmkcsl ) AS zqty1      FROM @lt_qcqm AS a
    WHERE matnr = @-matnr     AND sobkz = @-sobkz     AND lgort = @-lgort     AND zduration_days >= @day_from1     AND zduration_days <= @day_to1
    INTO CORRESPONDING FIELDS OF   @.

...

这个方法的效率极低。

select from @ 哈希表单条运行直接就超时了。调成标准表单个运行还是OK的但是在循环过程中超时。

因此用内表作为基础表进行select看起来不是好方法。

重新看内表操作的命令,发现内表数字字段的汇总通过collect wa into itab. 就可以完成,完全不用执行select。

gt_qcqm表管道lt_qcqm_temp表,删除非批次管理物料。

将期末数量金额根据day_from 和day_to通过if语句写入到数量金额1到8。

构造gt_subtl_alv的行项目gs_subtl_alv. 所有的数字字段都需要汇总。直接用collect 语句就可以自动完成了。

代码如下:

FORM paint_batchmat_subtl .


  DATA(lt_qcqm_temp) = gt_qcqm.
  DELETE lt_qcqm_temp WHERE charg = ''.
  SORT lt_qcqm_temp BY matnr sobkz lgort zduration_days .

  LOOP AT lt_qcqm_temp ASSIGNING FIELD-SYMBOL().

    MOVE-CORRESPONDING   TO gs_subtl_alv.
    IF -zduration_days >= day_from1 AND -zduration_days <= day_to1.
      gs_subtl_alv-zqty1 = -zqmkcsl.
      gs_subtl_alv-zvalue1 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from2 AND -zduration_days <= day_to2.
      gs_subtl_alv-zqty2 = -zqmkcsl.
      gs_subtl_alv-zvalue2 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from3 AND -zduration_days <= day_to3.
      gs_subtl_alv-zqty3 = -zqmkcsl.
      gs_subtl_alv-zvalue3 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from4 AND -zduration_days <= day_to4.
      gs_subtl_alv-zqty4 = -zqmkcsl.
      gs_subtl_alv-zvalue4 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from5 AND -zduration_days <= day_to5.
      gs_subtl_alv-zqty5 = -zqmkcsl.
      gs_subtl_alv-zvalue5 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from6 AND -zduration_days <= day_to6.
      gs_subtl_alv-zqty6 = -zqmkcsl.
      gs_subtl_alv-zvalue6 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from7 AND -zduration_days <= day_to7.
      gs_subtl_alv-zqty7 = -zqmkcsl.
      gs_subtl_alv-zvalue7 = -zqmkcje.
    ENDIF.
    IF -zduration_days >= day_from8 .
      gs_subtl_alv-zqty8 = -zqmkcsl.
      gs_subtl_alv-zvalue8 = -zqmkcje.
    ENDIF.
    COLLECT gs_subtl_alv INTO gt_subtl_alv.

    CLEAR gs_subtl_alv.

  ENDLOOP.

ENDFORM

对内表进行查找操作,实际上使用 loop 语句和read语句就足够了。 不用select。如果需要效率则可以用排序表进行binary search来read表,或者用哈希表来read表。

在loop中没有select语句的话,运行速度会很快。 

你可能感兴趣的:(前端,javascript,linux)