如何在ABAP中绘制图表(柱状图,折线图等)

今天给大家分享如何在ABAP中绘制图表(柱状图,折线图等).
要实现这一点,通常使用以下功能模块。

  • GFW_PRES_SHOW

假设你想绘制一张折线图,展示某个部门在几年内的收入情况。

年份收入
20095000
20108000
20113000
201210000

前提条件:创建一个自定义屏幕,例如 100,并在其中插入一个自定义控件。将其命名为“CONTAINER”。
image.png
函数 GFW_PRES_SHOW 的参数主要包含如下:

CALL FUNCTION 'GFW_PRES_SHOW'
  EXPORTING
*    CONTAINER         = 
*    TOP               = 
*    LEFT              = 
*    HEIGHT            = 
*    WIDTH             = 
     PRESENTATION_TYPE  = 
*    HEADER            = 
*    ORIENTATION       = 1
*    PARENT            = 
*    X_AXIS_TITLE      = 
*    Y_AXIS_TITLE      = 
*    FORMAT            = 
  IMPORTING
*    RETVAL            = 
*    CONTENT_TYPE      = 
*    CONTENT_LENGTH    = 
  TABLES
     VALUES            = 
     COLUMN_TEXTS      = 
*    ROW_LABELS        = 
*    COLUMN_LABELS     = 
*    CONTENT           = 
  EXCEPTIONS
     ERROR_OCCURRED    = 1
     OTHERS            = 2
.

参数 PRESENTATION_TYPE 决定了需要绘制的图表类型,使用表格中提供的不同图表类型。以下是不同图表类型对应的参数值:

  • 折线图 - gfw_prestype_lines
  • 区域图 - gfw_prestype_area
  • 横向条形图 - gfw_prestype_horizontal_bars
  • 纵向条形图 - gfw_prestype_vertical_bars
  • 饼图 - gfw_prestype_pie_chart
  • 时间轴图 - gfw_prestype_time_axis

在使用这个函数模块时,需要理解的重要概念是填充函数模块输入表的逻辑。
表参数 VALUESCOLUMN_TEXTS 就是对应我们需要展示的数据和标签。
本例中,COLUMN_TEXTS 表中包含的是 x 轴上的点,也就是 2009、2010、2011 等年份。
COLUMN_TEXTS 的结构是 GPRTXT,它只包含一个字段 COLTXT
将所有 x 轴的点添加到此表中:

DATA : X_TEXTS TYPE TABLE OF GPRTXT WITH HEADER LINE.

X_TEXTS-COLTXT = '2009'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = '2010'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = '2011'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = '2012'.
APPEND X_TEXTS.

VALUES 表中则包含与所有 x 轴坐标对应的 y 轴值,并将其作为一行添加到表中。
VALUES 是结构为 GPRVAL 的表,它包含图表的字段名称以及与不同 x 轴坐标对应的值。

字段名称数据类型长度描述
ROWTXTGFWXVALCHAR 40GFW:第一维度(X 值)
VAL1GFWYVALFLTP 16GFW:第二维度(Y 值)
VAL2GFWYVALFLTP 16GFW:第二维度(Y 值)
VAL3GFWYVALFLTP 16GFW:第二维度(Y 值)
VAL4GFWYVALFLTP 16GFW:第二维度(Y 值)
VAL5GFWYVALFLTP 16GFW:第二维度(Y 值)

你最多可以输入 32 个值,也就是说 TEXTS 表中最多可以包含 32 个 x 坐标点,每个点的 y 值在 VALUES 表中提供。
填充图表数据并展示的完整的代码如下:

*&---------------------------------------------------------------------*
*& Report ZGRAPHICS
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zgraphics.

TYPE-POOLS: gfw.

DATA: y_values TYPE TABLE OF gprval WITH HEADER LINE,
      x_texts  TYPE TABLE OF gprtxt WITH HEADER LINE.
DATA: ok_code LIKE sy-ucomm.

REFRESH y_values.
REFRESH x_texts.

y_values-rowtxt = 'Sales'.
y_values-val1 = 5000.
y_values-val2 = 8000.
y_values-val3 = 3000.
y_values-val4 = 10000.
APPEND y_values.

x_texts-coltxt = '2009'.
APPEND x_texts.
x_texts-coltxt = '2010'.
APPEND x_texts.
x_texts-coltxt = '2011'.
APPEND x_texts.
x_texts-coltxt = '2012'.
APPEND x_texts.

CALL SCREEN 100.
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'PF_100'.
  SET TITLEBAR 'GRAPHICS'.
