가끔 INTERFACE 프로젝트에 들어오면 (가끔... 일까?-_- 난 왜 맨날 인터페이스만...)
다른쪽 ORACLE DB에 우리 SAP 데이터를 꼽아줘야 할 때가 있다...
사실 시노니움을 맺어서 OPEN SQL로 그냥 처리하면(마치 SAP 에 DB가 있듯이.. 똑!! 같!! 이.. 하면 된다만..)
금방 끝나지만.....
모르겠따.. 이것도 DB 관리자 및 저쪽편 DB관리자에게 서로 쇼당을 봐야 하는 일이니...
그냥 던져주면 던져주는대로 하는 수 밖에...
우선 INTERFACE 시에 상대편 DB 컨넥트를 해준다.
소스는 하기와 같다... (컨넥트 보단 테스트??)
컨넥트 관련 선언문.. 뭐 오류같은거 잡아오는거 뿐..
DATA : lcl_open_sql TYPE REF TO cx_sy_open_sql_db,
lv_open_err TYPE string,
lcl_native_sql TYPE REF TO cx_sy_native_sql_error,
lv_native_err TYPE string.
**--------------------------------------------------------------------*
** DB CONNECTION
**--------------------------------------------------------------------*
PERFORM dbco_connection CHANGING lv_native_err.
위 소스는 아래....
*--------------------------------------------------------------------*
* DBCI CONNECTION
*--------------------------------------------------------------------*
FORM dbco_connection CHANGING error_text TYPE string.
DATA : exc_ref TYPE REF TO cx_sy_native_sql_error.
TRY.
EXEC SQL .
CONNECT TO 'GXIX' <- SAP와 웹DB 간에 서로 연결되는 Destination 명이 GXIX 란다.
ENDEXEC. <- 위 내용은 sap db관리자와 oracle db 관리자가 생성해준다.
CATCH cx_sy_native_sql_error INTO exc_ref.
error_text = exc_ref->get_text( ).
ENDTRY.
ENDFORM. "DBCO_CONNECTION
이렇게 체크해보면 GXIX에 연결되는지.. 알 수 있다.
이상없이 되었다면.. 본격적인 NATIVE SQL 쿼리를 날려보자
*--------------------------------------------------------------------*
* INSERT LOGIC
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
* 646 transfer
*--------------------------------------------------------------------*
CLEAR : lS_ht646_1.
LOOP AT lt_ht646_1 INTO lS_ht646_1. "EXPORT DATA
TRY.
EXEC SQL. "아래는 GXIX.상대편DB명 으로 쓰여있는거다.
INSERT INTO GXIX.IF_RCV_QUOTATION_HEADER_I (
ZQTNR,
ZITNR,
ZVSNR,
VV800,
VV200,
VV500,
VV700,
ZAWCAUSE,
ZATCAUSE
)
VALUES(
:lS_ht646_1-ZQTNR,
:lS_ht646_1-ZITNR,
:lS_ht646_1-ZVSNR,
:lS_ht646_1-VV800,
:lS_ht646_1-VV200,
:lS_ht646_1-VV500,
:lS_ht646_1-VV700,
:lS_ht646_1-ZAWCAUSE,
:lS_ht646_1-ZATCAUSE
)
ENDEXEC.
CATCH cx_sy_native_sql_error INTO lcl_native_sql.
lv_native_err = lcl_native_sql->get_text( ).
e_subrc = 1.
e_messg = text-m02 && lv_native_err.
ROLLBACK WORK.
PERFORM dbco_rollback(zmmhc002) CHANGING lv_native_err.
EXIT.
ENDTRY.
ENDLOOP.
*--------------------------------------------------------------------*
* DBCO COMMIT
*--------------------------------------------------------------------*
FORM DBCO_ROLLBACK CHANGING ERROR_TEXT TYPE STRING.
DATA : exc_ref TYPE REF TO cx_sy_native_sql_error.
TRY.
EXEC SQL .
ROLLBACK
ENDEXEC.
CATCH cx_sy_native_sql_error INTO exc_ref.
error_text = exc_ref->get_text( ).
ENDTRY.
ENDFORM.
위와같이 제대로 실행이 안되었다면 ROLLBACK을 넣어준다.
그 후에
*--------------------------------------------------------------------*
* Commit & Rollback
*--------------------------------------------------------------------*
IF e_subrc EQ 0. "제대로 실행되었다면 코밋을 해줘야 한다.
COMMIT WORK.
PERFORM dbco_commit CHANGING lv_native_err.
PERFORM save_log_data_SEND. "이건 회사마다 넣는 로그펑션이다. 니가 맹글어라.
e_messg = text-s01.
ENDIF.
* DBCO COMMIT
*--------------------------------------------------------------------*
FORM dbco_commit CHANGING error_text TYPE string.
DATA : exc_ref TYPE REF TO cx_sy_native_sql_error.
TRY.
EXEC SQL .
COMMIT
ENDEXEC.
CATCH cx_sy_native_sql_error INTO exc_ref.
error_text = exc_ref->get_text( ).
ENDTRY.
ENDFORM. "DBCO_COMMIT
자... 이제 GXIX 연결을 끊어야겠지.?
*--------------------------------------------------------------------*
* CLOSING DB CONNECTION
*--------------------------------------------------------------------*
PERFORM dbco_disconnect CHANGING lv_native_err.
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
* DBCO DISCONNECT
*--------------------------------------------------------------------*
FORM dbco_disconnect CHANGING error_text TYPE string.
DATA : exc_ref TYPE REF TO cx_sy_native_sql_error.
TRY.
EXEC SQL .
DISCONNECT 'GXIX'
ENDEXEC.
CATCH cx_sy_native_sql_error INTO exc_ref.
error_text = exc_ref->get_text( ).
ENDTRY.
ENDFORM. "DBCO_DISCONNECT
이렇게 하면 NATIVE SQL INTERFACE가 끝났따... 상대편 DB에 우리 데이터를 넣어준거다..
이건 거의 TEMPLATE와 같이 활용되는 것이니.. 가지고 다니거나 그대로 카피해서 써도 된다..
상대편 DB명이랑 필드명은 당연히 바꿔야 된다-_-
DESTINATION 명도.......
이정도 써놨는데 이해를 못하고 버벅된다면....
그건 아직 ABAP의 이해도가 매우 떨어지는 상태이니.... 더더욱 열심히 남이 짜놓은 소스를 구경하거나
독학하며 익혀야 한다..... 자.. 나도 늘 열공하고 있다..
당신도.. 열공합시다..^^
'ERP-SAP > ABAP' 카테고리의 다른 글
<ABAP> DEFINE 예시문 (0) | 2012.08.14 |
---|---|
<ABAP> at new, at first, at last, at end 의 의미 및 용법 (0) | 2012.08.14 |
<ABAP> Write ~ Currency ~, Interface 시에 통화키, 원화 문제 (0) | 2012.08.09 |
<ABAP> SMW0 사용 방법 & READ DOMAIN TEXT. (0) | 2012.08.01 |
<ABAP> 쉽게 쓰는 팝업 메모장 펑션! (0) | 2012.08.01 |