($title_img_alt)

こちらからの投稿は、先頭に表示されているコメントへの返信になります。
SQL cursorで次のレコードに切り替わらない AS400 初心者 さん [ 2月8日(月) 9時56分 ]
いつもお世話になっております。
論理ファイルの無い物理ファイルをSQLで並び替えして、サブファイルに表示
するという
プログラムを作成したいと思っています。

下記のSQLでcursorを定義して、FETCHで1行ずつサブファイルに書き込むという
流れになるかと思うのですが、実際にソースを書いたところ同じレコードが
サブファイルに書き込まれており、デバッグで確認してもCursorが次のレコードに
遷移していないようです。

私の書き方が悪いのだとは思うのですが、不慣れなもので思うように
動いてくれないという状態です。
お手数おかけしますが、ご教示いただけないでしょうか?

-------------------------------------------------
※SORTSQLにSQL文が文字列で入っています
※DSSQLにファイルと同じ構成のDSが用意されています
 (AやBはDSのフィールドです)

EXEC SQL DECLARE CSR CURSOR FOR WKSTATEMENT;
EXEC SQL PREPARE WKSTATEMENT FROM :SORTSQL;

EXEC SQL OPEN CSR;
FOR RRN1 = STRRRN TO ENDRRN;
   EXEC SQL FETCH CSR INTO :DSSQL;

   //DSから画面へセット
   P_SCD = A
   P_SCD = B

   WRITE SFL01
ENDFOR;
EXEC SQL CLOSE CSR;
-------------------------------------------------


RE:SQL cursorで次のレコードに切り替わらない IKD さん [ 2月8日(月) 16時20分 ]
同じレコードが出力されているという症状からすると
CURSOR が効いていないということですから

EXEC SQL DECLARE CSR CURSOR FOR WKSTATEMENT;
EXEC SQL PREPARE WKSTATEMENT FROM :SORTSQL;

が怪しいのですが、ずいぶん間接的な表現になっていますので

EXEC SQL DECLARE CSR CURSOR FOR :SORTSQL;

にして実行してみてください。
コンパイル・エラー等があればご自分で修正してください。

EXEC SQL FETCH CSR INTO :DSSQL;

の A, B が :DSSQL の DSで定義されているフィールドであると
予想していますが :DSSQL のフィールドには SFLレコードのフィールド名を
そのまま使えば、

//DSから画面へセット
   P_SCD = A
   P_SCD = B

は不要となります。その他に大きな問題は見受けられませんので
公開されていないところにも単純な記述のミスがある可能性も含めて
チエックしてください。

CRTSQLRPG で指定しているパラメータにも注意してください。
RE:SQL cursorで次のレコードに切り替わらない AS400 初心者 さん [ 2月10日(水) 10時52分 ]
ご教示ありがとうございます。

別のSQLRPGLEを用意して、カーソルで同じSQL文を読みだすという形で確認し
たところ
正常にレコードが切り替わって表示されました。

同じファイル、同じタイプ、同じコンパイルパラメータ、同じSQL文となっており
同じレコードのみが表示されたソースと、レコードが切り替わったソースの差異は
大きなところで言うと下記になります。

下記の中のいずれかの影響で、同じレコードしか表示しなくなるということは
あり得るのでしょうか?

-------------------------------
差異(同じレコードが表示されたソース)
-------------------------------
 ・サービスプログラムのプロシージャを使用している
 (自分自身はメインプログラム)
 
 ・cursorのSQLの前に、削除のSQLとデータ抽出のSQLを実行している
 (これらはカーソルは使用しておりません。また動作は正常に実行できてい
ます)
 
 ・サブファイルを6つ使用している
RE:SQL cursorで次のレコードに切り替わらない IKD さん [ 2月11日(木) 10時10分 ]
使用方法の差異によって簡単に原因を推察することは
できないでしょう。
要はあてずっぽうではなく、ひとつひとつ実験して原因を
突き止める作業が必要です。

・サービスプログラムのプロシージャを使用している
 (自分自身はメインプログラム)
==> SQL CURSOR は親には伝わらなかったという過去の記憶も確かにありますが
    これを原因と仮定するのであれば小さなプログラムを作って
    プロシージャー呼出しのSQL と、そうでないSQLバインドRPG とを
  比較実行して検証する必要があります。
  
 
 ・cursorのSQLの前に、削除のSQLとデータ抽出のSQLを実行している
 (これらはカーソルは使用しておりません。また動作は正常に実行できてい
ます)
===> これも原因となりうる可能性は高いですね。
   初めに示されたSQL ではなく FETCH のつど、このような特殊な操作を
   しているのであれば危ない操作であり、できれば避けたいものです。
 
 ・サブファイルを6つ使用している
