【问题标题】:Oracle APEX Dynamic Action to Set Value based on many ItemsOracle APEX 动态操作以基于多个项目设置值
【发布时间】:2015-11-20 15:34:43
【问题描述】:

我需要有关 Oracle APEX 4.2 中表单页面上的动态操作的帮助。我有许多项目设置,当在下拉列表中更改时会触发动态操作以返回“完成”或“在 Porgess”。当页面加载或更改项目时,我一直为空。我也检查了调试,它已经证实我只是得到空值。这是我的 PL/SQL 函数体。

declare l_status varchar2(255);
begin
if
:p2_dbst_1_1 = 'Complete' AND 

:p2_dbst_1_2 = 'Complete' AND

:p2_dbst_1_3 = 'Complete' AND 

:p2_dbst_2_1 = 'Complete' AND

:p2_dbst_2_2 = 'Complete' AND

:p2_dbst_2_3 = 'Complete' AND

(:p2_dbst_2_3A = 'Complete' OR 
:p2_dbst_2_3A = 'NA') AND

:p2_dbst_2_4 = 'Complete' AND

:p2_dbst_3_1 = 'Complete'

THEN l_status := 'Complete';
ELSE l_status := 'In Progress';
end if;
end;

唯一可以是“完成”或“不适用”的项目是 3A。

我在 Change Item 中确实有所有这些项目,用逗号分隔,我将 l_status 作为仅显示项目返回到 dbst_3_1。

关于为什么我一直为 null 而不是 Complete 或 In Progress 有什么想法吗?我还需要它在用户更改项目时一遍又一遍地在页面上动态运行。 “动态范围”有什么用处吗?

谢谢,

【问题讨论】:

  • 我不知道,但为什么这是一个 PL/SQL 动态操作?这将触发到服务器的 AJAX 往返。难道这一切都不能在客户端用 Javascript 完成吗?
  • 您的选择列表是如何定义的?您选择的值列表是什么样的? @TonyAndrews 你是对的,虽然我会理解 JavaScript 知识是否可能是 OP 的问题。
  • 块不应该以return l_status;结尾吗?
  • 嗨,是的,我根本不知道 JS,但我错过了那个返回 ;( Duhh ..当我在项目中更改它时,这个动态动作不会“动态”更新......使用 JS 或 PL/SQL。现在,不管它返回什么“正在进行中”,即使所有内容都是“完成”。我的选择列表是静态下拉列表。STATIC2:进行中;进行中,完成;完成。谢谢寻求帮助和建议。
  • 关于我的页面的另一点。我在这个页面上使用了 jquery Accordian ......这不会算作部分页面刷新,对吗?我有这些项目所在的三个区域,我想知道是否需要一个 jquery 选择器,以便我使用动态范围,并且动态操作会在项目的每次更改时触发。

标签: plsql oracle-apex


【解决方案1】:

您的 PL/SQL 在结束前缺少这个:

return l_status;

但是我认为可以使用这个 Javascript 表达式来代替 PL/SQL,这样会更有效:

(
$v('P2_DBST_1_1') == 'Complete' && 
$v('P2_DBST_1_2') == 'Complete' &&
$v('P2_DBST_1_3') == 'Complete' && 
$v('P2_DBST_2_1') == 'Complete' &&
$v('P2_DBST_2_2') == 'Complete' &&
$v('P2_DBST_2_3') == 'Complete' &&
($v('P2_DBST_2_3A') == 'Complete' || 
$v('P2_DBST_2_3A') == 'NA') &&
$v('P2_DBST_2_4') == 'Complete' &&
$v('P2_DBST_3_1') == 'Complete'
)
? 'Complete'
: 'In Progress'

【讨论】:

    【解决方案2】:

    确保您不要忘记提交和返回页面项目。您可以在 PL/SQL 代码框下找到列出它们的位置,名称为 Page items to SubmitPage items to Return

    您应该在 dbmst_3_1 上添加一个保存 l_status 的行。然后将其添加到页面项目以返回。

    declare 
    
    l_status varchar2(255);
    
    begin
      if
       :P2_DBST_1_1   = 'Complete' AND 
       :P2_DBST_1_2   = 'Complete' AND    
       :P2_DBST_1_3   = 'Complete' AND     
       :P2_DBST_2_1   = 'Complete' AND    
       :P2_DBST_2_2   = 'Complete' AND    
       :P2_DBST_2_3   = 'Complete' AND    
       (:P2_DBST_2_3A = 'Complete' OR 
       :P2_DBST_2_3A  = 'NA') AND    
       :P2_DBST_2_4   = 'Complete' AND    
       :P2_DBST_3_1   = 'Complete' THEN 
    
         l_status := 'Complete';
       ELSE          
         l_status := 'In Progress';
      end if;
    
      :dbst_3_1 := l_status;
    end;
    

    您的要提交的页面项目应包含以下项目: P2_DBST_1_1,P2_DBST_1_2,P2_DBST_1_3,P2_DBST_2_1,P2_DBST_2_2,P2_DBST_2_3,P2_DBST_2_3A,P2_DBST_2_3A,P2_DBST_2_4,P2_DBST_3_1

    要返回的页面项目应该包含这些项目:

    DBST_3_1

    希望这会有所帮助。

    【讨论】:

    • 嗨,我完全按照你的方式尝试了这个,但我收到了一个令牌错误。我还尝试将项目作为 P2_DBST_3_1 放入 Return 并将其从代码中删除,因为它不应作为 if 语句的一部分进行评估,而是用作要返回的值的容器。如果我更改其中一个项目,它第一次工作,但由于某种原因,APEX 在提交部分中切换相同或不同项目后不会继续运行表达式。知道为什么我会失去这种能力。我没有任何 PPR(部分页面刷新),只有 Javascript Accordian。谢谢
    • 解决方案=结束如果;返回 l_status;而不是 :dbst_3_1 := l_status;页面项返回 p2_dbst_3_1;感谢大家的时间和帮助:)
    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多