システム奮闘記:その51

LinuxとAS400の連動。「iSeries Access for Linux」に挑戦!





(2006年7月3日に掲載)
はじめに

  うちの会社に、大事な基幹業務システムとして鎮座しているAS400。

  数年前から、製造メーカーであるIBMはAS400と言わずに

  iSeries

  と言っているのだが、気にしない。AS400で良いのらー!!
 (注意!) iSeriesという名称も「i5」に変わりました。


  以前から、社内では、パソコンとAS400とのデータ連動の実現を望んでいる。

  月次帳票類などは、RPG言語を使って帳票プログラムを作成するのだが、
エクセル型式で表を求められる事が増えている。
  P-COMM(IBMが出している5250エミュレーター)には、データ転送の機能があり
データをエクセル型式に落とし込み、加工をしたりする。

  私の上司が行っているのだが、結構、手間だ。

  それ以外にも、私が、AS400のデータをP-COMMを使ってデータを落とし込み、
PostgreSQLに入れて、Web上でデータ閲覧ができるようにしているが、
更新を行うのが手作業。
  手間がかかる上、重要なデータを使っていないせいもあって、
ほとんど更新作業を行っていない。
  データの整合性が合わなくなる問題が発生している。

  そのため次のような事ができれば良いと考えていた。

LinuxとAS400とのデータ連動
AS400(iSeries,i5)とLinuxの連動の概略
Linuxのデータベース(PostgreSQL)とAS400のデータベース(DB2)とが
連動できれば良いと考えていた。
これを使うと、Web検索システムを構築する場合も、AS400のデータを
使う事ができるので利便性があがると考えている。

それだけでなくネット販売システムなどの受注データを
PostgreSQL経由でAS400のDB2へ反映させる事ができれば
手入力の手間も省かれる。
  上のような便利な方法がないかなぁと夢みていたのだ。

  2年ぐらい前からAS400を購入した先や、IBMから以下の方法があるのを
提案されている。

LinuxとAS400とのデータ連動
AS400(iSeries,i5)上にOS400とLinuxを共存させて連動させる方法
AS400(iSeries)の1台の中で、AS400のOS400とLinuxを共存させて
両方にDB2というデータベースを持たせて連動させる方法だ。
これだと1CPUのライセンスになるため、2つのデータベースを
購入する必要がなくなる。
  だが、この場合だと1000万円を軽く超えるため・・・

  費用が高過ぎるのらー!!

  だった。
  大企業ならいざ知らず、中小企業には大き過ぎる投資なのだ。

ODBCを使えばできる事を知る