===> SQL が正常に処理されFETCH も正しく進行しているのに SFLレコードに書き出す
     RRN が正しくないとご指摘の症状になる可能性が大いにあります。

===> データ・ベースを SORT するのに無理やりSQL を使わずとも LF を一時的にでも
     作成して READ するほうがパフォーマンスも圧倒的に優れており
   処理構造もシンブルで保守も容易です。
     LF を作ってはいけない、という事情があれば別ですが(それでも一時的にQTEMPなどに
     LF を作成するほうが IBM i には適しています)

     IBM i のある(有名な)経理パッケージを見たことがありますが、開発者がDB2/400の
  レコード・レベルのアクセス(READ, READE, CHAIN, ....)を知らないらしいようで
    すべて SQLバインドで開発していました。
  おかげでその経理パッケージはパフォーマンスが悪くてユーザーからクレームが
    多かったようです。
  別のユーザーでもやはりすべてSQLのみで組んでいるところユーザーもあり、
  やはりパフォーマンスの問題を抱えていました。

  IBM i には適した方法がありますので肩の力を抜いてシンプルで自然なやり方が
  スマートです。
  徒に凝った方法は避けるほうが賢明です。
  SQL は、SQL でなければできないケースにおいてのみ SQLを使うようにしたほうが
    いいでしょう。
    IBM i の場合は数十万レコードのデータ・ベースを扱うのも珍しくありません。
    そのようなケースで SQLだと実用にはなりません。
    レコード・レベルの操作をお勧めします。

RE:SQL cursorで次のレコードに切り替わらない AS400 初心者 さん [ 2月12日(金) 10時47分 ]
>IKD様

詳細にご説明頂き、いつも本当に感謝しています。
ありがとうございます。


処理の流れとしましては、

 1.画面表示(ここでユーザーが任意の検索項目、検索値を設定
        検索項目のサブファイルから値を選択する形で検索値を設定)
 2.実行キー
    ↓2-1 検索内容を含んだSQLでWKファイルを作成
    ↓2-2 抽出をRPG(プロシージャ一部使用)でWKからWK2ファイルを作成
    ↓
 3.画面表示(ここで質問内容のSQL CURSORで順番に表示用のサブファイルに
        書こうとしていました。
        またFキー押下で、押下したキーによってソート条件を
        変更して、サブファイルへの書きなおしをしようと思ってい
ました)


最後の3についてはLFを複数作れば済む話なのですが
SQLで出来ればLFを作成せずにソートが出来るようになるので
ケースバイケースで使い分け出来るようになればと思っていました。

ですがコメント頂いた内容を見て、今回のケースではSQLで行うには
逆に複雑になってしまうように感じましたので、LFを作成して
Fキー押下時にそれぞれのLFを読み直してソートするという形で
実装したいと思います。


いつも本当にありがとうございます。
デバッグが必要な段階で失敗 となりのSE   さん [ 2月11日(木) 10時54分 ]
表示順の索引ファイルを、表示するプログラムにする。

RE:デバッグが必要な段階で失敗 AS400 初心者 さん [ 2月12日(金) 11時2分 ]
> 表示順の索引ファイルを、表示するプログラムにする。

コメントありがとうございます。
これは論理ファイルを事前に作成しておいて、
それらを表示するプログラムに変更する方が良いということでしょうか?

その方がシンプルな仕様になりますので
その方向で設計しようと思います。

ありがとうございました。
OPNQRYF IKD さん [ 2月14日(日) 10時54分 ]
OPNQRYF(QUERY ファイル・オープン)というコマンドがありますが
これはオープンするデータ・ベースのレコードのアクセスやアクセス・パスを
一時的に変更するものです。

SQLバインドにするよりは、こちらのほうが一般的ですが
利用目的はバッチの印刷帳票出力のような場合に限られます。

SFLレコード照会のように対話式の場合はエンド・ユーザーに対して
パフォーマンスが重要視されますから、やはり LF の参照によって
照会を実現すべきでしょう。

OPNQRYFは調べておいて実行する練習をしておけば今後の適用業務開発に
役に立ちます。
RE:OPNQRYF AS400 初心者 さん [ 2月15日(月) 17時23分 ]
「OPNQRYF」は、初めてお聞きするコマンドでした。
CLから行うという形になるのですね。
クエリーも使いこなせるように学習したいと思います。

パフォーマンスに関わる部分はLFの方が良いということも
非常に参考になりました。
LF、クエリー、SQLとプログラムによって使い分けていきたいと思います。

ありがとうございました。

お名前

パスワード

メールアドレス

タイトル

ホームページ

アドレス

項目