JDBC에서 Query문을 효율 적으로 사용하기 위해서 여러가지 Attributes 를 제공 하고 있다.


첫번째로 함수를 사용하기 위해서 사용하는 hasQuot

기본적으로 아래 그림과 같이 매핑을 하게 되면 필드 앞뒤에 Quot(')가 붙게 된다. 

   ex)  value('ID', 'KEY', 'DATA1', 'DATA2')  처럼...

그렇기 때문에 sysdate를 사용하게 되면 'sysdate' 이것처럼 앞뒤에 Quot가 붙기 때문에 일반 String으로 인식한다.


Quot를 빼기 위해서 Attribute로 hasQuot를 사용한다. 기본적으로 YES로 되어 있다.

해당 값을 NO 변경하면 함수를 사용 할 수 있다.



두번째로 비교를 하기 위한 compareOperation

WHERE 절에 특정 값만 사용하는게 아니라 머머보다 큰값 작은 값등 비교가 필요 할때가 있다 그럴대는 다음과 같이 compareOperation를 사용




compareOperation 옵션으로 사용할 수 있는 값은 다음과 같다.

  • EQ: Equal (default value)   =
  • NEQ: Not equal  <>
  • LT: Less than    <              
  • LTEQ: Less than or equal to <=
  • GT: Greater than  >
  • GTEQ: Greater than or equal to  >=
  • LIKE: Likeness (of strings). In the corresponding value, the SQL placeholders “%” or “_” can then also be used.

세번째로 Null인지 비교 하기 위한 isNull이 있다.



※ 좀더 궁금한 사항들이 있으면 아래 SDN사이트를 참고 하면 된다.

http://help.sap.com/saphelp_nw73/helpdata/en/48/465581929734d9e10000000a42189d/content.htm?frameset=/en/22/b4d13b633f7748b4d34f3191529946/frameset.htm


Posted by INSPIEN
,


아주 심플한 JDBC to JDBC Interface 개발방법에 대해서 기술 하겠습니다.


우선 소스쪽 테이블(PI_SELECT_TEST) 입니다.


이건 똑같은 구조의 타겟쪽 테이블입니다.(PI_INSERT_TEST)



  • Enterprise Services Builder

우선 소스쪽 Object들을 생성 해보도록 하겠다.

DataType → MessageType → Service Interface 순이다.


DataType생성 (HUIEOK_01_Out_DT) 

  - SELECT 한 DataType은 row Element 밑에 각 필드명으로 들어 가게 된다. row는 여러값이 들어 갈수 있기 때문에 1..unbounded로 셋팅한다


DataType을 만들었으면, 해당 MessageType(HUIEOK_01_Out_MT)도 위에서 생성한 DataType을 Load해서 생성한다.


Service Interface(HUIEOK_01_Out)도 생성한다. 해당건은 Async / Outbound다. 



소스쪽 관련 정보들은 모두 생성했다. 이제는 DB에 Insert하기 위한 타겟쪽 Object를 생성 하겠다.


DataType(HUIEOK_01_In_DT)은 아래오 같은 구조로 만들어야 한다. 주의점은 action은 Element가 아닌 Attribute다 

action은 INSERT, UPDATE, DELETE, UPDATE_INSERT, SELECT, SQL_QUREY가 있으며

table은 실 테이블 명이다. access 밑으로는 실제 사용되는 필드명이 들어간다.

UPDATE등을 사용할때는 access Element 말고도 key Element가 들어간다.

필요하면 아래 Site를 참고 하길 바란다.


[XI/PI] JDBC Adapter 사용시 여러가지 Attributes



DataType을 만들었으면, 해당 MessageType(HUIEOK_01_In_MT)도 위에서 생성한 DataType을 Load해서 생성한다.


Service Interface(HUIEOK_01_In)도 생성한다. 해당건은 Async / Inbound다. 


이제 각각 Inbound / Outbound Object들은 다 생성했다. 

이제 서로 매핑해주는 일만 남았다.


