********************************************************************
* 事务代码: *
* 程序名称: *
* 程序目的:物料凭证打印 *
* 设 计 人: *
* 开 发 人: *
* 设计时间:2023-02-14 *
* 程序类型: ABAP/4 程序 ,打印程序 *
* 应用类型: MM *
* 描 述: 需求物料凭证打印 *
*(修改日志)--------------------------------------------------------*
* *
* 日志号 修改人 修改时间 修改说明 传输号码 *
* ---- ---- ------ -----------
* 001 Seele 2023-02-14 创建打印程序 DS4K901703 *
********************************************************************
REPORT zmmf002.
*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES:mkpf, " 物料凭证抬头
mara,
mseg. " 物料凭证行项目
*----------------------------------------------------------------------*
* 结构声明类型/Structure type declaration
*----------------------------------------------------------------------*
*&---主表数据/master table data
TYPES:BEGIN OF ty_output,
mblnr TYPE mkpf-mblnr , " 物料凭证
zeile TYPE mseg-zeile , " 物料凭证项目
budat TYPE mkpf-budat , " 过账日期
usnam TYPE rkpf-usnam , " 制单人
name_last TYPE user_addr-name_last , " 制单人名称
bktxt TYPE mkpf-bktxt , " 凭证抬头文本
werks TYPE mseg-werks , " 工厂
name1 TYPE t001w-name1 , " 工厂名
matnr TYPE mseg-matnr , " 物料号
maktx TYPE makt-maktx , " 物料描述
matkl TYPE mara-matkl , " 物料组
wgbez TYPE t023t-wgbez , " 物料组描述
menge TYPE mseg-menge , " 数量
meins TYPE mseg-meins , " 计量单位
lgort TYPE mseg-lgort , " 库存地点
lgobe TYPE t001l-lgobe , " 库存地点描述
bwart TYPE mseg-bwart , " 移动类型
btext TYPE t156t-btext , " 移动类型描述
zgyspc TYPE ausp-atwrt , " 供应商批次
zmjh TYPE ausp-atwrt , " 模具号
aufnr TYPE aufm-aufnr , " 生产订单
lifnr TYPE mseg-lifnr , " 供应商
name1_s TYPE lfa1-name1 , " 供应商名称
charg TYPE mseg-charg , " 批号
hsdat TYPE mseg-hsdat , " 生产日期
kostl TYPE mseg-kostl , " 成本中心
ktext TYPE cskt-ktext , " 成本中心描述
ps_psp_pnr TYPE mseg-ps_psp_pnr , " 研发项目
post1 TYPE prps-post1 , " 研发项目描述
cpudt TYPE mkpf-cpudt , " 输入日期
cputm TYPE mkpf-cputm , " 输入时间
ebeln TYPE mseg-ebeln , " 采购订单
umsok TYPE mseg-umsok , " 特殊库存标识
grund TYPE mseg-grund , " 移动原因
grtxt TYPE t157e-grtxt , " 移动原因描述
umwrk TYPE mseg-umwrk , " 收货工厂
name1_r TYPE t001w-name1 , " 收货工厂名
umlgo TYPE mseg-umlgo , " 收货仓库
lgobe_r TYPE t001l-lgobe , " 收货仓库描述
zggxh TYPE zmmt010-zggxh , " 规格型号
bismt TYPE mara-bismt , " 旧物料号
xauto TYPE mseg-xauto , " 项目自动创建
rstyp TYPE t156-rstyp , " 预定的帐户分配
box TYPE c , " 选择框
END OF ty_output.
*----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
*&---全局内表定义
DATA:gt_output TYPE TABLE OF ty_output. " 主数据表
*&---全局结构定义
DATA:gs_output TYPE ty_output. " 主数据结构
*&---全局变量定义
DATA:gv_uname TYPE user_addr-name_last. " 用户名
*&---全局常量定义
CONSTANTS:gc_form TYPE tdsfname VALUE 'ZMM_SF_02'. "smartform 名称
*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS:<fs_output> TYPE ty_output.
*&---------------------------------------------------------------------*
*& ALV TYPE/ALV 类型定义
*&---------------------------------------------------------------------*
*&---ALV数据组,类型池
TYPE-POOLS:slis,
vrm.
*&---定义ALV显示的字段列及其描述等属性
DATA:gt_fieldcat TYPE TABLE OF lvc_s_fcat, " ALV 控制: 字段目录
gs_fieldcat TYPE lvc_s_fcat, " ALV 控制: 字段目录
gs_layout TYPE lvc_s_layo. " ALV 控制: 布局结构
*&---------------------------------------------------------------------*
*& Macro 宏定义
*&---------------------------------------------------------------------*
DEFINE mcr_set_catalog.
gs_fieldcat-fieldname = &1. " 字段技术名称
gs_fieldcat-coltext = &2. " 显示名称
gs_fieldcat-ref_table = &3. " 参照表
gs_fieldcat-ref_field = &4. " 参照表字段
gs_fieldcat-qfieldname = &5. " 参考计量单位的字段名称
gs_fieldcat-key = &6. " key 值
gs_fieldcat-edit = &7. " 可编辑
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Selection Screen/选择屏幕
*&---------------------------------------------------------------------*
*&---选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-101.
*&---范围
SELECT-OPTIONS:s_mblnr FOR mkpf-mblnr , " 物料凭证
s_werks FOR mseg-werks OBLIGATORY, " 工厂
s_lgort FOR mseg-lgort , " 库存地点
s_matnr FOR mara-matnr , " 物料
s_bwart FOR mseg-bwart , " 移动类型
s_budat FOR mkpf-budat , " 过账日期
s_usnam FOR mkpf-usnam . " 制单人
*&---单值
PARAMETERS: p_mjahr LIKE mkpf-mjahr DEFAULT sy-datum+0(4). " 凭证年度(默认当年)
SELECTION-SCREEN END OF BLOCK blk01.
*&---------------------------------------------------------------------*
*& Start-of-selection/开始选择屏幕 *
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---内表数据获取
PERFORM frm_get_data.
IF gt_output IS INITIAL.
MESSAGE s008(zmm001) DISPLAY LIKE 'E'.
EXIT.
ENDIF.
*&---------------------------------------------------------------------*
*& end-of-selection/结束选择屏幕(程序结束处理,输出等) *
*&---------------------------------------------------------------------*
END-OF-SELECTION.
*&===ALV 输出
*&---设置ALV输出格式
PERFORM frm_init_layout.
*&---设置ALV输出字段
PERFORM frm_set_fieldcat.
*&---ALV 显示
PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_10 text
*----------------------------------------------------------------------*
FORM frm_get_data.
DATA:lv_tabix TYPE i,
lv_atinn TYPE ausp-atinn.
FREE:gt_output.
*&---获取主数据表内容mkpf mseg
SELECT
mkpf~mblnr , " 物料凭证
mkpf~budat , " 过账日期
mkpf~bktxt , " 凭证抬头文本
mkpf~cpudt , " 输入日期
mkpf~cputm , " 输入时间
mseg~zeile , " 物料凭证项目
mkpf~usnam , " 制单人
mseg~werks , " 工厂
mseg~matnr , " 物料
mseg~menge , " 数量
mseg~meins , " 计量单位
mseg~lgort , " 库存地点
mseg~bwart , " 移动类型
mseg~hsdat , " 生产日期
mseg~kostl , " 成本中心
mseg~ebeln , " 采购订单
mseg~umsok , " 特殊库存标识
mseg~grund , " 移动原因
mseg~umwrk , " 收货工厂
mseg~umlgo , " 收货仓库
mseg~ps_psp_pnr , " 研发项目
mseg~lifnr , " 供应商
mseg~xauto , " 项目自动创建
mseg~charg , " 批次
aufm~aufnr , " 生产订单
mara~matkl , " 物料组
mara~bismt " 旧物料号
FROM mkpf
LEFT JOIN mseg ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
LEFT JOIN aufm ON aufm~aufnr = mseg~aufnr
LEFT JOIN mara ON mseg~matnr = mara~matnr
WHERE
mkpf~mblnr IN @s_mblnr AND
mkpf~budat IN @s_budat AND
mseg~werks IN @s_werks AND
mseg~lgort IN @s_lgort AND
mseg~matnr IN @s_matnr AND
mseg~bwart IN @s_bwart AND
mkpf~usnam IN @s_usnam AND
mkpf~mjahr = @p_mjahr
INTO TABLE @DATA(lt_data).
SORT lt_data BY mblnr zeile.
IF lt_data IS NOT INITIAL.
*&---制单人名称
SELECT
name_last , " 制单人名称
bname "
FROM user_addr
FOR ALL ENTRIES IN @lt_data
WHERE
bname = @lt_data-usnam OR bname = @sy-uname
INTO TABLE @DATA(lt_user_addr).
SORT lt_user_addr BY bname.
*&---工厂名 收货工厂名
SELECT
name1 , " 工厂名/收货工厂名
werks " 工厂
FROM t001w
FOR ALL ENTRIES IN @lt_data
WHERE
werks = @lt_data-werks OR
werks = @lt_data-umwrk
INTO TABLE @DATA(lt_t001w).
SORT lt_t001w BY werks.
*&---物料描述
SELECT
matnr , " 物料号
maktx " 物料描述
FROM makt
FOR ALL ENTRIES IN @lt_data
WHERE
makt~matnr = @lt_data-matnr AND
makt~spras = @sy-langu
INTO TABLE @DATA(lt_makt).
SORT lt_makt BY matnr.
*&---物料组描述
SELECT
matkl , " 物料组
wgbez " 物料组描述
FROM t023t
FOR ALL ENTRIES IN @lt_data
WHERE
matkl = @lt_data-matkl AND
spras = @sy-langu
INTO TABLE @DATA(lt_t023t).
SORT lt_t023t BY matkl.
*&---库存地点描述/收货仓库描述
SELECT
lgobe , " 库存地点描述/收货仓库描述
werks , " 工厂
lgort
FROM t001l
FOR ALL ENTRIES IN @lt_data
WHERE
( lgort = @lt_data-lgort AND
werks = @lt_data-werks ) OR
( lgort = @lt_data-umlgo AND
werks = @lt_data-umwrk )
INTO TABLE @DATA(lt_t001l).
SORT lt_t001l BY werks lgort.
*&---供应商名称
SELECT
name1 , " 供应商名称
lifnr
FROM lfa1
FOR ALL ENTRIES IN @lt_data
WHERE
lfa1~lifnr = @lt_data-lifnr
INTO TABLE @DATA(lt_lfa1).
SORT lt_lfa1 BY lifnr.
*&---成本中心描述
SELECT
kostl , " 成本中心
ktext " 成本中心描述
FROM cskt
FOR ALL ENTRIES IN @lt_data
WHERE
kostl = @lt_data-kostl
INTO TABLE @DATA(lt_cskt).
SORT lt_cskt BY kostl.
*&---研发项目描述
SELECT
post1 , " 研发项目描述
pspnr " 研发项目
FROM prps
FOR ALL ENTRIES IN @lt_data
WHERE
pspnr = @lt_data-ps_psp_pnr
INTO TABLE @DATA(lt_prps).
SORT lt_prps BY pspnr.
*&---0000000803供应商批次 & 0000000804模具号
SELECT
mch1~matnr,
mch1~charg,
mch1~cuobj_bm,
ausp~atinn,
ausp~atwrt " 供应商批次&模具号
FROM mch1
LEFT JOIN ausp ON mch1~cuobj_bm = ausp~objek
FOR ALL ENTRIES IN @lt_data
WHERE
mch1~matnr = @lt_data-matnr AND
mch1~charg = @lt_data-charg AND
ausp~klart = '023' AND
ausp~atinn IN ( '0000000804' , '0000000803' )
INTO TABLE @DATA(lt_ausp).
SORT lt_ausp BY matnr charg atinn.
*&---移动类型描述
SELECT
bwart , " 移动类型
rstyp " 预定的帐户分配
FROM t156
FOR ALL ENTRIES IN @lt_data
WHERE
bwart = @lt_data-bwart
INTO TABLE @DATA(lt_t156).
SORT lt_t156 BY bwart.
*&---移动类型描述
SELECT
bwart , " 移动类型
btext " 移动类型描述
FROM t156t
FOR ALL ENTRIES IN @lt_data
WHERE
bwart = @lt_data-bwart AND
spras = @sy-langu
INTO TABLE @DATA(lt_t156t).
SORT lt_t156t BY bwart.
*&---移动原因描述
SELECT
bwart , " 移动类型
grund , " 移动原因
grtxt " 移动原因描述
FROM t157e
FOR ALL ENTRIES IN @lt_data
WHERE
bwart = @lt_data-bwart AND
grund = @lt_data-grund AND
spras = @sy-langu
INTO TABLE @DATA(lt_t157e).
SORT lt_t157e BY bwart grund.
*&---规格型号
SELECT
zggxh , " 规格型号
matnr
FROM zmmt010
FOR ALL ENTRIES IN @lt_data
WHERE
matnr = @lt_data-matnr
INTO TABLE @DATA(lt_zmmt010).
SORT lt_zmmt010 BY matnr.
ENDIF.
LOOP AT lt_data INTO DATA(ls_data).
CLEAR gs_output.
MOVE-CORRESPONDING ls_data TO gs_output.
" 物料描述
READ TABLE lt_makt INTO DATA(ls_makt) WITH KEY matnr = gs_output-matnr BINARY SEARCH.
IF sy-subrc = 0.
gs_output-maktx = ls_makt-maktx.
ENDIF.
" 工厂名
READ TABLE lt_t001w INTO DATA(ls_t001w) WITH KEY werks = gs_output-werks BINARY SEARCH.
IF sy-subrc = 0.
gs_output-name1 = ls_t001w-name1.
ENDIF.
" 收货工厂名
READ TABLE lt_t001w INTO ls_t001w WITH KEY werks = gs_output-umwrk BINARY SEARCH.
IF sy-subrc = 0.
gs_output-name1_r = ls_t001w-name1.
ENDIF.
" 制单人名称
READ TABLE lt_user_addr INTO DATA(ls_user_addr) WITH KEY bname = gs_output-usnam BINARY SEARCH.
IF sy-subrc = 0.
gs_output-name_last = ls_user_addr-name_last.
ENDIF.
" 物料组描述
READ TABLE lt_t023t INTO DATA(ls_t023t) WITH KEY matkl = gs_output-matkl BINARY SEARCH.
IF sy-subrc = 0.
gs_output-wgbez = ls_t023t-wgbez.
ENDIF.
" 库存地点描述
READ TABLE lt_t001l INTO DATA(ls_t001l) WITH KEY werks = gs_output-werks lgort = gs_output-lgort BINARY SEARCH.
IF sy-subrc = 0.
gs_output-lgobe = ls_t001l-lgobe.
ENDIF.
" 收货仓库描述
READ TABLE lt_t001l INTO ls_t001l WITH KEY werks = gs_output-umwrk lgort = gs_output-umlgo BINARY SEARCH.
IF sy-subrc = 0.
gs_output-lgobe_r = ls_t001l-lgobe.
ENDIF.
" 成本中心描述
READ TABLE lt_cskt INTO DATA(ls_cskt) WITH KEY kostl = gs_output-kostl BINARY SEARCH.
IF sy-subrc = 0.
gs_output-ktext = ls_cskt-ktext.
ENDIF.
" 研发项目描述
READ TABLE lt_prps INTO DATA(ls_prps) WITH KEY pspnr = gs_output-ps_psp_pnr BINARY SEARCH.
IF sy-subrc = 0.
gs_output-post1 = ls_prps-post1.
ENDIF.
" 供应商名称
READ TABLE lt_lfa1 INTO DATA(ls_lfa1) WITH KEY lifnr = gs_output-lifnr BINARY SEARCH.
IF sy-subrc = 0.
gs_output-name1_s = ls_lfa1-name1.
ENDIF.
" 0000000803供应商批次
READ TABLE lt_ausp INTO DATA(ls_ausp) WITH KEY matnr = gs_output-matnr
charg = gs_output-charg
atinn = '0000000803' BINARY SEARCH.
IF sy-subrc = 0.
gs_output-zgyspc = ls_ausp-atwrt.
ENDIF.
" 0000000804模具号
READ TABLE lt_ausp INTO ls_ausp WITH KEY matnr = gs_output-matnr
charg = gs_output-charg
atinn = '0000000804' BINARY SEARCH.
IF sy-subrc = 0.
gs_output-zmjh = ls_ausp-atwrt.
ENDIF.
" 移动类型描述
READ TABLE lt_t156t INTO DATA(ls_t156t) WITH KEY bwart = gs_output-bwart BINARY SEARCH.
IF sy-subrc = 0.
gs_output-btext = ls_t156t-btext.
ENDIF.
" 预定的帐户分配
READ TABLE lt_t156 INTO DATA(ls_t156) WITH KEY bwart = gs_output-bwart BINARY SEARCH.
IF sy-subrc = 0.
gs_output-rstyp = ls_t156-rstyp.
ENDIF.
" 移动原因描述
READ TABLE lt_t157e INTO DATA(ls_t157e) WITH KEY bwart = gs_output-bwart grund = gs_output-grund BINARY SEARCH.
IF sy-subrc = 0.
gs_output-grtxt = ls_t157e-grtxt.
ENDIF.
" 规格型号
READ TABLE lt_zmmt010 INTO DATA(ls_zmmt010) WITH KEY matnr = gs_output-matnr BINARY SEARCH.
IF sy-subrc = 0.
gs_output-zggxh = ls_zmmt010-zggxh.
ENDIF.
APPEND gs_output TO gt_output.
ENDLOOP.
" 制单人名称
READ TABLE lt_user_addr INTO ls_user_addr WITH KEY bname = sy-uname BINARY SEARCH.
IF sy-subrc = 0.
gv_uname = ls_user_addr-name_last.
ENDIF.
SORT gt_output BY mblnr zeile bwart.
ENDFORM. " frm_get_data
*&---------------------------------------------------------------------*
*& Form frm_init_layout
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_layout .
CLEAR gs_layout.
gs_layout-zebra = 'X' . " 斑马线
gs_layout-cwidth_opt = 'X' . " 自动调整ALVL列宽
gs_layout-no_toolbar = 'X' . " 隐藏工具栏
gs_layout-sel_mode = 'A'. "选择模式
gs_layout-box_fname = 'BOX'. "选择字段
ENDFORM. " frm_init_layout
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_set_fieldcat .
*&---ALV 输出字段目录,涉及字段必须大写
mcr_set_catalog: 'MBLNR' TEXT-A01 'MKPF' 'MBLNR' '' '' '', " 物料凭证
'ZEILE' TEXT-A02 'MSEG' 'ZEILE' '' '' '', " 物料凭证项目
'BUDAT' TEXT-A03 'MKPF' 'BUDAT' '' '' '', " 过账日期
'USNAM' TEXT-A04 'RKPF' 'USNAM' '' '' '', " 制单人
'NAME_LAST' TEXT-A05 'USER_ADDR' 'NAME_LAST' '' '' '', " 制单人名称
'BKTXT' TEXT-A06 'MKPF' 'BKTXT' '' '' '', " 凭证抬头文本
'WERKS' TEXT-A07 'MSEG' 'WERKS' '' '' '', " 工厂
'NAME1' TEXT-A08 'T001W' 'NAME1' '' '' '', " 工厂名
'MATNR' TEXT-A09 'MSEG' 'MATNR' '' '' '', " 物料号
'MAKTX' TEXT-A10 'MAKT' 'MAKTX' '' '' '', " 物料描述
'MATKL' TEXT-A11 'MARA' 'MATKL' '' '' '', " 物料组
'WGBEZ' TEXT-A12 'T023T' 'WGBEZ' '' '' '', " 物料组描述
'MENGE' TEXT-A13 'MSEG' 'MENGE' '' '' '', " 数量
'MEINS' TEXT-A14 'MSEG' 'MEINS' '' '' '', " 计量单位
'LGORT' TEXT-A15 'MSEG' 'LGORT' '' '' '', " 库存地点
'LGOBE' TEXT-A16 'T001L' 'LGOBE' '' '' '', " 库存地点描述
'BWART' TEXT-A17 'MSEG' 'BWART' '' '' '', " 移动类型
'BTEXT' TEXT-A18 'T156T' 'BTEXT' '' '' '', " 移动类型描述
'ZGYSPC' TEXT-A19 'AUSP' 'ATWRT' '' '' '', " 供应商批次
'ZMJH' TEXT-A20 'AUSP' 'ATWRT' '' '' '', " 模具号
'AUFNR' TEXT-A21 'AUFM' 'AUFNR' '' '' '', " 生产订单
'LIFNR' TEXT-A22 'AUFM' 'LIFNR' '' '' '', " 供应商
'NAME1_S' TEXT-A23 'LFA1' 'NAME1' '' '' '', " 供应商名称
'CHARG' TEXT-A24 'AUFM' 'CHARG' '' '' '', " 批号
'HSDAT' TEXT-A25 'MSEG' 'HSDAT' '' '' '', " 生产日期
'KOSTL' TEXT-A26 'MSEG' 'KOSTL' '' '' '', " 成本中心
'KTEXT' TEXT-A27 'CSKT' 'KTEXT' '' '' '', " 成本中心描述
'PS_PSP_PNR' TEXT-A28 'MSEG' 'PS_PSP_PNR' '' '' '', " 研发项目
'POST1' TEXT-A29 'PRPS' 'POST1' '' '' '', " 研发项目描述
'CPUDT' TEXT-A30 'MKPF' 'CPUDT' '' '' '', " 输入日期
'CPUTM' TEXT-A31 'MKPF' 'CPUTM' '' '' '', " 输入时间
'EBELN' TEXT-A32 'MSEG' 'EBELN' '' '' '', " 采购订单
'UMSOK' TEXT-A33 'MSEG' 'UMSOK' '' '' '', " 特殊库存标识
'GRUND' TEXT-A34 'MSEG' 'GRUND' '' '' '', " 移动原因
'GRTXT' TEXT-A35 'T157E' 'GRTXT' '' '' '', " 移动原因描述
'UMWRK' TEXT-A36 'MSEG' 'UMWRK' '' '' '', " 收货工厂
'NAME1_R' TEXT-A37 'T001W' 'NAME1' '' '' '', " 收货工厂名
'UMLGO' TEXT-A38 'MSEG' 'UMLGO' '' '' '', " 收货仓库
'LGOBE_R' TEXT-A39 'T001L' 'LGOBE' '' '' ''. " 收货仓库描述
ENDFORM. " frm_fieldcat
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_display_alv .
*&---ALV 显示函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat[]
i_callback_pf_status_set = 'FRM_USER_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
i_default = 'X'
i_save = 'A'
TABLES
t_outtab = gt_output
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " frm_display_alv
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_user_status
*&---------------------------------------------------------------------*
* 设置用户菜单栏状态
*----------------------------------------------------------------------*
* --> pt_extab 需要排除的菜单按钮
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_user_status USING ps_extab TYPE slis_t_extab. "GUI
SET PF-STATUS 'STATUS_1000' EXCLUDING ps_extab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
* 菜单栏事件
*----------------------------------------------------------------------*
* --> pv_ucomm 触发的功能码
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_user_command USING pv_ucomm LIKE sy-ucomm "user_command
pv_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
DATA:lv_answer TYPE c .
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data. "将更新后的数据传到alv所对应的内表
pv_selfield-refresh = 'X'. "刷新数据
pv_selfield-row_stable = 'X'.
pv_selfield-col_stable = 'X'.
CASE pv_ucomm.
WHEN 'PRT'.
PERFORM frm_print.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_user_command
*&---------------------------------------------------------------------*
* 菜单栏事件
*----------------------------------------------------------------------*
* --> pv_ucomm 触发的功能码
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_print.
DATA: ls_control_parameters TYPE ssfctrlop,
ls_output_options TYPE ssfcompop,
ls_outopt TYPE ssfcresop,
ls_output_info TYPE ssfcrescl,
lv_name TYPE rs38l_fnam.
DATA: lv_tabix TYPE i,
lv_str TYPE string,
ls_head TYPE ZMMS003,
ls_item TYPE ZMMS003C,
ls_key TYPE ty_output,
lt_item TYPE STANDARD TABLE OF ZMMS003C,
lt_key TYPE STANDARD TABLE OF ty_output,
lt_sel TYPE STANDARD TABLE OF ty_output.
" 保证打印所有行项目
LOOP AT gt_output INTO gs_output WHERE box = 'X'.
APPEND gs_output TO lt_key.
ENDLOOP.
DELETE ADJACENT DUPLICATES FROM lt_key COMPARING mblnr bwart.
IF lt_key[] IS INITIAL.
MESSAGE s011(zmm001) DISPLAY LIKE 'E'."请至少选择一条数据
EXIT.
ENDIF.
SORT lt_key BY ebeln.
SORT gt_output BY mblnr bwart zeile.
*&---获取form的函数名
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = gc_form
IMPORTING
fm_name = lv_name
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*&---开启打印流
CALL FUNCTION 'SSF_OPEN'
EXPORTING
control_parameters = ls_control_parameters
output_options = ls_output_options
IMPORTING
job_output_options = ls_outopt
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDIF.
ls_control_parameters-no_open = 'X'.
ls_control_parameters-no_close = 'X'.
LOOP AT lt_key INTO ls_key.
CLEAR: ls_head,lt_item,ls_item.
READ TABLE gt_output INTO gs_output WITH KEY mblnr = ls_key-mblnr bwart = ls_key-bwart.
IF sy-subrc = 0.
lv_tabix = sy-tabix.
*&---构建form表头
ls_head-mblnr = gs_output-mblnr. " 凭证编号
ls_head-budat = gs_output-budat. " 过账日期
ls_head-name_first = gs_output-name_last. " 制单人
ls_head-uname = gv_uname. " 打印人
ls_head-werks = gs_output-werks. " 工厂
ls_head-lifnr = gs_output-lifnr. " 供应商
CONCATENATE gs_output-bwart gs_output-btext INTO ls_head-bwart SEPARATED BY ' '. " 移动类型 移动类型描述
LOOP AT gt_output INTO gs_output FROM lv_tabix.
IF ls_key-mblnr <> gs_output-mblnr OR ls_key-bwart <> gs_output-bwart.
EXIT.
ENDIF.
CLEAR ls_item.
*&---构建form行项目
" 移动类型RSTYP=U,则排除行MSEG-XAUTO=X的行信息
IF gs_output-rstyp = 'U' AND gs_output-xauto = 'X'.
CONTINUE.
ENDIF.
ls_item-zeile = gs_output-zeile. " 项目
ls_item-meins = gs_output-meins. " 单位
ls_item-matnr = gs_output-matnr. " 物料号
ls_item-charg = gs_output-charg. " 批次
IF gs_output-zgyspc IS NOT INITIAL.
ls_item-atwrt = '(' && gs_output-zgyspc && ')'. " 供应商批次
ENDIF.
IF gs_output-bismt IS NOT INITIAL.
ls_item-bismt = '(' && gs_output-bismt && ')'. " 旧物料号
ENDIF.
lv_str = gs_output-menge.
REPLACE ALL OCCURRENCES OF REGEX '[ ]+$' IN lv_str WITH ''. " 去掉字符串多余的空格
REPLACE ALL OCCURRENCES OF REGEX '[0]+$' IN lv_str WITH ''. " 去掉小数点后多余的0
REPLACE ALL OCCURRENCES OF REGEX '[.]$' IN lv_str WITH ''. " 如最后一位是.则去掉
ls_item-menge = lv_str." 数量
ls_item-maktx = gs_output-maktx && '/' && gs_output-zggxh. " 物料名称/规格型号
ls_item-maktx = shift_right( val = ls_item-maktx sub = |/| ). " 用斜杠区分,没有值不要斜杠
ls_item-lgort = gs_output-lgort. " 库存地点:LGORT/UMLGO
IF ls_item-lgort IS INITIAL.
ls_item-lgort = gs_output-umlgo.
ELSE.
ls_item-lgort = ls_item-lgort && '/' && gs_output-umlgo.
ls_item-lgort = shift_right( val = ls_item-lgort sub = |/| ). " 用斜杠区分,没有值不要斜杠
ENDIF.
APPEND ls_item TO lt_item.
ENDLOOP.
*&---打印form
CALL FUNCTION lv_name
EXPORTING
control_parameters = ls_control_parameters
output_options = ls_output_options
gs_head = ls_head
IMPORTING
job_output_info = ls_output_info
TABLES
gt_item = lt_item
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
ENDIF.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDLOOP.
*&---关闭打印流
CALL FUNCTION 'SSF_CLOSE'
IMPORTING
job_output_info = ls_output_info
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_refresh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_refresh .
* 将更新后的数据传到alv所对应的内表
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CLEAR gt_output.
PERFORM frm_get_data.
"Refresh ALV
"Reset the layout
lr_grid->set_frontend_layout( is_layout = gs_layout ).
"Refresh ALV display
lr_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = 'X'
col = 'X' ) ).
ENDFORM.
ABAP Include ALV打印程序模板
于 2023-03-15 17:45:57 首次发布