ABAP BAPI和函数返回消息通常是包括程序名、日期、时间、操作人、消息号等。
其中,bapi不管运行成功或者失败都会返回消息,而系统标准函数则如果运行失败返回的消息是空、只有出问题的时候才是非空,这一点需要特别注意。
此外,call bapi之后,即便返回的消息是成功的,然而真正commit之后并不一定会成功,例如拣配的bapi,我们判断拣配是否成功其实应该select vbuk表来判断拣配状态,而不是看bapi的返回消息中是否含有E类型。
如果查询vbuk发现对应的状态不是C,则表明bapi实际上没有执行成功、必须要rollback,否则后续的操作会有问题。
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
TABLES:T100. DATA: gt_t100 TYPE TABLE OF t100 WITH HEADER LINE. DATA: gt_t100 TYPE TABLE OF t100 WITH HEADER LINE. LOOP AT lt_likpgi. CALL FUNCTION 'RV_DELIVERY_INIT'. i_vbkok-vbeln_vl = lt_likpgi-vbeln. "<- Delivery number i_vbkok-wabuc = 'X'. "<- Automatic PGI "i_vbkok-wadat_ist = lt_likpgi-bldat. "header. "发货日期要取第三方系统回传的发实际发货日期,如果没有回传则取sy-datum. CLEAR lv_pgidata. SELECT SINGLE wadat INTO lv_pgidata FROM zthylips01 WHERE ecc_dn EQ lt_likpgi-vbeln. IF lv_pgidata IS INITIAL OR lv_pgidata EQ '00000000'. i_vbkok-wadat_ist = sy-datum. i_vbkok-wadat = sy-datum. i_vbkok-lfdat = sy-datum. ELSE. i_vbkok-wadat_ist = lv_pgidata. i_vbkok-wadat = lv_pgidata. i_vbkok-lfdat = lv_pgidata. ENDIF. "填充行项目数据 CLEAR lt_lipsgi. REFRESH i_vbpok_tab[]. LOOP AT lt_lipsgi WHERE vbeln EQ lt_likpgi-vbeln. CLEAR i_vbpok_tab. i_vbpok_tab-vbeln_vl = lt_likpgi-vbeln. "<- Delivery number i_vbpok_tab-posnr_vl = lt_lipsgi-posnr. i_vbpok_tab-vbeln = lt_likpgi-vbeln. i_vbpok_tab-posnn = lt_lipsgi-posnr. i_vbpok_tab-matnr = lt_lipsgi-matnr. i_vbpok_tab-pikmg = lt_lipsgi-lfimg. * i_vbpok_tab-charg = lt_lipsgi-charg. * i_vbpok_tab-lgort = lt_lipsgi-lgort. APPEND i_vbpok_tab. CLEAR lt_lipsgi. ENDLOOP. *发货过账. REFRESH et_prot[]. CLEAR et_prot. CALL FUNCTION 'WS_DELIVERY_UPDATE' EXPORTING vbkok_wa = i_vbkok commit = 'X' delivery = lt_likpgi-vbeln update_picking = 'X' TABLES vbpok_tab = i_vbpok_tab prot = et_prot EXCEPTIONS error_message = 1 OTHERS = 2. "此函数没有return表,消息内容在log表PROT中 "获取father uuid. READ TABLE lt_zthyvbak01gi WITH KEY ecc_dn = lt_likpgi-vbeln. REFRESH gt_zthybapimsg[]. REFRESH gt_t100[]. LOOP AT et_prot. CLEAR gt_zthybapimsg. CLEAR gt_t100. "将message整理,装备写入数据库表ZTHYBAPIMSG. gt_zthybapimsg-uuid_father = lt_zthyvbak01gi-uuid . gv_uuid = ''. PERFORM frm_gen_uuid CHANGING gv_uuid. gt_zthybapimsg-uuid_son = gv_uuid . gt_zthybapimsg-zzdate = sy-datum . gt_zthybapimsg-zztime = sy-uzeit . gt_zthybapimsg-zzuser = sy-uname . gt_zthybapimsg-zzapplication = sy-repid . gt_zthybapimsg-zzaction = 'WS_DELIVERY_UPDATE' . gt_zthybapimsg-zztype = et_prot-msgty . gt_zthybapimsg-zzid = et_prot-msgid . gt_zthybapimsg-zznumber = et_prot-msgno . gt_zthybapimsg-zzmessage_v1 = et_prot-msgv1 . gt_zthybapimsg-zzmessage_v2 = et_prot-msgv2 . gt_zthybapimsg-zzmessage_v3 = et_prot-msgv3 . gt_zthybapimsg-zzmessage_v4 = et_prot-msgv4 . gt_zthybapimsg-zzparameter = '' . gt_zthybapimsg-zzrow = '' . gt_zthybapimsg-zzfield = '' . "消息可视化. gt_zthybapimsg-zzobject = lt_likpgi-vbeln. SELECT SINGLE * INTO CORRESPONDING FIELDS OF gt_t100 FROM t100 WHERE sprsl = 'E' "取英文. AND arbgb = et_prot-msgid AND msgnr = et_prot-msgno. * CONDENSE gt_t100-text NO-GAPS. * CONDENSE et_prot-msgv1 NO-GAPS. * CONDENSE et_prot-msgv2 NO-GAPS. * CONDENSE et_prot-msgv3 NO-GAPS. * CONDENSE et_prot-msgv4 NO-GAPS. "使用可视化消息替换bapi返回消息. gt_zthybapimsg-zzmessage = gt_t100-text. REPLACE FIRST OCCURRENCE OF '&' IN gt_zthybapimsg-zzmessage WITH et_prot-msgv1 IN CHARACTER MODE. REPLACE FIRST OCCURRENCE OF '&' IN gt_zthybapimsg-zzmessage WITH et_prot-msgv2 IN CHARACTER MODE. REPLACE FIRST OCCURRENCE OF '&' IN gt_zthybapimsg-zzmessage WITH et_prot-msgv3 IN CHARACTER MODE. REPLACE FIRST OCCURRENCE OF '&' IN gt_zthybapimsg-zzmessage WITH et_prot-msgv4 IN CHARACTER MODE. APPEND gt_zthybapimsg. APPEND gt_t100. "仅append测试用,不处理. CLEAR et_prot. ENDLOOP. "更新所有自建日志表. "更新数据库的操作必须在commit之后,否则无法成功! DELETE gt_zthybapimsg[] WHERE zztype = 'S' OR zztype = 'W' OR zztype = 'I'. INSERT zthybapimsg FROM TABLE gt_zthybapimsg[]. COMMIT WORK AND WAIT. READ TABLE et_prot WITH KEY msgty = 'E'. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. WAIT UP TO 2 SECONDS. CLEAR lv_wbstk. SELECT SINGLE wbstk INTO lv_wbstk FROM vbuk WHERE vbeln = lt_likpgi-vbeln. IF lv_wbstk = 'C'. SELECT MAX( vbeln ) INTO lv_mblnr FROM vbfa WHERE vbelv = lt_likpgi-vbeln AND vbtyp_n = 'R'. IF lv_mblnr <> ''. * output-flag = 'S'. * output-notes = '发货过账成功!'. ELSE. * output-flag = 'E'. * output-notes = '发货过账失败:找不到交货单对应的物料凭证!'. CLEAR gt_zthybapimsg. PERFORM frm_gen_uuid CHANGING gv_uuid. gt_zthybapimsg-uuid_son = gv_uuid . gt_zthybapimsg-zzdate = sy-datum . gt_zthybapimsg-zztime = sy-uzeit . gt_zthybapimsg-zzuser = sy-uname . gt_zthybapimsg-zzapplication = sy-repid . gt_zthybapimsg-zzaction = 'WS_DELIVERY_UPDATE' . gt_zthybapimsg-zztype = 'E' . gt_zthybapimsg-zzid = '无' . gt_zthybapimsg-zznumber = 999 . gt_zthybapimsg-zzmessage_v1 = ''. gt_zthybapimsg-zzmessage_v2 = '' . gt_zthybapimsg-zzmessage_v3 = '' . gt_zthybapimsg-zzmessage_v4 = '' . gt_zthybapimsg-zzparameter = '' . gt_zthybapimsg-zzrow = '' . gt_zthybapimsg-zzfield = '' . gt_zthybapimsg-zzobject = lt_likpgi-vbeln. gt_zthybapimsg-zzmessage = '发货过账失败:找不到交货单对应的物料凭证!'. INSERT zthybapimsg FROM gt_zthybapimsg. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDIF. ELSE. * output-flag = 'E'. * output-notes = '发货过账失败:交货单货物移动状态不为C!'. CLEAR gt_zthybapimsg. PERFORM frm_gen_uuid CHANGING gv_uuid. gt_zthybapimsg-uuid_son = gv_uuid . gt_zthybapimsg-zzdate = sy-datum . gt_zthybapimsg-zztime = sy-uzeit . gt_zthybapimsg-zzuser = sy-uname . gt_zthybapimsg-zzapplication = sy-repid . gt_zthybapimsg-zzaction = 'WS_DELIVERY_UPDATE' . gt_zthybapimsg-zztype = 'E' . gt_zthybapimsg-zzid = '无' . gt_zthybapimsg-zznumber = 998 . gt_zthybapimsg-zzmessage_v1 = ''. gt_zthybapimsg-zzmessage_v2 = '' . gt_zthybapimsg-zzmessage_v3 = '' . gt_zthybapimsg-zzmessage_v4 = '' . gt_zthybapimsg-zzparameter = '' . gt_zthybapimsg-zzrow = '' . gt_zthybapimsg-zzfield = '' . gt_zthybapimsg-zzobject = lt_likpgi-vbeln. gt_zthybapimsg-zzmessage = '发货过账失败:交货单货物移动状态不为C!'. INSERT zthybapimsg FROM gt_zthybapimsg. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDIF. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDIF. "获取对应的物料凭证,如果获取到则表明发货成功.\ "mkpf-XBLNR1 = lt_likpgi-vbeln. SELECT COUNT(*) INTO lv_count FROM mkpf WHERE xblnr = lt_likpgi-vbeln. IF lv_count > 0. "创建成功. UPDATE zthylips01 SET zzgi_status = 'X' WHERE uuid = lt_zthyvbak01gi-uuid. COMMIT WORK AND WAIT. ELSE. "do nothing. ENDIF. CLEAR lt_likpgi. CLEAR et_prot. CLEAR i_vbkok. CLEAR i_vbpok_tab. CLEAR gt_zthybapimsg. REFRESH gt_zthybapimsg[]. CLEAR lt_zthyvbak01gi. ENDLOOP. *endof确认DN(发货过账)-------------- ENDFORM. |
本文作者: GavinDong
版权属于: GavinDong博客
文章链接: https://gavindong.com/1666.html
如果使用过程中遇到问题,可 **点击此处** 交流沟通。
版权所有,转载时必须以链接形式注明作者和原始出处及本声明。