【问题标题】:APEX 4.1 - Populate DB based on right panel of shuttleAPEX 4.1 - 基于右面板填充数据库
【发布时间】:2012-11-12 15:48:09
【问题描述】:

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)

然后,在我将一些项目从左侧面板移动到右侧面板并单击“应用更改”后,我希望将“Analyst_1”放入数据库的分析师字段中,用于右侧面板上的每个字段名称.

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

这是我单击“应用更改”按钮时的代码。

更新数据表 设置 ANALYST_NAME = :P51_ANALYST 其中 FIELD = :P51_SHUTTLE_RIGHT;

【问题讨论】:

    标签: oracle-apex


    【解决方案1】:

    Shuttle 值以冒号分隔的字符串提交到会话状态。例如'VALUE1:VALUE2:VALUE4:VALUE7'。显然这是行不通的。 当然,您可以通过多种方式处理此问题。一种是在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 '/');
    

    不过,这只是一种风格,还有许多其他示例和方法,例如使用 regexp 或 connect by。选择你觉得舒服的那个。

    另一种方法是使用 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;
    

    【讨论】:

      【解决方案2】:

      我使用以下代码让数据库根据右侧面板中的项目更新分析师(选择列表)以工作。

      注意:这只更新了基于右侧面板的数据库。如果您将某些内容从右侧面板移动到左侧面板,页面提交后仍会显示在右侧面板上。

      提交后创建页面进程(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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-23
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-02
        • 1970-01-01
        • 2014-06-19
        相关资源
        最近更新 更多