2022年5月18日水曜日

「リクエストされた一連の行は無効です。レポートのソース・データが変更されています。」理由と対処方法について

 対話モード・レポートやクラシック・レポートで、レポートに「リクエストされた一連の行は無効です。レポートのソース・データが変更されています。」と表示されることがあります。ページ区切りのリセットのリンクをクリックするとレポートが表示されます。

この理由と対処方法の説明です。

確認するために、アプリケーションを作成しました。

https://github.com/ujnak/apexapps/blob/master/exports/reset-pagenation.sql

サンプル・データセットEMP/DEPTに含まれる表EMPを使用します。

対話モード・レポートEmployeesソース表名EMPです。WHERE句として以下を記述しています。

(
   :P1_ENAME is null
   or
   ENAME like :P1_ENAME
)

検索条件に使用されるページ・アイテムP1_ENAMEは、値が変更されたときにセッション・ステートに保存されるよう、動的アクションを定義しています。

TRUEアクションとしてサーバー側のコードを実行を選択し、PL/SQLコードnull;で何も実行しませんが、送信するアイテムとしてP1_ENAMEを指定しています。この定義により、変更されたページ・アイテムの値をセッション・ステートに保存しています。


ボタンB_SEARCHを作成し、動作アクションとしてぺージ1(同じページ)にリダイレクトするようにターゲットを設定します。


アプリケーションの初期状態は以上です。

対話モード・レポートは、以下のように表示されます。


アクション・メニューの書式からページごとの行数を呼び出し、ページごとの表示行数を行に減らします。


ページ送りを行い、3ページ目を表示させます。データとしては11行から14行目がレポートに表示されます。


ここで、従業員名中島%を入力し、検索をクリックします。

従業員名中島%を与えたときに実行されるSELECT文は、以下になります。返される行数は1行です。

select * from emp where ename like '中島%'

対話モード・レポートは3ページ目を表示するため、上記のselect文の11から14行目を取り出そうとします。しかし、データは無いので以下のような表示になります。


ページ区切りのリセットのリンクをクリックすると、3ページ目という状態をリセットし、ページの最初から(1ページ目)から表示します。


リクエストされた一連の行は無効です。レポートのソース・データが変更されています。」という表示をさせたくない場合、2つの対処方法があります。

ひとつめは、ボタンターゲットの設定で、アクションとしてページ区切りのリセットを選択します。


ページ区切りのリセットが選択されていると、このターゲットにアクセスする際は常に、レポートのページはリセットされます。つまり、必ず1ページ目から表示されます

例えば、以下のようにレポートとして2ページ目が表示されている状態で、従業員名%として検索を実行します。


検索結果は14行になります。検索した後でも、6行目から10行目までのデータは取得できるため、2ページ目の表示が維持されます


ターゲットアクションとしてページ区切りのリセットを選択していると、このような場合でも1ページ目から表示されます。


別の方法として、プロセスを作成し、APEX_IR.RESET_REPORTを呼び出すことによりレポートをリセットできます。


サーバー側の条件を設定することにより、ページのリセットを制御することができます。

ページ区切りのリセットの扱いの説明は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。