Message Mapping(HUIEOK_01_MM)을 아래 그림과 같이 생성해보길 바란다.

action에는 "INSERT"를 매핑하고, table에는 "PI_INSERT_TEST"를 매핑한다.

row와 access를 매핑해야 에러가 안나며 에러가 안나더라도 매핑을 하지 않으면 값이 하나의 row밖에 매핑되지 않을것이다.

나머지는 각각 필드명을 매핑한다.


Operration Mapping은 다음과 같이 Outbound / Inbound Service Interface와 Message Mapping을 할당해주고 Active 한다.


  • Configuration Integration Builder

디자인단을 끝냈으면 이제 Configure 부분 Object들을 만들어야 


테스트 비지니스 시스템으로 HUIEOK_D로 만든다.

Channel 2개는 JDBC Sender와 Receiver 2개를 만든다.

왼쪽 그림과 같이 Object들 을 모두 생성 해야 한다.
























우선 Sender JDBC Channel(HUIEOK_03_JDBCReceiver) 설정이다.

Adapter Type은 JDBC Sender고Database Connection부분에 DB접속 정보를 입력해준다.


아래 그림과 같이 Sender에 관련된 Object 명들과 SQL문을 각각 넣어 준다.

Quality of Service : Best Effort(Sync), Exactly Once(ASnyc / 순서보장X), Exactly Once in Order(ASync / 순서보장O)

Poll Interval(secs) : 배치 주기, 초단위

Query SQL Statement : select할 Qeury 문

Document Name : Outbound Message Type

Document namespace : Outbound Message Type의 Namasapce

