*

[jt400, Java]レコードレベルアクセスの実現

公開日: : 最終更新日:2015/04/01 AS400, java

到着順

AS400のファイルシステムですと、レコードを読み込んで、処理して、出力して、次のレコード読んで……といった感じのレコードレベルのアクセス形式だったりします。
RDBに慣れてる人だと一括で読み込んで一括で処理して一括で出力するのが普通だと思います。

ついで、ファイルの中には、書き込まれた順序が大事な場合があります。
その場合は通常のRDBですと、Sequence numberなどを割り振りして、順序を保つのですが、レガシーなファイルを扱っていると、そんなことはしてない場合があります。
では、どうやって順序を保っているかというと、AS400の場合、到着順というアクセスパスがあります。
つまり、ファイルに書き込まれた順序を保持しています。もちろん、その順番で読み取ることが出来ます。

しかしながらSQLでは、Indexを付与していなかったり、Order byで指定しなかった場合、その順序は保証されません。
Indexを付けたり付け直したりすることによって、照会の順序が変わることがあります。
そして極めつけはSQLでは到着番号を取得出来ないんです。

もちろん行番号は取得できますが(ROW_NUMBER() OVER())、その行番号は照会結果に番号を振ったものですので、本来の到着番号ではないのです。

では、どのようにしてその到着順でファイルを扱うかというと、IBMのツールボックスを頼ることになります。

ソース

    public static void main(String[] args) {
        AS400 as400 = new AS400();
        QSYSObjectPathName path = new QSYSObjectPathName("HOGELIB", "HOGEFILE", "HOGEFILE", "MBR");
        
        SequentialFile file = new SequentialFile(as400, path.getPath());
        AS400FileRecordDescription recordDescription = 
        new AS400FileRecordDescription(as400, path.getPath());
        try{
            RecordFormat[] formats = recordDescription.retrieveRecordFormat();
            file.setRecordFormat(formats[0]);
            file.open();
            Record rec;
            while((rec = file.readNext()) != null){
                System.out.println(rec);
            }
            file.close();
        }catch(Exception e ){
            System.out.println(e);
        }
    }

解説

HOGELIBのHOGEFILEを到着順で読んで全部標準出力に出力しているだけです。
QSYSObjectPathNameを使わない場合”/QSYS.LIB/HOGELIB.LIB/HOGEGILE.FILE/HOGEFILE.MBR”という文字列をSequentialFileの第2引数に与えてもいいです。
ファイルを開く前の注意点として、AS400FileRecordDescriptionをインスタンス化して、セットしてください。
レコード記述がないとレコードをどう読んでいいのかわからない為Exceptionを吐き出します。

昔はなんとかしてファイルやらを減らしていたのでしょうがないのですが、到着順で運用するようなファイルを作らないのが一番です。

ad

関連記事

logo

[C#]AS400のメンバーを指定してデータにアクセスする

◆前提条件◆ CliantAccessをインストールしている。 .NET Framework3.

記事を読む

AS400_1

PCを新しくしました〜5250エミュレータの受難編〜

会社のPCを新しくしました。 CPUがi5でメモリは8GBで、とアホみたいな顔しながら注文して

記事を読む

wannabenote

[jt400, java]AS400用のJavaをPCで実行したとき、終了しない理由

終了しない JavaでAS400をいじってると、たまに、終了しないんです。 プロセスが残ったまま

記事を読む

logo

[AS400]5250エミュレータの挙動がおかしいときの対処

というわけで前回から引き続き解決編です。 ちなみに前回は↓こんなん↓になったりしてましたね。

記事を読む

logo

[java, jt400]AS400ネイティブ環境でjavaを起動し、ファイルに対するSQLを実行する方法。

日本語資料なさすぎだから自分で作ります。 AS400がでjavaを起動して、自分のファイルを見に行

記事を読む

NetBeans

[Java, NetBeans]NetBeansをインストールしてHelloWorldまで。

JavaのIDEは? よく挙げられるのがEclipseとNetBeans。 前はExclipse

記事を読む

logo

[C#]AS400をDBに見立ててPCのPGMからODBC接続する

◆前提条件◆ PCにClient Accessがインストールされている。 PCに.NET Fra

記事を読む

logo

[Java]DbUtilsでORA-12519エラー

DbUtilsを使ってたんですが、Oracleに対して処理するとORA-12519というエラーコード

記事を読む

logo

[java, NETBEANS]出来上がったclassファイルをコマンドラインで実行する。

コマンドラインから実行 以前作成したJavaのHelloWorldをコマンドラインから実行してみま

記事を読む

AS400_

[java, JDBC]AS400からOracleに接続をする

javaでAS400からOracleに接続する必要があったときのメモを清書。 AS400のPG

記事を読む

ad

Message

メールアドレスが公開されることはありません。

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

ad

  •  Auther;わなび

     「オープン系得意だよね? 俺のPCの調子悪いんだけど」という無茶振りから解き放たれゲームエンジニアに。
    C#とかUnityを扱います。
    Twitterフォロー大歓迎です。
    githubアカウント→wannabenote
  • follow us in feedly
PAGE TOP ↑