3.SAP RFC를 호출하는 모델 개발하기

Edit

3.1개요

SAP RFC를 호출하는 모델을 개발하기 위해선 SAP RFC Invoke를 이용하여 개발합니다.

본 장에서는 X-UP 빌더를 이용하여 SAP RFC를 호출하는 모델을 생성하고 X-UP 서버로 배포 한 뒤 Nexacro-Studio에서 해당 모델을 사용하는 방법에 대해 설명합니다.

본 문서는 동영상을 기반으로 작성되었습니다.

3.2필요사항

3.3SAP RFC를 호출하는 모델 개발하기

SAP RFC Function을 호출하는 X-UP도메인을 개발(모델개발)하고 Nexacro 어플리케이션에서 X-UP 도메인을 호출하는 방법에 대해 알아봅니다.

3.3.1도메인 개발하기

SAP RFC 호출을 위한 도메인 개발은 다음과 같은 절차로 이루어집니다.

1도메인 생성하기

2SAP 데이터소스 생성하기

3SAP RFC 호출 모델 개발하기

4서버에 배포하기

그림 3-1SAP RFC Invoke를 이용한 도메인 개발하기

3.3.2Nexacro 어플리케이션에서 X-UP 도메인 호출하기

X-UP에서 만들어진 도메인을 사용하기 위해서 Nexacro 어플리케이션에서는 다음과 같은 순서로 진행됩니다.

1TypeDefinition Service 등록하기

2모델 리스트와 인터페이스 가져오기

3모델 호출 스크립트 작성하기

4테스트 하기

그림 3-2Nexacro 어플리케이션에서 X-UP 모델 호출하기

3.4Review

3.4.1도메인 개발하기

X-UP에서 모델을 개발하기 위해 Java의 Project와 같은 도메인을 생성합니다.

도메인 생성하기

'NexawebInc' 라는 도메인을 생성합니다.

SAP서버 데이터소스 생성하기

SAP 서버와 연결을 맺기 위한 데이터소스를 생성합니다.

데이터소스는 도메인 별 생성되며, 모델내의 Invoke에서 사용하게 됩니다.

데이터소스 명칭은 'SAP_RFC'을 입력하고 환경에 맞는 데이터소스 설정 정보를 입력합니다.

도메인의 mashup.msh 파일내의 DataSources 탭에서 생성합니다.

그림 3-3그림1

SAP RFC 데이터 조회 모델 개발하기

'SAP_RFC' 데이터소스정의된 설정정보를 토대로 SAP RFC Function Invoke를 이용해 'BAPI_FLIGHT_GETLIST' Function을 호출하는 'FlightGetList' 모델을 개발한다.

SAP RFC Invoke : SAP 서버로부터 RFC Function을 호출하여 데이터를 획득하는 모듈

'BAPI_FLIGHT_GETLIST' 모델을 생성하고 BAPI_FLIGHT_GETLIST Function을 호출하기위해 SAP RFC Invoke를 생성합니다.

그림 3-4rfcInvoke1

'BAPI_FLIGHT_GETLIST' Function의 input / output 레이아웃을 확인하고 'Test' 버튼을 클릭하여 결과 데이터를 확인합니다.

그림 3-5rfcInvoke2

1'BAPI_FLIGHT_GETLIST' SAP RFC Invoke : BAPI_FLIGHT_GETLIST Function을 호출하여 데이터를 획득

2SAPBC_BAPI_SFLIGHT : BAPI_FLIGHT_GETLIST이 속한 그룹 명

3'BAPI_FLIGHT_GETLIST' Function의 in / out Parameter

4'BAPI_FLIGHT_GETLIST' Function의 in / out DataSet Layout

Jetty Web Server 실행

Start 버튼을 누르면 Jetty Web Server가 동작합니다.

X-UP Explorer에 보이는 모든 X-UP Project가 Jetty Web Server에 올라가게 됩니다.

Jetty Web Server에 올라간 모델 테스트하기

