Excel上传后,第一行在自定义表中为空白

2020-09-07 02:03发布

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

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


大家好,

我正在做一个GRC实施项目,并且需要从excel工作表更新自定义表。 现在,我知道这是一个非常简单的要求,并且我已经做到了。 但是,我不得不使用面向对象的方法,因为GRC系统无法识别出truxs类型的池,也无法识别FM ALSM_EXCEL_TO_INTERNAL_TABLE。

下面是我编写的代码:

 报告zgrc_excel_to_table。

 类型:开始于t_upload,

          tcode TYPE tcode,

          sys TYPE grfn_connectorid,

          tcode_clasfcn TYPE ztcode_clasfcn,

        t_upload结束,

        开始于t_int,

          column(4)TYPE c,

          值(256)TYPE C,

        t_int的结尾。

 数据:v_container类型参考cl_gui_custom_container。

 数据:v_error类型参考i_oi_error,

       v_control类型参考i_oi_container_control,

       v_document类型参考i_oi_document_proxy,

       v_spreadsheet类型参考i_oi_spreadsheet。

 *数据声明。

 数据:t_upload的i_upload类型表,

       i_zgrc_ann_lic_tab类型表zgrc_ann_lic_tab,

       wa_zgrc_ann_lic_tab TYPE zgrc_ann_lic_tab,

       wa_upload TYPE t_upload,

       wa_value TYPE t_upload,

       i_files TYPE文件表,

       wa_files TYPE file_table,

       v_doc_name TYPE char256,

       v_changed TYPE int4,

       v_rcode TYPE int4,

       i_ranges TYPE soi_range_list,

       is_ranges TYPE soi_range_item,

       i_data TYPE soi_generic_table,

       i_int t_int类型表,

       wa_int TYPE t_int,

       wa_data TYPE soi_generic_item,

       v_action TYPE int4。



 *初始化事件。

 初始化。

   类别c_oi_errors定义负载。
 *为容器创建实例控件

   调用方法c_oi_container_control_creator => get_container_control

     输入

       控制= v_control

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。



 *在屏幕100中创建链接到容器的通用容器

   创建对象v_container

     出口

       container_name ='集装箱'

     例外情况

       cntl_error = 1

       cntl_system_error = 2

       create_error = 3

       lifetime_error = 4

       lifetime_dynpro_dynpro_link = 5

       其他= 6。

   如果sy-subrc <> 0。

     消息e208(00)包含"创建容器时出错"。

   万一。



 *建立与GUI控件的连接

   调用方法v_control-> init_control

     出口

       r3_application_name ='Excel文档容器'

       inplace_enabled ='X'

       父= v_container

     输入

       错误= v_error。


   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *创建文档代理

   呼叫方法v_control-> get_document_proxy

     出口

       document_type = soi_doctype_excel_sheet

     输入

       document_proxy = v_document

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *选择开始。

 选择开始。

 * l_file = p_file。

 *调用对话框导航到文件

   呼叫方法cl_gui_frontend_services => file_open_dialog

     出口

       default_extension ='.xls'

       file_filter ='* .xls'

       initial_directory ='C:\'

     改变

       file_table = i_files

       rc = v_rcode

       user_action = v_action

     例外情况

       file_open_dialog_failed = 1

       cntl_error = 2

       error_no_gui = 3

       其他= 4。

   如果sy-subrc <> 0。

     带有" FILE_OPEN_DIALOG"的消息e208(00)。

   万一。



 *仅在用户尚未取消的情况下继续

   检查:v_action = 0。

 *确定文件名以打开Excel文档

   读取表i_files索引1到wa_files中。

   如果sy-subrc = 0。

     CONCATENATE'FILE://'wa_files-filename INTO v_doc_name。

   其他。

     讯息e208(00)。

   万一。  " sy-subrc = 0

 *在SAPWORKDIR中打开电子表格

   呼叫方法v_document-> open_document

     出口

       open_inplace ='X'

       document_title ='Excel'

       document_url = v_doc_name

       no_flush =''

     输入

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *打开电子表格界面

   调用方法v_document-> get_spreadsheet_interface

     出口

       no_flush =''

     输入

       sheet_interface = v_spreadsheet

       错误= v_error。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *为1000行设置选择

   呼叫方法v_spreadsheet-> set_selection

     出口

       顶部= 1

       左= 1

       行='1000'

       栏='3'。

 *在电子表格中定义范围

   调用方法v_spreadsheet-> insert_range

     出口

       名称="测试"

       行='1000'

       栏='3'

       no_flush =''

     输入

       错误= v_error。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

   is_ranges-name ='测试'。

   is_ranges-rows ='1000'。

   is_ranges-columns ='3'。

   APPEND is_ranges到i_ranges。

 *获取数据

   调用方法v_spreadsheet-> get_ranges_data

     出口

       全部=''

       no_flush =''

     输入

       内容= i_data

       错误= v_error

     改变

       范围= i_ranges。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。  "关闭文件


 *关闭文件

   呼叫方法v_document-> close_document

     出口

       do_save =''

       no_flush =''

     输入

       has_changed = v_changed

       错误= v_error。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。


 *清除文件资源

   呼叫方法v_document-> release_document

     出口

       no_flush =''

     输入

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *清除文件名表

   免费:i_files,

         v_control。

   删除i_data WHERE行='1'。

   将i_data移动到i_int。

   在i_int处循环进入wa_int。
     如果wa_int-column ='1'。

       wa_upload-tcode = wa_int-value。

     ELSEIF wa_int-column ='2'。

       wa_upload-sys = wa_int值。

     ELSEIF wa_int-column ='3'。

       wa_upload-tcode_clasfcn = wa_int值。

       APPEND wa_upload至i_upload。

       清除wa_upload。

     万一。

   结局。

 *在i_upload INTO wa_upload中循环。

 *将wa_upload移动到wa_zgrc_ann_lic_tab。

 *从wa_zgrc_ann_lic_tab插入zgrc_ann_lic_tab。

 *清除wa_zgrc_ann_lic_tab。

 * ENDLOOP。

   循环至i_upload INTO wa_upload。

     将wa_upload移动到wa_zgrc_ann_lic_tab。

     附录wa_zgrc_ann_lic_tab到i_zgrc_ann_lic_tab。

 *从wa_zgrc_ann_lic_tab插入zgrc_ann_lic_tab。

     清除wa_zgrc_ann_lic_tab。

   结局。

   如果i_zgrc_ann_lic_tab不是INITIAL。

     从表i_zgrc_ann_lic_tab修改zgrc_ann_lic_tab。

     如果sy-subrc EQ 0。

       提交工作。

       消息"数据已成功上传" TYPE" S"。

     其他。

       回滚工作。

       信息"数据未成功上传"类型" E"。

     万一。

   ENDIF。

