SAP .NET Connector 3.0 사용방법 및 예제 (SAP 연동)

.NET 프로그램 개발과정에서 SAP의 RFC BAPI Function을 연결해서 사용해야 하는 경우가 생깁니다.

SAP 연결 작업을 하기 위해서는 SAP에서 재공하는 .NET Connector dll이 파일이 필요합니다.

dll은 인터넷에서 다운 받을 수 있습니다.(다운로드 계정이 필요함)

아래 설명은 SAP .NET Connector 3.0 사용방법 및 SAP .NET Connector 3.0을 이용하여 SAP RFC Function을 사용하는 방법에 대한 설명입니다.

SAP .NET Connector 3.0 다운 받을 수 있는 곳 : https://support.sap.com/en/product/connectors/msnet.html?anchorId=section_512604546

프레임워크의 버전에 맞는 Connector를 다운 받아 사용하면 됩니다.

<참조 추가>

SAP .NET Connector 3.0 사용방법 및 예제 (SAP 연동) - 참조 추가


<실행 폴더>

SAP .NET Connector 3.0 사용방법 및 예제 (SAP 연동) - 실행 폴더


64bit, 32bit 구분하여 추가

– sapnco.dll, sapnco_utils.dll은 프로그램에서 참조에 추가
– libicudecnumber.dll, rscp4n.dll은 실행파일이 있는 폴더에 복사


– 프로그램 using 선언

using SAP.Middleware.Connector;

사용자 계정으로 SAP에 연결하기

RfcConfigParameters rfc = new RfcConfigParameters();
rfc.Add(RfcConfigParameters.Name, “PRD”);
rfc.Add(RfcConfigParameters.AppServerHost, “100.100.100.100”); //서버IP
rfc.Add(RfcConfigParameters.Client, “200”);
rfc.Add(RfcConfigParameters.User, “abc”); //사용자ID
rfc.Add(RfcConfigParameters.Password, “********”);  //사용자 패스워드
rfc.Add(RfcConfigParameters.SystemNumber, “00”);
rfc.Add(RfcConfigParameters.Language, “KO”);
rfc.Add(RfcConfigParameters.PoolSize, “5”);
rfc.Add(RfcConfigParameters.MaxPoolSize, “10”);
rfc.Add(RfcConfigParameters.IdleTimeout, “500”);
RfcDestination rfcDest = RfcDestinationManager.GetDestination(rfc);
RfcRepository rfcRep = rfcDest.Repository;
 
IRfcFunction function = null;
 

– SAP 서버 및 사용자 정보를 입력하여 SAP로 연결하기 위한 부분 입니다.

P_KUNNR Import 해서 RETURN, MESSAGE, O_NAME1 Export 예제

function = rfcRep.CreateFunction(“Z_BAPI_SD_KUNNR_NAME1”); //BAPI펑션
function.SetValue(“P_KUNNR”, textBox2.Text); //import
function.Invoke(rfcDest);
rfcDest = null;
 
//export
IRfcStructure RETURNStructure = function.GetStructure(“RETURN”);
label1.Text = RETURNStructure.GetString(“MESSAGE”).ToString();
textBox1.Text = function.GetString(“O_NAME1”).ToString();
 

– SetValue : BAPI Function의 Import 값으로 넘겨 줍니다.

– GetStructure : SAP Dictionary의 구조 형태를 받습니다.

– GetString : SAP의 String 리턴값을 받습니다.

파라메터 2개를 Import하고 인터널 Table Export 예제

function = rfcRep.CreateFunction(“Z_BAPI_SD_PERNR_OF_KUNNR”);
function.SetValue(“P_ZDOFO”“F”);
function.SetValue(“P_KUNNR”“1477”);
function.Invoke(rfcDest);
fcDest = null;
 
IRfcStructure RETURNStructure = function.GetStructure(“RETURN”);
label1.Text = RETURNStructure.GetString(“MESSAGE”).ToString();
IRfcTable IT_PERNR = function.GetTable(“IT_PERNR”);
for (int i = 0; i < IT_PERNR.RowCount; i++)
{
   listView1.Items.Add(IT_PERNR[i][“PERNR”].GetString());
}

– GetTable : SAP의 인터널테이블을 받습니다. GetTable은 Import에도 사용됩니다.

Export 받은 인터널 Table을 GridView에 바인딩 예제

function = rfcRep.CreateFunction(“Z_BAPI_SD_DETAIL_QORDER_N”);
function.SetValue(“P_ZQVBLN”“2013001310”);
function.Invoke(rfcDest);
rfcDest = null;
 
IRfcStructure RETURNStructure = function.GetStructure(“RETURN”);
label1.Text = RETURNStructure.GetString(“MESSAGE”).ToString();
IRfcTable IT_ITEM = function.GetTable(“IT_ITEM”);
 
dataGridView1.DataSource = GetDataTableFromRFCTable(IT_ITEM);
 

– GetDataTableFromRFCTable : SAP에서 받은 인터널테이블을 C#의 DataTable 형식으로 변환해주기 위해 추가로 만들어 준 메서드 입니다. 아래 만들어 놓은 메서드를 참고하세요.

Table을 Import하고 Table을 Export 해서 처리하는 예제

function = rfcRep.CreateFunction(“Z_BAPI_WEB_LIST_QRORDER_N”);
IRfcTable table = function.GetTable(“IM_TAB”);
table.Insert();
table.SetValue(“DATE_LOW”“20130301”);
table.SetValue(“DATE_HIGH”“20130331”);
table.SetValue(“KUNNR”“110”);
function.Invoke(rfcDest);
rfcDest = null;
 
IRfcStructure RETURNStructure = function.GetStructure(“RETURN”);
label1.Text = RETURNStructure.GetString(“MESSAGE”).ToString();
IRfcTable IT_LIST = function.GetTable(“IT_LIST”);
 
dataGridView1.DataSource = GetDataTableFromRFCTable(IT_LIST);
 

– function.GetTable()과 table.Insert() : DataTable을 SAP의 Import로 넘겨 줍니다.

Export 받은 인터널테이블을 DataTable로 변환하기

public DataTable GetDataTableFromRFCTable(IRfcTable myrfcTable)
{
   DataTable loTable = new DataTable();
   int liElement = 0;
   for (liElement = 0; liElement <= myrfcTable.ElementCount  1; liElement++)
   {
      RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
      loTable.Columns.Add(metadata.Name);
   }
   foreach (IRfcStructure Row in myrfcTable)
   {
      DataRow ldr = loTable.NewRow();
      for (liElement = 0; liElement <= myrfcTable.ElementCount  1; liElement++)
      {
         RfcElementMetadata metadata = myrfcTable.GetElementMetadata(liElement);
         ldr[metadata.Name] = Row.GetString(metadata.Name);
      }
      loTable.Rows.Add(ldr);
   }
   return loTable;
}
 

– DataTable로 변환하기 위해 추가로 만들어준 로직이며 Debugging으로 분석해서 작업에 맞게 수정해서 사용하면 됩니다.



이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.

This Post Has One Comment

  1. 익명

    감사합니다.

답글 남기기