ABAP ALV程序报表总结

程序类型区别:
可执行程序的特点是可以直接执行,而无需事务码,这个也是一般报表开发最常用的程序类型。我们可以在 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)
  1. INITIALIZATION: 在选择屏幕显示前,对变量进行初始化赋值。【示例: s_aedat-low/high/sign/option 进行赋默认值
  2. AT SELECTION-SCREEN :对选择屏幕的数据输入进行检查。
  3. START-OF-SELECTION :选择屏幕处理完后,数据的处理。
  4. TOP-OF-PAGE :列表显示启动新页,页头的输出。
  5. END-OF-PAGE :一节结束时,页尾的处理。
  6. AT LINE-SELECTION :用户双击选中某行触发该事件。
  7. AT PF :设置自定义菜单。
  8. AT USER-COMMAND   无论何时用 户从自定义 用户界面中  选择自定义 功能代码,  都将发生 AT USER-COMMAND  事件。
  9. 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]  行文本语言
  10. PARAMETERS [P_1] TYPE [CHAR] DEFAULT 'A'. 定义屏幕单值字段默认值
  11. SELECTION-OPTIONS [S_1] FOR [sflight-carrid].  定义屏幕多值字段
  12. ... AS CHECKBOX :复选框
  13. ... RADIOBUTTON GROUP [G].单选框
  14. ... AS LISTBOX VISIBLE LENGTH [10].下拉框
控制关键字
  1. IF(条件分支): if......endif.每个判断语句之后都要加句号。
  2. CASE(条件分支) :case(条件变量)when(变量值)......endcase。
  3. DO循环    计次循环
  4. WHILE 条件循环
    -- 使用循环要避免死循环    。        
    -- 在语句块中至少应包含一个 EXIT、 STOP 或 REJECT 语句,以便系统能够退出循环。
  1. 循环控制: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方式
  1.     表结构直接展示
 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函数
  1.   函数方式显示
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        = ' '
     popup _ title     = ' BAIDUSAP.COM '
*   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
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值