2

APEX バージョン: 4.1.1.00.23

ページにシャトルがあり、アイテムを左側から右側のパネルに移動するときに、データベース内のテーブルを選択リストにあるもので更新したいと考えています。

この場合、ドロップダウンから「Analyst_1」を選択すると、JavaScript に基づいて右側に入力されます。

ここに画像の説明を入力

DB table (before clicking button):
Field                          Analyst
Co-Borrower Credit Score       Analyst_1
Appraised Value                (null)
Appraisal Identifier           (null)

次に、いくつかのアイテムを左パネルから右パネルに移動し、[変更を適用] をクリックした後、右パネルのフィールド名ごとに DB のアナリスト フィールドに「Analyst_1」を配置します。

ここに画像の説明を入力

DB table (after clicking button):
Field                          Analyst
Co-Borrower Credit Score       Analyst_1
Appraised Value                Analyst_1
Appraisal Identifier           Analyst_1

「変更を適用」ボタンがクリックされたときのコードは次のとおりです。

Data_Table を更新 set ANALYST_NAME = :P51_ANALYST where FIELD = :P51_SHUTTLE_RIGHT;

4

2 に答える 2

0

Shuttle の値は、コロンで区切られた文字列でセッション状態に送信されます。たとえば'VALUE1:VALUE2:VALUE4:VALUE7'。明らかにそれはうまくいきません。もちろん、これにはいくつかの方法で対処できます。1 つは、IN句で文字列を使用し、それをいくつかの要素に分割することです。

UPDATE data_table 
   SET analyst_name = :P51_ANALYST 
 WHERE field IN (SELECT a_field
                   FROM 
                     xmltable('/root/e/text()' passing xmltype('<root><e>'
                     || REPLACE(:P51_SHUTTLE_RIGHT,':','</e><e>')
                     || '</e></root>') columns a_field VARCHAR2(50) path '/');

ただし、これは 1 つのフレーバーにすぎず、regexp や connect by の使用など、他にも多くの例や方法があります。使いやすい方を選んでください。

もう 1 つの方法は、文字列内のすべての値を PLSQL コードでループすることです。これにはAPEX_UTIL.STRING_TO_TABLEを使用できます。繰り返しますが、好きなフレーバー (例: INSTR+ SUBSTR)。

DECLARE
    l_vc_arr2    APEX_APPLICATION_GLOBAL.VC_ARR2;
BEGIN
    l_vc_arr2 := APEX_UTIL.STRING_TO_TABLE('One:Two:Three');
    FOR z IN 1..l_vc_arr2.count LOOP
        htp.p(l_vc_arr2(z));
    END LOOP;
END;
于 2012-11-13T08:16:42.930 に答える
0

次のコードを使用して、右側のパネルの項目のみに基づいて DB がアナリスト (選択リスト) を更新するようにしました。

注:これは、右側のパネルに基づいて DB のみを更新しました。右側のパネルから左側のパネルに何かを移動すると、ページが送信された後も右側のパネルに表示されます。

送信後にページ・プロセス(PL/SQL無名ブロック)を作成します:

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
       UPDATE DQ_MANUAL_EDIT
       SET DQ_ANALYST = :P51_DQ_ANALYST
       WHERE DQ_ATTRIBUTE = tab(i);
    end if;
    end loop;
end;
于 2012-11-19T15:51:01.893 に答える