需求分析:
1、具体需求
本实践有如下需求:
- 初始界面输入物料编号,执行后从物料表中获得对应物料编号的记录;
- 获得记录中指定字段(集团、物料编号、物料名称、计量单位、类型、制造商、标准价格、价格单位、库存)的字段说明、字段值、字段类型、长度、小数位数;
- 格式化输出信息。
2、开发分析
要达成本实践目标,需要综合ABAP的数据输出实现方式:
- 可以通过定义结构,以存储和处理要获得和输出的数据;
- 通过使用OpenSQL语句可以根据输入的物料编号,在对应物料表(ztmaterial)表中读取数据并存储于结构中;
- 使用DESCRIBE FIELD关键字可以获得各字段类型、长度、小数位数等属性;
- 通过Write语句可以将数据输出到屏幕,而在输出时需要考虑每列数据输出起始位置及所占字符长度。
实践步骤:
本实践通过程序编辑器(SE38)即可完成,编写的代码将有如下几部分组成,按开发人员风格不同,其组成部分并非强制一致。
No | 部分 | 说明 |
---|---|---|
1 | 程序声明 | 声明本程序执行后是否包含标准标题,数据输出宽度和每页的行数量为多少 |
2 | 对象定义 | 通过定义变量或常量或要使用的表结构等,以在程序执行过程中计算和存储临时值 |
3 | 页眉输出 | 如不指定标准标题,则可以通过代码设置输出的页眉 |
4 | 获取数据 | 从表中获得要输出的数据数据,并存储到内表中以待后续输出 |
5 | 输出数据 | 将内表中的数据按要求输出 |
1、程序声明
程序声明部分代码如下:
REPORT zu0303_mat_stru_data.
REPORT 程序名称:是对程序的定义,表明此程序代码不是FUNCTION MODULE(功能函数),不是CLASS(类),而是可以执行的可以输出数据的此程序;这是对程序最基本的声明,且必须存在的部分。
2、对象定义
对象定义部分代码如下:
*****对象定义
DATA: BEGIN OF mat_stru, " MAT_STRU-结构体名称
mandt TYPE ztmaterial-mandt, "通过已有表字段定义类型
materialid TYPE ztmaterial-materialid,
materialname TYPE ztmaterial-materialname,
sunit TYPE ztmaterial-bunit,
materialtype TYPE ztmaterial-materialtype,
supplier TYPE ztmaterial-supplier,
sprice TYPE ztmaterial-sprice,
scurrency TYPE ztmaterial-scurrency,
inventory TYPE ztmaterial-inventory,
END OF mat_stru.
*DATA: MAT_STRU TYKE ZU02_MAT_STRU. "通过字典对象定义结构体
DATA: typ(1) TYPE c,
len TYPE i,
olen TYPE i,
deci TYPE i,
compo TYPE i.
PARAMETERS: matnr TYPE ztmaterial-materialid DEFAULT '1017'.
如上代码对程序中要使用的对象进行定义,首先定义了1个结构mat_stru,此结构包含如下字段:mandt(集团)、materialid(物料编号)、materialname(物料名称)、sunit(计量单位)、materialtype(物料类型)、supplier(制造商)、sprice(标准价格)、scurrency(价格单位)、inventory(库存)。
然后定义了如下变量以存储和输出字段的各种属性:typ(字段名)、len(字段说明)、 olen(字段类型)、deci(长度)、compo(小数位数)。
同时通过PARAMETERS定义初始界面中要输入的物料编号,以作为获取记录的条件,默认为“1017”。
3、页眉输出
页眉部分代码,要通过TOP-OF-PAGE定义,在此部分可以定义每一页上方输出的标题行。
*****输出页眉
TOP-OF-PAGE. "页眉事件
WRITE:/5(75) sy-uline,
/5 '字段', 20 '字段说明', 35(15) '字段值', 50 '字段类型', 60 '长度' , 70 '小数位数',
/5(75) sy-uline.
4、获得数据
获得数据部分代码如下:
*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION. "数据处理事件
SELECT SINGLE "通过SELECT 语句从表ZTMETERIAL中获得数据并赋值到结构体
mandt materialid materialname sunit materialtype supplier sprice scurrency inventory
INTO mat_stru
FROM ztmaterial
WHERE materialid = matnr.
如上SELECT代码为ABAP的Open SQL语句,通过其可以将数据从ztmaterial表中,获得所需的各个字段的数据并插入到mat_stru结构中,WHERE条件以筛选数据物料编号。
5、变量赋值和输出
赋值和输出数据部分代码如下:
*****获得字段属性并输出
*****客户端
DESCRIBE FIELD mat_stru-mandt TYPE typ. "获得字段的类型
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'. "获得字段的长度,不同类型对象的长度方式有差异
DESCRIBE FIELD mat_stru-mandt LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-mandt LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-mandt DECIMALS deci. "对类型为F和P的对象获得小数位数
ENDIF.
WRITE:/5 'MANDT', 20 '集团', 35(15) mat_stru-mandt, 50 typ, 60 len , 70 deci.
*****物料编号
DESCRIBE FIELD mat_stru-materialid TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
DESCRIBE FIELD mat_stru-materialid LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-materialid LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-materialid DECIMALS deci.
ENDIF.
WRITE:/5 'MATERIALID', 20 '物料编号', 35(15) mat_stru-materialid, 50 typ, 60 len , 70 deci.
*****物料名称
DESCRIBE FIELD mat_stru-materialname TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
DESCRIBE FIELD mat_stru-materialname LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-materialname LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-materialname DECIMALS deci.
ENDIF.
WRITE:/5 'MATERIALNAME', 20 '物料名称', 35(15) mat_stru-materialname, 50 typ, 60 len , 70 deci.
*****销售计量单位
DESCRIBE FIELD mat_stru-sunit TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
DESCRIBE FIELD mat_stru-sunit LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-sunit LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-sunit DECIMALS deci.
ENDIF.
WRITE:/5 'SUNIT', 20 '销售计量单位', 35(15) mat_stru-sunit, 50 typ, 60 len , 70 deci.
*****物料类型
DESCRIBE FIELD mat_stru-materialtype TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
DESCRIBE FIELD mat_stru-materialtype LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-materialtype LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-materialtype DECIMALS deci.
ENDIF.
WRITE:/5 'MATERIALTYPE', 20 '物料类型', 35(15) mat_stru-materialtype, 50 typ, 60 len , 70 deci.
*****制造商
DESCRIBE FIELD mat_stru-supplier TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
DESCRIBE FIELD mat_stru-supplier LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-supplier LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-supplier DECIMALS deci.
ENDIF.
WRITE:/5 'SUPPLIER', 20 '制造商', 35(15) mat_stru-supplier, 50 typ, 60 len , 70 deci.
*****标准价格
DESCRIBE FIELD mat_stru-sprice TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
* DESCRIBE FIELD MAT_STRU-SPRICE LENGTH LEN IN CHARACTER MODE. "对于类型为P的对象,不得通过CHARACTER语句
ELSE.
DESCRIBE FIELD mat_stru-sprice LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-sprice DECIMALS deci.
ENDIF.
WRITE:/5 'SPRICE', 20 '标准价格', 35(15) mat_stru-sprice, 50 typ, 60 len , 70 deci.
*****价格单位
DESCRIBE FIELD mat_stru-scurrency TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
DESCRIBE FIELD mat_stru-scurrency LENGTH len IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-scurrency LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-scurrency DECIMALS deci. " 字段小数位数
ENDIF.
WRITE:/5 'SCURRENCY', 20 '价格单位', 35(15) mat_stru-scurrency, 50 typ, 60 len , 70 deci.
*****库存
DESCRIBE FIELD mat_stru-inventory TYPE typ.
IF typ = 'C' OR typ = 'D' OR typ = 'N' OR typ = 'T'.
* DESCRIBE FIELD MAT_STRU-INVENTORY LENGTH LEN IN CHARACTER MODE.
ELSE.
DESCRIBE FIELD mat_stru-inventory LENGTH len IN BYTE MODE.
ENDIF.
deci = 0.
IF typ = 'F' OR typ = 'P'.
DESCRIBE FIELD mat_stru-inventory DECIMALS deci. " 字段小数位数
ENDIF.
WRITE:/5 'INVENTORY', 20 '库存', 35(15) mat_stru-inventory, 50 typ, 60 len , 70 deci.
如上代码,通过DESCRIBE FIELD取得字段类型、长度、小数位数,并结合内表里的数量逐条赋值给变量输出。
WRITE输出格式:字段名称(字符)、字段说明(字符)、字段值(结构)、字段类型(typ)、长度(len)、小数位数(deci)。
如上5部分代码按顺序组合在一起,则是此开发实践的完整实现代码。