C# 呼叫SAP的 RFC教學

來自 | 9 月 2, 2024 | 程式 | 0 條留言

SAP的API稱為 RFC,就類似一般程式設計所謂的API。

前置作業

  1. 開好跟SAP系統連線的相關防火牆。
  2. 準備好RFC,如果有導入顧問可以詢問顧問。

專案設定

我這邊用的是.Net 4.8的專案

image

弄好之後。

所需DLL

系統需要這三個DLL

  1. NSAPConnector.dll Nuget
  2. sapnco.dll
  3. sapnco_utils.dll 

第一個可以從Nuget找到,後面兩個我也不確定哪邊有,知道的麻煩補充給我,我把我的放在連結。SAP DLL.zip

我猜相關DLL可以從這邊抓到,不過我沒帳號。

把DLL加入至專案後 ,要設定Copy到程式碼目錄中,我改為Always Copy

測試用的RFC

如果要測試連線,可以試試這個RFC

RFC_GET_SYSTEM_INFO

相關說明

設定資料庫連線

/// <summary>
/// SAP連線參數
/// </summary>
/// <returns></returns>
public static RfcConfigParameters GetParameters()
{	
  RfcConfigParameters parms = new RfcConfigParameters();
  parms.Add(RfcConfigParameters.AppServerHost, "127.0.0.1");  //SAP主機IP
  parms.Add(RfcConfigParameters.SystemNumber, ""); //SAP 系統代號
  parms.Add(RfcConfigParameters.User, ""); //帳號
  parms.Add(RfcConfigParameters.Password, ""); //密碼
  parms.Add(RfcConfigParameters.Client, ""); // Client 
  parms.Add(RfcConfigParameters.Language, "ZF"); //登入語言
  parms.Add(RfcConfigParameters.PoolSize, "");
  parms.Add(RfcConfigParameters.IdleTimeout, "");
  parms.Add(RfcConfigParameters.Name, "");
  return parms;
}

RFC回傳的資料轉DataTable

/// <summary>
/// RFC回傳的TABLE 轉成 DataTable
/// </summary>
/// <returns></returns>
public static DataTable ToDataTable(IRfcTable myRfcTable)
{
   DataTable loTable = new DataTable();
   int liElement;
   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;
}

主程式

//設定連線字串
RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination(GetParameters(client));
RfcRepository SapRfcRepository = SapRfcDestination.Repository;

IRfcFunction func = SapRfcRepository.CreateFunction("RFC名稱");
			
//定義輸入值 假如需要的話
string rfcImput = "";
func.SetValue("參數名稱", rfcImput);//設定RFC輸入參數

//取資料			
func.Invoke(SapRfcDestination);
IRfcTable SAPDataTable = func.GetTable("回傳的資料表名稱");

//將RFC回傳的TABLE 轉成 DataTable
DataTable table = ToDataTable(SAPDataTable);
int rowcount = 0;

//將DataTable 轉成 List<某Model>
var result = new List<某Model>();
foreach (DataRow row in table.Rows)
{
  var model = new 某Model
  {
    某屬性 = row["某屬性"].ToString(),
  };
  result.Add(model);
  rowcount++;
}

0 條留言

提交留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *