最近做一個專案用到的SAO接口的調用,用到的上傳參數獲取回傳的IRfcTable,以及以IRfcTable作為參數上傳SAP,通過查閱很多資料,發現資料說明的也多是魚龍混雜,許多沒有實現就直接貼在上面,有的還是值得借鑒的,專案完成后,記錄下,好記性不如爛筆頭,也分享給大伙借閱。
1.SAP連接
這里先設置SAP連接
public static RfcDestination GetRfcDest() { RfcConfigParameters configParams = GetConfigParams(); RfcDestination dest = RfcDestinationManager.GetDestination(configParams); return dest; } private static RfcConfigParameters GetConfigParams() { RfcConfigParameters configParams = new RfcConfigParameters(); //正式服務器 configParams.Add(RfcConfigParameters.Name, "SAP_CONN"); configParams.Add(RfcConfigParameters.AppServerHost, "xxx.xxx.xxx.xxx");//正式機 configParams.Add(RfcConfigParameters.SystemNumber, "00"); configParams.Add(RfcConfigParameters.User, "B2BACL"); configParams.Add(RfcConfigParameters.Password, "ACLACL"); configParams.Add(RfcConfigParameters.Client, "168"); configParams.Add(RfcConfigParameters.Language, "EN"); configParams.Add(RfcConfigParameters.PoolSize, "5"); configParams.Add(RfcConfigParameters.MaxPoolSize, "10"); configParams.Add(RfcConfigParameters.IdleTimeout, "600"); return configParams; }
2.通過參數獲取對應的IRfcTable
/// <summary> /// 通過參數獲取SAP中Table返回值(Table) /// </summary> /// <param name="ASN"></param> /// <returns></returns> public static DataTable method(string ASN) { DataTable result = null; IRfcTable value = null; try { RfcDestination rfcdes = SapConn.GetRfcDest(); RfcRepository repos = rfcdes.Repository; IRfcFunction func = repos.CreateFunction("方法名"); //RFC函數名 func.SetValue("參數名", ASN); //測量點 func.Invoke(rfcdes); value = func.GetTable("需要獲取的表明"); //輸出參數 DataTable dt = new DataTable(); //新建列 dt.Columns.Add("VBELN"); dt.Columns.Add("POSNR"); dt.Columns.Add("VGBEL"); dt.Columns.Add("VGPOS"); for (int i = 0; i < value.Count; i++) { value.CurrentIndex = i; DataRow dr = dt.NewRow();//新建行 dr["VBELN"] = value.GetString("VBELN"); dr["POSNR"] = value.GetString("POSNR"); dr["VGBEL"] = value.GetString("VGBEL"); dr["VGPOS"] = value.GetString("VGPOS"); dt.Rows.Add(dr); } System.Threading.Thread.Sleep(100); dt.DefaultView.Sort = "LFIMG ASC";//按Id倒序 dt = dt.DefaultView.ToTable();//返回一個新的DataTable result = dt; } catch (Exception ex) { } return result; }
3.將參數以IRfcTable形式上傳SAP
public static void PostTableToASap(string StaffNO) { RfcDestination rfcdes = SapConn.GetRfcDest(); RfcRepository repos = rfcdes.Repository; IRfcFunction func = null; string ASN = null; func= repos.CreateFunction("RFC函數名"); //RFC函數名 try { //表頭部分 IRfcStructure GOODSMVT_HEADER = func.GetStructure("GOODSMVT_HEADER"); string time = DateTime.Now.ToString("yyyyMMdd"); GOODSMVT_HEADER.SetValue("參數1", time); //測量點 GOODSMVT_HEADER.SetValue("參數2", time); //測量點 GOODSMVT_HEADER.SetValue("參數3", ""); //測量點 func.SetValue("GOODSMVT_HEADER", GOODSMVT_HEADER); //Get需要操作的表T_PURORDER_IN IRfcTable itb = func.GetTable("表名"); for (int i = 0; i < DT.Rows.Count-1; i++) { itb.Insert(); itb.CurrentRow.SetValue("列1", DT.Rows[i]["VGBEL"].ToString()); itb.CurrentRow.SetValue("列2", DT.Rows[i]["VGPOS"].ToString()); itb.CurrentRow.SetValue("列3", DT.Rows[i]["MATNR"].ToString()); itb.CurrentRow.SetValue("列4", DT.Rows[i]["LFIMG"].ToString()); } func.SetValue("表名", itb); func.Invoke(rfcdes); } catch (Exception ex) { LogHelper.WriteLog(typeof(SapConn), ex); } }