【ABAP——在ALV报表中调用表单打印信息】

实现一个学生信息表的打印功能,表头打印学生基本信息,循环该学生的学校信息,每当学生ID变更时新开一页并打印该学生的表头信息,然后循环打印该学生的每一条学校信息,在ALV报表中能够打印选中的学生信息,效果如图:
在这里插入图片描述
在这里插入图片描述

创建表单

定义接口

定义数据接口,用于传递学生信息
接口字段包括学员ID、姓名、性别、学校等。
在这里插入图片描述
接口字段如下
在这里插入图片描述

创建全局变量并初始化

在这里插入图片描述
GW_STUINFO: 存储当前处理的学生信息。
GW_SCHINFO: 存储学生信息的内表。
GV_INDEX: 索引变量,初始化为1,用于遍历内表

初始化:取表的第一条数作为表头学员信息
在这里插入图片描述

*
IF OUTPUT_STUINFO[] IS NOT INITIAL.
  GW_STUINFO = OUTPUT_STUINFO[ 1 ].
ENDIF.

循环显示学校信息表

  • 创建W1表头信息和W2学校信息,设置W1为次窗口,W2为主窗口
  • 在W1下创建模板W11表头
    在这里插入图片描述
    W1表头下包含的元素
    在这里插入图片描述

在W2下创建循环,用于显示学校信息的每一行
在这里插入图片描述
定义数据的LOOP循环方式
在这里插入图片描述

在循环下创建用于显示学校信息的模板和模板包含的文本
在这里插入图片描述

在循环下创建程序行
在这里插入图片描述

在程序行中更新GV_INDEX下一条数据的索引, 更新表头取下一条学员的信息

在这里插入图片描述

*更新表头和GV_INDEX
GV_INDEX = GV_INDEX + 1.
IF GV_INDEX <= LINES( OUTPUT_STUINFO ).
  GW_STUINFO = OUTPUT_STUINFO[ GV_INDEX ].
ENDIF.

在循环下创建命令用于当下一条学生ID跟正在处理的学生ID不相等时换页
在这里插入图片描述

  • 换页命令:条件 GW_STUINFO-ZCODE != GW_SCHINFO-ZCODE
    在这里插入图片描述
    在这里插入图片描述

注意

在这里插入图片描述
W2和W1的顺序不能错,LOOP循环下的模板、程序行和命令是并级的,改变顺序可能会导致表单只显示一位学生的表头信息或需要循环显示的信息不完整。

在报表中调用表单,打印信息

增加用户选择数据功能

在用来显示ALV数据的结构中添加SEL
在这里插入图片描述
在ALV字段中启动用户选择功能
在这里插入图片描述

添加ALV按钮并在ALV_USER_COMMAND 接收按钮

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

响应设置的打印按钮

  • 得到用户选择的数据

数据是用来和表单进行交互,所以表单接口定义要什么,这里我们准备什么数据

*1.定义一个和表单接口类型一致的本地内表
  DATA: LT_STUINFO TYPE ZSTUINF_JSM_TTY_01,
        LS_STUINFO TYPE ZSTUINF_JSM_STR_01.
*2.把用户选择的数据放到LT_STUINFOLOOP AT GT_ALV INTO GS_ALV WHERE SEL = 'X' .
    MOVE-CORRESPONDING GS_ALV TO LS_STUINFO.
    APPEND LS_STUINFO TO LT_STUINFO.
  ENDLOOP.

取数时要将数据根据学生ID进行排序

FORM FRM_GET_DATA .
  FIELD-SYMBOLS <FS_ALV> TYPE GTY_ALV."改变这个值,内表值也会改变
  SELECT A~ZCODE ,A~ZNAME, A~SEX,A~ZSCHOOL, B~ZSNAME, B~ZADD
    FROM ZSTUDENT_JSM_01 AS A LEFT OUTER JOIN ZSCHOOL_JSM_01 AS B
  ON A~ZSCHOOL = B~ZSCHOOL
  INTO CORRESPONDING FIELDS OF TABLE @GT_ALV
  WHERE ZCODE IN @S_CODE.

  SORT GT_ALV BY ZCODE ASCENDING.
*处理取到的数据,把F/M转换成男/LOOP AT GT_ALV ASSIGNING <FS_ALV>.
    IF <FS_ALV>-SEX = 'F'.
      <FS_ALV>-SEX = '女'.
    ELSE.
      <FS_ALV>-SEX = '男'.
    ENDIF.
  ENDLOOP.
ENDFORM.
  • 调用这个FORM
    调用SSF_FUNCTION_MODULE_NAME,拿到表单module的名字 —— 因为系统会给每个SF生成一个函数模块,所以根据参数 SmartForm的名字调用表单
*得到FORM的函数模块名称ZJSM_SF_STUINFOR_02
*调用SSF_FUNCTION_MODULE_NAME

  DATA:LV_STRING TYPE RS38L_FNAM.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME = 'ZJSM_SF_STUINFOR_02'
