C#連接SAP並下載工單資料【生產系統與ERP對接】


企業如果上了ERP系統,比如SAP、用友、金蝶或者E10等等,只需要ERP里面提供相應的接口,則可以直接將PMC創建的工單信息拋轉至 MTS 系統,當該工單生產完成之后,MTS 將完成數據回傳至 ERP,方便貨倉進行入倉與扣數,這篇文章介紹 MTS 與 SAP 之間如何對接。

1.SAP里面必須有一個Function,類似 MSSQL里面的存儲過程一樣,根據用戶傳入的參數,返回所需要的數據,這一部分程序通過 ABAP 完成,不在本文的講述范圍之類,這里略過。

2.MTS連接到 SAP,Call對應的 Function,拿到數據后進行處理,這里需要准備以下幾個參數。

  • SAP服務器的IP地址
  • 訪問SAP的用戶名
  • 訪問SAP的密碼
  • SAP系統的實例編號
  • SAP系統的客戶端編號

為了方便多個地方調用,這里將Call SAP 的代碼寫成一個方法,避免重復代碼,代碼如下:

 

 
using SAP.Middleware.Connector;

public class SapHelper { public IRfcTable GetSapData(string FunctionName, string TableName, List<string> Key, List<string> Value) { string Server = ConfigurationManager.AppSettings["SapServer"]; string Client = ConfigurationManager.AppSettings["SapClient"]; string User = ConfigurationManager.AppSettings["SapUser"]; string Password = ConfigurationManager.AppSettings["SapPwd"]; string SystemNumber = ConfigurationManager.AppSettings["SapSystemNumber"]; RfcConfigParameters rfcPar = new RfcConfigParameters(); rfcPar.Add(RfcConfigParameters.Name, "CON"); rfcPar.Add(RfcConfigParameters.AppServerHost, Server); rfcPar.Add(RfcConfigParameters.Client, Client); rfcPar.Add(RfcConfigParameters.User, User); rfcPar.Add(RfcConfigParameters.Password, Password); rfcPar.Add(RfcConfigParameters.SystemNumber, SystemNumber); rfcPar.Add(RfcConfigParameters.Language, "EN"); RfcDestination dest = RfcDestinationManager.GetDestination(rfcPar); RfcRepository rfcrep = dest.Repository; IRfcFunction myfun = null; myfun = rfcrep.CreateFunction(FunctionName); IRfcTable IrfTable = myfun.GetTable(TableName); if (Key.Count != Value.Count) { return null; } for (int i = 0; i < Key.Count; i++) { myfun.SetValue(Key[i].ToString(), Value[i].ToString()); } myfun.Invoke(dest); return IrfTable; } }

當用戶輸入需要下載的工單號碼之后,系統連接到 SAP 開始調用函數:

 string Order = Request["LotName"];
                if (string.IsNullOrEmpty(Order))
                {
                    return;
                }
      
          //這里強烈建議將參數以key value的形式傳進去,方便很多。
List
<string> Key1 = new List<string>(); List<string> Value1 = new List<string>(); Key1.Insert(0, "ORDER_NUMBER"); Value1.Insert(0, Order); IRfcTable IrfTable_Order = new SapHelper().GetSapData("function", "table", Key1, Value1); DataTable dt_Order = new DataTable(); dt_Order.Columns.Add("LotName"); dt_Order.Columns.Add("ProductName"); dt_Order.Columns.Add("LotQuantity"); dt_Order.Columns.Add("Customer"); dt_Order.Columns.Add("Plant"); for (int i = 0; i < IrfTable_Order.Count; i++) { IrfTable_Order.CurrentIndex = i; DataRow dr = dt_Order.NewRow(); dr["LotName"] = IrfTable_Order.GetString("AUFNR"); dr["ProductName"] = IrfTable_Order.GetString("STLBEZ"); dr["LotQuantity"] = Math.Round(Convert.ToDouble(IrfTable_Order.GetString("GAMNG")), 0).ToString(); dr["Customer"] = IrfTable_Order.GetString("PSPEL"); dr["Plant"] = IrfTable_Order.GetString("WERKS"); dt_Order.Rows.Add(dr); } var json = Newtonsoft.Json.JsonConvert.SerializeObject(dt_Order); var totalRecordCount = dt_Order.Rows.Count.ToString(); json = "{\"total\":" + totalRecordCount + ",\"rows\":" + json + "}"; Response.Write(json); Response.End();

 

注意,從SAP里面得到的數據是一張 rfc table,並不是我們常用的 DataTable,所以這里需要進行轉換后才能使用,最后將數據轉換為 JSON 輸出即可:

 

 

下一篇將介紹如何將 MTS 里面的工單完工數回傳至 SAP 里面,方便貨倉入倉與扣數...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM