mbewh取数中 主键访问的感悟

对mbewh取表的尝试

 

DATA : BEGIN OF itab OCCURS 0,
        matnr      TYPE matnr,
        bwkey  TYPE bwkey,

        lfgja TYPE lfgja,
        LFMON type LFMON,
        stprs TYPE stprs,
        yearmonth(6),

        END OF itab.

  data itab_it like table of itab with header line  .

*  data mbew_it like table of itab with header line.

DATA : BEGIN OF mbew_it OCCURS 0,
        matnr      TYPE matnr,
        bwkey  TYPE bwkey,

*        lfgja TYPE lfgja,
*        LFMON type LFMON,
*        stprs TYPE stprs,
*        yearmonth(6),

        END OF mbew_it.

  data itab1 like table of itab with header line.

*        data:ym(6) .
PARAMETERS:         ym(6)  DEFAULT  '201006'.
parameters:p_bukrs type bukrs obligatory.
*PARAMETERS: p_matnr TYPE matnr DEFAULT '1B01602BCN1W0'."'1TD26C1TCN0B'.
*SELECT * INTO CORRESPONDING FIELDS OF TABLE itab FROM mbewh WHERE
*matnr = p_matnr AND bwkey = '2101'.

SELECT *  INTO  CORRESPONDING FIELDS OF TABLE itab_it FROM mbew WHERE
bwkey = p_bukrs.

*mbew_it[] = itab_it[].

SELECT matnr
        bwkey

        bwtar
        lfgja
        LFMON
        stprs
appending CORRESPONDING FIELDS OF TABLE itab_it FROM mbewh WHERE
bwkey = p_bukrs.
loop at itab_it.
mbew_it-matnr = itab_it-matnr.
mbew_it-bwkey = itab_it-bwkey .
collect mbew_it.
endloop.

loop at mbew_it.
clear itab.clear itab[].
loop at itab_it where matnr = mbew_it-matnr.
itab_it-yearmonth = itab-lfgja .
itab_it-yearmonth+4(2) = itab-lfmon .

if itab_it-yearmonth > ym.

else.
append itab_it to itab.
endif.
endloop.

sort itab by yearmonth  descending.

read table itab index 1.
itab-yearmonth = ym.
append itab to itab1.

endloop.

image

 

时间比较长 取数

 

其实上面这个方案是想到 如果 用物料去取的话会耗时很多(因为我原本的是验证好的单物料的程序 很好用的 就是集中取数时候效率问题)

所以费劲的想一起取出来(不用物料判断),现在看数据库耗时太多还是采取物料的方式吧

结果很惊人!

image

select matnr
        bwkey

        bwtar
        lfgja
        lfmon
        stprs  into  corresponding fields of table itab_it from mbew where
bwkey = p_bukrs.

*mbew_it[] = itab_it[].
loop at itab_it.
clear itab.clear itab[].
select matnr
        bwkey

        bwtar
        lfgja
        lfmon
        stprs
appending corresponding fields of table itab from mbewh where
matnr = itab_it-matnr and  bwkey = p_bukrs.
append itab_it to itab.

loop at itab where matnr = itab_it-matnr.
itab-yearmonth = itab-lfgja .
itab-yearmonth+4(2) = itab-lfmon .

if itab-yearmonth > ym.
delete itab.

else.
modify itab.
endif.
endloop.

sort itab by yearmonth  descending.

read table itab index 1.
itab-yearmonth = ym.
append itab to itab1.

endloop.

 

这也说明了主键访问的重要性!!!!!!!!!!!!!!!!!!

 

顺便说一下 以上是个很好的算法求历史价格的 保存 呵呵

 

单个物料的完整程序如下:

*&---------------------------------------------------------------------*
*& Report  ZMBEWH                                                      *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

report  zmbewh                                  .

data : begin of itab occurs 0,
        matnr      type matnr,
        bwkey  type bwkey,

        lfgja type lfgja,
        lfmon type lfmon,
        stprs type stprs,
        yearmonth(6),

        end of itab.

*        data:ym(6) .
parameters:         ym(6)  default  '201006',
p_bukrs type bukrs obligatory.

parameters: p_matnr type matnr default '1B01602BCN1W0'."'1TD26C1TCN0B'.
*SELECT * INTO CORRESPONDING FIELDS OF TABLE itab FROM mbewh WHERE
*matnr = p_matnr AND bwkey = '2101'.

select matnr
        bwkey

        bwtar
        lfgja
        lfmon
        stprs
into corresponding fields of table itab from mbewh where
matnr = p_matnr and bwkey = p_bukrs.

select * appending  corresponding fields of table itab from mbew where
matnr = p_matnr and bwkey = p_bukrs.

data num type i.

num = lines( itab ).
loop at itab.
itab-yearmonth = itab-lfgja .
itab-yearmonth+4(2) = itab-lfmon .

if itab-yearmonth > ym." and sy-tabix <> num.
delete itab.
else.
modify itab.
endif.
endloop.

sort itab by yearmonth  descending.

read table itab index 1.

write: itab-yearmonth, itab-stprs.

