ABAP BDC金额类型字段报错

本文讨论了在处理国际企业数据时遇到的问题,如KONP-KBETR输入过长、金额字段类型转换以及不同国家日期格式的兼容性,重点提及了CONVERT_DATE_TO_EXTERNAL日期转换函数的应用。

例:KONP-KBETR(1)输入长度超过屏幕长度

需要将金额字段转为CHAR类型且压缩再写入bdc中

如有国内+国外公司的,可能日期格式也有问题

日期内外部转换函数:CONVERT_DATE_TO_EXTERNAL

<think>我们在ABAP中调用事务代码CK11N进行成本估算时,可能会遇到错误。为了获取详细的错误信息,我们可以通过程序捕获异常并分析系统返回的消息。 通常,我们可以使用函数模块`CK_F_CALCULATE_COSTPLAN`来执行成本估算,它允许我们通过参数传递数据并捕获异常。 但是,如果我们需要模拟调用CK11N的完整过程并捕获所有错误,可能需要使用事务代码的BAPI方式或者通过批输入(BDC)方式,并捕获返回的消息。 不过,更直接的方式是使用函数模块`CK_F_CALCULATE_COSTPLAN`,它能够返回详细的错误消息。 步骤: 1. 准备输入参数:我们需要提供物料、工厂、成本核算变式、成本核算版本等。 2. 调用函数模块`CK_F_CALCULATE_COSTPLAN`。 3. 处理异常:在异常中获取错误消息。 4. 从返回的消息表或者异常对象中提取错误明细。 另外,我们也可以使用`BAPI_MATPRICE_CREATESIM`这个BAPI来进行成本估算,它同样能够返回消息。 这里我们以`CK_F_CALCULATE_COSTPLAN`为例,因为它更接近CK11N的事务逻辑。 示例代码: ```abap DATA: lt_message TYPE ck_msg_ttyp, ls_message TYPE ck_msg_str. DATA: lv_matnr TYPE matnr, lv_werks TYPE werks_d, lv_kalg TYPE ck_kalg, lv_kalkvers TYPE ck_kvers. * 设置参数 lv_matnr = 'MATERIAL_NUMBER'. lv_werks = 'PLANT'. lv_kalg = 'PPC1'. "成本核算变式 lv_kalkvers = '000'. "成本核算版本 TRY. CALL FUNCTION 'CK_F_CALCULATE_COSTPLAN' EXPORTING i_matnr = lv_matnr i_werks = lv_werks i_kalg = lv_kalg i_kalkvers = lv_kalkvers IMPORTING et_message = lt_message. CATCH cx_calculation_error. " 这里可以处理异常,但通常错误信息会放在et_message中 ENDTRY. * 输出错误信息 LOOP AT lt_message INTO ls_message. WRITE: / ls_message-msgrp, ls_message-msgty, ls_message-msgid, ls_message-msgnr, ls_message-msgv1. ENDLOOP. ``` 注意:函数`CK_F_CALCULATE_COSTPLAN`在调用时需要确保输入参数正确。它会返回消息表`et_message`,其中包含了所有的消息(包括错误、警告和成功信息)。 另外,我们也可以使用函数模块`CK_F_MESSAGES_GET`来获取更详细的消息文本,但通常消息表的结构已经包含了消息的详细信息。 但是,请注意,有时错误可能是由于配置或数据不完整造成的,所以需要仔细检查消息。 如果我们需要在程序中将错误消息以文本形式显示,可以使用函数`MESSAGE_TEXT_BUILD`或者直接从表T100中读取消息文本。 示例:使用`FORMAT_MESSAGE`函数获取消息文本 ```abap DATA: lv_msg_text TYPE string. LOOP AT lt_message INTO ls_message. CALL FUNCTION 'FORMAT_MESSAGE' EXPORTING id = ls_message-msgid lang = sy-langu no = ls_message-msgnr v1 = ls_message-msgv1 v2 = ls_message-msgv2 v3 = ls_message-msgv3 v4 = ls_message-msgv4 IMPORTING msg = lv_msg_text EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc = 0. WRITE: / lv_msg_text. ENDIF. ENDLOOP. ``` 这样,我们就可以在程序运行过程中捕获CK11N调用时的错误明细。 另外,如果使用BAPI `BAPI_MATPRICE_CREATESIM`,也可以获取返回的消息表,方法类似。 注意:由于系统配置和权限的不同,上述函数模块可能在某些系统不可用,请根据实际情况选择。 相关问题: 1. 如何通过ABAP代码调用CK11N并获取成本估算结果? 2. 在SAP中,如何配置成本估算变式? 3. 如何处理ABAP程序中BAPI返回的消息? </think>### ABAP代码获取AP调用CK11N报错明细信息的方法 在ABAP中获取CK11N成本估算事务的报错明细,可通过以下两种核心方法实现: #### 方法1:使用BDC录屏捕获错误消息(推荐) ```abap DATA: lt_bdcdata TYPE TABLE OF bdcdata, lt_msgs TYPE TABLE OF bdcmsgcoll. " 1. 准备BDC数据 APPEND VALUE #( program = 'SAPLKEAK' dynpro = '1000' dynbegin = 'X' ) TO lt_bdcdata. APPEND VALUE #( fnam = 'BDC_OKCODE' fval = '=CALC' ) TO lt_bdcdata. APPEND VALUE #( fnam = 'RCKAL-KALNR' fval = gv_kalnr ) TO lt_bdcdata. "成本估算编号 " 2. 调用事务 CALL TRANSACTION 'CK11N' USING lt_bdcdata MODE 'E' MESSAGES INTO lt_msgs. " 3. 提取错误明细 LOOP AT lt_msgs ASSIGNING FIELD-SYMBOL(<fs_msg>) WHERE msgtyp CA 'EAX'. "错误/终止消息 MESSAGE ID <fs_msg>-msgid TYPE <fs_msg>-msgtyp NUMBER <fs_msg>-msgnr WITH <fs_msg>-msgv1 <fs_msg>-msgv2 <fs_msg>-msgv3 <fs_msg>-msgv4 INTO DATA(lv_error_text). WRITE: / '错误明细:', lv_error_text. ENDLOOP. ``` #### 方法2:调用BAPI获取结构化的错误信息 ```abap DATA: lt_return TYPE TABLE OF bapiret2. CALL FUNCTION 'BAPI_MATPRICE_CREATESIM' "模拟成本估算BAPI EXPORTING material = lv_matnr plant = lv_werks costingvariant = lv_kalg TABLES return = lt_return. " 提取技术性错误明细 LOOP AT lt_return ASSIGNING FIELD-SYMBOL(<fs_ret>) WHERE type CA 'EAX'. WRITE: / '错误ID:', <fs_ret>-id, / '消息号:', <fs_ret>-number, / '详细信息:', <fs_ret>-message. ENDLOOP. ``` #### 关键注意事项: 1. **权限检查** 确保用户有`CK11N`事务的`K_KE24`权限对象授权,否则会触发权限错误[^1] 2. **典型错误类型**: - `CK261` - 物料主数据缺失成本视图 - `CK804` - 作业价格未维护 - `CK911` - 物料BOM不完整 - `CKFT`系列错误 - 成本组件结构问题 3. **增强错误处理** 使用`MESSAGE ... RAISING`语句封装自定义异常: ```abap CLASS cx_ck11n_error DEFINITION INHERITING FROM cx_static_check. DATA error_details TYPE string. ENDCLASS. ``` 4. **日志持久化** 建议将错误信息存储到自定义表`ZCOST_ERROR_LOG`,包含字段: ```abap MANDT TYPE MANDT, RUNID TYPE GUID, MSGID TYPE SYMSGID, MSGNO TYPE SYMSGNO, MSGTEXT TYPE STRING, TIMESTAMP TYPE CHAR14 ``` > **调试提示**:在CK11N执行时设置断点于`LKEAKF03`子例程,这是成本计算的核心例程[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值