2015年10月30日 星期五

C# call AS400 RPG program



背景


因為有RPG程式老舊但一時間又不能轉出來,只能先靠程式去呼叫,
所以就用C#引用AS400元件去呼叫RPG,得到結果。

使用DLL

C:\Program Files (x86)\IBM\Client Access\Shared\cwbx.dll


加入參考的時候要注意內嵌 Interop 型別的問題


REF:http://blog.miniasp.com/post/2010/06/21/dot-net-4-Interop-type-cannot-be-embedded-Use-the-applicable-interface-instead.aspx


程式碼參考:


REF:http://forums.asp.net/t/1817332.aspx?calling+as400+programs+from+c+



using cwbx;
public string getRPGProgramReturnValue(string functionName, string LibraryName, string ProgramName, ProgramParameters parameters, string outputParameterName, out CUDResult msg)
{

    msg = new CUDResult();
    string result = string.Empty;
    StringConverter stringConverter = new StringConverterClass();
    AS400System system = new AS400System();

    try
    {
        // 定義 AS400 連線資訊
        system.Define("AS400");
        system.UserID = "你的帳號";
        system.Password = "你的密碼";
        //注意:一定要是IP,用domain網址會跳一個"CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87"的錯誤
        system.IPAddress = "你的伺服器IP";
        system.Connect(cwbcoServiceEnum.cwbcoServiceRemoteCmd);

        // 有連線才繼續
        if (system.IsConnected(cwbcoServiceEnum.cwbcoServiceRemoteCmd) == 1)
        {
            // 宣告程式物件 連到系統    
            cwbx.Program program = new cwbx.Program();
            program.LibraryName = LibraryName;
            program.ProgramName = ProgramName;
            program.system = system;

            // 呼叫程式
            try
            {
                program.Call(parameters);
            }
            catch (Exception ex)
            {
                msg.status = false;
                msg.msg += "呼叫程式時發生錯誤:" + ex.Message + "\n";

                if (system.Errors.Count > 0)
                {
                    msg.msg += "呼叫程式時發生system錯誤:";
                    foreach (cwbx.Error error in system.Errors)
                    {
                        msg.status = false;
                        msg.msg += error.Text + "\n";
                    }
                }

                if (program.Errors.Count > 0)
                {
                    msg.msg += "呼叫程式時發生program錯誤:";
                    foreach (cwbx.Error error in program.Errors)
                    {
                        msg.status = false;
                        msg.msg += error.Text + "\n";
                    }
                }
            }
            result = stringConverter.FromBytes(parameters[outputParameterName].Value);
        }
        else
        {
            msg.status = false;
            msg.msg += "無法連線到AS400 ServiceRemoteCmd\n";
        }
        system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
        msg.status = true;
    }
    catch (Exception ex)
    {
        system.Disconnect(cwbcoServiceEnum.cwbcoServiceAll);
        msg.status = false;
        msg.msg += "執行" + functionName + "時發生錯誤:" + ex.Message + "\n";
    }
    return result;
}



追記

20180530 在改寫舊程式時我把IP換成DOMAIN,因應管理要求,
結果就跳出一個CWB4016 - cwbCO_SetIPAddressW 傳回錯誤碼 87的錯誤,
研究了半天想說自己沒改什麼東西,google也查不到什麼,
回頭看自己改的東西才想到那個欄位是IP,該不會不能填網址,
就改回IP,就正常了,算踩到一個雷。
但他還有一個IPAddressLookupMode屬性,我是沒試過。

2015年10月28日 星期三

DB2 numeric 百分比 除法

兩個numeric欄位 A與B 都是兩位數
計算(B/A)*100的比率,如果是0就顯示0,或65.43的小數點表示

當A為0時,會無法計算,所以就直接顯示0

重點是CAST轉型為DECIMAL時要記得小數位數是包含在長度內的
如果要顯示123.45這樣三位數字與兩位小數點,長度就是3+2=5


CASE WHEN A is null or A=0 then varchar(0)

else varchar(round(CAST((CAST(COALESCE(B,0) AS FLOAT)/

     CAST(COALESCE(A,0) AS FLOAT))*100 AS decimal(5,2)),2))

END AS RATE

2015年10月21日 星期三

Microsoft Exchange server SMTP mail send slowly

SMTP寄信,每封信都要DELAY30秒,
明明已經收到信,但程式還卡在寄信指令那行無法前進,

經查為Exchange Server 有延遲設定,為了做陰影備援
請MIS將所有主機的延遲用以下指令設為零後,寄信都秒送了。


<div class="MsoNormal">
set-ReceiveConnector -Identity "MyExchangeName\Default MyExchangeName" -MaxAcknowledgementDelay 0
</div>


參考:




2015年10月19日 星期一

VM install Windows Server 2012 accoured error 0x80070570

VM install Windows Server 2012 accoured error 0x80070570
solution: check the md5 code,maybe ISO file not complete.
解法:檢查MD5,不一樣就重抓ISO

來源:LINE群

2015年10月13日 星期二

2015年10月2日 星期五

ORA-12704 字元設定不符合

我在做小計總計報表
用了group by rollup來做群組,還有grouping(欄位名稱)來判斷小計行跟總計行
因為小計跟總計行的時候被群組的欄位會留白,要塞一些字進去
就用了case when grouping.... then '這是小計'的判斷
然後就跳錯ORA-12704
查很多網頁都說字串引號前面加一個N來轉型
但是很討厭的是加上去後,那個字串後developer裡面的sql全部都會變成字串顏色

解決方法就是把這個字串轉型就好了
cast('總計' as nvarchar2(20))