2011年10月26日 星期三

SAP: Destination configuration already initialized - Part II

這個範例主要用來解決兩件事情:

1. 避免 Destination configuration already initialized 錯誤
2. 展示如何把 IRfcTable 當作呼叫 RFC 的輸入參數

歷經浪費非常多天的 try and error,有需要的請服用。

public IRfcTable TEST_B0001(string VBELN, string POSNR, string CHARG, string LFIMG)
{
        IRfcTable IRetTable = null;
        HLBackendConfig hlConfig = new HLBackendConfig();
        
        bool bRegistered = false;
        
        try
        {
            RfcDestinationManager.RegisterDestinationConfiguration(hlConfig);
            RfcDestination rfcDest = RfcDestinationManager.GetDestination("INIT_SAP");
            RfcRepository rfcRepo = rfcDest.Repository;
            IRfcFunction IReader = rfcRepo.CreateFunction("TEST_B0001");
        
            bRegistered = true;
        
            IRfcTable Itab = IReader.GetTable("IT_INPUT");

            Itab.Append();
        
            Itab[0].SetValue("VBELN", VBELN);
            Itab[0].SetValue("POSNR", POSNR);
            Itab[0].SetValue("CHARG", CHARG);
            Itab[0].SetValue("LFIMG", LFIMG);
        
            IReader.SetValue("IT_INPUT", Itab);
        
            IReader.Invoke(rfcDest);
            
            IRetTable = IReader.GetTable("ET_RETURN");
        }
        catch (Exception ex)
            {
            throw ex;
        }
        finally
        {
            if (bRegistered)
                RfcDestinationManager.UnregisterDestinationConfiguration(hlConfig);
        }
        
        return IRetTable;
}

2011年10月18日 星期二

SAP 與 .NET 整合心得

經過了數個月專案的奮鬥,總結出一些心得列出如下:

1. .NET 與 SAP 函數溝通透過 DataTable <--> IRfcTable 兩者間的互相轉換最方便
2. .NET Web Service 與 SAP 函數溝通 DataTable <--> DataSet <--> IRfcTable 三者間的互轉最方便
3. 設計溝通介面函數時使用以上兩個原則,實作系統的速度很快而且具有快速擴充的彈性
4. SAP Connector 本身的問題很多,每次呼叫 RFC 時,Init / Uninit 要寫在同一段處理函數中
5. SAP Connector 也是透過 .NET 撰寫而成,第一次實機部署安裝之後,要記得重新啟動作業系統
7. 由於第六點原因,RFC 呼叫非常耗資源及時間,可以的話盡量將資料另外儲存在自己系統的資料庫中,資料庫沒資料才考慮從 RFC 呼叫取得
8. 多多利用 SAP Logon 等 GUI 工具,文件上寫的往往都不是真的,看 code 才是王道
9. 一有功能要馬上讓使用者試用,並且立即強迫畫押簽收,以免日後發生糾紛時沒有防禦的系統

2011年10月11日 星期二

.NET CF ListView 不支援 OnClick

.NET CF 中的 ListView 不支援 ItemOnClick, OnClick 等事件,
所以若要取得使用者點選的 ListViewItem 得用 SelectedIndexChanged 來替代,
範例如下:

private void lv_SelectedIndexChanged(object sender, EventArgs e)
{
    if (lv.SelectedIndices.Count > 0)
    {
        ListViewItem lvi = lv.Items[lv.SelectedIndices[0]];
        MessageBox.Show(lvi.SubItems[0].Text);
    }
}