事情原由: 需要用 jco 來調用 BAPI_MATERIAL_SAVEDATA 建立物料,但是發現有個 可配置欄位,沒有地方傳入 這個 bapi .
imports 和 tables 裡都沒辦法將這個欄位傳入,檢查了一下當初上線匯入的程式,發現當初外部顧問是通過改寫 這個BAPI 的原始碼,通過 memory 方式傳進去的.
當然如果 在 jco 也調一個能 export memory 的 bapi 能串連上這段修改。但是種作法本身就是不合常規的,改標準代碼還是少做的好。 所以仔細研讀了一下關於這個 bapi的 sap 英文線上文檔,其實類似這種擴充欄位,或自訂的欄位是可以通過 EXTENSIONIN 這個 table 參數傳入此bapi 的.
只要找到這種欄位所在的結構,填充結構並最終交結構填充到 EXTENSIONIN 和 EXTENSIONINX 參數裡就可以了。 找結構的話可能根據欄位原本所在的表名 按這種格式找到: bapi_te_<表名> ,bapi_te_<表名> X . 具體填寫參數方式,請參考我的一段java代碼,如果是用 abap 可相應調整一下.
// MARA-KZKFG 是否可配置物料
te_mara_data.setValue(entity.getKzkfg(),"KZKFG");
te_mara_data_x.setValue("X","KZKFG");
te_mara_data.setValue(entity.getMaterial_no(),"MATERIAL");
te_mara_data_x.setValue(entity.getMaterial_no(),"MATERIAL");
//更新擴充欄位
extensionin.appendRow();
extensionin_x.appendRow();
extensionin.setValue("BAPI_TE_MARA","STRUCTURE");
extensionin.setValue(te_mara_data.getString("MATERIAL")+te_mara_data.getString("KZKFG"),"VALUEPART1");
extensionin_x.setValue("BAPI_TE_MARAX","STRUCTURE");
extensionin_x.setValue(te_mara_data_x.getString("MATERIAL")+ te_mara_data_x.getString("KZKFG"),"VALUEPART1");