物料信息&采购订单信息查询报表
业务目的:根据选择屏幕的筛选条件,使用ALV报表显示采购订单详情和物料信息
效果展示




涉及的功能点:
1.当在物料信息查询页面以及采购订单信息查询页面取不到任何数据时,在选择画面提示错误消息"不存在满足条件的数据,请确认选择条件"
2.在采购订单信息查询页面对屏幕上的输入字段"公司代码"进行存在检查,如果不存在该公司代码,提示消息"公司xxxx不存在,请检查"
3.物料信息查询报表和采购订单信息查询报表中的物料号都设置成"HOTSPOT"热点,单击某物料号跳转到 MM03 的界面显示该物料详情
4.采购订单信息查询报表中的采购凭证编号设置成"HOTSPOT",当双击某采购凭证编号时,跳转到ME23N显示该采购订单详情
5.在采购订单信息查询报表中选择需要进行打印的采购凭证编号行数据,点击打印按钮,进行后续的Smartforms表单打印操作
6.在采购订单信息查询报表中选择需要进行导出的采购凭证编号行数据,点击PDF格式导出按钮,以PDF格式导出表单数据到电脑本地
完整代码如下所示
主程序(zmm60_437)
*&---------------------------------------------------------------------*
*& Report ZMM60_437
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmm60_437.
INCLUDE zmm60_437_top. " 数据定义
INCLUDE zmm60_437_f01. " 子例程
*----------------------------------------------------------------------*
* DESC: INITIALIZATION 事件
*----------------------------------------------------------------------*
INITIALIZATION.
PERFORM frm_set_initialization. " 赋初始值
*----------------------------------------------------------------------*
* DESC: AT SELECTION-SCREEN OUTPUT 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_set_screen. " 选择屏幕的动态变化
*----------------------------------------------------------------------*
* DESC: AT SELECTION-SCREEN 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
PERFORM frm_check_data. " 数据检查
*----------------------------------------------------------------------*
* DESC: START-OF-SELECTION 事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_get_data. " 获取数据
*---------------------------------------------------------------------*
* END-OF-SELECTION 事件
*---------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM frm_display_data. " ALV呈现数据
INCLUDE程序(zmm60_437_top)
*&---------------------------------------------------------------------*
*& 包含 ZMM60_437_TOP
*&---------------------------------------------------------------------*
TABLES: mara,ekko,ekpo.
* 自定义数据类型
TYPES: BEGIN OF ty_item,
sel(1), " 选择标志
index TYPE n LENGTH 5, " 序号
matnr TYPE mara-matnr, " 物料编号
maktx TYPE makt-maktx, " 物料描述
ersda TYPE mara-ersda, " 创建日期
cyear(4) TYPE c, " 创建年度 mara-ersda取前4位
cmonth(2) TYPE c, " 创建月 mara-ersda取前5-6位
cday(2) TYPE c, " 创建日 mara-ersda取前7-8位
ctime TYPE tims, " 创建时间
ernam TYPE mara-ernam, " 创建人
name_first TYPE user_addr-name_first, " 名
name_last TYPE user_addr-name_last, " 姓
nametxt TYPE c LENGTH 40, " 创建人描述 user_addr-name_first连接user_addr-name_last后输出
lvorm TYPE c LENGTH 6, " 删除标记
END OF ty_item.
TYPES: BEGIN OF ty_ekpo,
sel(1), " 选择标志
index TYPE n LENGTH 5, " 序号
ebeln TYPE ekpo-ebeln, " 采购凭证编号
ebelp TYPE ekpo-ebelp, " 采购凭证行
loekz TYPE c LENGTH 10, " 删除标记
txz01 TYPE ekpo-txz01, " 行项目文本
matnr TYPE ekpo-matnr, " 物料号
maktx TYPE makt-maktx, " 物料描述
bukrs TYPE ekko-bukrs, " 公司代码
butxt TYPE t001-butxt, " 公司代码描述
werks TYPE ekpo-werks, " 工厂
name1 TYPE t001w-name1, " 工厂名称
lgort TYPE ekpo-lgort, " 存储地点
lgobe TYPE t001l-lgobe, " 存储地点描述
banfn TYPE ekpo-banfn, " 采购申请编号
menge TYPE ekpo-menge, " 订单数量
meins TYPE ekpo-meins, " 订单单位
zyshsl TYPE ekpo-menge, " 已收货数量
zwshsl TYPE ekpo-menge, " 未收货数量 (未收货数量 = 订单数量 - 已收货数量)
bsart TYPE esart, " 采购凭证类型
lifnr TYPE elifn, " 供应商帐户号
END OF ty_ekpo.
* 定义内表和结构变量
DATA: gs_item TYPE ty_item, " 结构体变量(工作区)
gs_ekpo TYPE ty_ekpo, " 结构体变量(工作区)
gt_item TYPE STANDARD TABLE OF ty_item, " 内表
gt_ekpo TYPE STANDARD TABLE OF ty_ekpo. " 内表
* ALV参数定义
DATA: gs_layout TYPE lvc_s_layo, " 用于定义ALV表单的相关格式、属性
gs_fcat TYPE lvc_s_fcat, " 字段目录工作区
gt_fcat LIKE TABLE OF gs_fcat. " 字段目录内表
* 选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
* 物料查询选择条件
SELECT-OPTIONS: s_matnr FOR mara-matnr MODIF ID m1, " 物料号
s_ersda FOR mara-ersda MODIF ID m1, " 创建日期
s_matkl FOR mara-matkl MODIF ID m1. " 物料组
PARAMETERS: p_lvorm TYPE mara-lvorm AS CHECKBOX MODIF ID m1. " 删除标记(复选框)
* 采购订单查询选择条件
PARAMETERS: p_bukrs TYPE ekko-bukrs OBLIGATORY DEFAULT '1010' MODIF ID m2. " 公司代码(必输,默认值为1010)
SELECT-OPTIONS: s_bsart FOR ekko-bsart MODIF ID m2, " 采购凭证类型
s_aedat FOR ekko-aedat MODIF ID m2, " 创建日期
s_ernam FOR ekko-ernam MODIF ID m2, " 创建人
s_mat FOR ekpo-matnr MODIF ID m2. " 物料号
SELECTION-SCREEN END OF BLOCK b01.
SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-002.
* 功能选择
PARAMETERS: p_mara TYPE xfeld RADIOBUTTON GROUP r1 DEFAULT 'X' USER-COMMAND u1, " 查询物料信息(缺省值)
p_ekko TYPE xfeld RADIOBUTTON GROUP r1. " 查询采购订单信息
SELECTION-SCREEN END OF BLOCK b02.
INCLUDE程序(zmm60_437_f01)
*&---------------------------------------------------------------------*
*& 包含 ZMM60_437_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form frm_set_initialization
*&---------------------------------------------------------------------*
*& 屏幕缺省值设置:20240101至当前日期
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_initialization.
s_ersda-sign = 'I'.
s_ersda-option = 'EQ'.
s_ersda-low = '20240101'.
s_ersda-high = sy-datum.
APPEND s_ersda. " S_ERSDA创建日期 缺省值 20240101 至当前日期
s_aedat-sign = 'I'.
s_aedat-option = 'EQ'.
s_aedat-low = '20240101'.
s_aedat-high = sy-datum.
APPEND s_aedat. " S_AEDAT创建日期 缺省值 20240101 至当前日期
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& 获取数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data.
IF p_mara = abap_true.
PERFORM frm_get_mara. " 获取物料信息
ELSE.
PERFORM frm_get_ekpo. " 获取采购订单信息
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_data
*&---------------------------------------------------------------------*
*& 数据呈现
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_data .
" 设置fieldcat
PERFORM frm_set_fieldcat.
IF p_mara = abap_true.
" 调用ALV函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_bypassing_buffer = abap_true
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_ALV_SET_STATUS' " 子例程(设置状态栏)
i_callback_user_command = 'FRM_ALV_USER_COMMAND' " 子例程(用户指令响应)
is_layout_lvc = gs_layout " 设置ALV布局
it_fieldcat_lvc = gt_fcat " 设置ALV列属性
i_save = 'A'
TABLES
t_outtab = gt_item " 内表数据
EXCEPTIONS
program_error = 1
OTHERS = 2.
ELSE.
" 调用ALV函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_bypassing_buffer = abap_true
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_ALV_SET_STATUS' " 子例程(设置状态栏)
i_callback_user_command = 'FRM_ALV_USER_COMMAND' " 子例程(用户指令响应)
is_layout_lvc = gs_layout " 设置ALV布局
it_fieldcat_lvc = gt_fcat " 设置ALV列属性
i_save = 'A'
TABLES
t_outtab = gt_ekpo " 内表数据
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
DATA: lv_index LIKE sy-index.
CLEAR: gs_fcat,
gt_fcat,
gs_layout.
* 设置行的属性(ALV界面格式)
gs_layout-cwidth_opt = 'X'. " 设置自适应列宽
gs_layout-zebra = 'X'. " 设置斑马标识
gs_layout-box_fname = 'SEL'. " 用于ALV做选择的box
" ALV字段处理宏
DEFINE catalog.
lv_index = lv_index + 1.
gs_fcat-col_pos = lv_index.
gs_fcat-fieldname = &1. " 设置要输出的表格列的值,在内表中定义的字段名(必须大写)
gs_fcat-fix_column = &2. " 固定列
gs_fcat-ref_table = &3.
gs_fcat-edit = &4. " 是否可编辑
gs_fcat-colddictxt = 'L'.
gs_fcat-scrtext_l = &5. " 设置要输出的表格列的列名,即ALV报表显示的列名
gs_fcat-ref_field = &6.
gs_fcat-outputlen = &7.
gs_fcat-emphasize = &8. " 列颜色
gs_fcat-hotspot = &9. " 热点
APPEND gs_fcat TO gt_fcat.
END-OF-DEFINITION.
IF p_mara = abap_true.
* * &1 &2 &3 &4 &5 &6 &7 &8 &9
catalog:
'INDEX' 'X' '' '' '序号' '' '' '' '',
'MATNR' 'X' '' '' '物料编号' '' '' 'C110' 'X',
'MAKT' '' '' '' '物料描述' '' '' '' '',
'CYEAR' '' '' '' '创建年度' '' '' '' '',
'CMONTH' '' '' '' '创建月' '' '' '' '',
'CDAY' '' '' '' '创建日' '' '' '' '',
'CTIME' '' '' '' '创建时间' '' '' '' '',
'ERNAM' '' '' '' '创建人' '' '' '' '',
'NAMETXT' '' '' '' '创建人描述' '' '' '' '',
'LVORM' '' '' '' '删除标记' '' '' '' ''.
ELSE.
* * &1 &2 &3 &4 &5 &6 &7 &8 &9
catalog:
'INDEX' 'X' '' '' '序号' '' '' '' '',
'EBELN' 'X' '' '' '采购凭证编号' '' '' 'C110' '',
'EBELP' 'X' '' '' '采购凭证行' '' '' '' '',
'LOEKZ' '' '' '' '删除标记' '' '' '' '',
'TXZ01' '' '' '' '行项目文本' '' '' '' '',
'MATNR' '' '' '' '物料号' '' '' 'C110' 'X',
'MAKTX' '' '' '' '物料描述' '' '' '' '',
'BUKRS' '' '' '' '公司代码' '' '' '' '',
'BUTXT' '' '' '' '公司代码描述' '' '' '' '',
'WERKS' '' '' '' '工厂' '' '' '' '',
'NAME1' '' '' '' '工厂名称' '' '' '' '',
'LGORT' '' '' '' '存储地点' '' '' '' '',
'LGOBE' '' '' '' '存储地点描述' '' '' '' '',
'BANFN' '' '' '' '采购申请编号' '' '' '' '',
'MENGE' '' '' '' '订单数量' '' '' 'C510' '',
'MEINS' '' '' '' '订单单位' '' '' '' '',
'ZYSHSL' '' '' '' '已收货数量' '' '' '' '',
'ZWSHSL' '' '' '' '未收货数量' '' '' '' ''. "
ENDIF.
ENDFORM.
* 设置状态栏
FORM frm_alv_set_status USING ct_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSTALV' EXCLUDING ct_extab.
ENDFORM.
* 设置用户指令响应
FORM frm_alv_user_command USING pv_ucomm LIKE sy-ucomm
ps_selfield TYPE kkblo_selfield.
DATA: lt_ekko TYPE ztpo_header_437,
lv_fm_name TYPE rs38l_fnam,
ls_cp TYPE ssfctrlop, " 打印参数
ls_options TYPE ssfcompop. " 弹出框参数
DATA: ls_result TYPE ssfcrescl.
DATA: lv_bin_filesize TYPE i. " 文件大小
DATA: lt_lines TYPE STANDARD TABLE OF tline,
lv_filename TYPE string. " 文件名称
CASE pv_ucomm. " pv_ucomm参数表示引发输入后处理的功能代码
WHEN '&IC1'. " 单击(热点)或者双击进行触发:单击和双击使用同一功能代码(用户命令执行)
IF p_mara = abap_true.
READ TABLE gt_item INTO gs_item INDEX ps_selfield-tabindex.
IF ps_selfield-fieldname = 'MATNR'.
* 物料号设置成“HOTSPOT”,单击某物料号跳转到MM03的界面显示该物料详情
SET PARAMETER ID 'MAT' FIELD gs_item-matnr.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ELSE.
READ TABLE gt_ekpo INTO gs_ekpo INDEX ps_selfield-tabindex.
IF ps_selfield-fieldname = 'EBELN'.
* 当双击某采购凭证编号时,跳转到ME23N显示该采购订单详情
SET PARAMETER ID 'BES' FIELD gs_ekpo-ebeln.
CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
ELSEIF ps_selfield-fieldname = 'MATNR'.
* 物料号设置成“HOTSPOT”,单击某物料号跳转到MM03的界面显示该物料详情
SET PARAMETER ID 'MAT' FIELD gs_ekpo-matnr.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.
WHEN '&ZPRINT'. " 打印Smartforms表单
IF p_ekko = abap_true.
LOOP AT gt_ekpo INTO gs_ekpo WHERE sel = abap_true.
APPEND INITIAL LINE TO lt_ekko ASSIGNING FIELD-SYMBOL(<lfs_ekko>).
" <lfs_ekko>-xxx表示采购订单SmartForms表头信息
<lfs_ekko>-ebeln = gs_ekpo-ebeln.
<lfs_ekko>-bukrs = gs_ekpo-bukrs.
<lfs_ekko>-lifnr = gs_ekpo-lifnr.
<lfs_ekko>-bsart = gs_ekpo-bsart.
ENDLOOP.
" 调用函数获取Smartforms的函数名称
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZFS_DEMO_2025' " Smartforms表单名称
IMPORTING
fm_name = lv_fm_name " Smartforms函数名称
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
" 设置打印与弹出框参数
ls_cp-preview = 'X'. " 预览
ls_cp-no_dialog = 'X'. " 无弹窗
ls_options-tddest = 'LP01'. " 输出设备参数
" 打印Smartforms(动态调用)
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_cp
output_options = ls_options
it_ekko = lt_ekko
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
ENDIF.
WHEN '&EXPORT'. " 以PDF格式导出Smartforms表单
IF p_ekko = abap_true.
LOOP AT gt_ekpo INTO gs_ekpo WHERE sel = abap_true.
APPEND INITIAL LINE TO lt_ekko ASSIGNING FIELD-SYMBOL(<lfs_ekko1>).
" <lfs_ekko>-xxx表示采购订单SmartForms表头信息
<lfs_ekko1>-ebeln = gs_ekpo-ebeln.
<lfs_ekko1>-bukrs = gs_ekpo-bukrs.
<lfs_ekko1>-lifnr = gs_ekpo-lifnr.
<lfs_ekko1>-bsart = gs_ekpo-bsart.
ENDLOOP.
" 调用函数获取Smartforms的函数名称
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
formname = 'ZFS_DEMO_2025' " Smartforms表单名称
IMPORTING
fm_name = lv_fm_name " Smartforms函数名称
EXCEPTIONS
no_form = 1
no_function_module = 2
OTHERS = 3.
" 设置打印与弹出框参数
ls_cp-preview = 'X'. " 预览
ls_cp-no_dialog = 'X'. " 无弹窗
ls_options-tddest = 'LP01'. " 输出设备参数
ls_cp-getotf = abap_true. " 获取OTF数据
" Smartforms函数动态调用获取OTF格式数据
CALL FUNCTION lv_fm_name
EXPORTING
control_parameters = ls_cp
output_options = ls_options
it_ekko = lt_ekko
IMPORTING
job_output_info = ls_result
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
" ONVERT_OTF函数将OTF格式数据转换成PDF格式数据
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
format = 'PDF' " 输出文件格式
IMPORTING
bin_filesize = lv_bin_filesize " 文件大小
TABLES
otf = ls_result-otfdata[]
lines = lt_lines
EXCEPTIONS
err_max_linewidth = 1
err_format = 2
err_conv_not_possible = 3
OTHERS = 4.
" 生成文件路径和名称
CONCATENATE 'C:\Users\HP\Desktop\数据导出\' sy-datum sy-uzeit '.PDF' INTO lv_filename.
" 下载文件
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
bin_filesize = lv_bin_filesize " 文件大小
filename = lv_filename " 文件名
filetype = 'BIN'
TABLES
data_tab = lt_lines "
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
OTHERS = 22.
ENDIF.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_screen
*&---------------------------------------------------------------------*
*& 屏幕切换
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_screen .
IF p_mara = abap_true.
LOOP AT SCREEN.
IF screen-group1 = 'M2'.
screen-active = '0'. " 0表示不可见
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
screen-active = '0'. " 1表示可见
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_mara
*&---------------------------------------------------------------------*
*& 读取物料信息数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_mara .
SELECT mara~matnr " 物料编号
makt~maktx " 物料描述
mara~ersda " 创建日期
mara~created_at_time AS ctime " 创建时间
mara~ernam " 创建人
user_addr~name_first " 名
user_addr~name_last " 姓
mara~lvorm " 删除标记
FROM mara
LEFT JOIN makt
ON mara~matnr = makt~matnr
AND makt~spras = sy-langu
LEFT JOIN user_addr
ON mara~ernam = user_addr~bname
INTO CORRESPONDING FIELDS OF TABLE gt_item
WHERE mara~matnr IN s_matnr
AND ersda IN s_ersda
AND matkl IN s_matkl.
" 检查数据是否为空
IF gt_item IS INITIAL.
MESSAGE '不存在满足条件的数据,请确认选择条件' TYPE 'E'.
ENDIF.
" 如果勾选删除标记则查询所有数据
" 如果不勾选删除标记则查询不带删除标记的数据
IF p_lvorm = abap_false.
DELETE gt_item WHERE lvorm = abap_true. " 排除已经删除的数据
ENDIF.
" 如果ernam(创建人)为空,查询当前用户的姓名信息
SELECT SINGLE name_first, name_last
FROM user_addr
INTO @DATA(ls_user)
WHERE bname = @sy-uname.
" 处理字段逻辑数据
IF sy-subrc = 0.
LOOP AT gt_item INTO gs_item.
" 序号处理
gs_item-index = sy-tabix.
" 判断ersda字段是否不为空
IF gs_item-ersda IS NOT INITIAL.
gs_item-cyear = gs_item-ersda+0(4). " 创建年度
gs_item-cmonth = gs_item-ersda+4(2). " 创建月
gs_item-cday = gs_item-ersda+6(2). " 创建日
ENDIF.
" 判断ernam字段是否为空
" ernam 创建人为空时,设置为系统变量sy-uname
IF gs_item-ernam IS INITIAL.
gs_item-ernam = sy-uname.
gs_item-name_first = ls_user-name_first.
gs_item-name_last = ls_user-name_last.
ENDIF.
" 字符串拼接方式一
" gs_item-nametxt = |{ gs_item-name_first } { gs_item-name_last }|.
" 字符串拼接方式二
CONCATENATE gs_item-name_first gs_item-name_last INTO gs_item-nametxt SEPARATED BY ' '. " 创建人描述
" 如果lvorm字段值为X,显示“已删除”,否则显示空
IF gs_item-lvorm = abap_true.
gs_item-lvorm = '已删除'.
ENDIF.
" 内表修改
MODIFY gt_item FROM gs_item.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_ekpo
*&---------------------------------------------------------------------*
*& " 读取采购订单信息数据
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_ekpo.
SELECT ekpo~ebeln " 采购凭证编号
ekpo~ebelp " 采购凭证行
ekpo~loekz " 删除标记
ekpo~txz01 " 行项目文本
ekpo~matnr " 物料号
makt~maktx " 物料描述
ekko~bukrs " 公司代码
t001~butxt " 公司代码描述
ekpo~werks " 工厂
t001w~name1 " 工厂名称
ekpo~lgort " 存储地点
t001l~lgobe " 存储地点描述
ekpo~banfn " 采购申请编号
ekpo~menge " 订单数量
ekpo~meins " 订单单位
ekko~bsart " 采购凭证类型
ekko~lifnr " 供应商账户号
FROM ekpo
INNER JOIN ekko
ON ekpo~ebeln = ekko~ebeln
LEFT JOIN makt
ON ekpo~matnr = makt~matnr
AND makt~spras = sy-langu
LEFT JOIN t001
ON ekko~bukrs = t001~bukrs
LEFT JOIN t001w
ON ekpo~werks = t001w~werks
LEFT JOIN t001l
ON ekpo~werks = t001l~werks
AND ekpo~lgort = t001l~lgort
INTO CORRESPONDING FIELDS OF TABLE gt_ekpo
WHERE ekko~bukrs = p_bukrs
AND ekko~bsart IN s_bsart
AND ekko~aedat IN s_aedat
AND ekko~ernam IN s_ernam
AND ekpo~matnr IN s_matnr.
" 检查数据是否为空
IF gt_ekpo IS INITIAL.
MESSAGE '不存在满足条件的数据,请确认选择条件' TYPE 'E'.
ENDIF.
" 处理字段逻辑数据
IF sy-subrc = 0.
SORT gt_ekpo BY ebeln ASCENDING ebelp ASCENDING. " 输出结果按照以下字段升序排列:EBELN,EBELP
* zyshsl字段(已收货数量)逻辑处理(方法1)
SELECT ebeln,ebelp,wemng
FROM eket
INTO TABLE @DATA(lt_eket)
FOR ALL ENTRIES IN @gt_ekpo
WHERE ebeln = @gt_ekpo-ebeln
AND ebelp = @gt_ekpo-ebelp.
" 数据编辑
LOOP AT gt_ekpo ASSIGNING FIELD-SYMBOL(<lfs_ekpo>).
<lfs_ekpo>-index = sy-tabix. " 序号处理
" 当字段loekz = L时,显示“已删除”,否则显示为空
IF <lfs_ekpo>-loekz = 'L'.
<lfs_ekpo>-loekz = '已删除'.
ENDIF.
* zyshsl字段(已收货数量)逻辑处理(方法1)
LOOP AT lt_eket INTO DATA(ls_eket)
WHERE ebeln = <lfs_ekpo>-ebeln AND ebelp = <lfs_ekpo>-ebelp.
<lfs_ekpo>-zyshsl = <lfs_ekpo>-zyshsl + ls_eket-wemng.
ENDLOOP.
* zyshsl字段(已收货数量)逻辑处理(方法2)
* SELECT SUM( wemng )
* FROM eket
* INTO <lfs_ekpo>-zyshsl
* WHERE ebeln = <lfs_ekpo>-ebeln
* AND ebelp = <lfs_ekpo>-ebelp.
<lfs_ekpo>-zwshsl = <lfs_ekpo>-menge - <lfs_ekpo>-zyshsl. " 未收货数量 = 订单数量 - 已收货数量
" 将订单单位转换成“可读”的格式,例如将“EA”转换成“个”
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
input = <lfs_ekpo>-meins " 转换前
language = sy-langu
IMPORTING
long_text = <lfs_ekpo>-meins " 转换后
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
" 将最终输出的物料号字段,转换成“外部格式”
CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
EXPORTING
input = <lfs_ekpo>-matnr " 转换前
IMPORTING
output = <lfs_ekpo>-matnr. " 转换后
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& 对屏幕上的输入字段 P_BUKRS 进行“存在检查”
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_data .
DATA: lv_bukrs TYPE t001-bukrs.
SELECT SINGLE bukrs
INTO lv_bukrs
FROM t001
WHERE bukrs = p_bukrs.
IF sy-subrc <> 0.
MESSAGE e000(z_msg2025) WITH p_bukrs. " 公司&1 不存在,请检查
ENDIF.
ENDFORM.
上述代码涉及的消息类以及文本元素如下所示


GUI STATUS状态栏
补充扩展知识
调用REUSE_ALV_GRID_DISPLAY_LVC函数显示ALV,在调用该函数之前,需要先定义Layout和Fieldcat,该函数对应的Layout 类型为lvc_s_layo,Fieldcat类型为lvc_s_fcat
Layout主要用于设定 ALV的输出格式
Fieldcat主要用于ALV的结构定义,包括具体的栏位及名称、类型、格式等属性
本文涉及到的相关知识点
[SAP ABAP] ALV状态栏GUI STATUS的快速创建