全公司的如下

*&---------------------------------------------------------------------*
*& Report  ZMBEWH                                                      *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*

report  zmbewhnt                                  .
define add_field.
  wa_field-fieldname = &1.
  wa_field-reptext_ddic = &2.
  append wa_field to it_field.
end-of-definition.

type-pools slis.
data: gs_layout type slis_layout_alv.
data: g_repid type sy-repid.
data: it_field type slis_t_fieldcat_alv.
data: wa_field type slis_fieldcat_alv.

data : begin of itab occurs 0,
        matnr      type matnr,
        bwkey  type bwkey,

        lfgja type lfgja,
        lfmon type lfmon,
        stprs type stprs,
        yearmonth(6),

        end of itab.

  data itab_it like table of itab with header line  .

*  data mbew_it like table of itab with header line.

data : begin of mbew_it occurs 0,
        matnr      type matnr,
        bwkey  type bwkey,

*        lfgja TYPE lfgja,
*        LFMON type LFMON,
*        stprs TYPE stprs,
*        yearmonth(6),

        end of mbew_it.

  data itab1 like table of itab with header line.

*        data:ym(6) .
parameters:         ym(6)  default  '201006'.
parameters:p_bukrs type bukrs obligatory.
*PARAMETERS: p_matnr TYPE matnr DEFAULT '1B01602BCN1W0'."'1TD26C1TCN0B'.
*SELECT * INTO CORRESPONDING FIELDS OF TABLE itab FROM mbewh WHERE
*matnr = p_matnr AND bwkey = '2101'.

select matnr
        bwkey

        bwtar
        lfgja
        lfmon
        stprs  into  corresponding fields of table itab_it from mbew where
bwkey = p_bukrs.

*mbew_it[] = itab_it[].
loop at itab_it.
clear itab.clear itab[].
select matnr
        bwkey

        bwtar
        lfgja
        lfmon
        stprs
appending corresponding fields of table itab from mbewh where
matnr = itab_it-matnr and  bwkey = p_bukrs.
append itab_it to itab.

loop at itab where matnr = itab_it-matnr.
itab-yearmonth = itab-lfgja .
itab-yearmonth+4(2) = itab-lfmon .

if itab-yearmonth > ym.
delete itab.

else.
modify itab.
endif.
endloop.

sort itab by yearmonth  descending.

read table itab index 1.
itab-yearmonth = ym.
append itab to itab1.

endloop.

*loop at itab_it.
*mbew_it-matnr = itab_it-matnr.
*mbew_it-bwkey = itab_it-bwkey .
*collect mbew_it.
*endloop.

*loop at mbew_it.
*clear itab.clear itab[].
*loop at itab_it where matnr = mbew_it-matnr.
*itab_it-yearmonth = itab-lfgja .
*itab_it-yearmonth+4(2) = itab-lfmon .
*
*if itab_it-yearmonth > ym.
*
*else.
*append itab_it to itab.
*endif.
*endloop.

*
*sort itab_it by matnr yearmonth.

sort itab by yearmonth  descending.

*read table itab index 1.
*itab-yearmonth = ym.
*append itab to itab1.
*
*
*endloop.
perform out.

*loop at itab.
*itab-yearmonth = itab-lfgja .
*itab-yearmonth+4(2) = itab-lfmon .
*
*if itab-yearmonth > ym." and sy-tabix <> num.
*delete itab.
*else.
*modify itab.
*endif.
*endloop.
*
*sort itab by yearmonth  descending.
*
*read table itab index 1.

*write: itab-yearmonth, itab-stprs.

form out.

g_repid = sy-repid.
*gs_layout-colwidth_optimize = 'X'.
*gs_layout-box_fieldname = 'SEL'.
data: it_sort type slis_t_sortinfo_alv,
      ls_sort type slis_sortinfo_alv.
*ls_sort-fieldname = 'VBELN'.
*ls_sort-spos      = 1.
*ls_sort-up        = 'X'.
*ls_sort-subtot    = 'X'.
*APPEND ls_sort TO it_sort.
*it_sort-fieldname = 'VBELN'.
*it_sort-up = 'X'.
*append it_sort.
add_field 'MATNR' '物料'.
add_field 'BWKEY' '公司'.
add_field 'LFGJA' '年度'.
add_field 'LFMON' '表中月'.
add_field 'STPRS' '价格'.
add_field 'YEARMONTH' '查询年月'.

call function 'REUSE_ALV_GRID_DISPLAY'  "输出退换货清单
         exporting
              i_callback_program = g_repid
              it_fieldcat        = it_field
              is_layout          = gs_layout
*              it_sort            = it_sort
              i_save             = 'A'
         tables
              t_outtab           = itab1.
endform.

 

 

顺便说下 本来是想发布对mbewh的算法  呵呵 后来在速度上遇到麻烦 速度成主角了

这个算法比较可取

取mbewh和mbew 剔除比输入月份大的 数据,按照年月的字符串大到小排序,取第一个即可 效率也挺高的

单个的直接取的 ,某个公司的也只需要半分多钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值