ABAP 一个主调程序调用另一个程序,获取另一个程序的ALV数据列表

核心知识

在这里插入图片描述

核心步骤

1、设置-SET

在这里插入图片描述

2、获取ALV内表的值(数据引用)

在这里插入图片描述

3、清空变量

在这里插入图片描述

自己尝试

被调程序:Z_ALV_LHY

在这里插入图片描述

代码

*&---------------------------------------------------------------------*
*& Report ZTEST_ALV_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_alv_lhy.

*--第一步:声明ALV的相关变量

TYPE-POOLS:slis.
*DATA:lt_fieldcat  TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
*      ls_fieldcat TYPE slis_fieldcat_alv, "
*      ls_layout TYPE slis_layout_alv. "alv格式控制的结构体:layout

DATA:lt_fieldcat  TYPE slis_t_fieldcat_alv. "存储fieldcat的内表
DATA lv_colpos TYPE int2.

*--第二步:定义结构
TYPES:BEGIN OF ty_alvshow,
  vbeln TYPE vbak-vbeln,"销售凭证
  erdat TYPE vbak-erdat,"记录建立日期
  kunnr TYPE vbak-kunnr, "售达方
  vtweg TYPE vbak-vtweg, "分销渠道
  ernam TYPE vbak-ernam, "创建人员名称
  posnr TYPE vbap-posnr, "销售凭证项目
  matnr TYPE vbap-matnr, "物料
  END OF ty_alvshow.

*--第三步:定义内表和工作区
DATA: wa_alvshow TYPE  ty_alvshow. "工作区
DATA: lt_alvshow TYPE TABLE OF ty_alvshow. "内表

*--第四步:读取数据
SELECT
a~vbeln a~erdat kunnr vtweg a~kostl posnr matnr
  FROM vbak AS a INNER JOIN vbap AS b
  ON a~vbeln = b~vbeln
  INTO TABLE lt_alvshow
  UP TO 10 ROWS.


DATA: gt_listheader TYPE slis_t_listheader,  "ALV 表头
      gs_setting    TYPE lvc_s_glay,
      gs_layout     TYPE lvc_s_layo.  "ALV布局工作区

DATA: gs_fieldcat  TYPE lvc_s_fcat,  "字段工作区
      gt_fieldcat  TYPE lvc_t_fcat.  "字段的表

DATA: gs_sort TYPE lvc_s_sort,   "ALV 控制:排序顺序,结构类型
      gt_sort TYPE lvc_t_sort.   "ALV 控制:排序标准表

PERFORM frm_set_layout.     "设置布局
PERFORM frm_set_fieldcat.   "设置字段
PERFORM frm_show_alv. "展示alv
PERFORM form_top_of_pace.  "控制标题的显示

FORM frm_set_layout. "设置布局的子程序
  gs_layout-zebra = 'X'.  "斑纹的页面列表输出’
  gs_layout-detailtitl = '详细信息'.
*    Write: 'set layout'.
ENDFORM.

FORM frm_set_fieldcat.
    CLEAR gs_fieldcat."????
    REFRESH gt_fieldcat. "????

    DEFINE set_fieldcat. "定义字段宏
      gs_fieldcat-fieldname = &1. "标识列对应的字段名
      gs_fieldcat-coltext = &2. "ALV 控制: 列标题
      gs_fieldcat-no_zero = &3. "是否隐藏输出为0的字段
      gs_fieldcat-key = &4. "是否是关键字
      gs_fieldcat-outputlen = &5. "列输出的字符宽度
      gs_fieldcat-ref_table = &6. "ALV 控制: 内部表字段的参考表名称
      gs_fieldcat-ref_field = &7. "ALV 控制: 内部表字段的参考字段名称
      gs_fieldcat-drdn_hndl = &8. "4 字节带符号整数
      gs_fieldcat-just      = 'L'."ALV 控制: 对齐
      APPEND gs_fieldcat TO gt_fieldcat.
      CLEAR gs_fieldcat.  "????
    END-OF-DEFINITION.
    set_fieldcat 'vbeln' '销售凭证' '' '' '' '' '' ''. "这里不隐藏0的部分
    set_fieldcat 'erdat' '记录建立日期' 'X' '' '' '' '' ''.
    set_fieldcat 'kunnr' '售达方' 'X' '' '' '' '' ''.
    set_fieldcat 'vtweg' '分销渠道' 'X' '' '' '' '' ''.
    set_fieldcat 'ernam' '创建人员名称' 'X' '' '' '' '' ''.
    set_fieldcat 'posnr' '销售凭证项目' 'X' '' '' '' '' ''.
    set_fieldcat 'matnr' '物料' 'X' '' '' '' '' ''.

    DEFINE set_sort.  "定义排序宏
      CLEAR gs_sort.
      gs_sort-fieldname = &1.
      gs_sort-spos = 1. "排序顺序
      gs_sort-up = 'X'. "升序排列
      gs_sort-subtot = 'X'. "输出小计
      APPEND gs_sort TO gt_sort.
    END-OF-DEFINITION.
    "调用宏
*  第一种调用宏的写法
    set_sort: 'vbeln','erdat','kunnr','vtweg','ernam','posnr','matnr'.
