2015年10月30日 星期五

C# call AS400 RPG program

markdown

# 背景

因為有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+



```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將所有主機的延遲用以下指令設為零後,寄信都秒送了。


set-ReceiveConnector -Identity "MyExchangeName\Default MyExchangeName" -MaxAcknowledgementDelay 0


參考:




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))