http://www-06.ibm.com/jp/domino01/mkt/cnpages3.nsf/page/default-002416B5
V6R1では次のバージョンからWindows7がサポートされるそうです。V5R4はサポートされないけど、リフレッシュ・オーダー(無償)でV6R1版が入手できるらしいです。
http://www-06.ibm.com/jp/domino01/mkt/cnpages3.nsf/page/default-002416B5
V6R1では次のバージョンからWindows7がサポートされるそうです。V5R4はサポートされないけど、リフレッシュ・オーダー(無償)でV6R1版が入手できるらしいです。
7/7からV5R4M0向けにSI35287が提供開始されてた。
http://www-06.ibm.com/jp/domino01/mkt/cnpages3.nsf/page/default-002416B5
AS400上のクエリで日付演算するには・・・
CAST(’2009-05-07′ as DATE) as TEST
CAST(’2009-05-07′ as DATE) – 7 DAY as TEST
前に調べたけど、忘れてしまいかなり探しました。区切り文字の’-'はAS400のバージョンに依存するかもしれません。この表記はV5R4で確認。
前回のように設定すると4つほど問題が発生。
| RUNRMTCMD CMD(’D:\CMDS\AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) CCSID(943) |
| RUNRMTCMD CMD(’D:\CMDS\AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) RMTUSER(TEST) RMTPWD(TEST) CCSID(943) |
| RUNRMTCMD CMD(’D:/CMDS/AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) RMTUSER(TEST) RMTPWD(TEST) CCSID(943) |
| Microsoft (R) Windows Script Host Version 5.7 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. |
| cscript //B AS400Mail.vbs |
前回の続きです。
| AS400Mail.vbsとAS400MAIL.BATを設置したサーバーにて「」サービスを起動します。 | |
| 再起動時にも開始されるように自動にします。 | |
| デスクトップとの「対話サービスの許可」が無くてもOKでした。 | |
| 空白などが含まれないパスにAS400Mail.vbsとAS400MAIL.batをコピーします。 ここでは「D:\cmds」としました。 |
| 監視するメッセー ジ対象とRUNRMTCMDを指定。 RUNRMTCMD CMD(’D:\CMDS\AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) CCSID(943) これでいけました。 |
|
| メッセージ監視間隔を指定。 | |
| この辺は特に触ってません。 | |
| AS400のIPL時にメッセージのモニタが停止してしまう場合は、この辺をチェックすると治る。 |
| RUNRMTCMD CMD(’D:\CMDS\AS400MAIL.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) CCSID(943) |
| RUNRMTCMD CMD(’D:\CMDS\AS400MAIL.BAT 1′) RMTLOCNAME(’192.168.xxx.xxx’ *IP) CCSID(943) |
AS400の異常をメールで通知する方法を探していたが、
| 外部のSMTPサーバーを利用してメールを送信する事はできない。 |
| SMTPサーバーを立てても日本語は扱えない。 |
| SMTPサーバーを立ててもユーザーが無いと送信できない |
などの諸事情と自身のAS400に対するスキルの無さを踏まえた上で下記の方法を取った。
こうしてしまえばあとはWindowsの領域に無理矢理引きずり出せる。VBScriptは起動時に
| cscript AS400Mail.vbs |
としなくてはならないので、呼び出し用のbatファイルを組み合わせました。メールのSubjectとBodyをvbs内で設定するようにしたのは、batファイルから渡せなかった為の妥協です(汗)。
Set a = CreateObject("CDO.Message")
a.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
a.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.xxx.xxx"
a.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
a.Configuration.Fields.Update
a.From = "xxxx@exsample.com"
a.To = "test@exsample.com"
a.Subject = "[AS400]エラー通知"
a.TextBody = "AS400にてエラーしました。" & vbCrLf
'// 送信パターン指定があるか?
If WScript.Arguments.Named.Exists("I") Then
iSendMode = 0
If WScript.Arguments.Named("I") <> "" Then
iSendMode = CInt(WScript.Arguments.Named("I"))
End If
SELECT CASE iSendMode
CASE "1"
' 01 ファイルロックモニタ用
a.Subject = "[AS400]ファイルロック発生通知"
a.TextBody = "AS400にてファイルロック発生通知が発生したようです。" & vbCrLf
CASE ELSE
a.Subject = "[AS400]エラー通知"
a.TextBody = "AS400にてエラーしました。" & vbCrLf
END SELECT
End If
'// 時刻を末尾に追加
a.TextBody = a.TextBody & Now
'// メール送信
a.Send
cscript D:\cmds\As400Mail.vbs /I:%1
SELECT
CURRENT_DATE,
CURRENT_TIME
FROM
TESTLIB.TEST
i5(AS400)に対してODBC経由でSELECTはもちろん、INSERT,UPDATEなどのクエリも問題なく処理できるのですがプログラムのインストールとは別にIBM iSeries Access for WindowsをインストールしODBCの接続設定をしないと動作しません。しかもODBCの接続設定名も間違っていてはいけません。
そのためiSeries Access for Windowsに含まれるIBM.Data.DB2.iSeries(.Netプログラミングサポート時にインストールされる)を利用してクエリを実行するにはどうすればよいか悩んでました。
というのも、@@TESTというカラムが存在していた場合にODBCなら[@@TEST]と記述すれば問題なかったが、iSeries Access for Windowsで同じように記述するとエラーとなる。
結局、"(ダブルクォテーション)を使えばうまく行くことがわかった。実際には"@@TEST"となる。"(ダブルクォテーション)はC#上でも特殊文字なので記述が面倒だけど。
public void UpdateTest(string sValue)
{
const string CRLF = @"\r\n";
StringBuilder sbSql = new StringBuilder();
sbSql.Append("UPDATE" + CRLF);
sbSql.Append(" TESTLIB.TEST0407" + CRLF);
sbSql.Append("SET" + CRLF);
sbSql.Append(" \"@@TEST2\" = @TEST2" + CRLF);
sbSql.Append("WHERE" + CRLF);
sbSql.Append(" \"@@TEST1\"= @TEST1" + CRLF);
try
{
using (iDB2Connection cn = new iDB2Connection(DataSource=192.168.xxx.xxx;USERID=(ユーザー名);PASSWORD=(パスワード);))
{
cn.Open();
using (iDB2Command cmd = cn.CreateCommand())
{
sbSql = sbSql.Replace(CRLF, " ");
cmd.CommandText = sbSql.ToString();
Debug.WriteLine(sbSql.ToString());
cmd.Parameters.Add("@TEST1", iDB2DbType.iDB2Char);
cmd.Parameters.Add("@TEST2", iDB2DbType.iDB2Char);
cmd.Parameters["@TEST1"].Value = "(更新対象レコードのキー)";
cmd.Parameters["@TEST2"].Value = sValue;
cmd.ExecuteNonQuery();
}
cn.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
※AppendLineを使用していないのは、WindowsCEとソースを共有している為です。あと\は実際には円マークです。
ちょっと時間がかかるクエリを投げたら、「SQL0666 – SQL QUERYが指定された時間制限または記憶制限を超えています。 」とi5に言われた。
前に解決方法を書いていたが、画像のリンクが切れていたので再度投稿。
※iSeries Access for WindowsのODBCドライバを利用しています。
| 管理ツールのODBCより、構成画面を開く。 パフォーマンスタブを選択し、下部にある拡張ボタンを押す | |
| 「照会タイムアウトを使用可能にする」のチェックボックスを外す。 |