Update SQL statment : select 문 후에 사용할 UPDATE SQL문(아무 동작도 안할시 "<TEST>"로 입력면 됨


Sender Channel을 셋팅했으면 다음은 Receiver Channel을 아래와 같이 만들어 준다.

특별한 셋팅 필요 없이 접속 정보만 제대로 넣어 준다.



다음으로는 Receiver Determination, 



Interface Determination


Sender Agreement


Receiver Agreement




를 만들어 준다

끄읏..


Posted by INSPIEN
,

[XI/PI] ABAP Mapping

EAI/XI/PI 2013. 8. 12. 09:53

본 소스는는 "http://www.riyaz.net/sap/abap-mapping-code-walkthrough/862/" Blog에서 가져온 내용입니다.


Abap Mapping을 테스트 할때 사용 하는 Input XML 데이터는 아래와 같다.


Output XML데이터는 아래와 같다.


기본적으로 Operation Mapping에서 ABAP Mapping을 사용하게 하려면 아래 URL을 참고 해서 옵션을 켜둔다.

http://blog.inspien.co.kr/24


ABAP쪽 소스코드는 다음과 같다. 

T-CODE "SE80"으로 들어가서 다음 그림과 같이 Class Library를 생성한다.


Class명과 Description을 넣는다.


Class생성후 Interface Tab에 가서 "IF_MAPPING"을 추가 한다.



Interface를 추가하면 Methods Tab에 가보면 IF_MAPOING~EXECUTE 라는 Methods가 생성되는데 더블클릭해서 들어가면 소스를 입력 할 수 있다.



method IF_MAPPING~EXECUTE.
* initialize iXML
  TYPE-POOLS: ixml.
  CLASS cl_ixml DEFINITION LOAD.
* create iXML factory object
  DATA: ixmlfactory TYPE REF TO if_ixml.
  ixmlfactory = cl_ixml=>create( ).
* create streamfactory object
  DATA: streamfactory TYPE REF TO
  if_ixml_stream_factory.
  streamfactory = ixmlfactory->create_stream_factory( ).
* create input stream object
  DATA: istream TYPE REF TO if_ixml_istream.
  istream = streamfactory->create_istream_xstring( source ).
* initialize the input xml document
  DATA: idocument TYPE REF TO if_ixml_document.
  idocument = ixmlfactory->create_document( ).
* parse the input xml document
  DATA: iparser TYPE REF TO if_ixml_parser.
  iparser = ixmlfactory->create_parser(
  stream_factory = streamfactory
  istream = istream
  document = idocument ).
  iparser->parse( ).

* Getting the Message ID
* Not necessary. Just demonstrating how to access mapping parameters in ABAP mapping.
  DATA: l_msgid_ref TYPE string.
  DATA : oref TYPE REF TO cx_root.
  TRY.
      l_msgid_ref = param->get( if_mapping_param=>message_id ).
    CATCH cx_sy_ref_is_initial INTO oref.
  ENDTRY.
* Reading source XML data
  DATA: odocument TYPE REF TO if_ixml_document.
  DATA: root TYPE REF TO if_ixml_element.
  DATA: msgid TYPE REF TO if_ixml_element.
  DATA: person TYPE REF TO if_ixml_element.
  DATA: name TYPE REF TO if_ixml_element.
  DATA: fname TYPE REF TO if_ixml_node_collection.
  DATA: lname TYPE REF TO if_ixml_node_collection.
  DATA: bdate TYPE REF TO if_ixml_node_collection.
  DATA: firstname TYPE REF TO if_ixml_node.
  DATA: lastname TYPE REF TO if_ixml_node.
  DATA: birthdate TYPE REF TO if_ixml_node.
  DATA: fullname TYPE string.
  DATA: str_fname TYPE string.
  DATA: str_lname TYPE string.
  DATA: fname_iterator TYPE REF TO if_ixml_node_iterator.
  DATA: lname_iterator TYPE REF TO if_ixml_node_iterator.
  DATA: bdate_iterator TYPE REF TO if_ixml_node_iterator.
  DATA: ostream TYPE REF TO if_ixml_ostream.
  DATA: renderer TYPE REF TO if_ixml_renderer.
  DATA: rc TYPE i.
  DATA: len TYPE i.
  DATA: idx TYPE i.
  fname = idocument->get_elements_by_tag_name( 'Name' ).
  lname = idocument->get_elements_by_tag_name( 'Surname' ).
  bdate = idocument->get_elements_by_tag_name( 'Birthdate' ).
* create output document
  odocument = ixmlfactory->create_document( ).
* create a root node Names
  root = odocument->create_simple_element(
  name = 'PersonsCompact'
  parent = odocument ).
* create element 'MessageID' and add it to the output document
  msgid = odocument->create_simple_element(
  name = 'MessageID'
  value = l_msgid_ref
  parent = root ).
* create iterators to iterate over the data elements
  fname_iterator = fname->create_iterator( ).
  lname_iterator = lname->create_iterator( ).
  bdate_iterator = bdate->create_iterator( ).
  len = fname->get_length( ).
  idx = 0.
  WHILE len GT idx.
    idx = idx + 1.
* create element 'Person' and add it to the output document
    person = odocument->create_simple_element(
    name = 'Person'
    parent = root ).
    firstname = fname_iterator->get_next( ).
    lastname = lname_iterator->get_next( ).
    birthdate = bdate_iterator->get_next( ).
    str_fname = firstname->get_value( ).
    str_lname = lastname->get_value( ).
    CONCATENATE str_fname str_lname INTO fullname SEPARATED BY space.
* create element 'Name' and add it to the output document
    name = odocument->create_simple_element(
    name = 'Name'
    value = fullname
    parent = person ).
* create element 'Birthdate' and add it to the output document
    rc = person->append_child( birthdate ).
  ENDWHILE.
* create output stream
  ostream = streamfactory->create_ostream_xstring( result ).
* create renderer
  renderer = ixmlfactory->create_renderer(
  ostream = ostream
  document = odocument ).
  rc = renderer->render( ).


endmethod.



위의 소스를 IF_MAPING~EXECUTE 넣은 후 Active하고 OP에서 다음과 같이 해당 Class 명을 넣으면 끝이다.




Posted by INSPIEN
,