IF li_num = 1. "첫번째로 Insert 될 때의 Screen.
PERFORM make_bdcdata USING:
'X' 'SAPMM07R' '0560',
' ' 'BDC_OKCODE' '/00',
' ' 'RM07M-RSNUM' i_resno, "[Reservation 번호 입력].
' ' 'XFULL' ''.
PERFORM make_bdcdata USING:
'X' 'SAPMM07R' '0521',
' ' 'BDC_OKCODE' '=NLR',
' ' 'RKPF-WEMPF' i_gr_rcpt. "[자재수령인].
PERFORM make_bdcdata USING:
'X' 'SAPMM07R' '1502',
' ' 'BDC_OKCODE' '=OK',
' ' 'RM07M-BDTER' i_res_date, "[구성부품소요일].
' ' 'RM07M-WERKS' t_resitem-plant. "[플랜트].
PERFORM make_bdcdata USING:
'X' 'SAPMM07R' '0521',
' ' 'BDC_OKCODE' '/00',
' ' 'RESB-MATNR(01)' t_resitem-material,
' ' 'RESB-ERFMG(01)' ls_qnt,
' ' 'RESB-LGORT(01)' t_resitem-stge_loc.
ELSE. "첫번째 이후로 Insert 될 때의 Screen.
PERFORM make_bdcdata USING:
'X' 'SAPMM07R' '0521',
' ' 'BDC_OKCODE' '/00',
' ' 'RESB-MATNR(02)' t_resitem-material,
' ' 'RESB-ERFMG(02)' ls_qnt,
' ' 'RESB-LGORT(02)' t_resitem-stge_loc.
ENDIF.
*-(09.07.14)
PERFORM make_bdcdata USING:
'X' 'SAPMM07R' '0510',
' ' 'BDC_OKCODE' '/00',
' ' 'RESB-WERKS' t_resitem-plant, "[플랜트].
' ' 'RESB-MATNR' t_resitem-material, "[자재번호].
' ' 'RESB-LGORT' t_resitem-stge_loc, "[저장위치].
' ' 'RESB-ERFMG' ls_qnt, "[입력단위수량].
' ' 'RESB-BDTER' i_res_date, "[소요일].
' ' 'RESB-XWAOK' 'X', "[이동허용].
' ' 'RESB-WEMPF' i_gr_rcpt, "[자재수령인].
' ' 'RESB-SGTXT' i_sgtxt. "[텍스트].
li_rspos = li_rspos + 1. "현재 예약/종속 소요량의 품목개수값 증가.
t_resitem-rspos = li_rspos. "품목추가시 증가되는 품목번호값.
MODIFY t_resitem INDEX li_num TRANSPORTING rspos.
* 품목번호만 변경.
ENDIF.
ENDLOOP.
===============================================================
Reservation change bdc 소스 입니다.
붉은색으로 된 부분부터 2번째 loop 를 타는데 'RESB-MATNR(02)'
부분에서 (02) 때문에 2번째 loop 에서만 타는데 3번째 그리고
4번째 loop 를 계속 태우려면 소스를 어떻게 수정해야 할까여
꼭 좀 고수님들의 답변 부탁드립니다.
수고하세요
댓글 3
-
activeman
2009.07.16 00:01
-
ac3mania
2009.07.16 01:10
필드심볼을 이용하여 괄호에 들어갈 숫자를 결합하시어 loop를 수행해도 될거 같은데요
-
노름마치
2009.07.16 07:58
만약 CONTROL 이 여의치 않으면, BAPI 를 사용해도 되지 않을까 싶네요.
'BAPI_RESERVATION_CREATE1' 에 대한 예제인데요.
만약 변경을 하시려면 'BAPI_RESERVATION_CHANGE' 를 사용하셔도 되구요. 흠,,,
DATA: ls_bapi_header TYPE bapi2093_res_head.
DATA: lt_bapi_items TYPE bapi2093_res_item OCCURS 0 WITH HEADER LINE,
lt_bapi_return TYPE bapiret2 OCCURS 0 WITH HEADER LINE,
lt_bapi_pasegment TYPE bapi_profitability_segment OCCURS 0.
DATA: l_testrun TYPE bapi2093_test VALUE space.
*HEADER
ls_bapi_header-res_date = sy-datum. "<<--출고/이동 요청일
ls_bapi_header-move_type = '309'. "<<--이동유형
ls_bapi_header-move_plant = g_werks. "<<--입고될 플랜트
ls_bapi_header-move_stloc = g_rgort. "<<--입고될 저장위치
*ITEM
LOOP AT itab.
lt_bapi_items-material = itab-matnr. "<<--출고될 품목코드(입/출고 동일)
lt_bapi_items-plant = g_werks. "<<--출고될 플랜트
lt_bapi_items-stge_loc = g_lgort. "<<--출고될 저장위치
lt_bapi_items-batch = itab-charg. "<<--출고될 뱃치번호 <== 뱃치사용시
lt_bapi_items-gr_rcpt = itab-rharg. "<<--입고될 뱃치번호 <== 뱃치사용시
lt_bapi_items-entry_qnt = itab-erfmg. "<<--출고될 수량
lt_bapi_items-entry_uom = itab-erfme. "<<--출고될 수량단위
lt_bapi_items-movement = 'X'.
APPEND lt_bapi_items.
ENDLOOP.
CLEAR g_res_number.
CALL FUNCTION 'BAPI_RESERVATION_CREATE1'
EXPORTING
reservationheader = ls_bapi_header
testrun = l_testrun
IMPORTING
reservation = g_res_number
TABLES
reservationitems = lt_bapi_items
profitabilitysegment = lt_bapi_pasegment
return = lt_bapi_return.
IF g_res_number IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
* ERROR 화면표시
DATA : ls_layout TYPE slis_layout_alv.
DATA : l_repid TYPE sy-repid.
l_repid = sy-repid.
ls_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = ls_layout
i_structure_name = 'BAPIRET2'
TABLES
t_outtab = lt_bapi_return
EXCEPTIONS
program_error = 1.
ENDIF.
SAP에서는 bdc를 짤때 항목이 여러개 일경우 'RESB-MATNR(02)' 과 같이 배열의 형태를 띄게 됩니다.
이럴 경우 첫번째 배열로 원하는 항목을 옮길수 있도록 커서의 위치를 변경하는 기능을 제공합니다.
정확한 t-code를 알 수 없어서 어떻게 직접적으로 말씀드리진 못하겠습니다만 그 기능을 한번 찾아 보십시요.
즐밥하세요.