开篇无话。
拟从用户需求、代码实现、最终所见所得三方面进行阐释。
第1—— 用户需求:
假有甲鱼哥所需的如下图所示的业务数据报表:(贴图pict.1)
需求分析过程:
初看得是一个自定义数据报表展示的需求,所需字段描述(字段名)包含:
工单生产工厂(字段:WERKS ), 工单类型(字段:AUART )
工单编号(字段:AUFNR ), 产成品物料号(字段:PLNBEZ )
产成品物料描述(字段:MAKTX ), 计划完工日期(字段:GLTRS )
计划开始日期(字段:GSTRS), 工单总数(字段:GAMNG )
已报工良品数(字段:GMNGA ), 已报工废品数(字段:XMNGA )
工单的系统状态(字段:ORSTATUS )
第2—— ABAP 代码实现(完整)
【SQL 数据运算获取部分】
*&---------------------------------------------------------------------*
form getdata.
clear: git_tab0, wa_tab0.
select * from afko inner join aufk on afko~aufnr = aufk~aufnr into corresponding fields of wa_tab0 where
aufk~werks in s_werks and
aufk~auart in s_auart and
aufk~aufnr in s_aufnr and
afko~plnbez in s_plnbez and
afko~gltrs in s_gltrs and
afko~gstrs in s_gstrs
order by aufk~werks descending afko~gstrs descending aufk~aufnr descending.
select single maktx from makt into corresponding fields of wa_tab0 where makt~matnr = wa_tab0-plnbez.
select single gmnga xmnga from afru into corresponding fields of wa_tab0 where afru~meilr = 'X' and
afru~aufnr = wa_tab0-aufnr.
perform get_order_status.
perform get_unit_conversion.
append wa_tab0 to git_tab0.
clear wa_tab0.
endselect.
endform. "getdata
*&---------------------------------------------------------------------*
■▲▲▲▲▲■完整代码内容:(注释,后期计划无限注释以便 高2学生阅读理解)
REPORT yyyymmdd MESSAGE-ID s05.
tables: afko, "工单表头数据
aufk, "工单基本数据
makt, "物料描述表
onror. "工单状态描述
types: begin of ty_gs0,
werks like aufk-werks, "工厂
auart like aufk-auart, "工单类型
aufnr like aufk-aufnr, "工单编号
plnbez like afko-plnbez, "产成品物料号
maktx like makt-maktx, "产成品物料描述
gltrs like afko-gltrs, "计划完工日期
gstrs like afko-gstrs, "计划开始日期
gamng like afko-gamng, "订单总数量
gmein like afko-gmein, "计量单位转换前
gmeinaft like afko-gmein, "基本计量单位(转换之后)
orstatus like bsvx-sttxt, "工单状态
objnr like onror-objnr, "工单对象号
gmnga like afru-gmnga, "已确认良品数
xmnga like afru-xmnga, "已报工废品数
rowx type c1, "整行选中的标记
end of ty_gs0.
data: git_tab0 type standard table of ty_gs0 with non-unique key aufnr,
wa_tab0 like line of git_tab0. "data: wa_tab1 type ty_s1.
type-pools:slis.
data:
i_layout type slis_layout_alv,
i_fieldcat type slis_fieldcat_alv,"定义列名工作区
i_fieldcat_alv type slis_t_fieldcat_alv,"定义列标题内表
i_events type slis_t_event,"alv事件
w_events like line of i_events, "定义alv事件的工作区
w_repid like sy-repid."当前程序名
* 选择屏幕
selection-screen begin of block blk1 with frame title btitle1.
select-options:
s_werks for aufk-werks memory id wer default '1000' to '3000', "生产工厂
s_auart for aufk-auart memory id aua default 'pp01', "工单类型
s_aufnr for aufk-aufnr memory id auf, "工单编号
s_plnbez for afko-plnbez memory id pln, "产成品料号
s_matxt for makt-maktx memory id mak, "产成品物料描述
s_gltrs for afko-gltrs memory id glt, "计划完工日期
s_gstrs for afko-gstrs memory id gst. "计划开始日期
selection-screen end of block blk1.
initialization.
btitle1 = '生产工单信息查询'.
start-of-selection.
perform getdata.
perform layout_build.
perform fieldcat_build.
perform final_alv_display.
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form getdata.
clear: git_tab0, wa_tab0.
select * from afko inner join aufk on afko~aufnr = aufk~aufnr into corresponding fields of wa_tab0 where
aufk~werks in s_werks and
aufk~auart in s_auart and
aufk~aufnr in s_aufnr and
afko~plnbez in s_plnbez and
afko~gltrs in s_gltrs and
afko~gstrs in s_gstrs
order by aufk~werks descending afko~gstrs descending aufk~aufnr descending.
select single maktx from makt into corresponding fields of wa_tab0 where makt~matnr = wa_tab0-plnbez.
select single gmnga xmnga from afru into corresponding fields of wa_tab0 where afru~meilr = 'X' and
afru~aufnr = wa_tab0-aufnr.
perform get_order_status.
perform get_unit_conversion.
append wa_tab0 to git_tab0.
clear wa_tab0.
endselect.
endform. "getdata
*&---------------------------------------------------------------------*
*& Form unit_exchange
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form get_unit_conversion. "此处通过函数'CONVERSION_EXIT_CUNIT_OUTPUT'获取从内部值(程序和数据库)到外部值(显示)的转换
call function 'CONVERSION_EXIT_CUNIT_OUTPUT'
exporting
input = wa_tab0-gmein
importing
output = wa_tab0-gmeinaft.
endform. "unit_exchange
*&---------------------------------------------------------------------*
*& Form get_order_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form get_order_status. " 此处通过函数 'STATUS_TEXT_EDIT' 获取工单的系统状态
select single objnr from onror into corresponding fields of wa_tab0 where onror~aufnr = wa_tab0-aufnr.
call function 'STATUS_TEXT_EDIT'
exporting " client = sy-mandt
objnr = wa_tab0-objnr " 单据号码
spras = 'E' " BYPASS_BUFFER = ' '
importing
line = wa_tab0-orstatus. " 返回状态描述文本
endform. "get_order_status
*&---------------------------------------------------------------------*
*& Form layout_build
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form layout_build.
i_layout-zebra = 'X'. "ALV表格按斑马线条纹显示
i_layout-colwidth_optimize = 'X'. "将ALV字段宽度设置为最优化
" i_layout-info_fieldname = 'COLOR'. "設置顏色FIELD
i_layout-no_colhead = ''. "显示列名
i_layout-box_fieldname = 'ROWX'.
w_repid = sy-repid.
*"i_layout-info_fieldname = 'COLOR'. "設置顏色FIELD
*"i_layout-no_colhead = 'X'.
endform. "layout_build
*&---------------------------------------------------------------------*
*& Form fieldcat_build
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form fieldcat_build.
define macron.
i_fieldcat-col_pos = &1.
i_fieldcat-fieldname = &2.
i_fieldcat-seltext_s = &3.
i_fieldcat-lzero = &4. "字义字段前导以"0"的形式显示
i_fieldcat-key = &5.
i_fieldcat-hotspot = &6. "热点显示
append i_fieldcat to i_fieldcat_alv.
clear i_fieldcat.
end-of-definition.
macron 1 'WERKS' '生产工厂' 'X' '' '' .
macron 2 'AUART' '工单类型' 'X' '' '' .
macron 3 'AUFNR' '工单编号' 'X' '' 'X' .
macron 4 'PLNBEZ' '产成品物料号' 'X' '' 'X' .
macron 5 'MAKTX' '产成品的物料描述' 'X' '' '' .
macron 6 'GLTRS' '计划完工日期' 'X' '' '' .
macron 7 'GSTRS' '计划开始日期' 'X' '' '' .
macron 8 'GAMNG' '工单总数' 'X' '' '' .
macron 10 'XMNGA' '报工废品数' 'X' '' '' .
macron 9 'GMNGA' '报工良品数量' 'X' '' '' .
macron 11'GMEINAFT' '计量单位' 'X' '' '' .
macron 12 'ORSTATUS' '工单的系统状态' 'X' '' '' .
endform. "fieldcat_build
*&---------------------------------------------------------------------*
*& Form final_alv_display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form final_alv_display.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = w_repid
is_layout = i_layout
it_fieldcat = i_fieldcat_alv[]
i_callback_user_command = 'USER_COMMAND' "USER_COMMAND EVENT
tables
t_outtab = git_tab0[] "将内表赋值给输出表
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. "final_alv_display
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_UCOMM text
* -->I_SELFIELD text
*----------------------------------------------------------------------*
form user_command using i_ucomm type sy-ucomm i_selfield type slis_selfield.
case i_ucomm.
when '&IC1'. "对于热点链接,所对应的动作码为"&IC1"
if i_selfield-fieldname = 'AUFNR' or
i_selfield-fieldname = 'PLNBEZ'.
perform call_tran using i_selfield. "调用自定义事务
endif.
endcase.
endform. "user_command
*&---------------------------------------------------------------------*
*& Form call_tran
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_SELFIELD text
*----------------------------------------------------------------------*
form call_tran using i_selfield type slis_selfield.
read table git_tab0 into wa_tab0 index i_selfield-tabindex. "i_selfield-tabindex 当击行索引,从内表中提取数据
case i_selfield-fieldname.
when 'AUFNR'.
set parameter id 'ANR' field wa_tab0-aufnr. " 工单编号的参数ID 为ANR
call transaction 'CO03'."AND SKIP FIRST SCREEN "调用CO03事务码
when 'PLNBEZ'.
set parameter id 'MAT' field wa_tab0-plnbez. " 物料编号的参数ID 为MAT
call transaction 'MM03'."AND SKIP FIRST SCREEN "调用MM03事务码
endcase.
endform. "call_tran
第3—— 用户之所见:(贴图 pict.2 贴图 pict.3)
甲鱼哥之所见:
查询结果:
(~~完完~~)