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

这里写了一个简单的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. 7.Object

    Object类 超类.基类,所以类的直接或间接父类,位于继承树的最顶层 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承 Object类中所定义的方法,是所 ...

  2. Wordpress后台网址安全

    wordpress 固定的后台地址是 网站/wp-admin/ 如果对方知道你是wp建站,然后很自然的就能知道你后台登录地址.然而你密码简单的话,很容易被黑. 所以为了安全考虑,我们需要把这个默认地址 ...

  3. php ajax跨域问题解决方案

    本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com. 如果直接使用 ...

  4. uniapp使用百度地图

    要使用第三方百度地图,首先要去百度地图官方申请一个密钥,之后引入百度地图的API文件,参考使用文档即可开发使用.而在uniapp中是没法直接引入百度地图API文件的,我们要结合uniapp中的web- ...

  5. 【Linux】docker学习

    docker 使用加速器可以提升获取Docker官方镜像的速度 方法: 安装/升级Docker客户端 推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce 配置镜像加速器 针 ...

  6. 关于精准UWB人员定位系统解决方案

    WB技术, 目前主要应用在室内定位.人员定位系统等定位领域.近年来被应用在无线定位和雷达测距应用中,因此作为民用雷达和民用测距取得了较快的发展.而今天,我们主要要来介绍的产品就是UWB技术的芯片DW1 ...

  7. 链接mysql数据库报错:2003-cant connect to Mysql server on ‘localhost’(10038)

    今天用navicat连mysql时候突然报错了 我百度了一下,知道了是mysql服务没开,但是我打开了服务,发现服务里面没有mysql,于是就去cmd以管理员身份打开命令提示符,切换到安装mysql的 ...

  8. postgresql 学习链接

    1.菜鸟教程:https://www.runoob.com/postgresql/postgresql-operators.html 2.易百教程:https://www.yiibai.com/pos ...

  9. 使用go自定义生成项目LISENSE(授权协议)

    需要使用一个使用go开发的工具,叫license,在Windows下安装这个工具,请确保你使用的go sdk是1.16以上的版本,然后执行下面的命令: go install github.com/ni ...

  10. 【Pr】如何将音频剪成多段批量导出

    如何将音频剪成多段批量导出 需要软件: Pr, Adobe Media Encoder (时间线窗口中) 用剃刀将音频割成多段 (时间线窗口中) 选中音频右键 | 嵌套 | 输入名字 (嵌套快捷键:A ...