有的時候我們需要在RFC中拋出一些自訂的異常,比如輸入一個不存在的品號,我們需要拋出一個異常,告知使用者品號不存在。有一個笨笨的做法就是通過傳回值來判斷,但是這樣不靈活,同時也會因為品號不存在而繼續之行RFC。如果我們能自己拋出異常,程式自動停止執行RFC,那將是兩全其美!
現在設定一個功能:輸入兩個數,第一個數除以第二個數。2個異常:被除數不能為0和除數不能為100。
首先,在SE37中建立一個RFC,就用上篇博文的RFC吧。
在IMPORT頁設定如下:
Export版面設定如下:
Changing和Table頁面放空
Exceptions版面設定如下:
然後就是源碼咯:
代碼中,RAISE專門用於拋出異常,程式自動停止執行,所有的傳回值將被清空!RAISE 後面的內容就是在Exceptions中定義的內容了。
然後程式記得啟用!!如此SAP端設定就結束了。
回到VS2010中,建立一個程式,介面如下:
於是,開始寫程式:
首先是引用兩個dll(參考上篇),並在程式開頭輸入:
using SAP.Middleware.Connector;
public void nco()
{
IDestinationConfiguration ID = new MyBackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(ID);
RfcDestination prd = RfcDestinationManager.GetDestination("PRD_000");
RfcDestinationManager.UnregisterDestinationConfiguration(ID); //反註冊
nco(prd);
}
public void nco(RfcDestination prd)
{
string type = string.Empty;
RfcRepository repo = prd.Repository;
IRfcFunction companyBapi = repo.CreateFunction("ZRFC_MARA_INFO"); //指定RFC名稱
try
{
companyBapi.SetValue("NUM1", textBox1.Text.Trim()); //輸入參數複製
companyBapi.SetValue("NUM2", textBox2.Text.Trim()); //輸入參數複製
companyBapi.Invoke(prd); //開始調用執行
textBox3.Text = companyBapi.GetValue("NUM3").ToString(); //擷取返回結果
}
catch (RfcAbapException ex) //此Exception專門用於擷取使用者自訂的異常資訊!!!!
{
// companyBapi.Metadata.GetAbapException(ex.Key).Documentation 擷取對應的異常的解說文字
MessageBox.Show(companyBapi.Metadata.GetAbapException(ex.Key).Documentation, "SAP RFC返回資訊", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (RfcTypeConversionException ex) //此Exception專門用於擷取變數類型轉換的異常!!!!
{
MessageBox.Show("您輸入的不是數值", "SAP RFC返回資訊", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
catch (RfcAbapRuntimeException ex) //此Exception專門用於擷取RFC執行過程中的運行時異常!!!!
{
MessageBox.Show(companyBapi.Metadata.GetAbapException(ex.Key).Documentation, "SAP RFC返回資訊", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
catch (RfcBaseException ex) //此Exception是總Exception類,可以擷取所有的異常,如果有多個Catch,則不可以放第一位!!!!
{
MessageBox.Show("其他所有錯誤", "SAP RFC返回資訊", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
prd = null;
repo = null;
}
public class MyBackendConfig : IDestinationConfiguration
{
public RfcConfigParameters GetParameters(String destinationName)
{
if ("PRD_000".Equals(destinationName))
{
RfcConfigParameters parms = new RfcConfigParameters();
parms.Add(RfcConfigParameters.AppServerHost, "192.168.1.3");
parms.Add(RfcConfigParameters.SystemNumber, "00");
parms.Add(RfcConfigParameters.User, "MENGXIN");
parms.Add(RfcConfigParameters.Password, "5239898");
parms.Add(RfcConfigParameters.Client, "888");
parms.Add(RfcConfigParameters.Language, "ZH");
parms.Add(RfcConfigParameters.PoolSize, "5");
parms.Add(RfcConfigParameters.MaxPoolSize, "10");
parms.Add(RfcConfigParameters.IdleTimeout, "60");
return parms;
}
else return null;
}
public bool ChangeEventsSupported()
{
return false;
}
public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;
}
private void button1_Click(object sender, EventArgs e)
{
nco();
}
如此,C#運行結果如下:
以上可以正確得出我們自己拋出的異常的資訊出來。程式測試OK!!!