对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.
时间比较长 取数
其实上面这个方案是想到 如果 用物料去取的话会耗时很多(因为我原本的是验证好的单物料的程序 很好用的 就是集中取数时候效率问题)
所以费劲的想一起取出来(不用物料判断),现在看数据库耗时太多还是采取物料的方式吧
结果很惊人!
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 剔除比输入月份大的 数据,按照年月的字符串大到小排序,取第一个即可 效率也挺高的
单个的直接取的 ,某个公司的也只需要半分多钟