.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를 다운 받아 사용하면 됩니다.
<참조 추가>
<실행 폴더>
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으로 분석해서 작업에 맞게 수정해서 사용하면 됩니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
♥ 이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.
감사합니다.