因根据查询条件展示的报表列数不一定一致,因此采用动态内表的方式进行处理

这里写了一个简单的Demo记录一下

效果如下图:

一般来说通过选择屏幕来控制列的,我这里就简单处理,直接对内表赋予相关值,包括相关指标的数据,都是手动赋值的,大部分需求中都是通过数据库表取值在赋值的,这里根据业务情况的不同需要做出改变,代码相关如下:

REPORT y_test_demo01.

TYPES: BEGIN OF ty_alv,
item TYPE char6,
target TYPE char30,
END OF ty_alv. TYPES: BEGIN OF ty_item,
item TYPE char6,
ittxt TYPE char20,
END OF ty_item. DATA: gt_item TYPE STANDARD TABLE OF ty_item,
gt_alv TYPE STANDARD TABLE OF ty_alv,
ls_item TYPE ty_item,
ls_alv TYPE ty_alv.
*&---Field-symbols
FIELD-SYMBOLS: <dyn_alv> TYPE STANDARD TABLE. *&---ALV Object
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_layout TYPE lvc_s_layo. *&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化(选择屏幕展示之前执行)
*&---------------------------------------------------------------------*
INITIALIZATION . *&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN OUTPUT/选择屏幕控制(第二屏输出)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT . *&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN/选择屏幕执行(参数输入检查)
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN . *&---------------------------------------------------------------------*
*& START-OF-SELECTION/开始选择屏幕(点击执行按钮之后执行的语块)
*&---------------------------------------------------------------------*
START-OF-SELECTION .
PERFORM frm_deal_data. " 处理数据 *&---------------------------------------------------------------------*
*& END-OF-SELECTION/结束选择屏幕(程序结束处理,输出等)
*&---------------------------------------------------------------------*
END-OF-SELECTION .
PERFORM frm_display_alv. " 展示报表 *&---------------------------------------------------------------------*
*& Form frm_deal_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_deal_data .
" 主数据填值
ls_alv-item = '010'.
ls_alv-target = '十'.
APPEND ls_alv TO gt_alv. ls_alv-item = '020'.
ls_alv-target = '二十'.
APPEND ls_alv TO gt_alv. ls_alv-item = '030'.
ls_alv-target = '三十'.
APPEND ls_alv TO gt_alv. ls_alv-item = '040'.
ls_alv-target = '四十'.
APPEND ls_alv TO gt_alv. ls_alv-item = '050'.
ls_alv-target = '五十'.
APPEND ls_alv TO gt_alv. "填值 限定展示列的 内表 通过对这张表的 控制 来决定列的数量
ls_item-item = '010'.
ls_item-ittxt = '表头一'.
APPEND ls_item TO gt_item. * ls_item-item = '020'.
* ls_item-ittxt = '表头二'.
* APPEND ls_item TO gt_item. ls_item-item = '030'.
ls_item-ittxt = '表头三'.
APPEND ls_item TO gt_item. * ls_item-item = '040'.
* ls_item-ittxt = '表头四'.
* APPEND ls_item TO gt_item. ls_item-item = '050'.
ls_item-ittxt = '表头五'.
APPEND ls_item TO gt_item. ENDFORM. *&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv . PERFORM frm_set_dynamic_table. " 设置动态内表
PERFORM frm_fill_dyntab. " 填充动态内表
PERFORM frm_set_layout. "设置ALV输出格式
PERFORM frm_call_alv TABLES <dyn_alv>. "调用ALV函数 ENDFORM. *&---------------------------------------------------------------------*
*& Form frm_set_dynamic_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_dynamic_table .
DEFINE _set_fieldcat.
APPEND VALUE #(
fieldname = &1
ref_table = &2
ref_field = &3
coltext = &4
scrtext_l = &4
scrtext_m = &4
scrtext_s = &4
) TO gt_fieldcat.
END-OF-DEFINITION. _set_fieldcat 'TARGET' '' '' '指标'. "
LOOP AT gt_item INTO DATA(ls_item).
_set_fieldcat ls_item-item '' '' ls_item-ittxt.
ENDLOOP. " 根据字段目录创建动态内表
DATA: dyn_table TYPE REF TO data. " 指向任意类型
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = gt_fieldcat
IMPORTING
ep_table = dyn_table. " 创建动态内表
ASSIGN dyn_table->* TO <dyn_alv>.
ENDFORM. *&---------------------------------------------------------------------*
*& Form frm_fill_dyntab
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_fill_dyntab .
DATA: lv_num TYPE i,
lv_sum TYPE i. LOOP AT gt_alv INTO DATA(ls_alv). DEFINE _set_value.
IF sy-subrc EQ 0 AND <fs_value> IS ASSIGNED.
<fs_value> = &1.
UNASSIGN <fs_value>.
ENDIF.
END-OF-DEFINITION. APPEND INITIAL LINE TO <dyn_alv> ASSIGNING FIELD-SYMBOL(<fs_alv>). " 固定列 填值
ASSIGN COMPONENT 'TARGET' OF STRUCTURE <fs_alv> TO FIELD-SYMBOL(<fs_value>).
_set_value: ls_alv-target. " 动态列 填值
LOOP AT gt_item INTO DATA(ls_item).
lv_num = lv_num + 1.
lv_sum = lv_num * 10.
ASSIGN COMPONENT ls_item-item OF STRUCTURE <fs_alv> TO <fs_value>.
_set_value: lv_sum. ENDLOOP. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout = VALUE #( zebra = abap_on
cwidth_opt = abap_on ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_call_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> <DYN_ALV>
*&---------------------------------------------------------------------*
FORM frm_call_alv
TABLES
pt_outtab TYPE table. IF pt_outtab[] IS INITIAL.
MESSAGE s373(g0) DISPLAY LIKE 'E'. " 无数据记录存在
LEAVE LIST-PROCESSING.
ENDIF. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
* i_callback_user_command = 'USER_COMMAND'
* i_callback_pf_status_set = 'SET_PF_STATUS'
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = pt_outtab[]
EXCEPTIONS
program_error = 1
OTHERS = 2. ENDFORM.

