3

まず、最新バージョンのOracle ApEx 4.1.1を使用しており、チェックボックスが選択されている次の標準レポートがあるため、クリックすると、時間など、sysdateを使用して別のフィールドを設定します。

チェックを外すと、前のステートメントで設定した日付とコメントフィールドをNULLにリセットしたい

レポートは次のようになります。

select id,
       name,
       telephone,
       apex_item.checkbox2(10,id) as "Tick when Contacted",
       apex_item.display_and_save(20,:P2_DATE) as "Date Contacted",
       apex_item.textarea(30,:P2_COMMENT,5,80) as "Comment"
from   my_table

上記のレポートの例として、合計10個のレコードが存在する可能性があるため、ユーザーが10個のレコードのチェックボックスをそれぞれオンにしているので、その場で日付フィールドをsysdateに設定します。また、チェックボックスがオフになっている場合は、逆の処理を行います。日付とコメントの両方をNULLに設定します。

これにどのようにアプローチすればよいですか?上記は動的アクションを介して可能ですか、それともJavaScript /オンデマンドプロセスを介して直接可能ですか?

私の必要なタスクを実行する新しい方法を学ぶために、可能であればダイナミックアクションアプローチを間違いなく好むでしょう。

4

1 に答える 1

6

EMPテーブルの例:

select 
apex_item.checkbox2(p_idx => 1, p_value => empno, p_attributes => 'class="check_select"') empselection,
apex_item.text(2, ename) empname,
empno,
ename
from emp

チェックボックス項目にクラスを追加します。これにより、jQueryでのターゲティングが簡単になります。

「チェックボックスクリック」などの新しい動的アクションを作成します。
イベント:クリック
選択タイプ:jQueryセレクター
jQueryセレクター:(.check_selectこれはSQLのチェックボックスに追加したクラスです)
条件:JavaScript式
$(this.triggeringElement).prop('checked')

条件は、チェックボックス要素をチェックして、チェックされているかどうかを確認することです。prop()は要素のプロパティをテストし、この場合はtrueまたはfalseを返します。trueの場合、trueアクションが発生し、それ以外の場合はfalseアクションが発生します。

真のアクション:
アクション:JavaScriptコード
コードを実行します:$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val('test');

誤ったアクション:
アクション:JavaScriptコード
コードを実行します:$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val('');

クリックしたチェックボックスと同じ行のアイテムをターゲットにする必要があるため、どちらにも選択タイプはありません。頂点の選択の可能性を通してこれを行う方法は実際にはありません。textareaヘッダーを介して列をターゲットにし、td(または: !)内の入力をターゲットにすることを忘れないでください

動的アクションが作成されたら、に戻ります。 [詳細設定]で、[イベントスコープ]をに変更しLiveます。これは、ページネーションを説明するために必要です。これを変更しない場合、ページネーション後にアクションが要素にバインドされることはありません。

次に、trueとfalseのアクションを編集し、チェック Fire on Page Loadを外します。

ここで日付を説明します。
デフォルト値としてsysdateが必要なので、ページに非表示のアイテム(P9_DEF_DATEなど)を追加することをお勧めします。ソースとして、PLSQL式を使用し、を使用しますSYSDATE
次に、そのフィールドの値をデフォルト値として使用できます。例:

$(this.triggeringElement).closest("tr").find("td[headers='EMPNAME'] input").val($v('P9_DEF_DATE'));

最後の注意:valで値を空白にする:単一引用符で使用val('')てください!私の経験ではdoubleで動作しません。

動的アクションドキュメントのいくつかのリンク:

ajaxプロセスの例:
チェックした従業員のCOMM列を更新するとします。

レポートのページに新しいプロセスを作成し、簡単な名前を付け、スペースを入れないでください。たとえば、「update_emp」で実行しています。

update emp
set comm = apex_application.g_x02
where empno = apex_application.g_x01;

動的アクションに別の真のアクションを追加し、「JavaScriptコードの実行」と入力します。

$.post('wwv_flow.show', 
       {"p_request"      : 'APPLICATION_PROCESS=update_emp',
        "p_flow_id"      : $v('pFlowId'), //app id
        "p_flow_step_id" : $v('pFlowStepId'), //page id
        "p_instance"     : $v('pInstance'), //session id
        "x01"            : $(this.triggeringElement).val(),
        "x02"            : '88', //just a bogus value to demonstrate
        },
        function(data){
           /*normally you'd handle the returned value here
             an example would be a JSON return with which to set item values*/
        }
        );

このJavaScriptは、update_empプロセスを対象としてページに投稿されます。x01x02は一種の「一時」変数です。それらは存在するため、セッション状態に値を送信するために常にページアイテムを送信する必要はありません。これらはapex_applicationパッケージの一部です。
したがって、ここではx01、empno(チェックボックスの値、したがってthis.triggeringElement)を格納し、コミッションx02の値を渡すために使用しています。ここでハードコーディングしましたが、もちろん、任意の値を取得できます。

$.postページに投稿するjQueryメソッドです。

動的なアクションやトロールフォーラムを学習しているときに、ページに投稿する別の方法、つまり、に出くわす可能性がありhtmldb_Getます。これは、apexjavascriptファイルに組み込まれています。本当のAjax(非同期)ではなく、Sjax(同期)であり、私の意見では十分に透明ではないため、私はそれを使用しません。私はそれにいくつかのGetAsync部分を信じています、それは良いことですが、どんな例でもそれが使われているのを見ることはほとんどありません。これで簡単に見えるかもしれませんが、私get.get();のjsの代わりに3行のコードで同じ結果を得ることができます。実際のajax呼び出しを実装することをお勧めします。時々プロセスを終了するのを待ちすぎてhtmldb_Get、アプリケーションでのこれらすべての呼び出しが思ったほど楽しくないことに気付くかもしれません...

このレポートの設定では、状況もさらに複雑になります。ページアイテムを使用すると、別のルートを取ることができます。javascriptブロックを実行する代わりに、plsqlコードブロックを実行できます。ここで、セッション状態に送信する項目(plsqlブロックで使用できるようにする)と、このplsqlブロックで値を設定する項目を指定できます。(SQLブロックはサーバー側で実行されます。つまり、参照されるアイテムはセッション状態で値を持っている必要があります)。それも試してみることをお勧めします。
そうは言っても、レポートアクションでもこれを行うことができますが、セッション状態に送信できる値を一時的に保持するために、いくつかの偽のアイテムを設定する必要があります。繰り返しますが、私はそのファンではないので、私はそれを使いませんでした(したがって別の「imo」)。

基本的に、firebugなどのブラウザ検査ツールを開いてください。これにより、ページで行われたajax呼び出しを検査でき、これを調べるための優れた方法が提供されます。

于 2012-08-20T15:23:44.267 に答える