03ABAP语法,A3-显示物料记录的表字段值和属性

图3-A3 物料表字段属性界面

需求分析:

1、具体需求

本实践有如下需求:

  1. 初始界面输入物料编号,执行后从物料表中获得对应物料编号的记录;
  2. 获得记录中指定字段(集团、物料编号、物料名称、计量单位、类型、制造商、标准价格、价格单位、库存)的字段说明、字段值、字段类型、长度、小数位数;
  3. 格式化输出信息。
2、开发分析

要达成本实践目标,需要综合ABAP的数据输出实现方式:

  1. 可以通过定义结构,以存储和处理要获得和输出的数据;
  2. 通过使用OpenSQL语句可以根据输入的物料编号,在对应物料表(ztmaterial)表中读取数据并存储于结构中;
  3. 使用DESCRIBE FIELD关键字可以获得各字段类型、长度、小数位数等属性;
  4. 通过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部分代码按顺序组合在一起,则是此开发实践的完整实现代码。

本实践小结:

1、控制语句
2、DESCRIBE FIELD关键字
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容