Jetty Web Server에 올라간 모델을 테스트하기 위해 브라우저에서 모델을 호출합니다.

Editor에서 오른쪽 마우스 버튼을 클릭하면 'Copy Service URL to Clipboard' 버튼을 클릭하면 호출 URL을 클립보드에 복사하게 됩니다.

호출 URL은 다음과 같습니다.

http://localhost:8080/xup/FrontControllerServlet.do?service=xupservice&format=xml&version=nexacro&domain=NexawebInc&model=FlightGetList

3.4.2Nexacro 어플리케이션에서 X-UP 모델 호출하기

Nexacro 어플리케이션을 개발하기 위해 Nexacro-Studio에서 X-UP 모델을 사용하기 위한 개발 단계는 다음과 같습니다.

1TypeDefinition Service 등록하기

2모델 리스트와 인터페이스 가져오기

3모델 호출 스크립트 작성하기

4테스트 하기

TypeDefinition Service 등록하기

TypeDefinition에서 다음과 같이 Service로 등록합니다.

Field Name

Field Value

Prefix

'XUP_SERVER'

모델 호출 스크립트 코드에서 사용되는 Prefix를

입력합니다.

Type

'bs'

X-UP 모델을 호출하기 위해서는 반드시 bs 타입을 선택해야

합니다.

URL

'http://localhost:8080/xup/'

X-UP 서버 URL을 입력합니다.

ServiceList

'ServiceInfoServiceServlet.do?service=serviceInfo&target=modelList'

서비스 리스트 호출 url을 입력합니다.

DatasetLayout

'ServiceInfoServiceServlet.do?service=serviceInfo&target=modelLayout'

입출력 정보를 획득하기 위한 url을 입력합니다.

모델 리스트와 인터페이스 가져오기

모델 리스트와 인터페이스를 가져오기 위해 생성 된 Service ('XUP_SERVER') 를 Refresh 하고 모델을 Refresh 하여 모델의 인터페이스 정보를 가져옵니다.

모델 호출 스크립트 작성하기

모델을 호출하기 위해 Form을 하나 생성합니다.

X-UP 모델을 사용하기 위해 조회 된 모델의 인터페이스 정보에서 입출력 데이터셋을 Invisible Object 에디터로 Drag & Drop 합니다.

그림 3-6rfcInvoke3

아래와 같이 Form을 구성하고 Script 에디터에서 호출코드를 작성합니다.

