企業如果上了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 輸出即可: