対話モード・レポートやクラシック・レポートで、レポートに「リクエストされた一連の行は無効です。レポートのソース・データが変更されています。」と表示されることがあります。ページ区切りのリセットのリンクをクリックするとレポートが表示されます。
この理由と対処方法の説明です。
確認するために、アプリケーションを作成しました。
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を呼び出すことによりレポートをリセットできます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_region_id apex_application_page_ir.region_id%type; | |
begin | |
-- 対話モード・レポートをリセットする。1ページに1つだけなので、region_nameは指定しない。 | |
select region_id into l_region_id from apex_application_page_ir | |
where application_id = :APP_ID and page_id = :APP_PAGE_ID; | |
-- and region_name = 'Employees'; | |
-- 対話モード・レポートのリセット | |
apex_ir.reset_report( | |
p_page_id => :APP_PAGE_ID | |
, p_region_id => l_region_id | |
, p_report_id => null | |
); | |
end; |
サーバー側の条件を設定することにより、ページのリセットを制御することができます。
ページ区切りのリセットの扱いの説明は以上になります。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完