*    write:/.
*  第二种调用宏的写法
*    set_sort 'vbeln'.
*    set_sort 'erdat'.
*    set_sort 'kunnr'.
*    set_sort 'vtweg'.
*    set_sort 'ernam'.
*    set_sort 'posnr'.
*    set_sort 'matnr'.
ENDFORM.

FORM form_pf_status_set USING rt_extab TYPE slis_t_extab. "设置GUI状态,设置工具栏
  SET PF-STATUS 'ZTEST_STANDARD'.
  "需要使用 set PF-STATUS 才能调用我们的工具栏,
  "原来是STANDARD,现在改成我们自己的状态名
ENDFORM.

FORM frm_show_alv. "显示ALV
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'" 调用函数模块
  EXPORTING
    i_callback_program        = sy-cprog
    i_callback_pf_status_set  = 'FORM_PF_STATUS_SET'"输入函数名称,名字要输对,要大写
    "i_callback_user_command  = 'SUB_USER_COMMAND'

  "i_callback_pf_status_set = 'form_pf_status_set' " 设置GUI状态,设置工具栏
    i_callback_top_of_page    = 'FORM_TOP_OF_PACE' " 设置标题,要大写
    is_layout_lvc             = gs_layout " ALV输出布局样式
    it_fieldcat_lvc           = gt_fieldcat " 设定显示的项目名称及输出设定
"    it_sort_lvc               = gt_sort "排序
    i_save                    = 'A'  " 保存表格布局:'X'-只能保存为全局标准变式,'U'-只能保存特定用户变式,'A'-都可以保存,SPACE-不能保存变式(默认:space)
  TABLES
    t_outtab = lt_alvshow  " 必须参数,要显示的内表
  EXCEPTIONS
    program_error = 1
    OTHERS = 2.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.



FORM form_top_of_pace. "设置标题
 "设置大号的标题
 DATA LT_Commentary TYPE slis_t_listheader.
 DATA WA_Commentary TYPE slis_listheader.

 WA_Commentary-typ = 'H'.
 WA_Commentary-info = '销售凭证清单'.
 APPEND WA_Commentary TO LT_Commentary.

 "设置中号的标题
 WA_Commentary-typ = 'S'.
 WA_Commentary-info = '销售凭证清单'.
 APPEND WA_Commentary TO LT_Commentary.

 "设置小号的标题
 WA_Commentary-typ = 'A'.
 WA_Commentary-info = '销售凭证清单'.
 APPEND WA_Commentary TO LT_Commentary.


CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
  EXPORTING
    it_list_commentary       = LT_Commentary"因为这个参数是一个类表,故赋值一个类表
    i_logo                   = 'LOGO'. "名称一定要大写
*   I_END_OF_LIST_GRID       =
*   I_ALV_FORM               =.

ENDFORM.

主调程序:Z_GET_OTHERALV

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

代码

*&---------------------------------------------------------------------*
*& Report Z_GET_OTHERALV
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT Z_GET_OTHERALV.

DATA REF_DATA TYPE REF TO DATA.
TYPES: BEGIN OF GTY_OUT,
         VBELN TYPE VBAK-VBELN, "销售凭证
         ERDAT TYPE VBAK-ERDAT, "记录建立日期
         KUNNR TYPE VBAK-KUNNR, "售达方
         VTWEG TYPE VBAK-VTWEG, "分销渠道
         ERNAM TYPE VBAK-ERNAM, "创建人员名称
         POSNR TYPE VBAP-POSNR, "销售凭证项目
         MATNR TYPE VBAP-MATNR, "物料
       END OF GTY_OUT.
DATA: GS_OUT TYPE GTY_OUT,
      GT_OUT TYPE TABLE OF GTY_OUT.

FIELD-SYMBOLS <LT_DATA> TYPE STANDARD TABLE. "定义承接数据的动态内表,不提前定义这种类型的话,无法使用LOOP循环

"1、设置CL_SALV_BS_RUNTIME_INFO的初始设置
CALL METHOD CL_SALV_BS_RUNTIME_INFO=>SET
  EXPORTING
    DISPLAY  = ABAP_FALSE
    METADATA = ABAP_FALSE
    DATA     = ABAP_TRUE.


SUBMIT Z_ALV_LHY AND RETURN.

TRY.
  "2、获取数据引用
    CALL METHOD CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF
      IMPORTING
        R_DATA = REF_DATA.
  CATCH CX_SALV_BS_SC_RUNTIME_INFO INTO DATA(LS_CX_SALV_BS_SC_RUNTIME_INFO).
    WRITE LS_CX_SALV_BS_SC_RUNTIME_INFO->GET_TEXT( ).
ENDTRY.

"3、清空变量
CALL METHOD CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL.
ASSIGN REF_DATA->* TO <LT_DATA>.

CHECK <LT_DATA> IS ASSIGNED.


LOOP AT <LT_DATA> ASSIGNING FIELD-SYMBOL(<FS_DATA>).
  MOVE-CORRESPONDING <FS_DATA> TO GS_OUT.
  IF GS_OUT-ERDAT = '20250318'.
    GS_OUT-ERNAM = 'LiuHongyu'.
  ENDIF.
  APPEND GS_OUT TO GT_OUT.
  CLEAR GS_OUT.
ENDLOOP.

CL_DEMO_OUTPUT=>DISPLAY( GT_OUT ).

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值