oracle apex值列表 - 选择值并在下一个字段中的SQL查询中使用

Jon*_*n T 2 oracle-apex

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是让Apex以这种方式行事.因为P200_CARD_TYPE,如果我将"值更改后的页面操作"设置设置为"重定向和设置值",则该P200_CARD_TYPE变量似乎已设置(我将其写入表中)但

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

如果打开P200_CARD_TYPE,我有"当值更改时的页面操作"设置,所以没有,我的选择保留在屏幕上,但我不能坚持到表,P200_DESC但仍然似乎无法识别它.

我曾经想过,一旦我从LOV中做出选择P200_CARD_TYPE,我就可以在其他地方使用它了.

Tom*_*Tom 5

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

来自文档:

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

在您的情况下,这意味着您认为从该LOV中选择一个值会改变该项的会话状态.它不是.您在客户端选择一个值,该值只能在那里使用,直到它以某种方式被推送到服务器.

这对于在顶点理解至关重要!在继续之前,您需要了解这一点,因为您将再次遇到这样的情况.

所以现在我们有了这个,让我们继续讨论如何解决这个问题.

将值推送到服务器的最基本方法?执行页面提交.所有项目的会话状态将使用它们在客户端保存的值进行设置(例外情况适用,但暂时忽略它).
这是您选择列表操作出错的地方:您执行了重定向.重定向不是页面提交,而只是重定向.通过设置目标项的值,您只需更改该项的会话状态.
因此,不是SQL不识别变量,而是它没有任何值,因此无法呈现任何内容.
当然,提交页面可能不是您想要设置字段值的目的.提交可能会导致验证,分支或进程触发.

这就是Tony Andrews建议的:使用动态动作来动态检索值.例如,您可以将其设置为:

  • 设置选择列表,以便在值更改时不执行任何操作.
  • 右键单击树视图中的选择列表,然后选择"创建动态操作"
  • 当事件选择"更改"事件
  • 对于真正的操作选择"设置值"
  • "Set type"应该是"sql语句"
  • 使用您也定义为desc项的源的sql:

    SELECT CARD_DESC
      FROM CARDTYPE
     WHERE card_type = :P200_CARD_TYPE;
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后非常重要:在"要提交的页面项目"字段中,添加P200_CARD_TYPE.这将导致将当前值P200_CARD_TYPE提交给服务器,从而设置其会话状态,从而使查询起作用.

现在,当选择列表上的值发生更改时,将对服务器/数据库进行调用,并返回一个值并在描述项中进行设置.
还有更多的东西,但这应该让你朝着正确的方向前进.