首页 > 其他分享 >【ABAP——在ALV报表中调用表单打印信息】

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

时间:2024-11-17 18:49:56浏览次数:3  
标签:FUNCTION 打印信息 表单 ABAP ls ALV OUTPUT STUINFO

文章目录

  • 创建表单
    • 定义接口
    • 创建全局变量并初始化
    • 循环显示学校信息表
    • 注意
  • 在报表中调用表单,打印信息
    • 增加用户选择数据功能
    • 添加ALV按钮并在ALV_USER_COMMAND 接收按钮
    • 响应设置的打印按钮

实现一个学生信息表的打印功能,表头打印学生基本信息,循环该学生的学校信息,每当学生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_STUINFO里
  LOOP 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_STUINFO里
  LOOP 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.

标签:FUNCTION,打印信息,表单,ABAP,ls,ALV,OUTPUT,STUINFO
From: https://blog.csdn.net/irisawy/article/details/143762670

相关文章

  • ABAP开发学习——权限控制
    目录概念常规应用SU01SU22PFCGSU53概念常规应用SU01:创建用户(SU01,SU02,SU03)SU22:查看事物码中的权限对象(SU20,SU21,SU22) PFCG:创建角色 SU53:权限测试(确认用户缺少权限)SU01SU22双击查看这里看到该权限根据采购组织来判断su21可以直接......
  • ABAP开发学习——ST05 ABAP SQL跟踪工具
    操作步骤第一步使用ST05之前,将要查的程序停留想要看的操作的前一步,这里想看到取数操作,所以停留在选择界面第二步进入ST05选择SQLTrace然后激活第三步去执行程序第四步ST05取消激活第五步查看操作选完时间直接执行......
  • ABAP开发学习——权限控制 实例2
    目录自建权限对象 1.SU20,创建权限字段 2.SU21,创建权限对象 2.1先创建对象类ZCK.2.2在对象类中创建权限对象3.SU02,创建参数文件,维护权限值,并激活4.SU01,为用户分配参数文件5.SE38,编写程序及效果自建权限对象业务逻辑:建立一个ZTMM_TEST1,表中插入几条数据,实现只能......
  • VisualVM 使用说明
    VisualVM简介:一个轻量级的Java进程监控软件VisualVM安装介绍(Mac使用brew安装)➜~brewuninstallvisualvm==>UninstallingCaskvisualvm==>BackingApp'VisualVM.app'upto'/opt/homebrew/Caskroom/visualvm/2.1.10/VisualVM.app'==>RemovingAp......
  • 10 倍性能提升, GraalVM 应用可观测实践
    作者:铖朴、层风GraalVM静态编译背景介绍随着云原生浪潮的蓬勃发展,利用云原生技术为企业应用提供极致的弹性能力是企业数字化升级的核心诉求。但Java作为一种解释执行+运行时实时编译的语言,相比于其他静态编译型语言天生具有如下不足,严重影响了其快速启动与扩缩容效果。冷启......
  • 在 ALV 报表中使用 CL_SALV 类时,如何处理多行?
    举个例子:我设置了显示“全选按钮”。需要选择几行,在这种情况下,已经选择了2行,并使用这2行执行了一个调用事务。但还有其他事情要做,因为ALV报告中的所有行都执行了调用事务。我找到了以下内容:layout-box_fname=“字段名”。layout-sel_mode='A'。但这种功能......
  • 如何查看 SAP ABAP Kernel Module 的源代码
    StackOverflow上有个网友提问,想查看ABAP系统生成UUID方法,在KernelModulepf_create_uuid16c32里实现的源代码:https://stackoverflow.com/questions/42110195/how-to-open-kernel-module-in-abap笔者之前的文章提到,类似上图高亮这种ABAPKernelModule,通过C语......
  • visualvm远程连接Docker容器中部署的java应用并监控
    visualvm远程连接Docker容器中部署的java应用前言jdk1.8中自带了,java11中需要单独下载下载地址visualvm下载地址简介java虚拟机监控,故障排查及性能分析工具。网络配置局域网与docker内网打通,请参考:办公网络与Docker内网网络互通服务于网络服务名称节点IPj......
  • ABAP小白开发操作手册+(十)验证和替代——上
    目录一、前言:二、步骤详解: 新建确认:新建步骤:先决条件:检查步骤:消息设置:三、传输请求四、DEBUG本章内容分为上下两篇,包括验证和替代上篇:验证步骤、传输验证请求、DEBUG下篇:替代步骤、传输替代请求、DEBUG一、前言:SAP验证和替代,也是增强的一种类型,不过更加倾向于......
  • ABAP开发-内存管理
    系列文章目录文章目录系列文章目录前言一、概述二、程序间调用三、外部会话和内部会话四、SAP内存与ABAP内存五、实例总结前言一、概述内存是程序之间为了传递数据而使用的共享存储空间,在每个程序里使用的内存有SAP内存和ABAP内存SAP内存分类SAP内存......