*     VARIANT  = ' '
*     DIRECT_CALL              = ' '
  IMPORTING
     FM_NAME  = LV_STRING
*  EXCEPTIONS
*     NO_FORM  = 1
*     NO_FUNCTION_MODULE       = 2
*     OTHERS   = 3
    .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

*调用函数模块显示表单
  CALL FUNCTION LV_STRING"使用上面生成的FORM名字来调用表单
    EXPORTING
*     ARCHIVE_INDEX      =
*     ARCHIVE_INDEX_TAB  =
*     ARCHIVE_PARAMETERS =
      CONTROL_PARAMETERS = ls_SSFCTRLOP
*     MAIL_APPL_OBJ      =
*     MAIL_RECIPIENT     =
*     MAIL_SENDER        =
      OUTPUT_OPTIONS     = ls_SSFCOMPOP
*     USER_SETTINGS      = 'X'
*   IMPORTING
*     DOCUMENT_OUTPUT_INFO       =
*     JOB_OUTPUT_INFO    =
*     JOB_OUTPUT_OPTIONS =
    TABLES
      OUTPUT_STUINFO     = LT_STUINFO
*   EXCEPTIONS
*     FORMATTING_ERROR   = 1
*     INTERNAL_ERROR     = 2
*     SEND_ERROR         = 3
*     USER_CANCELED      = 4
*     OTHERS             = 5
    .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

打印控制相关的:设置打印参数,如预览、是否弹出对话框等

*FORM修改打印参数
  DATA: ls_SSFCTRLOP TYPE SSFCTRLOP, "CONNTROL_PARAMETERS参数
        ls_SSFCOMPOP TYPE SSFCOMPOP. "OUTPUT_OPTIONS参数
*SMARTFORM的打印参数赋值
  ls_SSFCTRLOP-NO_DIALOG = 'X'. "无弹窗
  ls_SSFCTRLOP-PREVIEW   = 'X'. "预览
  ls_SSFCOMPOP-TDDEST    = 'LP01'."output参数

PRINT_STUINFO子程序完整代码如下:

FORM PRINT_STUINFO .

*1.定义一个和表单接口类型一致的本地内表
  DATA: LT_STUINFO TYPE ZSTUINF_JSM_TTY_01,
        LS_STUINFO TYPE ZSTUINF_JSM_STR_01.
*FORM修改打印参数
  DATA: ls_SSFCTRLOP TYPE SSFCTRLOP, "CONNTROL_PARAMETERS参数
        ls_SSFCOMPOP TYPE SSFCOMPOP. "OUTPUT_OPTIONS参数
*SMARTFORM的打印参数赋值
  ls_SSFCTRLOP-NO_DIALOG = 'X'. "无弹窗
  ls_SSFCTRLOP-PREVIEW   = 'X'. "预览

  ls_SSFCOMPOP-TDDEST    = 'LP01'."output参数
*2.把用户选择的数据放到LT_STUINFOLOOP AT GT_ALV INTO GS_ALV WHERE SEL = 'X' .
    MOVE-CORRESPONDING GS_ALV TO LS_STUINFO.
    APPEND LS_STUINFO TO LT_STUINFO.
  ENDLOOP.

*得到FORM的函数模块名称ZJSM_SF_STUINFOR_02
*调用SSF_FUNCTION_MODULE_NAME

  DATA:LV_STRING TYPE RS38L_FNAM.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME = 'ZJSM_SF_STUINFOR_02'
*     VARIANT  = ' '
*     DIRECT_CALL              = ' '
  IMPORTING
     FM_NAME  = LV_STRING
*  EXCEPTIONS
*     NO_FORM  = 1
*     NO_FUNCTION_MODULE       = 2
*     OTHERS   = 3
    .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
*调用函数模块显示表单
  CALL FUNCTION LV_STRING"使用上面生成的FORM名字来调用表单
    EXPORTING
*     ARCHIVE_INDEX      =
*     ARCHIVE_INDEX_TAB  =
*     ARCHIVE_PARAMETERS =
      CONTROL_PARAMETERS = ls_SSFCTRLOP
*     MAIL_APPL_OBJ      =
*     MAIL_RECIPIENT     =
*     MAIL_SENDER        =
      OUTPUT_OPTIONS     = ls_SSFCOMPOP
*     USER_SETTINGS      = 'X'
*   IMPORTING
*     DOCUMENT_OUTPUT_INFO       =
*     JOB_OUTPUT_INFO    =
*     JOB_OUTPUT_OPTIONS =
    TABLES
      OUTPUT_STUINFO     = LT_STUINFO
*   EXCEPTIONS
*     FORMATTING_ERROR   = 1
*     INTERNAL_ERROR     = 2
*     SEND_ERROR         = 3
*     USER_CANCELED      = 4
*     OTHERS             = 5
    .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值