ABAP 动态内表 实例展示以及代码Demo的更多相关文章

  1. ABAP 动态内表添加单元格颜色字段

    *动态内表alv显示时要求某些单元格显示颜色 *wa_fldcat-datatype不能添加LVC_T_SCOL类型,在创建好内表之后,再添加颜色列. DATA: wa_fldcat TYPE lvc ...

  2. 转载: ABAP动态内表操作

    顾名思义,动态表的列是可以根据数据的变化而变化的,会使报表显示更简洁漂亮. 以下是实现方法. ------------------------------------------- 1, 创建动态内表 ...

  3. ABAP 动态内表 动态ALV

    DATA: DY_TABLE TYPE REF TO DATA, DY_WA TYPE REF TO DATA. FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE ...

  4. 转ABAP将内表行列转换实例(动态内表) .

    把内表的行列转换,网上的例子很多,但是新人想看懂,几乎很难,所以总结下我是怎么完成的. 比如:你的内表如图: 你想让内表最后展示成这样:如图: 那么完成之后会是这样: 完成这个过程,得用到动态内表.看 ...

  5. ABAP 动态内标排序

     动态内表怎样排序动态内表怎样排序 动态内表要排序时,因为不知道内表中的字段名字,所以不能直接用SORT table BY field1 field2... 可以使用下面的方法来实现:SORT tab ...

  6. 动态ALV表实例-移动类型汇总

    TABLES:MSEG,MAKT. "定义结构 TYPES:BEGIN OF TY_DATA, MJAHR LIKE MSEG-MJAHR, "物料凭证的年份 MBLNR LIKE ...

  7. SAP ABAP: 把内表数据以excel或csv格式,通过前台或者后台的方式上传至FTP服务器

    今天接到一个FTP的需求,就是每天晚上把当天某个报表的数据自动保存excel上传到FTP服务器. SAP已经有现成的FTP函数使用,可以通过函数的方式来实现,实现前先准备一些数据: User:登录FT ...

  8. SAP ABAP ALV构建动态输出列与构建动态内表(包留备用),包含操作abap元类型表及类

    https://blog.csdn.net/zhongguomao/article/details/51095946

  9. 查找->动态查找表->键树(无代码)

    文字描述 键树定义 键树又叫数字查找树,它是一棵度大于或等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号.例如,若关键字是数值,则结点中只包含一个数位:若关键字是单词, ...

  10. 查找->动态查找表->B+树(无代码)

    文字描述 B+树定义 B+树是应文件系统所需而出的一种B-树的变型树.一棵m阶的B+树和m阶的B-树的差异在于: (1)有n棵子树的结点中含有n个关键字 (2)所有的叶子结点中包含了全部关键字的信息, ...

随机推荐

  1. sping入门介绍-bean标签的属性

    bean标签的属性 1 .基础属性 <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" ...

  2. 阿里云服务器 jdk1.8 安装配置

     阿里云服务器 jdk1.8 安装配置 下载/上传 jdk安装包 解压到指定目录 重命名解压后的文件夹名称 配置环境变量 验证JAVA环境是否安装成功 step 0.安装包准备 1 wget --no ...

  3. windows下解决getAddressInfo Failed的一种办法

    从九点到现在,解决完这个问题就四点了,其实不难,只是第一次遇到和我太菜. 就是管理员身份打开命令行然后输入ipconfig /flushdns,作用是刷新dns解析缓存,这还不够,如果只做这一步,重启 ...

  4. PHP接口微信支付

    PHP后台调用微信支付下单function wx_getPayRequest($openid, $orderid, $rmb, $title,$appoids){ $nonce = $orderid. ...

  5. Docker上安装MSSQL(SQL Server)

    ​ Mac OS X ,想安装微软的mssql-server数据库有三种方式: 第一种是在本机上安装MSSQL for Linux 版本. 第二种是安装Windows虚拟机,然后在虚拟机里面使用ISO ...

  6. List循环问题

    list循环时的问题,报错,称找不到该字段属性,原因如下: 1.字段名与toString里不匹配: 2.首字母大写了: 原回答:https://blog.csdn.net/qq_42671193/ar ...

  7. 微服务笔记之Eureka03(服务续约分析)

    服务续约接口分析 com.netflix.eureka.resources.InstanceResource#renewLease public Response renewLease( @Heade ...

  8. ajv参数验证

    1.验证枚举类型 var schema = { "properties": { "data": { "type": "object ...

  9. 记一次Mybatis-Plus动态分表DynamicTableNameInnerInterceptor里无法动态替换表名的坑

    首先上源码 protected String changeTable(String sql) { ExceptionUtils.throwMpe(null == tableNameHandler, & ...

  10. RabbitMQ管理界面使用之手动送数据

    目录 1. 找到相应的队列, 点击进入详情 2. 找到Publish Message项,填写自定义数据 3. 发送数据 4. 发送成功 5. 接收 1. 找到相应的队列, 点击进入详情 2. 找到Pu ...