BAPI没有一步到位的,直接用BDC
DEMO
loop at gt_alv1 where sel = 'X'.
if gt_alv1-app_date is not initial.
gt_alv1-rtype = 'S'.
gt_alv1-rtmsg = '无需重复审批'.
modify gt_alv1.
continue.
endif.
* perform frm_pro_head_change using gt_alv1-aufnr gt_alv1-gamng_new gt_alv1-xianb changing gt_alv1-rtype gt_alv1-rtmsg.
* perform frm_pro_item_change.
perform frm_req_get using gt_alv1-reqnm.
*输入订单屏幕
perform frm_bdc_dynnr using 'SAPLCOKO1' '0110'.
perform frm_bdc_field using 'CAUFVD-AUFNR' gt_alv1-aufnr.
perform frm_bdc_field using 'R62CLORD-FLG_OVIEW' 'X'.
perform frm_bdc_field using 'BDC_OKCODE' '=KPU2'. "组件
lt_alv2[] = gt_alv2[].
sort lt_alv2 by ewahr descending. "先改使用概率最高的,不然会报错
loop at lt_alv2 .
if lt_alv2-new_flag = 'X'. "新增
*组件屏幕
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'BDC_CURSOR' 'RESBD-MATNR(01)'. "定位第一行
perform frm_bdc_field using 'BDC_OKCODE' '=KEIN'. "差入行
*组件屏幕
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'RESBD-POSNR(01)' lt_alv2-posnr_pro. "项目
perform frm_bdc_field using 'RESBD-MATNR(01)' lt_alv2-matnr_new. "物料
perform frm_bdc_field using 'RESBD-MENGE(01)' lt_alv2-bdmng_new. "数量
perform frm_bdc_field using 'RESBD-VORNR(01)' '0010'. "工序
perform frm_bdc_field using 'RESBD-POSTP(01)' 'L'. "项目类别
perform frm_bdc_field using 'BDC_OKCODE' '/00'. "回车(会带出工厂)
*组件明细
perform frm_bdc_dynnr using 'SAPLCOMD' '0110'.
perform frm_bdc_field using 'BDC_OKCODE' '=BACK'. "返回
else.. "删除和修改都要进来定位
*组件屏幕
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'BDC_OKCODE' '=P--'. "第一页
*组件屏幕
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'BDC_OKCODE' '=AUFS'. "定位
*定位屏幕
perform frm_bdc_dynnr using 'SAPLCO05' '0110'.
perform frm_bdc_field using 'RCOSU-POSNR' lt_alv2-posnr_pro.
perform frm_bdc_field using 'RCOSU-MATNR' lt_alv2-matnr.
perform frm_bdc_field using 'RCOSU-BDMNG' lt_alv2-bdmng.
perform frm_bdc_field using 'BDC_OKCODE' '=MORE'. "确认
if lt_alv2-del = 'X'. "删除
*组件屏幕
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'RC27X-FLG_SEL(01)' 'X'. "第一行
perform frm_bdc_field using 'BDC_OKCODE' '=DEL'. "删除
else. "修改
*组件屏幕
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'BDC_CURSOR' 'RESBD-POSNR(01)'. "第一行
perform frm_bdc_field using 'BDC_OKCODE' '=PICK'. "项目明细(双击)
*组件明细
perform frm_bdc_dynnr using 'SAPLCOMD' '0110'.
if lt_alv2-alpgr is initial.
if lt_alv2-matnr_new is not initial .
perform frm_bdc_field using 'RESBD-MATNR' lt_alv2-matnr_new. "物料
endif.
if lt_alv2-bdmng_new is not initial.
perform frm_bdc_field using 'RESBD-MENGE' lt_alv2-bdmng_new. "需求数量
endif.
else.
if lt_alv2-nomng_new is not initial.
perform frm_bdc_field using 'RESBD-NOMNG' lt_alv2-nomng_new. "原始数量
endif.
if lt_alv2-ewahr_new is not initial.
perform frm_bdc_field using 'RESBD-EWAHR' lt_alv2-ewahr_new. "使用率
endif.
endif.
perform frm_bdc_field using 'BDC_OKCODE' '=BACK'. "返回
endif.
endif.
endloop.
*组件明细
perform frm_bdc_dynnr using 'SAPLCOMK' '0120'.
perform frm_bdc_field using 'BDC_OKCODE' '=KOZE'. "抬头
*总览屏幕
perform frm_bdc_dynnr using 'SAPLCOKO1' '0115'.
if gt_alv1-gamng_new is not initial.
perform frm_bdc_field using 'CAUFVD-GAMNG' gt_alv1-gamng_new. "数量(总数量需要最后改,否则组件按数量匹配就匹配不到了)
endif.
perform frm_bdc_field using 'BDC_OKCODE' '=+COI'. "客户屏幕
*客户屏幕
perform frm_bdc_dynnr using 'SAPLCOKO1' '0115'.
if gt_alv1-xianb_new is not initial.
perform frm_bdc_field using 'Z_COCI_AUFK-ZZLINE' gt_alv1-xianb_new. "线别
endif.
perform frm_bdc_field using 'BDC_OKCODE' '=BU'. "保存
perform frm_bdc_call using 'CO02' changing gt_alv1-rtype gt_alv1-rtmsg.
if gt_alv1-rtype = 'S'.
gt_alv1-app_date = sy-datum.
gt_alv1-app_name = sy-uname.
endif.
modify gt_alv1.
update ztpp0023a set app_date = gt_alv1-app_date app_name = gt_alv1-app_name
where reqnm = gt_alv1-reqnm.
update ztpp0023b set app_date = gt_alv1-app_date app_name = gt_alv1-app_name
where reqnm = gt_alv1-reqnm.
endloop.