"AS400" の一覧

5250エミュレータが繋がらない

WRKACTJOBにてサブシステムの欄にQINTERが存在していないと、5250エミュレータが接続できない。開始するにはコンソール端末より下記のコマンドを実行する。

STRSBS QINTER

ただし、なぜ起動していないのかの原因を解決する必要がある。バッチ処理が異常起こしていたり・・・

Inside the AS/400(日本語版)

AS400をDBとしてしか使っていないので、もっと活用しようとrs6000の日記を読ませてもらっているが基礎知識が無さ過ぎてJavaの開発環境の構築からできていない。

もっとAS400の基礎から学ばなくてはと思い、探してみたところInside the AS/400-日本語版に辿り着く。読んでみたいと思ったがそもそも注文ができないorz

どうもゲストもしくは会員としてログインしないとバスケットが正常に機能しない模様。

それにしてもAS400って公式マニュアル以外の書籍が圧倒的に少ないよなぁ。

IBM.Data.DB2.iSeriesの検証(2)

参照を追加したらフォームにdataGridView1とbutton1を追加。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using IBM.Data.DB2.iSeries;

namespace DB2Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            const string CN_STRING_DB2 = "DataSource=(ホスト名);USERID=(ユーザー名);PASSWORD=(パスワード);";

            StringBuilder sqlbldr = new StringBuilder();
            sqlbldr.AppendLine("select");
            sqlbldr.AppendLine("    COUNT(*)");
            sqlbldr.AppendLine("FROM");
            sqlbldr.AppendLine("    TESTLIB.TEST");


            using (iDB2Connection cn = new iDB2Connection(CN_STRING_DB2))
            {
                cn.Open();
                iDB2Command cmd = cn.CreateCommand();
                cmd.CommandText = sqlbldr.ToString();
                using (iDB2DataAdapter da = new iDB2DataAdapter(cmd))
                {
                    DataTable dt = new DataTable();
                    dt.Locale = System.Globalization.CultureInfo.InvariantCulture;
                    da.Fill(dt);

                    dataGridView1.DataSource = dt;
                }
            }
        }
    }
}

その後、iSeriesナビゲーターがインストールされていないXP上で実行すると・・・

image 

だめでした。エラーメッセージのせておきます。

See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.TypeInitializationException: The type initializer for ‘IBM.Data.DB2.iSeries.iDB2Constants’ threw an exception. —> An unexpected exception occurred.  Type: System.DllNotFoundException, Message: Unable to load DLL ‘cwbdc.dll’: 指定されたモジュールが見つかりません。 (Exception from HRESULT: 0x8007007E).
   — End of inner exception stack trace —
   at IBM.Data.DB2.iSeries.iDB2Connection.InitializeDefaultProperties()
   at IBM.Data.DB2.iSeries.iDB2Connection..ctor(String connectionString)
   at DB2Test.Form1.button1_Click(Object sender, EventArgs e) in D:\Visual Studio 2005\Projects\DB2Test\DB2Test\Form1.cs:line 30
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

************** Loaded Assemblies **************
mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
—————————————-
DB2Test
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/temp/DB2Test/DB2Test.exe
—————————————-
System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
—————————————-
System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
—————————————-
System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
—————————————-
IBM.Data.DB2.iSeries
    Assembly Version: 10.0.0.0
    Win32 Version: 11.0.9.1
    CodeBase: file:///C:/temp/DB2Test/IBM.Data.DB2.iSeries.DLL
—————————————-
System.Data
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
—————————————-
System.Xml
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.1433 (REDBITS.050727-1400)
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
—————————————-

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging=”true” />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

IBM.Data.DB2.iSeriesの検証(1)

MySQLみたいな設計なら、iSeriesナビゲーターに含まれる.Net Providorでも同じ事ができるんじゃね?ということで、試してみました。

image C:Program FilesIBMClient Access 以下にあるIBM.Data.DB2.iSeries.dllをコピー
image C#のプロジェクト内へコピー。その後、参照設定でDLLを指定。
image こんな風にする。

AS400のクエリで日付演算

AS400上のクエリで日付演算するには・・・

文字→日付

CAST(‘2009-05-07’ as DATE) as TEST

日付演算(DATEADD関数の代わり)

CAST(‘2009-05-07’ as DATE) – 7 DAY as TEST

 

前に調べたけど、忘れてしまいかなり探しました。区切り文字の’-‘はAS400のバージョンに依存するかもしれません。この表記はV5R4で確認。

AS400の異常をメールで通知する(3)

前回のように設定すると4つほど問題が発生。

1. 前回指定したコマンドが動かない

RUNRMTCMD CMD(’D:\CMDS\AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) CCSID(943)

