是一个非常easy的小报表。
一开始用的是这样的取数逻辑,我觉得还是很不错的
java
"获取物料批次对应的类等相关信息
CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
EXPORTING
i_matnr = itab-matnr
i_charg = itab-charg
IMPORTING
e_objek = e_objek
e_obtab = e_obtab
e_klart = e_klart
e_class = e_class.
"依据上一个函数的反馈返回值获取特性以及特性值
CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
EXPORTING
objectkey = e_objek
objecttable = e_obtab
classnum = e_class
classtype = e_klart
keydate = sy-datum
* UNVALUATED_CHARS = ' '
language = sy-langu
* IMPORTING
* STATUS = STATUS
* STANDARDCLASS = STANDARDCLASS
TABLES
allocvaluesnum = lt_allocvaluesnum
allocvalueschar = lt_allocvalueschar
allocvaluescurr = lt_allocvaluescurr
return = lt_return.
READ TABLE lt_allocvalueschar ASSIGNING FIELD-SYMBOL(<fs_atwrt>) WITH KEY charact = 'ZBUYMATNR'.
IF sy-subrc = 0.
itab-zbuynatnr = <fs_atwrt>-value_neutral.
ENDIF.
但是说效率有点低,就改成从ausp表数据了,完整代码po 到最后
java
DATA:gv_atnam TYPE atnam VALUE 'Z_OLD_BATCH', " 要查询的特性名称
* gv_mandt TYPE mandt VALUE '800', " 客户端
gs_cabn TYPE cabn.
DATA: z_old_batch TYPE char10.
* 精准查询ATNAM对应的ATINN
SELECT SINGLE atinn INTO gs_cabn-atinn
FROM cabn
WHERE
* mandt = gv_mandt
atnam = gv_atnam.
z_old_batch = gs_cabn-atinn.
SELECT a~matnr a~charg a~cuobj_bm b~atwrt
INTO TABLE gt_itab1
FROM mch1 AS a INNER JOIN ausp AS b ON a~cuobj_bm = b~objek
FOR ALL ENTRIES IN gt_itab
WHERE a~matnr = gt_itab-matnr
AND a~charg = gt_itab-charg
AND b~atinn = z_old_batch
AND a~cuobj_bm <> 0.
*其实可以直接填批次特性对应的atinn值的,但是避免各系统之间atinn不同的情况,改成从表里获取
然后就是一些小坑啥的
比如要复制gui状态,不然运行完程序后点击返回键会报错
用二分法read table的之前要进行排序,不然会出现有数据但找不到的情况
以及赋值完之后记得modify gt_itab.
大概就是这些,总的来说是一个非常简单的小程序了
完整代码:
java
*&---------------------------------------------------------------------*
*& Report ZMMR137
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmmr137.
TABLES: mchb,makt,ausp,mch1,mara,t006a,mkpf,ekbe,mseg.
INCLUDE zpub_lvc_func."包含功能模块
* 定义类型池
TYPE-POOLS: vrm.
TYPE-POOLS: slis.
*定义内表
DATA: BEGIN OF gt_itab OCCURS 0,
matnr LIKE mch1-matnr, " 物料编号,从mseg表中获取
charg LIKE mch1-charg,
ersda LIKE mch1-ersda, "创建日期
ernam LIKE mch1-ernam,
hsdat LIKE mch1-hsdat,
vfdat LIKE mch1-vfdat,
lwedt LIKE mch1-lwedt,
zwrt1 LIKE ausp-atwrt, "原有批次(属性批次)
END OF gt_itab.
"获取物料批次对应的类等相关信息
DATA e_objek TYPE cuobn.
DATA e_obtab TYPE tabelle.
DATA e_klart TYPE klassenart.
DATA e_class TYPE klasse_d.
"获取特性以及特性值
DATA lt_allocvaluesnum TYPE STANDARD TABLE OF bapi1003_alloc_values_num.
DATA ls_allocvaluesnum TYPE bapi1003_alloc_values_num.
DATA lt_allocvalueschar TYPE STANDARD TABLE OF bapi1003_alloc_values_char.
DATA ls_allocvalueschar TYPE bapi1003_alloc_values_char.
DATA lt_allocvaluescurr TYPE STANDARD TABLE OF bapi1003_alloc_values_curr.
DATA ls_allocvaluescurr TYPE bapi1003_alloc_values_curr.
DATA lt_return TYPE STANDARD TABLE OF bapiret2.
DATA ls_return TYPE bapiret2.
DATA: BEGIN OF gt_itab1 OCCURS 0,
matnr LIKE mchb-matnr,
charg LIKE mchb-charg,
cuobj_bm LIKE mch1-cuobj_bm,
atwrt LIKE ausp-atwrt,
END OF gt_itab1.
DATA: BEGIN OF gt_itab2 OCCURS 0,
matnr LIKE mchb-matnr,
charg LIKE mchb-charg,
cuobj_bm LIKE mch1-cuobj_bm,
atwrt LIKE ausp-atwrt,
END OF gt_itab2.
SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
s_matnr FOR mch1-matnr,
s_charg FOR mch1-charg,
s_ersda FOR mch1-ersda.
SELECTION-SCREEN END OF BLOCK blk1.
START-OF-SELECTION.
PERFORM get_data.
PERFORM alv_data.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* 获取目标数据表的数据
*----------------------------------------------------------------------*
FORM get_data.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_itab
FROM mch1
WHERE matnr IN s_matnr
AND charg IN s_charg
AND ersda IN s_ersda.
* LOOP AT gt_itab.
* CALL FUNCTION 'VB_BATCH_2_CLASS_OBJECT'
* EXPORTING
* i_matnr = gt_itab-matnr
* i_charg = gt_itab-charg
* IMPORTING
* e_objek = e_objek
* e_obtab = e_obtab
* e_klart = e_klart
* e_class = e_class.
*
* CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
* EXPORTING
* objectkey = e_objek
* objecttable = e_obtab
* classnum = e_class
* classtype = e_klart
* keydate = sy-datum
** UNVALUATED_CHARS = ' '
* language = sy-langu
** IMPORTING
** STATUS = STATUS
** STANDARDCLASS = STANDARDCLASS
* TABLES
* allocvaluesnum = lt_allocvaluesnum
* allocvalueschar = lt_allocvalueschar
* allocvaluescurr = lt_allocvaluescurr
* return = lt_return.
* READ TABLE lt_allocvalueschar ASSIGNING FIELD-SYMBOL(<fs_atwrt>) WITH KEY charact = 'ZBUYMATNR'.
* IF sy-subrc = 0.
* gt_itab-zbuynatnr = <fs_atwrt>-value_neutral.
* ENDIF.
* READ TABLE lt_allocvalueschar ASSIGNING <fs_atwrt> WITH KEY charact = 'Z_OLD_BATCH'.
* IF sy-subrc = 0.
* gt_itab-zwrt1 = <fs_atwrt>-value_neutral.
* ENDIF.
* modify gt_itab.
* ENDLOOP.
*新系统修改ATINN
DATA:gv_atnam TYPE atnam VALUE 'Z_OLD_BATCH', " 要查询的特性名称
* gv_mandt TYPE mandt VALUE '800', " 客户端
gs_cabn TYPE cabn.
DATA: z_old_batch TYPE char10.
* 精准查询ATNAM对应的ATINN
SELECT SINGLE atinn INTO gs_cabn-atinn
FROM cabn
WHERE
* mandt = gv_mandt
atnam = gv_atnam.
z_old_batch = gs_cabn-atinn.
*新系统修改ATINN
*新系统修改ATINN
DATA:gv_atnam1 TYPE atnam VALUE 'ZBUYMATNR', " 要查询的特性名称
* gv_mandt TYPE mandt VALUE '800', " 客户端
gs_cabn1 TYPE cabn.
DATA: zbuymatnr TYPE char10.
* 精准查询ATNAM对应的ATINN
SELECT SINGLE atinn INTO gs_cabn1-atinn
FROM cabn
WHERE
* mandt = gv_mandt
atnam = gv_atnam1.
zbuymatnr = gs_cabn1-atinn.
*新系统修改ATINN
SELECT a~matnr a~charg a~cuobj_bm b~atwrt
INTO TABLE gt_itab1
FROM mch1 AS a INNER JOIN ausp AS b ON a~cuobj_bm = b~objek
FOR ALL ENTRIES IN gt_itab
WHERE a~matnr = gt_itab-matnr
AND a~charg = gt_itab-charg
AND b~atinn = z_old_batch
AND a~cuobj_bm <> 0.
SELECT a~matnr a~charg a~cuobj_bm b~atwrt
INTO TABLE gt_itab2
FROM mch1 AS a INNER JOIN ausp AS b ON a~cuobj_bm = b~objek
FOR ALL ENTRIES IN gt_itab
WHERE a~matnr = gt_itab-matnr
AND a~charg = gt_itab-charg
AND b~atinn = zbuymatnr
AND a~cuobj_bm <> 0.
SORT gt_itab1 BY matnr charg.
SORT gt_itab2 BY matnr charg.
LOOP AT gt_itab.
READ TABLE gt_itab1 WITH KEY matnr = gt_itab-matnr charg = gt_itab-charg BINARY SEARCH.
IF sy-subrc = 0.
gt_itab-zwrt1 = gt_itab1-atwrt.
ENDIF.
MODIFY gt_itab.
ENDLOOP.
ENDFORM. "GET_DATA
*&---------------------------------------------------------------------*
*& Form ALV_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alv_data.
alv_clear_data.
status = 'X'. "保存按钮
alv_add_data 'gt_itab' '' '' '' '' '' '' 'MATNR' '物料号'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'CHARG' '批次号'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'ERSDA' '创建时间'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'ERNAM' '创建人'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'HSDAT' '生产日期'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'VFDAT' '货架到期日'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'LWEDT' '最近收货日期'.
alv_add_data 'gt_itab' '' '' '' '' '' '' 'ZWRT1' '原有批次'.
PERFORM get_leng TABLES gt_itab i_fieldcat. "使ALV长度默认为其本身的字段
alv_show_data gt_itab.
ENDFORM. "ALV_data
*&---------------------------------------------------------------------*
*& Form set_pf_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSAVE'.
ENDFORM. "set_pf_status