対話モード・レポートやクラシック・レポートで、レポートに「リクエストされた一連の行は無効です。レポートのソース・データが変更されています。」と表示されることがあります。ページ区切りのリセットのリンクをクリックするとレポートが表示されます。
この理由と対処方法の説明です。
確認するために、アプリケーションを作成しました。
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を指定しています。この定義により、変更されたページ・アイテムの値をセッション・ステートに保存しています。
アプリケーションの初期状態は以上です。
対話モード・レポートは、以下のように表示されます。
アクション・メニューの書式からページごとの行数を呼び出し、ページごとの表示行数を5行に減らします。
ページ送りを行い、3ページ目を表示させます。データとしては11行から14行目がレポートに表示されます。
ここで、従業員名に中島%を入力し、検索をクリックします。
従業員名に中島%を与えたときに実行されるSELECT文は、以下になります。返される行数は1行です。
select * from emp where ename like '中島%'
対話モード・レポートは3ページ目を表示するため、上記のselect文の11から14行目を取り出そうとします。しかし、データは無いので以下のような表示になります。
ページ区切りのリセットのリンクをクリックすると、3ページ目という状態をリセットし、ページの最初から(1ページ目)から表示します。
「リクエストされた一連の行は無効です。レポートのソース・データが変更されています。」という表示をさせたくない場合、2つの対処方法があります。
ひとつめは、ボタンのターゲットの設定で、アクションとしてページ区切りのリセットを選択します。
ページ区切りのリセットが選択されていると、このターゲットにアクセスする際は常に、レポートのページはリセットされます。つまり、必ず1ページ目から表示されます。
例えば、以下のようにレポートとして2ページ目が表示されている状態で、従業員名を%として検索を実行します。
検索結果は14行になります。検索した後でも、6行目から10行目までのデータは取得できるため、2ページ目の表示が維持されます。
別の方法として、プロセスを作成し、APEX_IR.RESET_REPORTを呼び出すことによりレポートをリセットできます。
サーバー側の条件を設定することにより、ページのリセットを制御することができます。
ページ区切りのリセットの扱いの説明は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完