点击此处---> 群内免费提供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)
您为什么不使用I_DATA,而是这样做呢?
无论如何,这是我的建议:
嗨曼尼什,
由于使用内部表i_zgrc_ann_lic_tab修改了zgrc_ann_lic_tab,因此在调试模式下检查内部表的内容i_zgrc_ann_lic_tab。
此致
穆罕默德M
可能是您的附加表已经有空白记录。 您是否尝试删除所有数据并再次上传?
请使用COMMENT按钮输入评论,详细信息等,答案仅是在答案的右侧提出解决方案dixit SAP文本 区域:"在回答之前,只有在提出海报问题的解决方案时才应提交答案。"
我遇到了问题,问题出在您正在使用的课程上。 检查类中的代码。 因为在方法内部,他们将在其中添加空白行。
请检查一下该零件。
不。 excel没有任何空白记录。 我确实删除了内部表和自定义表,然后重新上传了数据。 但是每次这样做,空白行都会不断出现。
这是excel工作表的样子:
穆罕默德M
嗨,下面是内部表格的屏幕截图:
字段mandt为空白。 您认为这可能是问题吗?
此致
Manish
一周热门 更多>