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

Oracle apex oracle apex值列表-在下一字段中选择值并在SQL查询中使用,oracle-apex,Oracle Apex,我正在使用Apex 4.0.2和Oracle XE 11 我有一个表单,其中一个字段,P200\u CARD\u TYPE,是从值列表中设置的。我希望使用我在设置“仅显示”字段的查询中选择的值,P200\u DESC 在P200_DESC的源代码部分,我将“源代码类型”设置为“SQL查询”: 我的问题是让Apex这样做。 对于P200\u CARD\u TYPE,如果我将“值更改时的页面操作”设置为“重定向并设置值”,则P200\u CARD\u TYPE变量似乎已设置,(我将其写入表中),但

我正在使用Apex 4.0.2和Oracle XE 11

我有一个表单,其中一个字段,
P200\u CARD\u TYPE
,是从值列表中设置的。我希望使用我在设置“仅显示”字段的查询中选择的值,
P200\u DESC

P200_DESC
的源代码部分,我将“源代码类型”设置为“SQL查询”:

我的问题是让Apex这样做。 对于
P200\u CARD\u TYPE
,如果我将“值更改时的页面操作”设置为“重定向并设置值”,则
P200\u CARD\u TYPE
变量似乎已设置,(我将其写入表中),但

  • 它不会保留在字段显示中(返回到我的空显示设置)
  • P200\u DESC
    无法识别
    P200\u卡类型
    bind变量
  • 如果在
    P200_CARD_TYPE
    上,我的“值更改时的页面操作”设置为“无”,我的选择将保留在屏幕上,但我无法保留到表中,
    P200_DESC
    似乎仍然无法识别它


    我会想,一旦我从LOV中做出选择,
    P200卡类型设置好了,我可以在其他地方使用它。

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

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

    在您的例子中,这意味着您认为从LOV中选择一个值会改变该项的会话状态。事实并非如此。您在客户端选择一个值,该值只有在以某种方式推送到服务器之前才可用

    这对于理解apex至关重要!在继续之前,你需要了解这一点,因为你会再次遇到类似的情况

    现在我们已经把它抛在脑后了,让我们来看看你是如何补救的

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

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

    • 将“选择”列表设置为在值更改时不执行任何操作
    • 右键单击树状视图中的选择列表,然后选择“创建动态操作”
    • 作为事件选择“更改”事件
    • 对于真实动作,选择“设置值”
    • “集合类型”应为“sql语句”
    • 使用您也定义为描述项源的sql:

      SELECT CARD_DESC
        FROM CARDTYPE
       WHERE card_type = :P200_CARD_TYPE;
      
    • 最后也是非常重要的一点:在“要提交的页面项目”字段中,添加
      P200\u卡片类型
      。这将导致将
      P200\u CARD\u TYPE
      的当前值提交到服务器,从而设置其会话状态,从而使查询工作
    现在,当选择列表上的值更改时,将调用服务器/数据库,并返回一个值并在描述项中进行设置。

    还有很多,但这会让你朝着正确的方向前进。

    你考虑过用动态动作来代替吗?重新加载页面更容易、更高效。我遇到的问题实际上是无法使用我为P200\U CARD\U TYPE为P200\U DESC选择的值。对于我的P200\U DESC源,我已从CARDTYPE中选择CARD\U DESC,其中CARD\U TYPE=:P200\U CARD\U TYPE;我的问题是,实际上能够使用我为P200_描述的P200_CARD_TYPE选择的值。对于P200_DESC的源,我已经从CARDTYPE中选择了CARD_DESC,其中CARD_TYPE=:P200_CARD_TYPE;我觉得应该没问题。我已将P200_DESC的源设置为“始终,替换会话状态中的任何现有值”,源类型为“SQL查询”。我提到重新加载页面的唯一原因是,我似乎能够通过这种方式访问值,但我认为这是一种误导
    SELECT CARD_DESC
      FROM CARDTYPE
     WHERE card_type = :P200_CARD_TYPE;