FORM frm_post_data .
DATA:lt_rows TYPE lvc_t_roid,
ls_rows TYPE lvc_s_roid.
DATA:ls_orderdata TYPE bapi_pp_order_create.
DATA:ls_return TYPE bapiret2,
lv_order_number TYPE bapi_order_key-order_number,
ls_zppt025 TYPE zppt025.
"获取选中行
CALL METHOD go_grid->get_selected_rows
IMPORTING
et_row_no = lt_rows.
IF lt_rows IS INITIAL.
MESSAGE '没有选中行' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ELSE.
LOOP AT lt_rows INTO ls_rows.
READ TABLE gt_data INTO gs_data INDEX ls_rows-row_id.
IF sy-subrc EQ 0 AND gs_data-icon IS INITIAL.
CLEAR:ls_orderdata,ls_return.
"物料编码
ls_orderdata-material_long = gs_data-matnr.
"交货工厂
ls_orderdata-plant = gs_data-werks_jh.
"订单类型
ls_orderdata-order_type = gs_data-auart.
"数量
ls_orderdata-quantity = gs_data-gamng.
"订单开始日期
ls_orderdata-basic_start_date = gs_data-gstrp.
"订单结束日期
ls_orderdata-basic_end_date = gs_data-gltrp.
"调用BAPI创建工单
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = ls_orderdata
IMPORTING
return = ls_return
order_number = gs_data-aufnr.
IF ls_return-type = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
gs_data-icon = icon_red_light.
gs_data-msg = ls_return-message.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
"工单创建成功后,更新采购订单和行项目
DO 50 TIMES.
SELECT COUNT(*)
FROM aufk
WHERE aufnr EQ gs_data-aufnr.
IF sy-subrc EQ 0.
EXIT.
ELSE.
WAIT UP TO '0.3' SECONDS.
ENDIF.
ENDDO.
"更新采购订单和行
UPDATE aufk SET /zpc1/zglxd = gs_data-/zpc1/zglxd
/zpc1/zglhh = gs_data-/zpc1/zglhh
WHERE aufnr = gs_data-aufnr.
IF sy-subrc EQ 0.
COMMIT WORK AND WAIT.
ENDIF.
ls_zppt025 = CORRESPONDING #( gs_data ).
"更新自建表数据
MODIFY zppt025 FROM ls_zppt025.
COMMIT WORK AND WAIT.
gs_data-icon = icon_green_light.
gs_data-msg = '工单创建成功'.
ENDIF.
MODIFY gt_data FROM gs_data INDEX ls_rows-row_id TRANSPORTING icon msg aufnr.
CLEAR:gs_data.
ENDIF.
CLEAR:ls_rows.
ENDLOOP.
ENDIF.
ENDFORM.
计划工单转生产订单 采用BDC
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
*&---------------------------------------------------------------------*
*& Form frm_PRODORD_FROM_PLORD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> GS_DATA
*&---------------------------------------------------------------------*
FORM frm_prodord_from_plord USING ps_data TYPE ty_data.
DATA: lt_return TYPE TABLE of BAPIRET2.
DATA:ls_return TYPE bapiret2.
DATA:lv_mode TYPE c.
REFRESH : bdcdata, messtab.
PERFORM bdc_dynpro USING 'SAPLCOKO1' '0150'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTK'.
PERFORM bdc_field USING 'AFPOD-PLNUM' ps_data-plnum.
PERFORM bdc_field USING 'AFPOD-TPAUF' 'X'.
PERFORM bdc_field USING 'AUFPAR-PP_AUFART' ps_data-auart.
PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE' '/00'.
PERFORM bdc_field USING 'ABBT-GSMNG(01)' ps_data-gamng.
IF ps_data-gstrp is NOT INITIAL.
PERFORM bdc_field USING 'ABBT-PSTTR(01)' ps_data-gstrp.
ENDIF.
IF ps_data-gltrp is NOT INITIAL.
PERFORM bdc_field USING 'ABBT-PEDTR(01)' ps_data-gltrp.
ENDIF.
PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE' '=GEN'.
PERFORM bdc_dynpro USING 'SAPLCOUP' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE' '=BU'.
lv_mode = 'N'.
CALL TRANSACTION 'CO40' USING bdcdata
MODE lv_mode
UPDATE 'S'
MESSAGES INTO messtab.
CALL FUNCTION 'CONVERT_BDCMSGCOLL_TO_BAPIRET2'
TABLES
imt_bdcmsgcoll = messtab
ext_return = lt_return.
LOOP AT lt_return INTO ls_return WHERE type = 'E' OR TYPE = 'A'.
ps_data-zmsg = ps_data-zmsg && ls_return-message.
ENDLOOP.
IF ps_data-zmsg IS NOT INITIAL.
ps_data-type = 'E'.
ELSEIF ps_data-zmsg IS INITIAL.
READ TABLE lt_return INTO LS_RETURN WITH KEY TYPE = 'S' ID = 'COTU' NUMBER = '014' .
IF SY-subrc = 0.
ps_data-TYPE = LS_RETURN-TYPE.
ps_data-zmsg = LS_RETURN-MESSAGE.
ps_data-aufnr = LS_RETURN-message_v2.
"工单创建成功后,添加工单的长文本
PERFORM frm_save_text USING ps_data-aufnr ps_data-ZBZZD.
ENDIF.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
" IF FVAL <> NODATA.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
IF FNAM = 'ABBT-GSMNG(01)'.
CONDENSE bdcdata-fval.
ENDIF.
APPEND bdcdata.
" ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_save_text
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> PS_DATA_AUFNR
*&---------------------------------------------------------------------*
FORM frm_save_text USING pv_aufnr pv_zbzzd.
DATA: lv_tdname TYPE THEAD-TDNAME,
lt_lines TYPE TABLE of TLINE,
ls_lines TYPE tline.
DATA:LV_ZBZZD TYPE char300.
CHECK pv_zbzzd is NOT INITIAL.
LV_ZBZZD = pv_zbzzd.
lv_tdname = sy-mandt && pv_aufnr.
WHILE LV_ZBZZD <> '' .
CLEAR ls_lineS .
ls_lineS-tdformat = '*'.
ls_lineS-tdline = LV_ZBZZD+0(132).
APPEND ls_lineS TO lt_lineS .
LV_ZBZZD = LV_ZBZZD+132(132) .
ENDWHILE .
WAIT UP TO '0.5' SECONDS.
CALL FUNCTION 'CREATE_TEXT'
EXPORTING
fid = 'KOPF'
flanguage = sy-langu
fname = lv_tdname
fobject = 'AUFK'
SAVE_DIRECT = 'X'
TABLES
flines = lt_lines
EXCEPTIONS
no_init = 1
no_save = 2
OTHERS = 3.
IF sy-subrc = 0.
"SAP bug,需暴力更新值才能CO03显示长文本
UPDATE aufk SET ltext = sy-langu WHERE aufnr EQ pv_aufnr . "CO03 显示长文本.
ENDIF.
ENDFORM.