ABAP在ALV列表上WRITE一些内容

本文介绍了一个使用ABAP编程语言生成报告的具体示例。该示例通过定义本地类lcl_report来实现数据获取(get_data)、数据列表展示(write_list)及高级列表视图(ALV)生成(generate_alv)等功能。报告首先从sflight表中根据选择条件筛选数据,然后以不同的形式展示这些数据。
*----------------------------------------------------------------------*
*  Local class for report
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
*
  PUBLIC SECTION.
*
    DATA: t_data   TYPE STANDARD TABLE OF sflight,  " Output data
          r_carrid TYPE RANGE OF sflight-carrid.    " Select Option
*
    METHODS:
      get_data,
      write_list,
      generate_alv.
*
ENDCLASS.                    "lcl_report DEFINITION
*
DATA: o_report TYPE REF TO lcl_report.
*
DATA: v_carrid TYPE sflight-carrid.
*
** Selection Screen
SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE aaa.
SELECT-OPTIONS:   s_carrid FOR v_carrid.
SELECTION-SCREEN: END   OF BLOCK blk1.
*
** Initialization
INITIALIZATION.
  aaa = 'Selection Criteria'.
 
*
** Start of Selection
START-OF-SELECTION.
* object for the report
  CREATE OBJECT o_report.
 
* Get data
  o_report->r_carrid = s_carrid[].
  o_report->get_data( ).
 
* generate output
  o_report->write_list( ).
  o_report->generate_alv( ).
 
*----------------------------------------------------------------------*
* Local Class Implementation
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
*
  METHOD get_data.
*   data selection
    SELECT * FROM sflight
           INTO  TABLE me->t_data
           WHERE carrid IN s_carrid.
 
  ENDMETHOD.                    "get_data
*
  METHOD write_list.
 
    WRITE: / 'This list is generated using the Good Old fashioned WRITE'.
    WRITE: / ' --- Total number of records', LINES( t_data ).
 
  ENDMETHOD.
*
  METHOD generate_alv.
*   local data
    DATA: lo_dock TYPE REF TO cl_gui_docking_container,
          lo_cont TYPE REF TO cl_gui_container,
          lo_alv  TYPE REF TO cl_salv_table.
 
    DATA: lv_repid TYPE sy-repid,
          lv_dynnr TYPE sy-dynnr.
 
    lv_repid = 'SAPMSSY0'.
    lv_dynnr = '0120'.
 
*
*   Create a docking control at bottom
    CHECK lo_dock IS INITIAL.
    CREATE OBJECT lo_dock
      EXPORTING
        repid = lv_repid
        dynnr = lv_dynnr
        ratio = 80
        side  = cl_gui_docking_container=>dock_at_bottom
        NAME  = 'DOCK_CONT'.
    IF sy-subrc <> 0.
      MESSAGE 'Error in the Docking control' TYPE 'S'.
    ENDIF.
*
*   Create a SALV for output
    CHECK lo_alv IS INITIAL.
    TRY.
*       Narrow Casting: To initialize custom container from
*       docking container
        lo_cont ?= lo_dock.
*
*       SALV Table Display on the Docking container
        CALL METHOD cl_salv_table=>factory
          EXPORTING
            list_display   = if_salv_c_bool_sap=>false
            r_container    = lo_cont
            container_name = 'DOCK_CONT'
          IMPORTING
            r_salv_table   = lo_alv
          CHANGING
            t_table        = me->t_data.
      CATCH cx_salv_msg .
    ENDTRY.
*
*   Pf status
    DATA: lo_functions TYPE REF TO cl_salv_functions_list.
    lo_functions = lo_alv->get_functions( ).
    lo_functions->set_default( abap_true ).
*
*   output display
    lo_alv->display( ).
*
  ENDMETHOD.                    "generate_ALV
*
ENDCLASS.                    "lcl_report IMPLEMENTATION

 

