程序类型区别:
可执行程序的特点是可以直接执行,而无需事务码,这个也是一般报表开发最常用的程序类型。我们可以在 SE38 中直接点击执行按钮或按 F8 键来运行一个可执行程序。
可执行程序包含一些预定义的过程块,比如 INITIALIZATION、AT SELECTION-SCREEN、START-OF-SELECTION、END-OF-SELECTION 等等,有一个后台系统程序会控制可执行程序,按照规定的顺序依次调用这些过程块。首先显示一个选择屏幕,最后输出一个列表。可执行程序还能指定一个逻辑数据库,逻辑数据库也是一种程序,它按照预定义好的数据库表结构,依次根据主键读取相关的业务数据,可以用 SE36 查看逻辑数据库。
为屏幕绘制器画出的屏幕所用的模块池 (程序类型为 M)
模块池包含了来自业务的屏幕模块的处理步骤,它只能通过事务码或者菜单功能调用。
包含程序 (程序类型为 I)
包含了不能独立运行的程序代码,也就是说,无论你是在 SE38 里用执行功能还是通过事务码或菜单调用,都无法打开一个包含程序。它们的作用主要是让程序变得清晰和可以被重用,在其他程序里,用 INCLUDE 语句可以把一个包含程序加到程序里。最终的效果相当于用被包含的程序里的全部内容替换调 INCLUDE 语句。
子程序 (程序类型为 S)
这种类型的程序里只包含被外部 PERFORM 语句调用的程序块。也就是说,只包含形如 FORM ... ENDFORM 块的程序代码,从外部程序里,用 PERFORM IN PROGRAM [IF FOUND]. 来调用。
函数组 (程序类型为 F)
这类程序包含了函数模块。函数组和函数模块用函数制作器进行管理,事务码 SE37。在创建函数组和函数模块时,函数制作器把程序类型设置为 F。
接口池 (程序类型为 J)
包含了接口。类和接口都在类制作器中管理,事务码 SE24。
类池 (程序类型为 K)
包含了类。类和接口都在类制作器中管理,事务码 SE24。
一、ALV相关关键字
事件关键字(定义处理快,多用于REPORT)
-
INITIALIZATION: 在选择屏幕显示前,对变量进行初始化赋值。【示例: s_aedat-low/high/sign/option 进行赋默认值 】
-
AT SELECTION-SCREEN :对选择屏幕的数据输入进行检查。
-
START-OF-SELECTION :选择屏幕处理完后,数据的处理。
-
TOP-OF-PAGE :列表显示启动新页,页头的输出。
-
END-OF-PAGE :一节结束时,页尾的处理。
-
AT LINE-SELECTION :用户双击选中某行触发该事件。
-
AT PF :设置自定义菜单。
-
AT USER-COMMAND : 无论何时用 户从自定义 用户界面中 选择自定义 功能代码, 都将发生 AT USER-COMMAND 事件。
-
SELECTION-SCREEN BEGIN OF BLOCK [C] WITH FRAME TITLE [TEXT-001] ...... SELECTION-SCREEN END OF BLOOK [C]. 屏幕框架【 block换成LINE 代表分配在同一行,SELECTION-SCREEN COMMENT 1(31) [TEXT-001] 行文本语言 】
-
PARAMETERS [P_1] TYPE [CHAR] DEFAULT 'A'. 定义屏幕单值字段默认值
-
SELECTION-OPTIONS [S_1] FOR [sflight-carrid]. 定义屏幕多值字段
-
... AS CHECKBOX :复选框
-
... RADIOBUTTON GROUP [G].单选框
-
... AS LISTBOX VISIBLE LENGTH [10].下拉框
控制关键字
-
IF(条件分支): if......endif.每个判断语句之后都要加句号。
-
CASE(条件分支) :case(条件变量)when(变量值)......endcase。
-
DO循环 : 计次循环
-
WHILE 条件循环 :
-- 使用循环要避免死循环 。
-- 在语句块中至少应包含一个 EXIT、 STOP 或 REJECT 语句,以便系统能够退出循环。
-
循环控制:1)、CONTINUE: 跳至循环的下一次(无条件终止一次循环);
2)、CHECK
:
满足check条件之后才继续往下执行循环(有条件终止循环) ;
3) 、 EXIT
: 跳离循环 (完全终止循环) 。
AT相关关键字
-
AT FIRST:循环时第一条记录时调用
-
AT LAST:循环时最后一条记录时调用
-
AT NEW:循环中当制定字段之前(包括制定字段)的组合和上一条记录不一致的时候调用
-
AT END OF:循环中当制定字段之前(包括制定字段)的组合和下一条记录不一致的时候调用
使用ref->*,field-symbols创建内表
REPORT
YTEST
_
FIELD
_
SYMBOLS
.
DATA
:
go
_
tab
TYPE
REF TO data
.
FIELD
-
SYMBOLS
:
<
fs
_
tab
>
TYPE
table
.
START-OF-SELECTION
.
CREATE DATA
go
_
tab
TYPE
TABLE
OF
(
'EKKO'
)
.
IF
go
_
tab
IS
BOUND
.
ASSIGN
go
_
tab
-
>
*
TO
<
fs
_
tab
>
.
CHECK
<
fs
_
tab
>
IS
ASSIGNED
.
ELSE
.
EXIT
.
ENDIF.
FILEDCAT_LVC方式
-
表结构直接展示
CALL FUNCTION
'
LVC_FIELDCATALOG_MERGE
'
EXPORTING
i_structure_name = 'ZES_STRUCK' “表结构
CHANGING
ct_fieldcat = gt_fieldcat.
2. 定义宏方式
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat.
DEFINE
alv_fieldcat.
CLEAR: gs_fieldcat.
gs_fieldcat-tabname = &1. ”内部表名称
gs_fieldcat-fieldname = &2. “内部表字段的字段名称
gs_fieldcat-f4availabl = &3. ”字段有输入帮助
gs_fieldcat-outputlen = &4. “列的字符宽度
gs_fieldcat-coltext = &5. ”列标题
gs_fieldcat-seltext = &5. “对话框功能的列标识符
gs_fieldcat-ref_field = &6. ”内部表字段的参考字段名称
gs_fieldcat-ref_table = &7. ”内部表字段的参考表名称
gs_fieldcat-edit = &8. “可编辑
gs_fieldcat-no_zero = &9. ”输出隐藏零
gs_fieldcat-emphasize = 'C310' "表格颜色
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
alv_fieldcat 'GT_ALV' 'PWWRK' ' ' '004' '工厂' ' ' ' ' ' ' ' '.
alv_fieldcat 'GT_ALV' 'VERID1' 'H_MKAL' '018' '生产版本1' 'VERID' 'PLAF' 'X' ''.
alv_fieldcat 'GT_ALV' 'GSMNG_1' ' ' '017' '分解订单数量1' 'GSMNG' 'PLAF' 'X' ' '.
LAYOUT格式定义
data gs_layout TYPE lvc_s_layo,
gs_layout-sel_mode = 'A'. "选择方式
gs_layout-cwidth_opt = 'X'. "优化列宽度
gs_layout-zebra = 'X'. "可选行颜色 (带)
gs_layout-no_rowmark = 'X'. "禁用行选择
DISVARIANT-report = sy-repid. "ABAP 程序名称
*排除ALV的功能按钮
DATA: lv_exclude
TYPE
ui_func .
lv_exclude =
cl_gui_alv_grid=>mc_fc_loc_cut.
APPEND lv_exclude
TO gt_exclude.
显示ALV函数
-
函数方式显示
CALL FUNCTION
'
REUSE_ALV_GRID_DISPLAY_LVC
'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID "ABAP 程序名称
I_DEFAULT = SPACE “默认值
I_CALLBACK_PF_STATUS_SET = 'SUB_ALV_STATUS' ”状态按钮布局
I_CALLBACK_USER_COMMAND = 'SUB_ALV_COMMAND' “按钮单机事件
IS_LAYOUT_LVC = GS_LAYOUT ”ALV显示格式
IT_FIELDCAT_LVC = GT_FIELDCAT “ALV显示字段
TABLES
T_OUTTAB = GT_ALV ”显示数据
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
2. 类方法事件展示
DATA :gr_alv
TYPE REF TO
cl_gui_alv_grid,
gt_exclude
TYPE
ui_functions,
gt_sort
TYPE
lvc_t_sort.
-
创建输出的ALV
CREATE OBJECT gr_alv
EXPORTING
* I_PARENT = GR_BODY
i_parent = cl_gui_container=>screen0.
-
显示ALV
CALL METHOD gr_alv->
set_table_for_first_display
EXPORTING
is_variant = gs_variant “
DISVARIANT程序外用格式
i_save = 'A'
is_layout = gs_layout ”ALV显示格式
it_toolbar_excluding = gt_exclude “ALV按钮控制
CHANGING
it_outtab = gt_alv[] ”显示数据
it_fieldcatalog = gt_field[] “ALV显示字段
it_sort = gt_sort[]. ”ALV 控制:排序顺序
-
刷新ALV
DATA: ls_stable
TYPE
lvc_s_stbl.
CHECK pr_alv
IS NOT INITIAL.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
CALL METHOD pr_alv->
refresh_table_display
EXPORTING
is_stable = ls_stable.
注册ALV事件
-
事件类定义
CLASS lcl_event_handler
DEFINITION DEFERRED.
DATA: gr_event_handler
TYPE REF TO lcl_event_handler.
CREATE OBJECT gr_event_handler .
SET HANDLER gr_event_handler->handle_toolbar
FOR gr_alv. " 添加按钮 【
CL_ALV_EVENT_TOOLBAR_SET->MT_TOOLBAR】
*
SET HANDLER GR_EVENT_HANDLER->HANDLE_MENU_BUTTON
FOR GR_ALV . " 添加菜单栏按钮
SET HANDLER gr_event_handler->handle_user_command
FOR gr_alv . "按钮事件
SET HANDLER
gr_event_handler->handle_data_changed
FOR
gr_alv.”修改事件
CALL METHOD
gr_event_handler->
register_edit_event
EXPORTING
i_event_id =
cl_gui_alv_grid=>mc_evt_modified. "修改,光标移除
*
SET HANDLER gr_event_handler->handle_onf4
FOR gr_alv . “搜索帮助事件
SET HANDLER gr_event_handler->handle_double_click
FOR gr_alv . ”双击事件 ——
跳转屏幕事件
【
SET PARAMETER ID
'MAT'
FIELD
ls_list-matnr.
CALL TRANSACTION
'MM03'
AND SKIP FIRST SCREEN.】
如果是MIGO界面跳转上边方法不适用,需要用函数——
MIGO_DIALOG进行页面跳转
CALL FUNCTION
'MIGO_DIALOG'
EXPORTING
I
_
ACTION
=
'A04'
I
_
REFDOC
=
'R02'
I
_
MBLNR
=
'4900000324'
I
_
MJAHR
=
'2018'
EXCEPTIONS
ILLEGAL
_
COMBINATION
=
1
OTHERS
=
2
-
事件点击进入下面PERFORM事件
METHOD handle_user_command.
PERFORM frm_handle_ucomm
USING e_ucomm. 【 LVC_S_ROID-ROW_ID 选中行】
ENDMETHOD.
搜索帮助两种方式:
-
事件方式
DATA: LT_F4 TYPE LVC_T_F4
WITH
HEADER LINE.
CLEAR LT_F4.
LT_F4-FIELDNAME =
'MDV01'
.
LT_F4-REGISTER =
'X'
.
LT_F4-CHNGEAFTER =
'X'
.
* LT_F4-GETBEFORE =
'X'
.
* LT_F4-INTERNAL =
'X'
.
APPEND LT_F4.
CALL
METHOD PP_ALV_GRID->REGISTER_F4_FOR_FIELDS
EXPORTING
IT_F4 = LT_F4[].
-
函数方式
CALL FUNCTION '
F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'EQUNR' "筛选内表里面的字段
DYNPPROG = SY-REPID
DYNPNR = SY-DYNNR
DYNPROFIELD = 'GS_TAB-ZEQUNR' "ALV内表字段
VALUE_ORG = 'S'
" CALLBACK_PROGRAM = SY-REPID
TABLES
VALUE_TAB = GT_EQUI "需要显示帮助的值内表
RETURN_TAB = LT_RETURN "返回值
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC = 0.
****将选的值填入ALV字段中
READ TABLE gt_tab
INTO gs_tab
INDEX p_row_no-row_id.
IF sy-subrc = 0.
READ TABLE lt_return
INTO ls_return
INDEX 1.
IF ls_return-fieldval
IS NOT INITIAL.
GS_TAB-ZEQUNR = ls_return-fieldval.
ENDIF.
MODIFY gt_tab
FROM gs_tab
INDEX p_row_no-row_id
TRANSPORTING ZEQUNR.
ENDIF.
ENDIF.
报表可输入弹出窗口-[
POPUP_GET_VALUES_USER_HELP
]
DATA
:
l
_
ret
TYPE
c
,
git
_
tab
TYPE
STANDARD TABLE OF
sval
WITH
HEADER
LINE
.
CLEAR
git
_
tab
.
git
_
tab
-
tabname
=
'AFKO'
.
git
_
tab
-
fieldname
=
'AUFNR'
.
git
_
tab
-
fieldtext
=
'生产订单号'
.
git
_
tab
-
field
_
attr
=
'02'
.
git
_
tab
-
value
=
'0100000001'
.
APPEND
git
_
tab
.
CLEAR
git
_
tab
.
git
_
tab
-
tabname
=
'AFKO'
.
git
_
tab
-
fieldname
=
'GAMNG'
.
git
_
tab
-
fieldtext
=
'订单数量'
.
git
_
tab
-
field
_
attr
=
''
.
APPEND
git
_
tab
.
CALL FUNCTION
'POPUP_GET_VALUES_USER_HELP'
EXPORTING
* F1_FORMNAME = ' '
* F1_PROGRAMNAME = ' '
* F4_FORMNAME = ' '
* F4_PROGRAMNAME = ' '
* FORMNAME = ' '
* PROGRAMNAME = ' '
* START_COLUMN = '5'
* START_ROW = '5'
* NO_CHECK_FOR_FIXED_VALUES = ' '
IMPORTING
returncode
=
l
_
ret
TABLES
fields
=
git
_
tab
EXCEPTIONS
error
_
in
_
fields
=
1
OTHERS = 2.
IF
sy
-
subrc
<
>
0.
* Implement suitable error handling here
ELSE
.
READ TABLE
git
_
tab
INDEX
2.
IF
sy
-
subrc
=
0.
CONDENSE
git
_
tab
-
value
.
WRITE
:
git
_
tab
-
value
LEFT-JUSTIFIED
.
ENDIF
.
ENDIF.
在弹出的窗口中输出内表[
BKK_POPUP_DISPLAY_LIST
]
DATA
:
return
LIKE
rsnewleng
-
fcode
.
DATA
:
BEGIN OF
itab
OCCURS
0
,
posnr
(
6
)
,
ettyp
(
10
)
,
END OF
itab
.
itab
-
posnr
=
1.
itab
-
ettyp
=
'aa'
.
APPEND
itab
.
itab
-
posnr
=
2.
itab
-
ettyp
=
'bb'
.
APPEND
itab
.
CALL FUNCTION
'BKK_POPUP_DISPLAY_LIST'
EXPORTING
i
_
callback
_
program
=
sy
-
repid
"程序名
i
_
callback
_
write
_
form
=
'FRM_WRITE_CONTENTS'
"输出表内容的form名
i
_
title
=
'test'
i
_
start
_
column
=
25
i
_
start
_
row
=
15
i
_
end
_
column
=
60
i
_
end
_
row
=
20
IMPORTING
answer
=
return
.
*&---------------------------------------------------------------------*
*& Form frm_write_contents
*&---------------------------------------------------------------------*
FORM
frm
_
write
_
contents
.
LOOP AT
itab
.
WRITE
:
/
itab
-
posnr
,
' '
,
itab
-
ettyp
.
ENDLOOP
.
ENDFORM. "l_server_info_contents
创建屏幕(dialog屏幕自建与向导创建查看单独笔记)
CALL SCREEN 9000.
格式编辑
可以通过函数ICON_CREATE将alv中的单元格(Cell)变成ICON.
CALL FUNCTION
'ICON_CREATE'
EXPORTING
name
=
icon
_
pdf
"图标名字
info
=
'PDF'
IMPORTING
result
=
<
lfs
_
alv
>
-
pdf
_
order
EXCEPTIONS
OTHERS
=
0.
REUSE_ALV_GRID_DISPLAY_LVC创建的alv能显示很多列示例
调用ALV报表程序方法:
RANGES: r_lifnr
FOR table-lifnr.
*参数:
APPEND |IEQ{ p_lifnr }|
TO r_lifnr.
APPEND |IEQ{ p_werks }|
TO r_werks.
APPEND |IEQ{ sy-datum }00000000|
TO r_date.
SUBMIT zmmxxxx
WITH slifnr
IN r_lifnr
WITH swerks
IN r_werks
WITH sdate
IN r_date
EXPORTING LIST TO MEMORY “这个加上可以不会因为return而退出,会继续走后面逻辑”
AND RETURN.
获取报表数据—
使用:
submit
和
cl_salv_bs_runtime_info=>get_data
或者
get_data_ref
DATA:
lr_alv_data
TYPE TABLE OF
bkpf_alv. "这个结构去被调用程序中找到的报表显示的结构"
TRY.
cl_salv_bs_runtime_info=>get_data
(
IMPORTING
t_data = lr_alv_data ).
CATCH
cx_salv_bs_sc_runtime_info.
MESSAGE
'查询结果为空!'
TYPE
'E'.
ENDTRY
.
cl_salv_bs_runtime_info=>clear_all( ).
cl_demo_output=>display
( lr_alv_data )."快速窗口输出结果
问题总结:
ALV界面鼠标右键缺失了“电子表格”这个选项,如下图所示:
解决方案:对该报表程序新建一个GUI状态,然后在ALV的相关Function中进行调用即可解决,如图:
定点运算问题:
标记结果按照正常计算逻辑
标记计算:
程序执行跟踪——ST05
在Trace Modes 区域中选择需要在SAP R/3 Server 上trace 的范围:
SQL Trace: 追踪该AP Server 上已过滤的SQL 语句。
Enqueue Trace: 追踪Enqueue Server 上的队列。
RFC Trace: 追踪该AP Server 上RFC 行为。
Buffer Trace: 追踪该AP Server 上Buffer 中的行为。
这里若要追踪SQL 则只要选中SQL Trace。然后在Trace Requests 区域中点选 Trace on with Filter 进行输出过滤:
Duration: 执行这条操作所消耗的时间,单位是微秒。1微秒=1/1000000秒。
Objectname: 指示该条操作的对象,对于SQL Trace 一般就是Table name。
Op.: 指示该条操作的类型。其中对应OPEN的条目对SQL 性能具有很大的参考价值。
Statement: 指示该条操作所下的SQL 语句(不完全和ABAP 语句中的SQL 一样)
点击SQL 语句,可以显示该语句的所有信息,包括条件变量(使用@PXXX 字符替换)。甚至按F5 可以直接跳转到ABAP 语句,方便大家修改调试。
注意事项:
1. 进入ST05 追踪后可以关闭该界面继续执行其他操作,而不会影响到ST05 的执行。
2. 因为ST05 不会随界面的关闭而结束,那么必须在使用完ST05 后手动停止追踪,否则会持续追踪,直到SAP DB LOG 满为止。这样将会导致系统故障。
3.使用追踪看到的SQL 语句是ABAP SQL 经解释后的版本,可能其中ABAP SQL 将会被自动分解或优化。可以参照ABAP code 进行比对。
程序后台执行——
SM37查看执行进度
SM36—创建后台作业
运行dump查看—
ST22