动态ALV报告

2020-08-26 16:43发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)表:VBRP 物料数量未按原...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


表:VBRP

物料数量未按原始表显示

输入

发票(VBELN)________到___________

我的输出:

我的源代码:

 报告ZALV_DYNAMIC。



 TYPE-POOLS:slis。



 表格:vbrp。



 类型:ts_vbrp的开头,

           vbeln TYPE vbrp-vbeln,

           fklmg TYPE vbrp-fklmg,

           matnr TYPE vbrp-matnr,

         ts_vbrp的结尾。



 数据:

 *内部表

   ts_vbrp的i_data类型标准表,

   ts_vbrp的i_data_temp类型标准表,

   i_fcat TYPE lvc_t_fcat,

   i_dynamic_table TYPE REF TO数据,

   i_fieldcat TYPE slis_t_fieldcat_alv,



 * 工作区域

   wa_fcat TYPE lvc_s_fcat,

   wa_dyn_line TYPE REF TO数据,

   wa_data TYPE ts_vbrp,



 *可变的

   v_field_name TYPE字段名,

   v_tabix TYPE sy-tabix,

   v_fieldname TYPE字段名,

   v_seltext TYPE scrtext_l。

 * -------------------------------------------------  -------------------- *

 *字段符号*

 * -------------------------------------------------  -------------------- *

 字段符号:

    TYPE STANDARD TABLE,

    TYPE STANDARD TABLE,

    TYPE任意,

    TYPE任意。





 带框架的b1块的选择屏幕开始。

 SELECT_OPTIONS s_invoi for vbrp-vbeln。

 块b的选择屏幕结束。





 选择开始。

   执行sub_slect_data。





 *填充每次运行所需的动态列

   执行sub_populate_catlog。

 *

 *建立动态内部表

   执行sub_build_int_table。

 *

 *建立ALF现场目录信息

   执行sub_alv_field_cat。



 *显示数据

   执行sub_display_data。







 *&------------------------------------------------  --------------------- *

 *&表格SUB_SLECT_DATA

 *&------------------------------------------------  --------------------- *

 *和文字

 *&------------------------------------------------  --------------------- *

 *&-> p1文字

 *&<-p2文字

 *&------------------------------------------------  --------------------- *

 FORM sub_slect_data。



   SELECT vbeln

          fklmg

          物质

          来自vbrp

          到表i_data

          在s_invoi中的vbeln。

   如果sy-subrc EQ 0。

     通过vbeln排序i_data。

     i_data_temp [] = i_data []。

     SORT i_data_temp BY matnr。

     从i_data_temp删除相邻的重复项

     比较matnr。

   万一。



 ENDFORM。  " sub_slect_data

 *&------------------------------------------------  --------------------- *

 *&表单SUB_POPULATE_CATLOG

 *&------------------------------------------------  --------------------- *

 *和文字

 *&------------------------------------------------  --------------------- *

 *&-> p1文字

 *&<-p2文字

 *&------------------------------------------------  --------------------- *

 FORM sub_populate_catlog。

   v_field_name ='VBELN'。

 *只有一个INVOICE DOC列

   使用v_field_name执行sub_pop_field_catlog。



   v_field_name ='MATNR'。

 *动态材料列为" N"个

 *取决于INVOICE和MATNR组合

   循环至i_data_temp INTO wa_data。

     使用v_field_name执行sub_pop_field_catlog。

   结局。

 ENDFORM。  " sub_populate_catlog

 *&------------------------------------------------  --------------------- *

 *&表单SUB_POP_FIELD_CATLOG

 *&------------------------------------------------  --------------------- *

 *和文字

 *&------------------------------------------------  --------------------- *

 *-> P_V_FIELD_NAME文字

 *&------------------------------------------------  --------------------- *

 FORM sub_pop_field_catlog使用p_l_field_name TYPE字段名。



   数据:dfies的l_i_dfies类型标准表,

         l_wa_dfies TYPE dfies。





   通话功能" DDIF_FIELDINFO_GET"

     出口

       tabname ='VBRP'

       栏位名称= p_l_field_name

     桌子

       dfies_tab = l_i_dfies

     例外情况

       not_found = 1

       internal_error = 2

       其他= 3。

   如果sy-subrc EQ 0。



     清除l_wa_dfies。

     读取表l_i_dfies INTO l_wa_dfies索引1。

     清除wa_fcat。

 *由于我们希望物料号成为标题文本

 *用实际工厂价值替换字段名称

     如果v_field_name ='MATNR'。

       l_wa_dfies-fieldname = wa_data-matnr。

     万一。



     将对应的l_wa_dfies移动到wa_fcat。

     将wa_fcat附加到i_fcat。

   万一。



 ENDFORM。  " sub_pop_field_catlog

 **&--------------------------------------------------------------  ---------------------- *

 **&表格SUB_ALV_FIELD_CAT

 **&--------------------------------------------------------------  ---------------------- *

 **和文字

 **&--------------------------------------------------------------  ---------------------- *

 **&-> p1文字

 **&<-p2文字

 **&--------------------------------------------------------------  ---------------------- *

 FORM sub_alv_field_cat。



 *为物料建立现场目录

   PERFORM sub_fill_alv_field_cat使用

         'VBELN''''L''Billing Doc'20。



 *材料的Matnr列数将是动态的

   循环至i_data_temp INTO wa_data。





     v_fieldname = wa_data-matnr。

     v_seltext = wa_data-matnr。



     PERFORM sub_fill_alv_field_cat使用

               v_fieldname'''L'v_seltext 18。



   结局。

 ENDFORM。  " sub_alv_field_cat

 *&------------------------------------------------  --------------------- *

 *&表格SUB_FILL_ALV_FIELD_CAT

 *&------------------------------------------------  --------------------- *

 *和文字

 *&------------------------------------------------  --------------------- *

 *-> P_文字

 *-> P_文字

 *-> P_文字

 *-> P_文字

 *-> P_36文字

 *&------------------------------------------------  --------------------- *

 FORM sub_fill_alv_field_cat使用

                              p_fldnam TYPE字段名称

                              p_tabnam TYPE标签名

                              p_justif TYPE char1

                              p_seltext类型dd03p-scrtext_l

                              p_outlen TYPE i。



   数据l_lfl_fcat类型slis_fieldcat_alv。



   l_lfl_fcat-fieldname = p_fldnam。

   l_lfl_fcat-tabname = p_tabnam。

   l_lfl_fcat-just = p_justif。

   l_lfl_fcat-seltext_l = p_seltext。

   l_lfl_fcat-outputlen = p_outlen。



   附加l_lfl_fcat至i_fieldcat。





   清除l_lfl_fcat。



 ENDFORM。  " sub_fill_alv_field_cat



 *&------------------------------------------------  --------------------- *

 *&表格SUB_BUILD_INT_TABLE

 *&------------------------------------------------  --------------------- *

 *和文字

 *&------------------------------------------------  --------------------- *

 *&-> p1文字

 *&<-p2文字

 *&------------------------------------------------  --------------------- *

 FORM sub_build_int_table。



 *使用每次运行所需的列准备动态内部表

   调用方法cl_alv_table_create => create_dynamic_table

     出口

       it_fieldcatalog = i_fcat

     输入

       ep_table = i_dynamic_table

     例外情况

       generate_subpool_dir_full = 1

       其他= 2。

 *将动态表的结构分配给字段符号

   ASSIGN i_dynamic_table-> *至。





 *创建动态工作区

   创建数据wa_dyn_line类似于的行。

   分配wa_dyn_line-> *至。

 ENDFORM。  " sub_build_int_table

 *&------------------------------------------------  --------------------- *

 *&表格SUB_DISPLAY_DATA

 *&------------------------------------------------  --------------------- *

 *和文字

 *&------------------------------------------------  --------------------- *

 *&-> p1文字

 *&<-p2文字

 *&------------------------------------------------  --------------------- *

 FORM sub_display_data。



   数据:l_count TYPE i,

         l_factor TYPE i,

         l_wa_layout TYPE slis_layout_alv,

         我输入

   将i_data循环到wa_data中。



   清除:l_factor,l_count。

 **********新*************



   使用键MATNR = WA_DATA-MATNR读取表i_data_temp

   禁止运输

   二进制搜索。



   如果sy-subrc EQ 0。



 *  +0(18)= wa_data-matnr。

      +0(18)= wa_data-VBELN。

     l_factor = sy-tabix-1。

     l_count = 18 +(36 * l_factor)。

      + l_count(36)= wa_data-fklmg。



 *在结束时。

     在MATNR结束时。

       将附加到。

       清除。

     ENDAT。

   万一。

 结局。



 l_wa_layout-colwidth_optimize ='X'。

 l_wa_layout-zebra ='X'。



 *用于显示ALV报告的功能模块

 通话功能'REUSE_ALV_GRID_DISPLAY'

   出口

     i_callback_program = sy-repid

       is_layout = l_wa_layout

     it_fieldcat = i_fieldcat

   桌子

     t_outtab = 

   例外情况

     程序错误= 1

     其他= 2。





 ENDFORM。

(26.1 kB)