一、业务情况
成本中心发料,涉及的移动类型为MATDOC-BWART = 201 and 202,因此,在取数时,需要限制移动类型的数据
输入的屏幕
涉及的字段
二、程序
1、声明部分
TABLES:matdoc,makt,mara,marc,csks,cskt.
TYPE-POOLS:slis.
TYPES:BEGIN OF ty_output,
werks TYPE matdoc-werks, "工厂
matbf TYPE matdoc-matbf, "物料
maktx TYPE makt-maktx, "物料描述
zpm TYPE mara-zpm, "品名
zggxh TYPE mara-zggxh, "规格
maabc TYPE marc-maabc, "ABC分类
lgort_sid TYPE matdoc-lgort_sid, "发出仓库
kostl TYPE matdoc-kostl, "成本中心
Ktext TYPE cskt-Ktext, "成本中心描述
bldat TYPE matdoc-bldat, "凭证日期
menge TYPE matdoc-menge, "数量
meins TYPE matdoc-meins, "单位
cprice TYPE dmbtr_cs, "成本价
dmbtr TYPE matdoc-dmbtr, "总价
usnam TYPE matdoc-usnam, "用户名
box TYPE c LENGTH 1,
END OF ty_output.
DATA gt_output TYPE TABLE OF ty_output.
DATA gs_output TYPE ty_output.
DATA gt_result TYPE TABLE OF ty_output.
DATA gs_result TYPE ty_output.
DATA gt_fieldcat TYPE slis_t_fieldcat_alv."列属性
DATA gs_fieldcat TYPE slis_fieldcat_alv.
DATA gs_layout TYPE slis_layout_alv. "全局参数
DATA gt_events TYPE slis_t_event. "CALLBACK事件
DATA gs_events TYPE slis_alv_event.
*定义宏
DEFINE %%append_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-col_pos = &1.
gs_fieldcat-fieldname = &2."字段名是什么
gs_fieldcat-seltext_m = &3."描述文本
gs_fieldcat-outputlen = &4."输出长度
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
2、选择界面部分
*选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK bk01 WITH FRAME TITLE TEXT-001.
PARAMETERS p_werks TYPE matdoc-werks OBLIGATORY."工厂
SELECT-OPTIONS s_matbf FOR matdoc-matbf. "物料
SELECT-OPTIONS s_kostl FOR matdoc-kostl. "成本中心
SELECTION-SCREEN END OF BLOCK bk01.
3、取数部分
取数部分注意:
1)不同的数据库表中的限制条件,比如MARC表中的同一个物料可能存在不同的工厂,使用LEFT JOIN会导致有两条数据存在,因此就要限制工厂的字段
2)成本中心描述也可能存在两个,因为一个成本中心的编号可能具有两个有效期,为了区分这两个有效期,就会有两个描述,在这里取出了有效期限最长的那个
FORM get_data .
SELECT
matdoc~werks,
matdoc~matbf,
makt~maktx,
mara~zpm,
mara~zggxh,
marc~maabc,
matdoc~lgort_sid,
matdoc~kostl,
cskt~ktext,
matdoc~bldat,
matdoc~menge,
matdoc~meins,
matdoc~dmbtr,
matdoc~usnam
FROM matdoc
INNER JOIN makt ON matdoc~matbf = makt~matnr
LEFT JOIN mara ON matdoc~matbf = mara~matnr
LEFT JOIN marc ON matdoc~matbf = marc~matnr AND matdoc~werks = marc~werks "同一个物料可能存在多个工厂中
INNER JOIN cskt ON matdoc~kostl = cskt~kostl AND cskt~datbi = '99991231'"部门可能拥有两个有效期的成本中心,取最新数据
WHERE matdoc~bwart BETWEEN '201' AND '202'
AND matdoc~werks = @p_werks
AND matdoc~matbf IN @s_matbf
AND matdoc~kostl IN @s_kostl
INTO CORRESPONDING FIELDS OF TABLE @gt_result.
**计算物料的单价
CLEAR gs_output.
LOOP AT gt_result INTO gs_output.
SHIFT gs_output-kostl LEFT DELETING LEADING '0'.
IF gs_output-menge <> 0."确保除数不为零
gs_output-cprice = gs_output-dmbtr / gs_output-menge.
APPEND gs_output TO gt_output.
ELSE.
gs_output-cprice = '0'.
APPEND gs_output TO gt_output.
ENDIF.
ENDLOOP.
ENDFORM.
4、布局部分
FORM display_data .
PERFORM build_fieldcat.
PERFORM build_layout.
PERFORM build_events.
PERFORM build_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
i_callback_pf_status_set = 'SET_STATUS'
* I_CALLBACK_USER_COMMAND = ' '
is_layout = gs_layout
it_fieldcat = gt_fieldcat
it_events = gt_events
TABLES
t_outtab = gt_output
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_fieldcat .
%%append_fieldcat: '1' 'WERKS' '工厂' '4',
'2' 'MATBF' '物料' '40',
'3' 'MAKTX' '描述' '40',
'4' 'ZPM' '品名' '40',
'5' 'ZGGXH' '规格' '128',
'6' 'MAABC' 'ABC分类' '1',
'7' 'LGORT_SID' '发出仓库' '4',
'8' 'KOSTL' '成本中心' '10',
'9' 'KTEXT' '成本中心描述' '20',
'10' 'BLDAT' '凭证日期' '8',
'11' 'MENGE' '数量' '13',
'12' 'MEINS' '单位' '3',
'13' 'CPRICE' '成本价' '13',
'14' 'DMBTR' '总价' '13',
'15' 'USNAM' '用户名' '12'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_layout .
gs_layout-colwidth_optimize = 'X'."优化列宽
gs_layout-zebra = 'X'. "斑马纹输出
gs_layout-box_fieldname = 'BOX'.
gs_layout-window_titlebar = '成本中心发料清单' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_events
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM build_events .
CLEAR gs_events.
gs_events-name = 'PF_STATUS_SET'.
gs_events-form = 'SET_STATUS'."子程序
APPEND gs_events TO gt_events.
ENDFORM.
FORM set_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'."参照标准按钮
ENDFORM.
5、权限设置
AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
ID 'ACTVT' FIELD '03'
ID 'WERKS' FIELD p_werks.
IF sy-subrc <> 0.
*不报E类型的message,因为如果是E类型,程序终止,用户没有办法修改
MESSAGE s001 WITH '无工厂权限!' DISPLAY LIKE 'E'.
else.
PERFORM get_data.
ENDIF.