在调试时,我可以看到i_upload具有正确格式的所有数据。

但是,当我转到表格并检查条目时,第一行显示为空白(但没有删除任何数据)。

TMG看起来像:

有人可以告诉我为什么会这样吗? 系统正在上载空白行作为记录,我不知道从哪里来。 内部表中有56个条目,但有57个条目正在上传。

此致

Manish

(24.9 kB)

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

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


大家好,

我正在做一个GRC实施项目,并且需要从excel工作表更新自定义表。 现在,我知道这是一个非常简单的要求,并且我已经做到了。 但是,我不得不使用面向对象的方法,因为GRC系统无法识别出truxs类型的池,也无法识别FM ALSM_EXCEL_TO_INTERNAL_TABLE。

下面是我编写的代码:

 报告zgrc_excel_to_table。

 类型:开始于t_upload,

          tcode TYPE tcode,

          sys TYPE grfn_connectorid,

          tcode_clasfcn TYPE ztcode_clasfcn,

        t_upload结束,

        开始于t_int,

          column(4)TYPE c,

          值(256)TYPE C,

        t_int的结尾。

 数据:v_container类型参考cl_gui_custom_container。

 数据:v_error类型参考i_oi_error,

       v_control类型参考i_oi_container_control,

       v_document类型参考i_oi_document_proxy,

       v_spreadsheet类型参考i_oi_spreadsheet。

 *数据声明。

 数据:t_upload的i_upload类型表,

       i_zgrc_ann_lic_tab类型表zgrc_ann_lic_tab,

       wa_zgrc_ann_lic_tab TYPE zgrc_ann_lic_tab,

       wa_upload TYPE t_upload,

       wa_value TYPE t_upload,

       i_files TYPE文件表,

       wa_files TYPE file_table,

       v_doc_name TYPE char256,

       v_changed TYPE int4,

       v_rcode TYPE int4,

       i_ranges TYPE soi_range_list,

       is_ranges TYPE soi_range_item,

       i_data TYPE soi_generic_table,

       i_int t_int类型表,

       wa_int TYPE t_int,

       wa_data TYPE soi_generic_item,

       v_action TYPE int4。



 *初始化事件。

 初始化。

   类别c_oi_errors定义负载。
 *为容器创建实例控件

   调用方法c_oi_container_control_creator => get_container_control

     输入

       控制= v_control

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。



 *在屏幕100中创建链接到容器的通用容器

   创建对象v_container

     出口

       container_name ='集装箱'

     例外情况

       cntl_error = 1

       cntl_system_error = 2

       create_error = 3

       lifetime_error = 4

       lifetime_dynpro_dynpro_link = 5

       其他= 6。

   如果sy-subrc <> 0。

     消息e208(00)包含"创建容器时出错"。

   万一。



 *建立与GUI控件的连接

   调用方法v_control-> init_control

     出口

       r3_application_name ='Excel文档容器'

       inplace_enabled ='X'

       父= v_container

     输入

       错误= v_error。


   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *创建文档代理

   呼叫方法v_control-> get_document_proxy

     出口

       document_type = soi_doctype_excel_sheet

     输入

       document_proxy = v_document

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *选择开始。

 选择开始。

 * l_file = p_file。

 *调用对话框导航到文件

   呼叫方法cl_gui_frontend_services => file_open_dialog

     出口

       default_extension ='.xls'

       file_filter ='* .xls'

       initial_directory ='C:\'

     改变

       file_table = i_files

       rc = v_rcode

       user_action = v_action

     例外情况

       file_open_dialog_failed = 1

       cntl_error = 2

       error_no_gui = 3

       其他= 4。

   如果sy-subrc <> 0。

     带有" FILE_OPEN_DIALOG"的消息e208(00)。

   万一。



 *仅在用户尚未取消的情况下继续

   检查:v_action = 0。

 *确定文件名以打开Excel文档

   读取表i_files索引1到wa_files中。

   如果sy-subrc = 0。

     CONCATENATE'FILE://'wa_files-filename INTO v_doc_name。

   其他。

     讯息e208(00)。

   万一。  " sy-subrc = 0

 *在SAPWORKDIR中打开电子表格

   呼叫方法v_document-> open_document

     出口

       open_inplace ='X'

       document_title ='Excel'

       document_url = v_doc_name

       no_flush =''

     输入

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *打开电子表格界面

   调用方法v_document-> get_spreadsheet_interface

     出口

       no_flush =''

     输入

       sheet_interface = v_spreadsheet

       错误= v_error。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *为1000行设置选择

   呼叫方法v_spreadsheet-> set_selection

     出口

       顶部= 1

       左= 1

       行='1000'

       栏='3'。

 *在电子表格中定义范围

   调用方法v_spreadsheet-> insert_range

     出口

       名称="测试"

       行='1000'

       栏='3'

       no_flush =''

     输入

       错误= v_error。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

   is_ranges-name ='测试'。

   is_ranges-rows ='1000'。

   is_ranges-columns ='3'。

   APPEND is_ranges到i_ranges。

 *获取数据

   调用方法v_spreadsheet-> get_ranges_data

     出口

       全部=''

       no_flush =''

     输入

       内容= i_data

       错误= v_error

     改变

       范围= i_ranges。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。  "关闭文件


 *关闭文件

   呼叫方法v_document-> close_document

     出口

       do_save =''

       no_flush =''

     输入

       has_changed = v_changed

       错误= v_error。

   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。


 *清除文件资源

   呼叫方法v_document-> release_document

     出口

       no_flush =''

     输入

       错误= v_error。



   如果v_error-> has_failed ='X'。

     呼叫方法v_error-> raise_message

       出口

         类型='E'。

   万一。

 *清除文件名表

   免费:i_files,

         v_control。

   删除i_data WHERE行='1'。

   将i_data移动到i_int。

   在i_int处循环进入wa_int。
     如果wa_int-column ='1'。

       wa_upload-tcode = wa_int-value。

     ELSEIF wa_int-column ='2'。

       wa_upload-sys = wa_int值。

     ELSEIF wa_int-column ='3'。

       wa_upload-tcode_clasfcn = wa_int值。

       APPEND wa_upload至i_upload。

       清除wa_upload。

     万一。

   结局。

 *在i_upload INTO wa_upload中循环。

 *将wa_upload移动到wa_zgrc_ann_lic_tab。

 *从wa_zgrc_ann_lic_tab插入zgrc_ann_lic_tab。

 *清除wa_zgrc_ann_lic_tab。

 * ENDLOOP。

   循环至i_upload INTO wa_upload。

     将wa_upload移动到wa_zgrc_ann_lic_tab。

     附录wa_zgrc_ann_lic_tab到i_zgrc_ann_lic_tab。

 *从wa_zgrc_ann_lic_tab插入zgrc_ann_lic_tab。

     清除wa_zgrc_ann_lic_tab。

   结局。

   如果i_zgrc_ann_lic_tab不是INITIAL。

     从表i_zgrc_ann_lic_tab修改zgrc_ann_lic_tab。

     如果sy-subrc EQ 0。

       提交工作。

       消息"数据已成功上传" TYPE" S"。

     其他。

       回滚工作。

       信息"数据未成功上传"类型" E"。

     万一。

   ENDIF。

