2

我将 Apex 4.0.2 与 Oracle XE 11 一起使用。

我有一个表单,其中一个字段 ,P200_CARD_TYPE是从值列表中设置的。我想要发生的是使用我在设置“仅显示”字段的查询中选择的值,P200_DESC

在 Source 部分P200_DESC,我将“Source Type”设置为“SQL Query”:

SELECT CARD_DESC
  FROM CARDTYPE
 WHERE card_type = :P200_CARD_TYPE;

我遇到的问题是让 Apex 以这种方式行事。对于P200_CARD_TYPE,如果我将“值更改时的页面操作”设置为“重定向并设置值”,则该P200_CARD_TYPE变量似乎已设置,(我将其写到表中)但是

  1. 它不会保留在字段显示中,(回到我的空显示设置)
  2. P200_DESC无法识别P200_CARD_TYPE绑定变量

如果打开P200_CARD_TYPE,我将“值更改时的页面操作”设置为无,我的选择将保留在屏幕上,但我无法坚持到表格中并且P200_DESC似乎仍然无法识别它。

我会认为,一旦我从 LOV 中做出选择,P200_CARD_TYPE就可以在其他地方使用它。

4

1 回答 1

5

您似乎还没有正确理解会话状态。这类问题在这里和 OTN 顶级论坛上不断出现。

从文档:

HTTP 是最常用于交付 HTML 页面的协议,它是一种无状态协议。Web 浏览器仅在下载完整页面所需的时间内连接到服务器。此外,每个页面请求都被服务器视为一个独立的事件,与之前发生的或将来可能发生的任何页面请求无关。要在后续页面上访问在一个页面上输入的表单值,这些值必须存储为会话状态。Oracle Application Express 透明地维护会话状态,并使开发人员能够从应用程序中的任何页面获取和设置会话状态值。

在您的情况下,这意味着您认为从该 LOV 中选择一个值会改变该项目的会话状态。它不是。您在客户端选择一个值,该值仅在以某种方式推送到服务器之前可用。

这是在 apex 中理解的关键!在继续之前你需要了解这一点,因为你会再次遇到这样的情况。

因此,现在我们已经掌握了这一点,让我们继续讨论如何解决这个问题。

将值推送到服务器的最基本方法?执行页面提交。所有项目的会话状态都将使用它们在客户端持有的值进行设置(例外情况适用,但我们暂时忽略它)。
这是您的选择列表操作出错的地方:您执行了重定向。重定向不是页面提交,而只是重定向。通过设置目标项目的值,您只更改该项目的会话状态。
所以不是 SQL 没有识别变量,只是它没有值,所以什么都不能渲染。
当然,提交页面可能不是您只想设置字段值的事情。提交可能会导致验证、分支或流程触发。

这就是 Tony Andrews 的建议:使用动态操作来动态检索值。例如,您可以这样设置:

  • 当值发生变化时,将选择列表设置为不执行任何操作。
  • 右键单击树视图中的选择列表,然后选择“创建动态操作”
  • 作为事件选择“更改”事件
  • 对于真正的动作,选择“设置值”
  • “设置类型”应该是“sql语句”
  • 使用您还定义为 desc 项的源的 sql:

    SELECT CARD_DESC
      FROM CARDTYPE
     WHERE card_type = :P200_CARD_TYPE;
    
  • 最后也是非常重要的:在“要提交的页面项目”字段中,添加P200_CARD_TYPE. 这将导致 的当前值P200_CARD_TYPE被提交给服务器,从而设置其会话状态,从而使查询工作。

Now when the value on the select list changes, a call will be made to the server/database and a value will be returned and set in the description item.
还有更多,但这应该会让你朝着正确的方向前进。

于 2013-06-19T12:57:52.083 回答