3年くらい前に、大学時代の先輩で、ユーザー企業のシステム担当者を やっている人から次の事を教えてもらった。 菅君、AS400とMS-AccessはODBCを使えばできるで!
MS-AccessとAS400とのデータ連動
MS-AccessとAS400(iSeries,i5)とのODBC経由のデータ連動の図式
  しかし、手元にドライバはない上、しかも・・・

  当時は、TCP/IPで動かしていなかった!

  だった (^^;;

  当時、社内のAS400の通信プロトコルがSNAだった。
  ODBCは使えないと思った私は、導入するのを断念したのだった。

  それから3年ぐらい放置する事になった。

Client Accessを社内で発見。早速、連動実験だ!

2006年6月、転機が訪れた。 ふと、MS-AccessとAS400とのデータ連動ができないかと思った。 AS400の購入先のヘルプデスクに電話をかける。 クライアントアクセス(Client Access)というソフトがあるという。 それはAS400の本体の購入時に付属品として付いているという。 そんな話、知らなかったぞ (・o・) AS400の本体を購入したのは1996年。 その頃は、私は大学生で、まだ入社していない。 しかも、購入時に関わった上司は、その事を把握していなかったのだ。 さて、早速、クライアントアクセスのCD-ROMを探すため、 AS400関連の資料が置いてある倉庫まで行く。倉庫を探すと見つかった! 「IBM AS/400 クライアント・アクセス Windows 95/NT 版」だ。 早速、Windows98のマシン(私の机のパソコン)に入れてみる。 そして、AS400のODBCのドライバの設定と、MS-AccessのODBCの データリンクの設定を行った。 すると 見事の成功した (^^)V さて、連動は可能になったが、使い道が思いつかない。 いかにMS-Accessとの連動を活用して、業務改善につなげるかが課題だ。

Linux版の「iSeries Access for Linux」を使ってみる

さて、AS400とMS-Accessとの連動が可能だという事がわかった。 それを調べている過程で、googleで以下のサイトを発見した。 http://www.e-bellnet.com/special/vision/vision_0405.html Linux版のクライアントアクセスがある事がわかった。 正式名称は「iSeries Access for Linux」という名前だ。 5250エミュレーターでLinux上でAS400の画面を開く事ができる以外にも、 どうやら以下の事ができるようだ。
LinuxからAS400のデータを呼び出す事ができる
ODBC経由でAS400(iSeries,i5)とLinuxとの連動の図式
  ただ、AS400側のOS400のバージョンが5.1以上である事が条件だった。
  うちの会社のバージョンは4.3だった。

  ダメ元でインストールしてみる事にした。
  IBMの次のサイトからダウンロードできる。
  http://www-03.ibm.com/servers/eserver/iseries/access/linux/

  英語で書かれている。英語が嫌いな私は、渋々と読みながら
「iSeries Access for Linux」をダウンロードした。


  さて、RedHat7.3のマシンに、そのソフトを入れてみるが

  インストールできへん (TT)

  だった。

エラーの様子
[root@redhat7.3]# rpm -ihv iSeriesAccess-5.2.0-1.10.i386.rpm
エラー: 依存性の欠如:
        libgcc_s.so.1は iSeriesAccess-5.2.0-1.10 に必要とされています
        libgcc_s.so.1(GCC_3.0)は iSeriesAccess-5.2.0-1.10 に必要とされています
        libgcc_s.so.1(GLIBC_2.0)は iSeriesAccess-5.2.0-1.10 に必要とされています
        libodbc.so.1は iSeriesAccess-5.2.0-1.10 に必要とされています
        libodbcinst.so.1は iSeriesAccess-5.2.0-1.10 に必要とされています
        libstdc++.so.5は iSeriesAccess-5.2.0-1.10 に必要とされています
        libstdc++.so.5(CXXABI_1.2)は iSeriesAccess-5.2.0-1.10 に必要とされています
        libstdc++.so.5(GLIBCPP_3.2)は iSeriesAccess-5.2.0-1.10 に必要とされています
[root@redhat7.3]# 
  うーん、RPM型式だとソフトの依存性が出る・・・ (--;;

  RedHat7.3が妙に気に入っている私は、カーネルやApacheやPostfixなど
全てソースコンパイルを行っているのだが、さすがに、gccやglibcは
恐くてソースコンパイルでインストールを行っていない。

  だが、1台だけRedHat9.0のマシンがある。
  gccも3.0以上だし、glibcも問題なし。なのでインストール可能と考えた。

  そして、Redhat9.0のマシンに入れるが・・・

  それでもインストールできへん (TT)

  だった。

  エラーの原因は、ODBCに関するライブラリが入っていないからだという。
  unixODBCというソフトを入れる必要があるという。

  RedHat9.0の場合、3枚目のCD-ROMに、unixODBCに関係するRPMが入っている。

CD-ROMからインストールしたunixODBCに関するソフト
unixODBC-2.2.3-6.i386.rpm
unixODBC-devel-2.2.3-6.i386.rpm
unixODBC-kde-2.2.3-6.i386.rpm
qt-ODBC-3.1.1-6.i386.rpm
  これらのソフトを入れる。問題なくインストールできた所で、
肝心のiSeriesAccess-5.2.0-1.10.i386.rpm もインストールする。
  今度は、ソフトの依存性のエラーがでなかった。

  これで準備OK!


iSeries Accessの付属品を触ってみる

さて、ODBCを使ってLinuxからAS400へ接続に挑戦する話に入る前に 「iSeries Access for Linux」のパッケージの中に含まれている いくつかのツールについて紹介したいと思います。 ツールの実行ファイルは以下のディレクトリーに入っています。 /opt/ibm/iSeriesAccess/bin ここのディレクトリーには以下のツールが入っています。
/opt/ibm/iSeriesAccess/bin に入っているツール類
[root@RedHat9.0]# ls
colormapper  cwbmedic  cwbrunsql   ibm5250    miscpref5250  rmtcmd
cwbcopwr     cwbnltbl  cwbtrc      keymapper  playedit      rmtodbc
cwblmsrv     cwbping   helpviewer  keypad     printapp      setup5250
これらのツールについての簡単な説明は以下のURLにあります。
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rzatv/rzatvutilodbc.htm
  まずは、Linux版の5250エミュレーターの話についてです。


  AS400を使っている中小企業が多いのだが、5250エミュレーターが使えるのは
Windowsという感じがある。
  そこで、Linuxデスクトップでも、5250エミュレーターが使えれば
中小企業へのLinuxデスクトップが普及するための一歩として考える。

  まずは、5250エミュレーターの設定を行う。
  setup5250コマンドを使う。すると、設定画面が出てくる。

Linux版5250エミュレーターの設定
Linux版5250エミュレーターの設定
赤い部分の「接続」を選びます。
そして「接続」→「新規」を選びます。
  すると次の画面が出てくる。

Linux版5250エミュレーターの設定
Linux版5250エミュレーターの設定
接続説明の部分に、接続する端末の名前を入れます。
そして、接続先のAS400のIPアドレスを入力します。

そして「拡張5250接続」を選びます。
  すると下の図が出てきます。

Linux版5250エミュレーターの設定
Linux版5250エミュレーターの設定
赤く囲んだ部分の「セッション表題」と「表示名」を記入します。
  これで設定が完了です。

  さて、設定後は、下の図のような画面になっています。

Linux版5250エミュレーターの設定
Linux版5250エミュレーターの設定
  接続で「set2000」(設定を行った接続)を選びます。
  すると、認証画面が出てきます。

Linux版5250エミュレーターの設定
Linux版5250エミュレーターの設定
IDとパスワードを入力します。
  これで、5250エミュレーターが登場します。

Linux版5250エミュレーターが立ち上がる
Linux版5250エミュレーターが起動
  見事に5250エミュレーターが動いた!!

  だが、問題はある。

  ところどころ文字化けがあるのらー!!

Linux版5250エミュレーターの文字化けの様子
外字を中心とした文字で文字化けが起こっている様子
  外字の表示に難ありなのだ。この文字化けも「No」(ナンバー)の外字が
文字化けして表示できなかったのだ。これは止む得ない話だ。
  Windowsの外字をLinuxで表示させる発想が間違えていると思うのだが
一般ユーザーに文字コードの問題の話をしても仕方がない面もある。

パソコンの大衆化の問題点(外字について)
「システム奮闘記:その14」(文字コードとメールの問題)
でも取り上げましたが、日本語には、何種類かの文字コードがあります。
そのためWindowsでは表示できてもLinuxでは表示できない文字や
メールでは送信できない文字などがあります。

もし、Windows上で受注明細などを入力する際に外字を使うと
Linux上では文字化けを起こす。

入力する人がITに詳しい人やIT技術者なら、文字コードの問題を
考慮してくれるのを期待(?)できるかもしれないが、
一般ユーザーに、そこまで考慮しろというのは難しい。
むしろ「なんで、できへんねん」と言われるのがオチだ。

文字コードの種類や、文字コードが何種類もできた経緯を知らない
一般利用者がパソコンを使い、知らずに外字を使う事で
生じる問題なのだ。

予備知識のない一般利用者が文字を使う事を前提に考えていかないと
この手の問題のトラブルはなくならないと思う。

最近、IT技術者が平気で外字入りのメールで送ったのを目の当りにし
呆れてしまう事もあるのだが・・・
  あとはライセンスの問題だろう。
 「iSeries Access for Linux」のパッケージ自体は無償でダウンロードできる。
  だが、WindowsのCALと同様に、AS400への接続台数が設定されているため、
無制限にAS400から接続はできないのだ。


iSeries Access for linux のコマンド

次に紹介するのは、直接、AS400へ接続して「AS400のコマンド」を送り込む コマンドを紹介します。 それが「rmtcmd」コマンドだ。 ポート8495を使い、AS400側でRMTCMDサーバーが立ち上がっていればOKだ。
rmtcmdコマンドについて
rmtcmdコマンド
直接、AS400のコマンドを送る。
受けてのAS400側は、RMTCMDサーバーが立ち上がっているのが前提だが
STRHOSTSVRコマンドを叩き、RMTCMDを選択すれば、簡単に立ち上がる。
  早速、コマンドを実行してみる。

rmtcmdコマンドを実行してみる
[root@RedHat9.0]# ./rmtcmd /SYSTEM:192.168.X.Y /USER:GMC /PASSWORD:GMC "SNDBRKMSG MSG('あああああ') TOMSGQ(XXXX)"

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
Remote Command utility V1.2
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

リモート・システム名は 192.168.X.Y です。
[root@RedHat9.0]# 
上の操作はAS400に「SNDBRKMSG MSG('あああああ') TOMSGQ(XXXX)」
というコマンドを、AS400に送り込むものだ。

これはAS400の端末XXXXに「あああああ」のメッセージを送るという意味だ。
  実際に、端末XXXXへ「あああああ」のメッセージが送られているのか
確認する事にした。すると

  見事、送信できた (^^)V

端末XXXXでの画面の様子
rmtcmdコマンドを実行結果
  キチンと文字コードも変換されているためか文字化けしていない。
  LinuxからAS400へコマンドを送る事ができるのは驚きだ。

  LinuxのcronにAS400のコマンドを仕掛けて、定期的にAS400へコマンドを
送る事が可能だ。
  だが、そんな事はAS400側でも設定はできる。

  上司と使い道について話をするが、使い道は思いつかなかった。


ODBCを使ってAS400とLinuxの連動に挑戦

さて、2つほど「iSeries Access for Linux」に付属しているツールについて 話を書いた所で、本題のODBCを使ってAS400とLinuxとの間でデータ連動が 可能かどうかの話に入る事にします。 まずはODBCの設定を行う。 ODBCConfigというコマンドを叩くと、ODBCの設定画面が出てくる。
ODBCConfigを使ったODBCの設定画面
ODBCConfigを使ったODBCの設定画面
  だが、上の状態だとログインしたユーザー名でないと使えない。
  そこで誰でも使えるように「System DSN」に設定をする。

ODBCConfigを使ったODBCの設定画面
ODBCConfigを使ったODBCの設定画面
  「Add」を選択する。
  すると下の図が出てくる。

ODBCConfigを使ったODBCの設定画面
ODBCConfigを使ったODBCの設定画面
ここで「iSeries Aceess ODBC」を選択する。そして「OK」を押す
 ここでAS400との連動のためのODBCドライバが組み込まれた形になる。

ODBCConfigを使ったODBCの設定画面
ODBCConfigを使ったODBCの設定画面
  すると以下の画面が出てきます。

ODBCConfigを使ったODBCの設定画面
ODBCドライバの設定項目
ODBCドライバの必要事項の入力部分だ。
赤い字で書いた内容を入力します。

ここのパラメータに関する情報は英語しかなかった (^^;;
http://www-03.ibm.com/servers/eserver/iseries/linux/odbc/guide/odbcproperties.html
  ちなみに、ODBCに関する全般的な情報のサイト(英語)は以下にあります。
  http://www-03.ibm.com/servers/eserver/iseries/linux/odbc/guide/


  これで設定完了。


  Webサイトを探している際に、Apache + PHPを使って、AS400のDB2に
アクセスしている話などを見つける。
  そこでお得意の丸写しを始める。

  AS400のODBCドライバをいれたLinuxに、ApacheとPHPをインストール。
  次の実験を行おうと考えた。

Linux + Apache + PHP + ODBC + AS400(iSeries,i5)の連動実験の概略
Linux + Apache + PHP + ODBC + AS400(iSeries,i5)の連動実験
PHPのODBC関数を使ってAS400のデータベース:DB2(物理ファイル)に
接続してみようと考えてみたい。
  PHPのプログラムは以下のソースになりました。

PHPのソース (conn.php)
<HTML><HEAD><TITLE>PHP ODBC-function test</TITLE></HEAD>
<BODY>

PHP ODBC-function test<BR><BR>

<HR>

<?php

$conn = odbc_connect("AS400","ID","PASSEORD");

print "$conn<BR>" ;

odbc_close($conn);

?>
  早速、プログラムを動かしてみるが・・・

  エラーが出てもうた!!

実験結果(ブラウザの様子)
エラーが出た実験結果の様子
エラーの内容
arning: SQL error: [unixODBC][IBM][iSeries Access ODBC ドライバー]
内部 ドライバー・エラー。, SQL state S1000 in SQLConnect 
in /var/www/html/conn.php on line 10


Warning: odbc_close(): supplied argument is not a valid ODBC-Link resource
in /var/www/html/conn.php on line 14
  なんだかAS400のODBCドライバに問題があるようだ。
  ODBCドライバのパラメータの設定を色々触ってみるのだが・・・

  やっぱりアカン (TT)

  この問題の解決の糸口がないかと考えた。
  ふとWebサイトに書いてあったrmtodbcコマンドを見る。

  ODBC経由でAS400にコマンドを送るものだという。

rmtodbcコマンドについて
rmtodbcコマンドについて
本来、rmtodbcコマンドはODBCを経由して、「AS400のコマンド」を送るのだが、
この時は、SQL文を送る物と思い込んでいた。

AS400側でDATABASEサーバーを立ち上がる必要があるのだが、
これもSTRHOSTSVRコマンドを叩き、DATABASEを選べば、簡単に立ち上がる。
  この時点ではrmtodbcコマンドをSQL文をODBC経由でAS400に送るための
コマンドだと思い込んでいた私。
  早速、SQL文を送ってみる事にした。

  だが・・・

  エラーが出た (TT)

  いつもの如く、泥沼にハマっていく予感がした。

エラーの内容
[root@redhat9.0]# pwd
/opt/ibm/iSeriesAccess/bin
[root@redhat9.0]#
[root@redhat9.0]# ./rmtodbc /DSN:AS400 /USER:*** /PASSWORD:*** "select * from MOJI"

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
Remote Command via ODBC utility V1.2
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

ERROR SQLDriverConnect
内部 ドライバー・エラー
サーバーは、複数データベースをサポートしていません。データベース名は無視されます。
[root@redhat9.0]# 
  色々なサイトを見ていると、上の入力の仕方が間違えていたようだ。
  そこで気を取り直してコマンドを打つが・・・

rmtodbcコマンドを打つが
[root@redhat9.0]# ./rmtodbc "SELECT * FROM SUGA.MOJI"

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
Remote Command via ODBC utility V1.2
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

リモート・システム名は 192.168.X.Y です。
ERROR SQLDriverConnect
通信 リンク 障害。 comm rc=8015 - CWBSY1006 - ユーザー ID が間違っています,
Password length = 0, Prompt Mode = Never, System IP Address = 192.168.X.Y
[root@redhat9.0]# 
  それでもエラーが出た (TT)

  これも毎度の事なので慣れっこなのだが・・・。

  ただ気になるのは、上のメッセージの赤い部分なのだ。
  パスワードの長さが「0」だという。
  つまりパスワードが入力されていないというのだ。

  そこでユーザー名とパスワードも一緒に入力してみる事にした。

rmtodbcコマンドを打つが
[root@redhat9.0]#  ./rmtodbc "SELECT * FROM SUGA.MOJI" /USER:*** /PASSWORD:***

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
Remote Command via ODBC utility V1.2
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

リモート・システム名は 192.168.X.Y です。
ERROR SQLDriverConnect
内部 ドライバー・エラー。
[root@redhat9.0]# 
  それでもエラーが出た (TT)

  色々、ODBCの設定パラメータを触ってみたがダメだった。

  さすがに、ここまでやると何かが原因で接続ができていないように思える。
  だが、あまりにも情報が少ない上、AS400の知識に乏しい私・・・  (--;;


  そこでAS400の購入先のヘルプデスクに電話をする。
  だが、返答は・・・

  うちでも、わかりません

  だった  (--;;

  これについては止む得ない。
  既に、AS400のVer4.3はIBMのサポートが切れている。
  しかも、IBMは公式には「iSeries Access for Linux」は
AS400のVer5.1から使えるとなっている。そのため、購入先も情報がないのだ。


  エラーが出る原因は何なのか。ここで、1つの仮説を立てる。

LinuxとAS400とのデータ連動の障害と、その原因に関する仮説
エラーの原因の仮説
LinuxとAS400との連動の場合、Linux側からSQL文をAS400へ送り
その返答をAS400から受け取る形になっていると思われる。
  うちの会社のAS400は、SQLが使えない。
  SQLキットのライセンスを購入していないためだ。
  そのため、エラーが出るのではないかと考える。


  さて、仮説を立てた所で

  調査不能のため断念 (^^)

  という事で幕引きをした所なのだが、仮説を検証しないとモヤモヤ感が残る。
  モヤモヤ感が残ったままだと「もしかして、できたかもしれない」という
淡い期待が残ったままになる。しかも私は性格的に

  往生際の悪さは天下一品なのらー!!

  なのだ。
  往生際が悪いため、無駄な時間を費した事はあるのだが、
逆に、往生際が悪いお陰で、諦めていた事が実現した事もある。
  そこでもう一歩踏み込んで、調べてみる事にした。


  そこでもう一度、次のサイトをじっくり読む事にした。
  http://www.e-bellnet.com/special/vision/vision_0405.html


  すると「iSeries Access for Linux」には、AS400との連動に関して
うまく作動しているかどうかのチェックのためのコマンドが用意されている。
  これらは /opt/ibm/iSeriesAccess/bin のディレクトリに入っている。

  そのうちの1つの「cwbping」コマンドがある。
  なんだか ping の親戚のようなネーミングがする。
  これはAS400の接続確認のためのコマンドだ。実際に使ってみる。

LinuxからAS400への接続確認
[root@redhat9.0]# ./cwbping 192.168.X.Y

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
接続検証プログラム
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

CWBPING 要求を キャンセル するには、CTRL-C または CTRL-BREAK を押してください
I - システム 192.168.X.Y への接続を確認中...
I - サーバー・アプリケーション セントラル・クライアント に正常に接続されました
I - サーバー・アプリケーション ネットワーク・ファイル に正常に接続されました
I - サーバー・アプリケーション ネットワーク 印刷 に正常に接続されました
I - サーバー・アプリケーション データ・アクセス に正常に接続されました
I - サーバー・アプリケーション データ待ち行列 に正常に接続されました
I - サーバー・アプリケーション リモート・コマンド に正常に接続されました
I - サーバー・アプリケーション セキュリティー に正常に接続されました
E - CWBCO1003 - ソケット・エラー、機能 connect() が 10061  を戻しました
E - CWBCO1049 - iSeries サーバーのアプリケーション (DDM) は開始されていません
E - CWBCO1008 - サーバー・アプリケーション DDM に接続できません。 10061 が戻されました。

I - サーバー・アプリケーション Telnet に正常に接続されました
W - CWBCO1015 - システム 192.168.X.Y への接続が検査済みですが、警告がありました
  DDMファイルが使えないというエラーが出ている。
  このファイルはAS400同士のデータが通信する時に使うものらしい。

  より詳細なデータをとるために、ODBCの通信でAS400が使う
通信ポートを調べると「8471」を使っている。
 http://publib.boulder.ibm.com/html/as400/v4r5/ic2962/info/RZAIISERVICESANDPORTS.HTM

  そこで、通信ポート8471の接続テストを行ってみた。

AS400(iSeries,i5)の通信ポート8471の接続テスト
[root@redhat9.0]# ./cwbping 192.168.X.Y /v /port:8471

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
接続検証プログラム
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

CWBPING 要求を キャンセル するには、CTRL-C または CTRL-BREAK を押してください
I - システム 192.168.X.Y への接続を確認中...

I - 次のサーバー・アプリケーションの接続を要求:  
I - CWBCO1009 - 通信 プロバイダー: Linux TCP/IP
I - システム 名は有効な アドレスです
I - CWBCO1044 - リモート・アドレス 192.168.X.Y
I - CWBCO1040 - リモート・ポート の ルックアップ・モード: 常に定義済みの標準ポートを使用
I - CWBCO1022 - リモート・ポート 8471 が使用されます
I - 接続の確立を試行中...
I - CWBCO1045 - ローカル・アドレス 192.168.X.Z:45813
I -  に接続しました (192.168.X.Y:8471)
I - サーバー・アプリケーション #8471 に正常に接続されました

I - システム 192.168.X.Y への接続が確認されました
  接続テストは問題がなさそうだ。

  この時点ではODBCのポート「8471」を使った通信が可能だという事は
わかったものの、その他の事は何もわからない。
  そのため当初の仮説であった「Linux側からAS400へSQL文を送信するが
SQL機能を付けていないため、AS400が処理できずにエラーで返す」という物を
証明したわけではない。

  unixODBCの付属コマンドでisqlコマンドがあるのを知る。

  これはODBCを経由して、データベースサーバーへSQL文を送り、
その結果を出力させるコマンドだ。
  これでエラーが出れば、SQL文を送信したものの、AS400内部でSQL文の
処理ができなかった事を証明できると思った。

  さて、早速、isqlコマンドを使ってみる事にする。

isqlコマンドの動作結果
[root@redhat9.0]# isql AS400
[ISQL]ERROR: Could not SQLConnect

[root@redhat9.0]#
isqlコマンドの使い方だが、コマンドの後ろに引数として
ODBCに登録しているデータベースのドライバー名を入れる。
  エラーが出る・・・

  そこで気を取り直して、IDとパスワードをつけてみる。

isqlコマンドの動作結果
[root@redhat9.0]# isql AS400 ID PASSWORD
[ISQL]ERROR: Could not SQLConnect

[root@redhat9.0]#
isqlコマンドの使い方だが、ドライバー名の引数の後ろに、
データベースのIDとパスワードを入れる事もできる。
  やっぱりエラーが出る・・・

  これで、AS400内部でSQL文の処理ができずに、エラーが出た事を
証明したと思った。

  だが、ふと思った。
  もしかして、ODBCのドライバに不具合があり、AS400へSQL文を送る前の段階で
エラーが出ているかもしれない。


  何から手をつけて良いのかわからない。
  だが、ある事に気づいた。RPMでunixODBCをインストールした時、
PostgreSQLへのODBC接続のドライバがついていた事だ。

  そこで、まずはunixODBCが正常に働いているかどうかを確かめるため、
PostgreSQLへの接続が正常にできるかどうか実験を行う事にした。

  PostgreSQLのODBCドライバの設定などの話は別の機会にします。
  編集上の都合で収集がつかなくなるためです (^^;;

isqlコマンドを使ったODBC経由のPostgreSQL接続実験
isqlコマンドを使ってPostgreSQLとLinuxとの連動実験
  早速、isqlコマンドを叩いてみる。すると以下の画面が出た。

isqlコマンドを入力すると
[root@redhat9.0]# isql PG
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> 
赤い部分がコマンドです。
PGは、unixODBCに登録した、PostgreSQLのODBCドライバ名です。
  SQLコマンドの受け付け画面が出てきた。
  さて、実際にSQL文を入力して、ENTERキーを押すと・・・

  結果が返ってきた!!

  見事にODBC経由のPostgreSQLへの接続が成功したのだった。


  つまり、上の実験で、PostgreSQLへの接続の場合は問題なくできたが
AS400の場合、SQL文を送る手前の段階でエラーが出たのだ。


  さて、さきほど、rmtodbcコマンドの事をAS400へSQL文を送る
コマンドだと思い込んでいて、実行させるがエラーが出る話を書きました。
  だが、調べて行くと、SQL文を送るのは間違えである事がわかった。
  正しくは、AS400のコマンドをODBC経由でAS400に送るコマンドだ。

  気を取り直して、rmtodbcコマンドを使って、AS400にコマンドを
送る実験を行う事にした。

rmtodbcコマンドを使って、AS400(iSeries,i5)にコマンドを送る実験
[root@RedHat9.0]# ./rmtodbc  /USER:*** /PASSWORD:*** "SNDBRKMSG MSG('あああああ') TOMSGQ(XXXX)"

IBM iSeries Access for Linux
バージョン 5  リリース 2  レベル 0
Remote Command via ODBC utility V1.2
(C) Copyright IBM Corporation and Others 1984, 2003.  All rights reserved.
U.S. Government Users Restricted Rights - Use, duplication or disclosure
  restricted by GSA ADP Schedule Contract with IBM Corp.
Licensed Materials - Property of IBM

リモート・システム名は 192.168.X.Y です。
ERROR SQLDriverConnect
内部 ドライバー・エラー。
[root@RedHat9.0]# 
「SNDBRKMSG MSG('あああああ') TOMSGQ(XXXX)」という内容は
AS400の端末XXXXに「あああああ」のメッセージを送るというコマンドです。

これでうまくコマンドをAS400が実行してくれるかなぁと思いきや
エラーが出る結果になりました。
  これでAS400のODBCドライバに原因がありそうな感じがしてきた。
  ドライバがAS400のバージョン(Ver4.3)と合っていないのか、
それともODBCの設定で私が間違えているのか。


  ただ、AS400のODBCのドライバに問題があると考えた場合、
ODBCのドライバの不具合によって、AS400との通信ができていない可能性もある。
  そこで、rmtodbcコマンドを使っている最中の通信パケットを
拾ってみる事にした。

rmtodbcコマンドを使っている最中の通信パケットを拾う実験
[root@RedHat9.0]# /usr/sbin/tcpdump port 8471 > dumpdata
[root@RedHat9.0]# more dumpdata
22:42:53.322033 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: S 2191988493:2191988493(0) win 5840 < mss 1460 ,sackOK,timestamp 143218514 0,nop,wscale 0> (DF)
22:42:53.331264 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: S 3572448147:3572448147(0) ack 2191988494 win 8192 <mss 1200>
22:42:53.331286 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: . ack 1 win 5840 (DF)
22:42:53.332453 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: P 1:29(28) ack 1 win 5840 (DF)
22:42:53.384618 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: P 1:33(32) ack 29 win 8192
22:42:53.384787 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: . ack 33 win 5840 (DF)
22:42:53.385068 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: P 29:74(45) ack 33 win 5840 (DF)
22:42:53.600924 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: P 33:57(24) ack 74 win 8192
22:42:53.602558 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: P 74:241(167) ack 57 win 5840 (DF)
22:42:53.644188 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: P 57:193(136) ack 241 win 8192
22:42:53.644685 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: P 241:375(134) ack 193 win 5840 (DF)
22:42:53.656228 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: P 193:329(136) ack 375 win 8192
22:42:53.656494 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: P 375:415(40) ack 329 win 5840 (DF)
22:42:53.656552 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: F 415:415(0) ack 329 win 5840 (DF)
22:42:53.665731 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: P ack 416 win 8192
22:42:53.667970 as400.xxxx.co.jp.8471 > 192.168.X.Y.36276: P 329:369(40) ack 416 win 8192
22:42:53.667985 192.168.X.Y.36276 > as400.xxxx.co.jp.8471: R 2191988909:2191988909(0) win 0 (DF)
[root@RedHat9.0]# 
このパケットのやりとりを見ている限りでは
LinuxとAS400との間の通信が行われている事がわかる。
  さて、この通信のやりとりの中身を見ようと、tcpdumpコマンドに「-X」の
オプションをつけて出力結果を見てみたのが・・・

  読まれへんかった (TT)

  だった。

  パケット解析ができないため、打つ手なしの状態だった。

往生際が悪いので、悪あがきをしてみる だが、往生際の悪い私は、まだ諦めきれなかった。 そこで、MS-Accessと同じように、AS400のデータベースのテーブルだけでも 呼び出せないかと考えたら、OpenOfficeを使った連動が思いついた。 早速、RedHat9.0にインストールされているOpenOffice1.0で 実験を行う事にした。 エクセルに似たソフトの、OpenOffice Calcを使う。 [ツール]-->[データソース]を選ぶと次の画面が出てくる。
OpenOffice1.0のODBCの接続機能
OpenOffice1.0のODBC接続機能を使ってみる
赤い部分を押す
  すると次の画面が出てくる。

OpenOffice1.0のODBCの接続機能
OpenOffice1.0でODBCドライバを選択
ODBCのドライバの選択を行う。
ここではAS400との連動を行いたいので、AS400の部分をクリックする。
 
OpenOffice1.0のODBCの接続機能
OpenOffice1.0のODBC接続でテーブルを選択
そしてAS400のデータベースを呼び出すため
赤い部分のテーブルを選択する。
  さて、結果を見てみるが・・・

  エラーが出てもうた (TT)

エラーの様子
OpenOffice1.0でODBC接続に失敗御した様子
エラーの詳細を見るため赤く囲んだ「オプション」を選ぶ。
 エラーの詳細が表示された。

エラーの詳細
OpenOffice1.0でODBC接続に失敗御した時のエラーの詳細
どうやらODBCドライバに問題がありそうな感じだが
エラーコードを調べようとgoogleで検索するが見つからず・・・ (--;;
  この結果を見て、さすがに諦める事にした。
  現在の私の知識では太刀打できないからだ。
  AS400の知識もなければ、ODBCの仕組みもわかっていないからだ。

  明日の勝利のため、今日は撤退する勇気も大事!

  つまり手探りで触り続けるよりも、一旦、触るのを止めて勉強し
再度、挑戦した方が結果的には早いという事だ。

  とカッコつけた事を書いたのだが、実際には・・・

  単に力尽きたのらー!

  なのだ (^^;;


  ここで実験に失敗した原因として、考えられる仮説を立てておくと

考えられる仮説
(1) AS400のバージョンが低い。Ver4.3ではダメなのかなぁ?
(2) AS400側にSQL文が使えるソフトが入っていない
(3) ODBCのAS400用のドライバに不具合がある
(4) unixODBCに不具合がある
  どれも仮説の域を抜けないが

  事務員なので、それで良いのらー!!

  で逃げたいと思います (^^)V


続編のお知らせ だが、2006年10月、大きく話が展開した。 それは、AS400の買い替え時に、SQL開発キットのお試し版を稼働させた所、 ODBC経由で、AS400とLinuxの連動が可能である事がわかった。 この章の続きですが「システム奮闘記:その56」をご覧ください。  ODBCを活用したAS400(iSeries,i5)とLinuxの連動に成功
まとめ この時点では、ODBC経由でのAS400への接続がうまくいきませんでした。 でも、今回、Linux上から、AS400のための5250エミュレーターが使える事が わかったので、AS400を使っている中小企業が多い事から、 Linuxデスクトップの利用が増える可能性も秘めていると思います。  この話の続きにつきましては「システム奮闘記:その56」 ODBCを活用したAS400(iSeries,i5)とLinuxの連動に成功に書きました。

次章:「Pukiwikiでホームページ作成
前章:「Microsoft製品をガメツク利用するLinux勉強法
システム奮闘記に戻る