在调试时,我可以看到i_upload具有正确格式的所有数据。

但是,当我转到表格并检查条目时,第一行显示为空白(但没有删除任何数据)。

TMG看起来像:

有人可以告诉我为什么会这样吗? 系统正在上载空白行作为记录,我不知道从哪里来。 内部表中有56个条目,但有57个条目正在上传。

此致

Manish

(24.9 kB)
付费偷看设置
发送
8条回答
spaceman01
1楼 · 2020-09-07 02:50.采纳回答

您为什么不使用I_DATA,而是这样做呢?

将i_data移动到i_int。
   在i_int处循环进入wa_int。
     如果wa_int-column ='1'。

无论如何,这是我的建议:

  • 从db表中删除空行(如建议Dan
  • 再次上传文件
  • 按ROW和COLUMN对I_INT进行排序,因为如果未排序,则可以输入 column = 3条件在其他条件之前,所以您冒着将wa_upload为空/部分填充的风险
  • 在LOOP AT i_update上放置一个断点并在调试中对内部表进行排序的原因:可能是FM还读取 最后,excel中的空行也要填充。
  • 如果内部表中有空行,则您发现了错误:只需删除循环前的空行即可。
  • < li>否则,请创建一个较小的文件(如3条记录),然后按照每个步骤进行调试以查找问题。
Alawn_Xu
2楼-- · 2020-09-07 02:53

Simone Milesi 谢谢, 我使用i_data并删除了初始行。 问题解决了。 但是我无法奖励您的积分,因为"接受"按钮没有反映在您的评论下

一周热门 更多>