*
  CALL FUNCTION 'GFW_PRES_SHOW'
    EXPORTING
      container         = 'CONTAINER'    "A screen with an empty container must be defined
      presentation_type = gfw_prestype_lines
*     PRESENTATION_TYPE = gfw_prestype_time_axis
*     PRESENTATION_TYPE = gfw_prestype_area
*     PRESENTATION_TYPE = gfw_prestype_horizontal_bars
    TABLES
      values            = y_values
      column_texts      = x_texts
    EXCEPTIONS
      error_occurred    = 1
      OTHERS            = 2.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'BACK'.
      LEAVE PROGRAM.
    WHEN 'CANCEL'.
      LEAVE PROGRAM.

  ENDCASE.

ENDMODULE.

输出示例如下:
image.png
多条折线图
现在,假设你想比较两个不同部门的收入。你需要为每个部门绘制一条折线图。为实现这一点,只需在 y values 表中再插入一行数据即可。

填充数据的代码替换为如下:

Y_VALUES-ROWTXT = 'Revenue - Dept1'.
Y_VALUES-VAL1 = 5000.
Y_VALUES-VAL2 = 8000.
Y_VALUES-VAL3 = 3000.
Y_VALUES-VAL4 = 10000.
APPEND Y_VALUES.

Y_VALUES-ROWTXT = 'Revenue - Dept2'.
Y_VALUES-VAL1 = 6000.
Y_VALUES-VAL2 = 7000.
Y_VALUES-VAL3 = 6000.
Y_VALUES-VAL4 = 5000.
APPEND Y_VALUES.

X_TEXTS-COLTXT = '2009'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = '2010'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = '2011'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = '2012'.
APPEND X_TEXTS.

image.png
横向条形图
要查看相同的比较但以条形图的形式,只需更改函数模块中的 PRESENTATION_TYPE 参数。

CALL FUNCTION 'GFW_PRES_SHOW'
  EXPORTING
    CONTAINER         = 'CONTAINER'  
    PRESENTATION_TYPE = gfw_prestype_horizontal_bars
  TABLES
    VALUES            = Y_VALUES
    COLUMN_TEXTS      = X_TEXTS
  EXCEPTIONS
    ERROR_OCCURRED    = 1
    OTHERS            = 2.


纵向条形图

CALL FUNCTION 'GFW_PRES_SHOW'
  EXPORTING
    CONTAINER         = 'CONTAINER'  
    PRESENTATION_TYPE = gfw_prestype_vertical_bars
  TABLES
    VALUES            = Y_VALUES
    COLUMN_TEXTS      = X_TEXTS
  EXCEPTIONS
    ERROR_OCCURRED    = 1
    OTHERS            = 2.


饼图
饼图的输入表内容稍有不同,因为饼图的用途不同。
假设你的需求是了解每个部门对总收入的贡献。
为了绘制饼图,将不同的部门添加到文本表 X_TEXTS 中(该表作为函数模块的 COLUMN_TEXTS 参数输入),而每个部门贡献的收入则添加到值表 Y_VALUES 中(作为 VALUES 参数的输入表)。饼图的 Y_VALUES 表中只能有一行数据。
示例代码:

DATA: Y_VALUES       TYPE TABLE OF GPRVAL WITH HEADER LINE,
      X_TEXTS        TYPE TABLE OF GPRTXT WITH HEADER LINE.
DATA: OK_CODE LIKE SY-UCOMM.

REFRESH Y_VALUES.
REFRESH X_TEXTS.

X_TEXTS-COLTXT = 'Dept A'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = 'Dept B'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = 'Dept C'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = 'Dept E'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = 'Dept F'.
APPEND X_TEXTS.
X_TEXTS-COLTXT = 'Dept G'.
APPEND X_TEXTS.

Y_VALUES-VAL1 = 5000.
Y_VALUES-VAL2 = 5500.
Y_VALUES-VAL3 = 3000.
Y_VALUES-VAL4 = 4000.
Y_VALUES-VAL5 = 5000.
Y_VALUES-VAL6 = 6000.
Y_VALUES-VAL7 = 7000.
APPEND Y_VALUES.

CALL FUNCTION 'GFW_PRES_SHOW'
  EXPORTING
    CONTAINER         = 'CONTAINER'
    PRESENTATION_TYPE = gfw_prestype_pie_chart
    HEADER            = 'Departmental Analysis of Revenue'
  TABLES
    VALUES            = Y_VALUES
    COLUMN_TEXTS      = X_TEXTS
  EXCEPTIONS
    ERROR_OCCURRED    = 1
    OTHERS            = 2.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值