CSDN
图一需求完成。 图一种详细明细已完成。
从起初期末表中进行汇总,根据zduration_days和对应的账龄天数进行汇总填入对应区间。
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).
哈希表要定义唯一值。 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 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语句的话,运行速度会很快。