今天给大家分享如何在ABAP中绘制图表(柱状图,折线图等).
要实现这一点,通常使用以下功能模块。
- GFW_PRES_SHOW
假设你想绘制一张折线图,展示某个部门在几年内的收入情况。
年份 | 收入 |
---|---|
2009 | 5000 |
2010 | 8000 |
2011 | 3000 |
2012 | 10000 |
前提条件:创建一个自定义屏幕,例如 100,并在其中插入一个自定义控件。将其命名为“CONTAINER”。
函数 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
在使用这个函数模块时,需要理解的重要概念是填充函数模块输入表的逻辑。
表参数 VALUES
和 COLUMN_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 轴坐标对应的值。
字段名称 | 数据类型 | 长度 | 描述 |
---|---|---|---|
ROWTXT | GFWXVAL | CHAR 40 | GFW:第一维度(X 值) |
VAL1 | GFWYVAL | FLTP 16 | GFW:第二维度(Y 值) |
VAL2 | GFWYVAL | FLTP 16 | GFW:第二维度(Y 值) |
VAL3 | GFWYVAL | FLTP 16 | GFW:第二维度(Y 值) |
VAL4 | GFWYVAL | FLTP 16 | GFW:第二维度(Y 值) |
VAL5 | GFWYVAL | FLTP 16 | GFW:第二维度(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.
输出示例如下:
多条折线图
现在,假设你想比较两个不同部门的收入。你需要为每个部门绘制一条折线图。为实现这一点,只需在 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.
横向条形图
要查看相同的比较但以条形图的形式,只需更改函数模块中的 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.