본문 바로가기

C#

SAP RFC 연동 (C#)




RFC 란?


   Remote Function Call 은 독점적 인 SAP SE 인터페이스입니다. RFC (Remote Function Call)는 SAP 시스템 간의 통신을위한 표준 SAP 인터페이스입니다. RFC는 원격 시스템에서 실행될 함수를 호출합니다. [1] 원격 함수 호출은 SAP 소프트웨어 및 ABAP 프로그래밍과 연관 될 수 있으며 서버에서 반환 된 데이터를 사용 하는 외부 프로그램 ( PHP , ASP , Java 또는 C , C ++ 과 같은 언어로 작성)에 대한 방법을 제공 합니다. 데이터 트랜잭션은 서버에서 데이터를 가져 오는 것에 만 국한되지 않지만 서버 레코드에도 데이터를 삽입 할 수 있습니다. SAP는 RFC 호출에서 클라이언트 또는 서버로 작동 할 수 있습니다.


[출처] 위키피디아




1. SAP .Net Connector 프로잭트에 참조 추가

   Sap .net Connettor를 설치, 압축을 풀게되면 아래 두개의 dll이 생기게됩니다. 운영하려  는 환경에 맞게 32비트 또는 64비트용 dll을 참조하여 주시기 바랍니다.


   - SAP .Net Connector의 경우 버젼 등의 정보가 각 시스템별로 상이 할 수 있으므로 되도록 고객사측으로부터 전달받는것이 좋습니다. 

(구글에 Sap .NET Connector를 검색하면 다운로드 페이지가 많으므로, 별도로 첨부하지는 않습니다.)


   - 참조시켜야하는 dll

      sapnco.dll

    sapnco_utils.dll



     2. 편의상 Sap연동관련 설정값을 app.config (또는 Web.config)에 추가합니다.


1
2
3
4
5
6
7
8
9
10
  <appSettings>
    <add key="NAME" value="QA"/>
    <add key="SAP_USERNAME" value="username"/>
    <add key="SAP_PASSWORD" value="password"/>
    <add key="SAP_CLIENT" value="100"/>
    <add key="SAP_APPSERVERHOST" value="servername"/>
    <add key="SAP_SYSTEMNUM" value="0"/>
    <add key="SAP_LANGUAGE" value="EN"/>
    <add key="SAP_POLLSIZE" value="10"/>
  </appSettings>
cs


     3. app.config (또는 Web.config)에 SAP 연동할 서버의 Destination 정보를 설정하여줍니다.

1
2
3
4
5
6
7
8
9
10
11
<configuration>
    <SAP.Middleware.Connector>
        <ClientSettings>
            <DestinationConfiguration>
                <destinations>
                    <add NAME="SapConnection" USER="userid" PASSWD="password" CLIENT="110" LANG="KO" ASHOST="123.123.123.123" SYSNR="00" MAX_POOL_SIZE="10" POOL_SIZE="5" IDLE_TIMEOUT="600"/>
                </destinations>
             </DestinationConfiguration>
         </ClientSettings>
    </SAP.Middleware.Connector>
</configuration>
cs



3.  RFC 호출 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    public string CallRFC()
      {
       RfcDestination rfcDest = null;
       IRfcFunction rfcFunc = null;
       string strReturn = "";
       string strStatus = "OK";
       try
       {
 
        PERNR = "EmpNo";
        ENAME = "USERNAME";
        BUKRS = "COMPANYCODE";
        NO_MASK = "";
        SPRAS = "";
        //파라메터 셋팅
        rfcStructInvoke.SetValue("PERNR", PERNR);               
        rfcStructInvoke.SetValue("LOGID", LOGID);               
        rfcStructInvoke.SetValue("ENAME", ENAME);               
        rfcStructInvoke.SetValue("SCRNO", SCRNO);               
        rfcDest = RfcDestinationManager.GetDestination("SapConnection");
        rfcFunc = rfcDest.Repository.CreateFunction(g_RFCName);
        IRfcStructure rfcStructInvoke = rfcFunc.GetStructure("IS_PARM");
 
        //Invoke
        rfcFunc.Invoke(rfcDest);
        IRfcStructure rfcStruct = rfcFunc.GetStructure("E_RETURN");
 
        strStatus  = rfcStruct.GetValue("Status").ToString();
        RfcTable rfcResultTable1 = rfcFunc.GetTable("T_Return");
        strReturn = rfcResultTable1.Metadata.LineType[0].Result;
 
       }
       catch (Exception ex)
       {
        throw new Exception(ex.Message);
       }
       finally
       {
        rfcDest = null;
        rfcFunc = null;
       }
       return strReturn;
  }
cs