动态ALV报告

2020-08-26 16:43发布

         点击此处--->   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)

         点击此处--->   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)
付费偷看设置
发送
4条回答
Haoba3210
1楼 · 2020-08-26 17:02.采纳回答

代码不可读,抱歉。 我无法阅读全部内容,但是当您从VBRP读取数据然后从比较材料中删除"重复项"时,显然存在问题。 如果同一材料有两个发票,则此后将不会在报告中显示其中一个。 我很难想象为什么会有人想要这样的报告。

总体而言,我不太了解该程序的功能。 所谓的"动态"是什么? 您可以使用明确定义的结构从数据库中读取非常具体的数据。 如果要将其呈现在ALV网格中,则只需执行此操作即可。

此外,请不要对ALV使用过时的REUSE ...函数。 改用SALV,通过SALV * DEMO *在SE38中查找演示程序。 还有许多其他过时的技术,请确保阅读文档中的最新ABAP准则或查找DSAG准则。

callcenter油条
2楼-- · 2020-08-26 17:16

睁大眼睛

这就是机器人

还是人?

这是一个问题吗?

nice_wp
3楼-- · 2020-08-26 17:06

我知道一个好的程序员是一个懈怠的程序员(即"不要重塑 轮子"),但在这里,他希望我们完成他的工作??? :-)

spaceman01
4楼-- · 2020-08-26 17:14

您好 Bhasker Reddy Anugu 我建议您看一下本教程 了解有关SAP Community Q&A的更多信息,以及如何最好地提出问题以获得有用的答案。

https://developers.sap.com/tutorials/community-qa.html

最诚挚的问候,

Mynyna(SAP社区主持人)

一周热门 更多>