これでエミュレータ上では正常に呼び出せていたが、iSeriesナビゲータを経由するせいなのか、「必要なユーザー ID がないかまたは無効です。」と言われる。結局、下記のように修正した。

RUNRMTCMD CMD(’D:\CMDS\AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) RMTUSER(TEST) RMTPWD(TEST) CCSID(943)

2. パスが認識されない

WS000063

困ったことに、iSeriesナビゲータ上のコマンド呼び出しでは¥(ほんとは半角)が使えない模様。

WS000054

物は試しということで、/(スラッシュ)にしたらOKだった。

RUNRMTCMD CMD(’D:/CMDS/AS400MAIL 1.BAT’) RMTLOCNAME(’192.168.xxx.xxx’ *IP) RMTUSER(TEST) RMTPWD(TEST) CCSID(943)

3.  CSCRIPTが応答メッセージを返す

BATファイルでいうところの@echo offをvbs呼び出し時に指定していなかったので、標準出力に下記のメッセージの大文字の箇所だけ出力されていた。

Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

よってAS400MAIL.BATを下記のように修正

cscript //B AS400Mail.vbs

4. RUNRMTCMDが邪魔する

ここまでの対応で晴れて標準出力(?)へ出力されるメッセージが無くなった。すると・・・

WS000065

というメッセージを親切に出してくれる。ググって出てきた結果、「OVRPRTF QYSPRTをHOLDしDLTSPLFして下さい。 」が理解できない・・・というか、影響範囲が解らずやっていいか判断できず。

今はメッセージモニタの実行ユーザーを別途作成し、そのユーザーが出力する先に仮想PRTデバイスを指定してます。が、すごく暫定的な対応で残念過ぎる。今回の手法はすごくお薦めできません(涙)

もし設定した人が居たらごめんなさい。

AS400の異常をメールで通知する(2)

前回の続きです。

iSeries Access for Windows リモート・コマンドの設定

WS000052 AS400Mail.vbsとAS400MAIL.BATを設置したサーバーにて「」サービスを起動します。
WS000057 再起動時にも開始されるように自動にします。
WS000058 デスクトップとの「対話サービスの許可」が無くてもOKでした。
WS000060 空白などが含まれないパスにAS400Mail.vbsとAS400MAIL.batをコピーします。
ここでは「D:\cmds」としました。

iSeries Access for Windows リモート・コマンドの設定

WS000051
WS000053
WS000054 監視するメッセー ジ対象とRUNRMTCMDを指定。

RUNRMTCMD CMD(‘D:\CMDS\AS400MAIL 1.BAT’) RMTLOCNAME(‘192.168.xxx.xxx’ *IP) CCSID(943)

これでいけました。

WS000050 メッセージ監視間隔を指定。
WS000055 この辺は特に触ってません。
WS000061 AS400のIPL時にメッセージのモニタが停止してしまう場合は、この辺をチェックすると治る。
RUNRMTCMD CMD(‘D:\CMDS\AS400MAIL.BAT’) RMTLOCNAME(‘192.168.xxx.xxx’ *IP) CCSID(943)

上の’D:\CMDS\AS400MAIL.BAT’部分を

RUNRMTCMD CMD(‘D:\CMDS\AS400MAIL.BAT 1’) RMTLOCNAME(‘192.168.xxx.xxx’ *IP) CCSID(943)

などにするとAS400Mail.vbsのCASE文のメッセージでメールが送信されます。

ちなみにメッセージをモニタする方法はiSeriesナビゲーターでしか無いらしい。あと、AS400MAIL.BATに@ECHO OFFを設定しないと標準出力のプリンタからなんか出てきます。

以上がAS400をDBとしてしか使えない人によるAS400の監視方法でした。また、より良い方法を求めています。コメント募集中です。

2009/04/26追記

この設定のままでは、正常に動作しない箇所があったので後日続編を書きます。

AS400の異常をメールで通知する(1)

AS400の異常をメールで通知する方法を探していたが、

外部のSMTPサーバーを利用してメールを送信する事はできない。
SMTPサーバーを立てても日本語は扱えない。
SMTPサーバーを立ててもユーザーが無いと送信できない

などの諸事情と自身のAS400に対するスキルの無さを踏まえた上で下記の方法を取った。

AS400自身からメールを送信することは諦めて、RUNRMTCMDを使う

こうしてしまえばあとはWindowsの領域に無理矢理引きずり出せる。VBScriptは起動時に

cscript AS400Mail.vbs

としなくてはならないので、呼び出し用のbatファイルを組み合わせました。メールのSubjectとBodyをvbs内で設定するようにしたのは、batファイルから渡せなかった為の妥協です(汗)。

AS400Mail.vbs

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

AS400MAIL.BAT

cscript D:\cmds\As400Mail.vbs /I:%1