<?xml version="1.0" encoding="utf-8"?>
<FDL version="1.5">
  <TypeDefinition url="..\default_typedef.xml"/>
  <Form id="FlightGetList" classname="FlightGetList" left="0" top="0" width="1024" height="768" titletext="New Form">
    <Layouts>
      <Layout>
        <Button id="btnSearch" taborder="0" text="search" left="436" top="16" width="120" height="50" onclick="btnSearch_onclick"/>
        <Grid id="Grid00" taborder="1" useinputpanel="false" left="11" top="75" width="546" height="240" binddataset="FLIGHT_LIST1">
          <Formats>
            <Format id="default">
              <Columns>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
                <Col size="80"/>
              </Columns>
              <Rows>
                <Row band="head" size="24"/>
                <Row band="body" size="24"/>
              </Rows>
              <Band id="head">
                <Cell col="0" disptype="normal" text="AIRLINEID"/>
                <Cell col="1" disptype="normal" text="AIRLINE"/>
                <Cell col="2" disptype="normal" text="CONNECTID"/>
                <Cell col="3" disptype="normal" text="FLIGHTDATE"/>
                <Cell col="4" disptype="normal" text="AIRPORTFR"/>
                <Cell col="5" disptype="normal" text="CITYFROM"/>
                <Cell col="6" disptype="normal" text="AIRPORTTO"/>
                <Cell col="7" disptype="normal" text="CITYTO"/>
                <Cell col="8" disptype="normal" text="DEPTIME"/>
                <Cell col="9" disptype="normal" text="ARRTIME"/>
                <Cell col="10" disptype="normal" text="ARRDATE"/>
                <Cell col="11" disptype="normal" text="PRICE"/>
                <Cell col="12" disptype="normal" text="CURR"/>
                <Cell col="13" disptype="normal" text="CURR_ISO"/>
              </Band>
              <Band id="body">
                <Cell col="0" disptype="normal" text="bind:AIRLINEID"/>
                <Cell col="1" disptype="normal" text="bind:AIRLINE"/>
                <Cell col="2" disptype="normal" text="bind:CONNECTID"/>
                <Cell col="3" disptype="normal" text="bind:FLIGHTDATE"/>
                <Cell col="4" disptype="normal" text="bind:AIRPORTFR"/>
                <Cell col="5" disptype="normal" text="bind:CITYFROM"/>
                <Cell col="6" disptype="normal" text="bind:AIRPORTTO"/>
                <Cell col="7" disptype="normal" text="bind:CITYTO"/>
                <Cell col="8" disptype="normal" text="bind:DEPTIME"/>
                <Cell col="9" disptype="normal" text="bind:ARRTIME"/>
                <Cell col="10" disptype="normal" text="bind:ARRDATE"/>
                <Cell col="11" disptype="normal" text="bind:PRICE"/>
                <Cell col="12" disptype="normal" text="bind:CURR"/>
                <Cell col="13" disptype="normal" text="bind:CURR_ISO"/>
              </Band>
            </Format>
          </Formats>
        </Grid>
      </Layout>
    </Layouts>
    <Objects>
      <Dataset id="FLIGHT_LIST1">
        <ColumnInfo>
          <Column id="AIRLINEID" type="string" size="3"/>
          <Column id="AIRLINE" type="string" size="20"/>
          <Column id="CONNECTID" type="string" size="4"/>
          <Column id="FLIGHTDATE" type="date" size="8"/>
          <Column id="AIRPORTFR" type="string" size="3"/>
          <Column id="CITYFROM" type="string" size="20"/>
          <Column id="AIRPORTTO" type="string" size="3"/>
          <Column id="CITYTO" type="string" size="20"/>
          <Column id="DEPTIME" type="time" size="6"/>
          <Column id="ARRTIME" type="time" size="6"/>
          <Column id="ARRDATE" type="date" size="8"/>
          <Column id="PRICE" type="bigdecimal" size="24"/>
          <Column id="CURR" type="string" size="5"/>
          <Column id="CURR_ISO" type="string" size="3"/>
        </ColumnInfo>
        <Rows/>
      </Dataset>
    </Objects>
  </Form>
</FDL>

그림 3-7rfcInvoke5

this.btnSearch_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
  var svcparam     = "domain="     + "NexawebInc"      // Domain name
                    + "&model="     + "FlightGetList" // Model name
                    + "&format="     + "xml"
                    + "&version="     + "nexacro";
    var svcUrl = "XUP_SERVER::FrontControllerServlet.do?service=xupservice&" + svcparam;
    
    // Model Input parameters
    var strInDatasets = "";
    var strOutDatasets = "FLIGHT_LIST1=FLIGHT_LIST1";
    var strArgument = "";

    this.transaction("BAPI_FLIGHT_GETLIST", svcUrl, strInDatasets, strOutDatasets, strArgument, "fn_Transaction_Callback");
}

this.fn_Transaction_Callback = function(strSvcID, nErrorCode, strErrorMag)
{
    if(nErrorCode < 0) {
        this.alert(strErrorMag);
        return;
    }
    
    if(strSvcID == "BAPI_FLIGHT_GETLIST") {
        trace(this.FLIGHT_LIST1.saveXML());
    } 
}

테스트하기

테스트를 수행하기 위해 어플리케이션을 실행하고 실행 된 어플리케이션에서 RFC Function을 호출해 항공운항정보를 검색합니다.

그림 3-8rfcInvoke5