SAP cx_sy_conversion_no_number 无法转换成数字

探讨EXCEL数据导入程序中常见的报错原因,聚焦于<FIELD>字段类型与<WA_ALSM_TAB>-VALUE类型的不匹配问题,详解数值与文本类型冲突的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EXCEL导入数据的程序中一般都会有类似这样的代码:

catch到报错的时候一般是此时<FIELD>的字段类型为数值类型,而<WA_ALSM_TAB>-VALUE的类型为文本,且值也为非数值数据。

SAP ABAP中,ALV(ABAP List Viewer)的`EDIT_MODE`功能允许用户在前端界面直接编辑表格数据,并通过回调函数将修改后的数据回传到程序中进行处理。以下是详细的使用方法和示例: --- ### **一、核心概念** 1. **`EDIT_MODE`的作用**: - 启用ALV表格的单元格编辑功能(如文本框、下拉框、复选框等)。 - 用户修改数据后,程序需通过事件(如`DATA_CHANGED`)捕获变更并更新内表。 2. **关键类和方法**: - `CL_GUI_ALV_GRID`:ALV控件的主类。 - `SET_READY_FOR_INPUT`:启用编辑模式。 - `REGISTER_EDIT_EVENT`:注册编辑事件(如单元格变更)。 --- ### **二、实现步骤** #### **1. 定义内表和字段目录** ```abap TYPES: BEGIN OF ty_data, matnr TYPE matnr, " 物料编号 maktx TYPE maktx, " 物料描述 menge TYPE menge_d, " 数量 END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data, gs_data TYPE ty_data. " 填充测试数据 gs_data-matnr = 'MAT-1001'. gs_data-maktx = '笔记本电脑'. gs_data-menge = 10. APPEND gs_data TO gt_data. gs_data-matnr = 'MAT-1002'. gs_data-maktx = '显示器'. gs_data-menge = 5. APPEND gs_data TO gt_data. ``` #### **2. 创建ALV控件并启用编辑模式** ```abap DATA: go_alv TYPE REF TO cl_gui_alv_grid, go_container TYPE REF TO cl_gui_custom_container. " 创建容器(屏幕上的布局区域) CREATE OBJECT go_container EXPORTING container_name = 'ALV_CONTAINER' repid = sy-repid dynnr = sy-dynnr. " 创建ALV实例 CREATE OBJECT go_alv EXPORTING i_parent = go_container. " 定义字段目录(指定可编辑字段) DATA: gt_fieldcat TYPE lvc_t_fcat. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE' EXPORTING i_structure_name = 'TY_DATA' CHANGING ct_fieldcat = gt_fieldcat. " 设置可编辑字段(通过编辑属性) LOOP AT gt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>). CASE <fs_fieldcat>-fieldname. WHEN 'MENGE'. " 数量字段设为可编辑 <fs_fieldcat>-edit = abap_true. WHEN OTHERS. <fs_fieldcat>-edit = abap_false. ENDCASE. ENDLOOP. " 显示ALV并启用编辑模式 go_alv->set_table_for_first_display( EXPORTING i_structure_name = 'TY_DATA' is_layout = VALUE #( edit_mode = abap_true ) " 关键:启用编辑模式 CHANGING it_outtab = gt_data it_fieldcatalog = gt_fieldcat ). " 注册编辑事件(捕获单元格变更) go_alv->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ). ``` #### **3. 处理数据变更事件** ```abap CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_changed. DATA: lt_modified TYPE lvc_t_modi, ls_modified TYPE lvc_s_modi. " 获取修改的单元格数据 lt_modified = er_data_changed->mt_good_cells. LOOP AT lt_modified INTO ls_modified. READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<fs_data>) INDEX ls_modified-row_id. IF sy-subrc = 0. CASE ls_modified-fieldname. WHEN 'MENGE'. " 更新内表中对应的字段 <fs_data>-menge = ls_modified-value. ENDCASE. ENDIF. ENDLOOP. " 可选:刷新ALV显示 go_alv->refresh_table_display( ). ENDMETHOD. ENDCLASS. DATA: go_event_handler TYPE REF TO lcl_event_handler. CREATE OBJECT go_event_handler. " 绑定事件处理器 SET HANDLER go_event_handler->handle_data_changed FOR go_alv. ``` --- ### **三、关键配置说明** 1. **字段目录(Field Catalog)**: - 通过`<fs_fieldcat>-edit = abap_true`设置字段可编辑。 - 支持其他属性: - `checkbox`:显示复选框。 - `dropdown`:显示下拉列表(需通过`domvalue_l`定义选项)。 2. **布局(Layout)**: - `i_layout-edit_mode = abap_true`:全局启用编辑模式。 - `i_layout-sel_mode = 'A'`:允许行选择(可选)。 3. **事件处理**: - 必须注册`mc_evt_modified`事件才能捕获单元格变更。 - 事件处理器中需通过`er_data_changed->mt_good_cells`获取修改记录。 --- ### **四、常见问题解决** 1. **编辑功能不生效**: - 检查字段目录中是否设置了`edit = abap_true`。 - 确认布局中`edit_mode`为`abap_true`。 2. **数据未同步到内表**: - 确保在事件处理器中正确更新内表(如通过`row_id`定位行)。 - 调用`refresh_table_display`刷新ALV界面。 3. **性能优化**: - 大量数据时,禁用单元格编辑(`edit = abap_false`)或分页显示。 --- ### **五、扩展功能** #### **1. 自定义下拉列表** ```abap " 在字段目录中定义下拉选项 LOOP AT gt_fieldcat ASSIGNING <fs_fieldcat> WHERE fieldname = 'MENGE'. <fs_fieldcat>-edit = abap_true. <fs_fieldcat>-domvalue_l = VALUE #( ( sign = 'I' option = 'EQ' low = '1' ) " 选项1 ( sign = 'I' option = 'EQ' low = '5' ) " 选项2 ( sign = 'I' option = 'EQ' low = '10' ) " 选项3 ). ENDLOOP. ``` #### **2. 校验输入数据** ```abap METHOD handle_data_changed. DATA: lt_modified TYPE lvc_t_modi. lt_modified = er_data_changed->mt_good_cells. LOOP AT lt_modified INTO DATA(ls_modi). IF ls_modi-fieldname = 'MENGE'. TRY. DATA(lv_value) = CONV menge_d( ls_modi-value ). IF lv_value < 0. " 校验数量不能为负 MESSAGE '数量必须大于0' TYPE 'E'. er_data_changed->add_protocol_entry( EXPORTING i_msgid = 'ZMSG' i_msgno = '001' i_fieldname = ls_modi-fieldname i_row_id = ls_modi-row_id ). ENDIF. CATCH cx_sy_conversion_no_number. MESSAGE '请输入数字' TYPE 'E'. ENDTRY. ENDIF. ENDLOOP. ENDMETHOD. ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值