
カラムヘディングとは、QUERYユーティリティーやデータ・ファイル・ユーティリティー(DFU)で使用されるフィールドのラベル(欄見出し)のことです。物理ファイルのフィールド定義(DDS)では、次のように COLHDGキーワードで定義します。
A*
A* ID : SAMPLE01
A* NAME : 取引先マスター
A*-------------------------------------------------------------
A R SAMPLE01R
A*
A STATUS 1A COLHDG(' 状態 ')
A TEXT(' 取引状態 ')
A CSTMNO 5A COLHDG(' 取引先№ ')
A CSTMNM 30O COLHDG(' 取引先名 ')
A CSTMNMK 30A COLHDG(' 取引先カナ名 ')
A CSTMTEL 10A TEXT(' 電話番号 ')
A CATNO 2A COLHDG(' 業種№ ')
A SALES 8S 0 COLHDG(' 売上実績 ')
A*
このカラムヘディング、AS/400ユーザにとってはお馴染みのようで、とあるお客様先で、物理ファイルのデータをExcelとしてダウンロードし、そのExcelの1行目に見出しとしてカラムヘディングを差し込むプログラムをVBとWSHで作りこんでいるのを見たことがあります。見出しはカラム名(上記のDDSではCSTMNOやCSTMNM)ではなくてカラムヘディングで表示するのが、AS/400ユーザでは常識のようです。
そこで、Java(JT400)でカラムヘディングを取得する方法を以下に紹介します。
1つ目は、JDBCの仕様の範囲だけで取得する方法です。
以下がそのサンプルです。
Connection con = null;
try {
Class.forName("com.ibm.as400.access.AS400JDBCDriver");
con = DriverManager.getConnection(
"jdbc:as400://as400server;prompt=false", "USER", "PASSWD");
DatabaseMetaData dmd = con.getMetaData();
ResultSet rs = dmd.getColumns(null, "MYLIB", "MYFILE", "%");
while(rs.next()) {
System.out.println(rs.getString("COLUMN_NAME")
+ "," + rs.getString("REMARKS"));
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if (con != null) {
con.close();
}
} catch(SQLException e) {
}
}
DatabaseMetaDataクラスのgetColumns()メソッドによって、指定の物理ファイルのフィールド情報を取得します。結果がResultSetで返されてきますが、カラムヘディングはカラム名"REMARKS"に格納されています。
なお、上記のDDSのように、フィールドにCOLHDGキーワードだけでなくTEXTキーワード(テキスト記述)も定義されている場合、REMARKSにはTEXTキーワードで定義した情報が格納されます。REMARKSの情報がカラムヘディングなのか、テキスト記述なのかは判別できません。
2つ目は、毎度ですがJT400(JTOpen)のユーティリティクラスを使用する方法です。
try {
AS400 as400 = new AS400("as400server", "USER", "PASSWD");
as400.setGuiAvailable(false);
as400.connectService(AS400.SIGNON);
String path = "/QSYS.LIB/MYLIB.LIB/MYFILE.FILE";
AS400FileRecordDescription file = new AS400FileRecordDescription(as400, path);
RecordFormat[] format = file.retrieveRecordFormat();
for (int i = 0; i < format[0].getNumberOfFields(); i++) {
FieldDescription fd = format[0].getFieldDescription(i);
System.out.println("NAME=" + fd.getFieldName());
System.out.println("COLHDG=" + fd.getCOLHDG());
System.out.println("TEXT=" + fd.getTEXT());
}
}
catch (Exception e) {
e.printStackTrace();
}
AS400FileRecordDescriptionクラスのretrieveRecordFormat()メソッドでレコード情報を取得。各フィールドのFieldDescriptionオブジェクトからカラムヘディングを取得します。この場合、カラムヘディング(COLHDG)とテキスト記述(TEXT)をそれぞれ取得するメソッドが用意されています。
3つ目は、AS/400のコマンドDSPFFD(ファイル・フィールド記述表示)を使用する方法です。この方法が、一番詳細なフィールド情報を取得することができます。
コマンドDSPFFD(ファイル・フィールド記述表示)は、その名のとおり、物理ファイルのフィールド情報を出力するコマンドです。出力されるフィールド情報には、カラムヘディングはもちろん、データタイプや長さ、さまざまな属性値なども含まれています。
例えば、次のようにコマンドを発行すると、
DSPFFD FILE(MYLIB/MYFILE) OUTPUT(*OUTFILE) OUTFILE(MYLIB/MYFILEFFD)
ファイルMYLIB/MYFILEのフィールド情報が、ファイルMYLIB/MYFILEFFDに出力されます。つまり、フィールド情報がDBのテーブルとして参照できるということです。フィールド情報のファイルを予め作成しておくか、以前のプログ『JavaからAS/400のコマンドを発行するには』で紹介したようにJT400でコマンドを発行し、あとは普通にJDBCで検索すればいい訳です。
実は、2つ目のAS400FileRecordDescriptionクラスを使う方法は、中身はDSPFFDコマンドを使った実装になっています。JT400は、JTOpenとしてソースが公開されています。そのソースを覗いてみると、いろいろと発見があって面白いですよ。
Rankingランキング
New arrival新着
Keywordキーワード