<think> 嗯,用户的问题是关于在ABAP中让ALV在后台作业中显示输出的方法。根据用户提供的引用信息,特别是引用[1]和[2],还有用户之前的问题历史,我需要综合思考如何实现这个需求。 首先分析用户提供的两个关键引用:引用[1]说明了ALV字段过滤的技术细节,引用[2]则详细解释了后台作业调度的机制。这两个知识点需要结合起来解决当前问题。 用户真正的需求是让ALV报表在后端执行时能生成可见的输出结果。这就涉及到两个核心ABAP技术点:后台作业调度机制和ALV输出适配。后台作业和前台执行的最大区别在于输出处理方式:后台作业需要明确指定输出设备,而ALV默认在前台展示。 考虑到技术实现路径,大概需要分三步走:首先是改造现有ALV程序使其支持后台运行,这需要添加逻辑判断当前是否在后台模式执行(sy-batch)。如果是后台模式,就要将ALV输出重定向到假脱机设备(spool),而不能调用交互式的ALV显示函数。 其次是配置后台作业参数,重点在于设置输出设备为假脱机设备。在ABAP的作业调度API中,print_parameters这个结构体里的参数需要认真配置。特别是rqident参数可以指定输出ID,方便后续查找作业输出。 最后是查看后台作业结果的方法指引。作业执行完成后,用户需要通过事务码SP02在假脱机请求列表中查找对应作业ID的输出。这里可以标注一个技术细节:ALV在后台模式下实际生成的是SAPSmartForm格式的打印文档。 用户可能遇到的典型难点在于:忘记设置假脱机参数导致输出丢失,或者未正确处理ALV在后台模式下的回调异常。这些需要在代码示例中特别注意防范。 为了让解决方案更完整,还可以考虑扩展说明如何处理交互功能缺失的问题——比如后台运行的ALV无法使用过滤、排序等交互按钮,这些功能需要预先在代码中配置好。 </think> 在ABAP中实现ALV在后台作业输出显示的核心方法是通过**假脱机(Spool)技术**将ALV转换为可打印格式输出。以下是具体实现步骤和代码示例: ### 关键技术方案 1. **后台作业调度** 使用`JOB_SUBMIT`提交作业,配置`print_parameters`指定输出设备 ```abap DATA: lv_jobname TYPE tbtcjob-jobname VALUE 'ZALV_BATCH_JOB', lv_jobcount TYPE tbtcjob-jobcount, lt_seltab TYPE TABLE OF rsparams. CALL FUNCTION 'JOB_SUBMIT' EXPORTING jobname = lv_jobname report = 'ZALV_REPORT' " 你的ALV程序名 TABLES sel_params = lt_seltab IMPORTING jobcount = lv_jobcount EXCEPTIONS cannot_be_headed = 1. ``` 2. **ALV输出重定向** 在ALV程序中添加后台处理逻辑: ```abap IF sy-batch IS NOT INITIAL. " 后台模式 PERFORM export_alv_to_spool. ELSE. PERFORM display_alv_screen. " 前台显示 ENDIF. ``` 3. **生成假脱机输出** ```abap FORM export_alv_to_spool. DATA: lt_spool TYPE TABLE OF rspoli, ls_spool TYPE rspoli, lv_jobname TYPE tbtcjob-jobname. " 1. 创建假脱机请求 CALL FUNCTION 'GET_PRINT_PARAMETERS' EXPORTING im_dest = 'NULL' " 后台输出设备 IMPORTING out_parameters = ls_spool. " 2. 将ALV数据转换为可打印格式 CALL FUNCTION 'REUSE_ALV_LIST_PRINT' EXPORTING i_callback_program = sy-repid it_list_commentary = lt_comment " 表头信息 TABLES t_outtab = lt_data " ALV数据表 EXCEPTIONS print_error = 1. " 3. 提交假脱机请求 CALL FUNCTION 'SSF_COMMIT_WORK'. ENDFORM. ``` ### 关键配置说明 | **参数** | **作用** | **示例值** | |------------------|----------------------------|---------------| | `sy-batch` | 检测后台执行模式 | IF sy-batch = 'X' | | `im_dest='NULL'` | 指定后台输出设备 | 必需参数 | | `rqident` | 假脱机请求唯一标识 | 系统自动生成 | ### 查看后台输出的方法 1. 事务码 **SP02** 查看假脱机请求 2. 通过作业号查找:`SM37` -> 输入作业名/JOB COUNT 3. 输出格式:ALV将自动转换为**列表形式**的打印文档 ### 注意事项 1. **交互功能限制**:后台ALV会丢失所有交互功能(排序/筛选等),需在前置处理中通过`IT_FILTER`预设过滤条件[^1] 2. **输出尺寸**:使用`REUSE_ALV_GRID_DISPLAY_LVC`时需设置`i_print`参数控制分页 3. **权限配置**:后台作业用户需有`S_SPO_ACT`操作假脱机请求的权限 > 典型错误:未处理`REUSE_ALV_LIST_PRINT`的异常`print_error`可能导致输出丢失。建议添加异常处理: > ```abap > IF sy-subrc <> 0. > MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno > WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. > ENDIF. > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值