1, 问题描述
调用bapi 'BAPI_SALESORDER_CREATEFROMDAT2' 创建销售订单,发现生成的销售订单有incompletion log,是关于可配置物料的,如下
可配置物料的可以通过字段MARA-KZKFG判断,
2, 问题分析
经过某大师指点发现,造成此问题的根本原因是bapi BAPI_SALESORDER_CREATEFROMDAT2中行项目ORDER_ITEMS_IN-PO_ITM_NO和configuration的ORDER_CFGS_REF-POSEX为空,没有将行项目和configuration的数据关联起来。
3, 解决方案
解决方法有两种:
方法1,当ORDER_ITEMS_IN-PO_ITM_NO和ORDER_CFGS_REF-POSEX 为空时,给这两个字段赋一个相同的假的行项目值,让行项目和配置信息关联起来,但是这么做有个副作用就是这个假行项目值会被保存到vbap-posex中,所以还要再bapi BAPI_SALESORDER_CREATEFROMDAT2 之后用直接更新表的方法将vbap-posex恢复。
方法2,写一段bdc程序模拟以下前台动作,
选中行项目,点击configuration detail按钮
然后,直接返回保存,这样就不会有incompletion log了
BDC代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
REPORT z_va02test. DATA:git_bdcdata TYPE TABLE OF bdcdata, gwa_bdcdata LIKE LINE OF git_bdcdata, git_messtab TYPE TABLE OF bdcmsgcoll, gwa_messtab LIKE LINE OF git_messtab. DATA: l_fnam TYPE bdcdata-fnam. CLEAR: git_bdcdata. PERFORM bdc_dynpro USING 'SAPMV45A' '0102'. PERFORM bdc_field USING 'BDC_OKCODE' '/00'. PERFORM bdc_field USING 'VBAK-VBELN' '0640000474'. PERFORM bdc_dynpro USING 'SAPMV45A' '4001'. PERFORM bdc_field USING 'BDC_OKCODE' 'POCO'. CONCATENATE 'RV45A-VBAP_SELKZ(' '01' ')' INTO l_fnam. PERFORM bdc_field USING l_fnam 'X'. PERFORM bdc_dynpro USING 'SAPLCEI0' '0109'. PERFORM bdc_field USING 'BDC_OKCODE' 'BACK'. PERFORM bdc_dynpro USING 'SAPMV45A' '4001'. PERFORM bdc_field USING 'BDC_OKCODE' 'SICH'. CALL FUNCTION 'CALL_TRANSACTION_FROM_TABLE_CO' STARTING NEW TASK 'INCOMPLETE_LOG' EXPORTING i_tcode = 'VA02' i_mode = 'N' i_update = 'A' TABLES t_bdcdata = git_bdcdata[] t_bdcmessages = git_messtab[] * T_PARAMETER_IDS = git_bdcdata[] EXCEPTIONS error_found = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. *&---------------------------------------------------------------------* *& Form BDC_DYNPRO *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_1785 text * -->P_1786 text *----------------------------------------------------------------------* FORM bdc_dynpro USING program dynpro. DATA: lwa_bdcdata TYPE bdcdata. CLEAR lwa_bdcdata. lwa_bdcdata-program = program. lwa_bdcdata-dynpro = dynpro. lwa_bdcdata-dynbegin = 'X'. APPEND lwa_bdcdata TO git_bdcdata. ENDFORM. *&---------------------------------------------------------------------* *& Form BDC_FIELD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_1813 text * -->P_1814 text *----------------------------------------------------------------------* FORM bdc_field USING fnam fval. DATA: lwa_bdcdata TYPE bdcdata. CLEAR lwa_bdcdata. lwa_bdcdata-fnam = fnam. lwa_bdcdata-fval = fval. APPEND lwa_bdcdata TO git_bdcdata. ENDFORM. |
注意:上面代码中,用到了CALL_TRANSACTION_FROM_TABLE_CO 开了一个新的task来实现BDC,这么做的原因是在调用BAPI_SALESORDER_CREATEFROMDAT2创建销售订单后再用call transaction va02实现BDC会出现一个iactive的屏幕,如下,
这个屏幕和sm35中的录屏不一样,导致bdc失败,所以开了新task执行bdc,这样就能成功,原因还没研究清楚。。。。
1 |
CALL FUNCTION 'CALL_TRANSACTION_FROM_TABLE_CO' STARTING NEW TASK 'INCOMPLETE_LOG' |
以上。
发表评论