注
1.固定标识默认是X,需要通过增强写进去
2.删除delete_ind传L,EKET物理删除,如果lt_schedulex-sched_linex = 'X' 不传,删了之后BAPI可能会重新计算sched_line,传了之后按传输的值
3.extension的增强结构名可以通过BAPI_SAG_GETDETAIL先取出来,测试没写进去,update了,应该是漏了增强
4.如果已经收过货,修改其他计划行会报错 MEOUT 200 转包组件对 5500006237 00010 不再可更改,前台可以修改,直接隐式增强跳过报错
5.报错 61 781 确定物料部件时出错,可能是组件需求日期大于计划行日期
DEMO 1
at end of ebeln.
read table gt_alv index lv_tabix.
* call function 'BAPI_SAG_GETDETAIL'
* exporting
* purchasingdocument = gt_alv-ebeln
* item_data = 'X'
* schedule_data = 'X'
* tables
* item = lt_item
* schedule = lt_schedule
** extensionout = extensionout
** return = lt_return
* .
call function 'BAPI_SCHEDULE_MAINTAIN'
exporting
purchasingdocument = gt_alv-ebeln
tables
schedule = lt_schedule
schedulex = lt_schedulex
* EXTENSIONIN = EXTENSIONIN
* EXTENSIONOUT = EXTENSIONOUT
return = lt_return.
loop at lt_return where type ca 'AEX'.
message id lt_return-id type lt_return-type number lt_return-number
with lt_return-message_v1 lt_return-message_v2
lt_return-message_v3 lt_return-message_v4
into data(lv_msg).
gt_alv-rtmsg = gt_alv-rtmsg && lv_msg && ';'.
endloop.
if sy-subrc = 0.
call function 'BAPI_TRANSACTION_ROLLBACK'.
gt_alv-led = 1.
* lt_ekko-rtmsg = 1.
else.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
gt_alv-led = 3.
gt_alv-rtmsg = '成功'.
endif.
modify gt_alv transporting led rtmsg where ebeln = gt_alv-ebeln.
clear:lt_item,lt_item[],lt_schedule,lt_schedule[],lt_return,lt_return[].
endat.
DEMO 2
form frm_data_import .
*BAPI
data :
lt_return type bapiret2 occurs 0 with header line.
data lt_item type standard table of bapimeoutitem with header line.
data lt_schedule type standard table of bapimeoutschedule with header line.
data lt_schedulex type standard table of bapimeoutschedulex with header line.
data:begin of lt_ekko occurs 0,
ebeln like ekpo-ebeln,
* ebelp like ekpo-ebelp,
led,
rtmsg type bapi_msg,
end of lt_ekko.
data:
lv_eindt like eket-eindt.
data: begin of ls_zmmr007,
ebeln type eket-ebeln,
ebelp type eket-ebelp,
etenr type eket-etenr,
fixkz type eket-fixkz,
end of ls_zmmr007.
data lt_zmmr007 like table of ls_zmmr007.
loop at <gt_out> into <gs_out>.
move-corresponding <gs_out> to lt_ekko.
collect lt_ekko.
endloop.
select ebeln,ebelp,etenr,eindt,fixkz,glmng
into table @data(lt_eket)
from eket
for all entries in @lt_ekko
where ebeln = @lt_ekko-ebeln.
sort lt_eket by ebeln ebelp etenr descending.
data(lt_eket2) = lt_eket.
sort lt_eket2 by ebeln ebelp etenr fixkz.
loop at lt_ekko.
clear:lt_item,lt_item[],lt_schedule,lt_schedule[],lt_return,lt_return[],ls_zmmr007,lt_zmmr007.
call function 'BAPI_SAG_GETDETAIL'
exporting
purchasingdocument = lt_ekko-ebeln
item_data = 'X'
schedule_data = 'X'
tables
item = lt_item
schedule = lt_schedule
* extensionout = extensionout
* return = lt_return
.
data(lt_schedule2) = lt_schedule[].
sort lt_schedule2 by item_no sched_line descending.
loop at lt_item.
clear lv_eindt. "一个po行清一次,是为了后面一行删一次
read table lt_schedule2 into data(ls_schedule2) with key item_no = lt_item-item_no.
read table <gt_out> into <gs_out> with key ('EBELN') = lt_ekko-ebeln ('EBELP') = lt_item-item_no binary search.
if sy-subrc = 0.
loop at <gt_out> into <gs_out> from sy-tabix.
assign component 'EBELN' of structure <gs_out> to field-symbol(<lv_ebeln>).
assign component 'EBELP' of structure <gs_out> to field-symbol(<lv_ebelp>).
if <lv_ebeln> ne lt_ekko-ebeln or <lv_ebelp> ne lt_item-item_no.
exit.
endif.
loop at gt_fieldcat into data(ls_fieldcat).
if sy-tabix >= 11 and sy-tabix <= gv_counts.
assign component ls_fieldcat-fieldname of structure <gs_out> to field-symbol(<lv_menge>).
split ls_fieldcat-coltext at '-' into data(lv_date) data(lv_type) data(lv_week).
if lv_type = '02'. "建新的计划行
elseif lv_type = '03'.
if lv_eindt is initial. "一个po行删一次
lv_eindt = lv_date. "预测的最早日期
if lt_item-plant = '2031' or lt_item-plant = '2041'.
loop at lt_schedule
* where delivery_date >= lv_eindt "delivery_date居然是c
. "最早预测日期之后的预测计划行都覆盖,
data lv_datum like sy-datum.
lv_datum = lt_schedule-delivery_date(4) && lt_schedule-delivery_date+5(2) && lt_schedule-delivery_date+8(2).
if lv_datum >= lv_eindt.
read table lt_eket2 into data(ls_eket2) with key ebeln = lt_ekko-ebeln ebelp = lt_schedule-item_no etenr = lt_schedule-sched_line fixkz = 'X' binary search.
if sy-subrc = 0 and ls_eket2-glmng is initial. "已经交货的不能删
lt_schedulex-item_no = lt_schedule-item_no.
lt_schedulex-sched_line = lt_schedule-sched_line .
lt_schedulex-delete_ind = 'X'.
append lt_schedulex.
lt_schedule-delete_ind = 'L'.
modify lt_schedule.
endif.
endif.
endloop.
else.
loop at lt_schedule . "删全部预测
read table lt_eket2 into ls_eket2 with key ebeln = lt_ekko-ebeln ebelp = lt_schedule-item_no etenr = lt_schedule-sched_line fixkz = 'X' binary search.
if sy-subrc = 0 and ls_eket2-glmng is initial. "已经交货的不能删
lt_schedulex-item_no = lt_schedule-item_no.
lt_schedulex-sched_line = lt_schedule-sched_line .
lt_schedulex-delete_ind = 'X'.
append lt_schedulex.
lt_schedule-delete_ind = 'L'.
modify lt_schedule.
endif.
endloop.
endif.
endif.
endif.
if <lv_menge> is not initial.
clear:lt_schedule,lt_schedulex.
ls_schedule2-sched_line = ls_schedule2-sched_line + 1.
lt_schedule-item_no = lt_item-item_no.
lt_schedule-sched_line = ls_schedule2-sched_line.
lt_schedule-delivery_date = lv_date.
lt_schedule-quantity = <lv_menge>.
append lt_schedule.
lt_schedulex-item_no = lt_schedule-item_no.
lt_schedulex-sched_line = lt_schedule-sched_line .
lt_schedulex-delivery_date = 'X'.
lt_schedulex-quantity = 'X'.
append lt_schedulex.
clear ls_zmmr007.
ls_zmmr007-ebeln = lt_ekko-ebeln.
ls_zmmr007-ebelp = lt_schedule-item_no.
ls_zmmr007-etenr = lt_schedule-sched_line.
if lv_type = '02'.
ls_zmmr007-fixkz = ''.
elseif lv_type = '03'.
ls_zmmr007-fixkz = 'X'.
endif.
append ls_zmmr007 to lt_zmmr007.
endif.
endif.
endloop.
clear:ls_schedule2.
endloop.
endif.
endloop.
export lt_zmmr007 = lt_zmmr007 to memory id 'ZMMR007'.
call function 'BAPI_SCHEDULE_MAINTAIN'
exporting
purchasingdocument = lt_ekko-ebeln
tables
schedule = lt_schedule
schedulex = lt_schedulex
* EXTENSIONIN = EXTENSIONIN
* EXTENSIONOUT = EXTENSIONOUT
return = lt_return.
loop at lt_return where type ca 'AEX'.
message id lt_return-id type lt_return-type number lt_return-number
with lt_return-message_v1 lt_return-message_v2
lt_return-message_v3 lt_return-message_v4
into data(lv_msg).
lt_ekko-rtmsg = lt_ekko-rtmsg && lv_msg && ';'.
endloop.
if sy-subrc = 0.
call function 'BAPI_TRANSACTION_ROLLBACK'.
lt_ekko-led = 1.
* lt_ekko-rtmsg = 1.
else.
call function 'BAPI_TRANSACTION_COMMIT'
exporting
wait = 'X'.
lt_ekko-led = 3.
lt_ekko-rtmsg = '成功'.
endif.
modify lt_ekko.
endloop.
loop at <gt_out> into <gs_out>.
assign component 'EBELN' of structure <gs_out> to <lv_ebeln>.
assign component 'LED' of structure <gs_out> to field-symbol(<lv_led>).
assign component 'RTMSG' of structure <gs_out> to field-symbol(<lv_rtmsg>).
read table lt_ekko with key ebeln = <lv_ebeln> binary search.
<lv_led> = lt_ekko-led.
<lv_rtmsg> = lt_ekko-rtmsg.
modify <gt_out> from <gs_out>.
endloop.
*存表
data:
lt_ztmm007a like table of ztmm007a with header line.
loop at <gt_out> into <gs_out>.
move-corresponding <gs_out> to lt_ztmm007a.
lt_ztmm007a-version = gv_version.
assign component 'LED' of structure <gs_out> to <lv_led>.
if <lv_led> = 3.
loop at gt_fieldcat into ls_fieldcat from 11 to gv_counts.
lt_ztmm007a-zjhrq = ls_fieldcat-fieldname.
assign component ls_fieldcat-fieldname of structure <gs_out> to <lv_menge>.
lt_ztmm007a-menge = <lv_menge>.
split ls_fieldcat-coltext at '-' into lv_date lv_type lv_week.
lt_ztmm007a-type = lv_type.
lt_ztmm007a-erdat = sy-datum.
lt_ztmm007a-erzet = sy-uzeit.
lt_ztmm007a-ernam = sy-uname.
lt_ztmm007a-aedat = sy-datum.
lt_ztmm007a-aezet = sy-uzeit.
lt_ztmm007a-aenam = sy-uname.
append lt_ztmm007a.
endloop.
endif.
endloop.
if lt_ztmm007a is not initial.
modify ztmm007a from table lt_ztmm007a.
commit work and wait.
message s001(00) with '版本数据已保存'.
endif.
* perform frm_alv_styl.
perform frm_alv_refresh using go_alvgrid.
endform.