Oracle APEX - 如何根据我在 3 选择列表类型项目中选择的内容,用文本填充仅显示类型项目?

问题描述 投票:0回答:1

我刚开始使用 Oracle APEX 23.2.3,我正在尝试执行以下操作: 我有 3 个选择列表类型的项目(机会、周期性、自动化)。每个都从 SQL 查询中获取值列表。例如,对于机会:

select OPPORTUNITY, OPPORTUNITY_ID
from OPPORTUNITY

在 3 个选择列表中选择一个值后,我需要一个“仅显示”类型的项目来填充名为“有效性”的表中存在的值,该表类似于以下内容:

身份证 机会 周期性 自动化 有效性
1 预防 永久 手册 常规
2 纠正 周期 自动化 最优化
3 侦探 偶尔 半自动 布埃诺

为此,我创建了一个执行以下 JavaScript 代码的动态操作:

var op_apl = ($v("P14_Opportunity") !== "") ? parseInt($v("P14_Opportunity")) : 0;
var per_apl = ($v("P14_Periodicity") !== "") ? parseInt($v("P14_Periodicity")) : 0;
var aut_ctrl = ($v("P14_Automation") !== "") ? parseInt($v("P14_Automation")) : 0;
var ef_ctrl = "";

if (!isNaN(op_apl) && !isNaN(per_apl) && !isNaN(aut_ctrl)) { 
    apex.server.process("GET_EFFECTIVENESS", {
        x01: op_apl,
        x02: per_apl,
    x03: aut_ctrl
    }, {
    dataType: 'text',
        success: function(data) {            
        if(data.effectiveness) {
            ef_ctrl = data.effectiveness; 
            $s("P14_EFFECTIVENESS", ef_ctrl); 
            } else {
            console.error("No effectiveness was found for the given values.");
        }
        },
        error: function(xhr, textStatus, errorThrown) {
            console.error("Error when obtaining control effectiveness:", errorThrown);
        }
    });
}

在我的变量 op_apl、per_apl 和 aut_ctrl 中,我接收的是每行的 ID,而不是带有文本的字段,因此在 AJAX 回调 (GET_EFFECTIVENESS) 中,我正在执行以下 PL/SQL 代码:

DECLARE
     l_ef_control VARCHAR2(20);
BEGIN
     SELECT EFFECTIVENESS
     INTO l_ef_control
     FROM EFFECTIVENESS
     WHERE OPPORTUNITY = (SELECT OPPORTUNITY
                         FROM OPPORTUNITY
                         WHERE OPPORTUNITY_ID = APEX_APPLICATION.G_X01)
     AND PERIODICITY = (SELECT PERIODICITY
                       FROM PERIODICITY
                       WHERE PERIODICITY_ID = APEX_APPLICATION.G_X02)
     AND AUTOMATION = (SELECT AUTOMATION
                      FROM AUTOMATION
                      WHERE AUTOMATION_ID = APEX_APPLICATION.G_X03);

     APEX_JSON.OPEN_OBJECT;
     APEX_JSON.WRITE('effectiveness', l_ef_control);
     APEX_JSON.CLOSE_OBJECT;
END;

但是,当我运行应用程序时,我填充了“选择列表”项,但“仅显示”项未填充任何数据。在网络浏览器控制台中,我可以看到以下错误:

未发现给定值的有效性。

有人可以指导我或帮助我解决我的错误吗?也许我想做的不是正确的方法。

非常感谢。

javascript plsql oracle-apex
1个回答
0
投票

首先,在我看来,您拥有的数据结构设计得不好。您可能需要重新构造它,例如使用外键、唯一键以及更具体地定义表之间的关系。 (链接

对于你的问题,在你的Javascript代码中

if(data.effectiveness)
你试图检查一个布尔值(真/假)。但在你的 AJAX 过程中, 如果我理解正确的话,您将返回一个像“optimo”这样的值。

因此,我建议您将 Javascript 代码和 AJAX 流程更改为:

DECLARE
     l_ef_control VARCHAR2(20);
BEGIN
     SELECT EFFECTIVENESS
     INTO l_ef_control
     FROM EFFECTIVENESS
     WHERE OPPORTUNITY = (SELECT OPPORTUNITY
                         FROM OPPORTUNITY
                         WHERE OPPORTUNITY_ID = APEX_APPLICATION.G_X01)
     AND PERIODICITY = (SELECT PERIODICITY
                       FROM PERIODICITY
                       WHERE PERIODICITY_ID = APEX_APPLICATION.G_X02)
     AND AUTOMATION = (SELECT AUTOMATION
                      FROM AUTOMATION
                      WHERE AUTOMATION_ID = APEX_APPLICATION.G_X03);

     APEX_JSON.OPEN_OBJECT;
     APEX_JSON.WRITE('effectiveness', true);
     APEX_JSON.WRITE('value', l_ef_control);
     APEX_JSON.CLOSE_OBJECT;
EXCEPTION WHEN OTHERS THEN
     APEX_JSON.OPEN_OBJECT;
     APEX_JSON.WRITE('effectiveness', false);
     APEX_JSON.WRITE('value','Something went wrong!');
     APEX_JSON.CLOSE_OBJECT;
END;
var op_apl = ($v("P14_Opportunity") !== "") ? parseInt($v("P14_Opportunity")) : 0;
var per_apl = ($v("P14_Periodicity") !== "") ? parseInt($v("P14_Periodicity")) : 0;
var aut_ctrl = ($v("P14_Automation") !== "") ? parseInt($v("P14_Automation")) : 0;
var ef_ctrl = "";

if (!isNaN(op_apl) && !isNaN(per_apl) && !isNaN(aut_ctrl)) { 
    apex.server.process("GET_EFFECTIVENESS", {
        x01: op_apl,
        x02: per_apl,
    x03: aut_ctrl
    }, {
    dataType: 'text',
        success: function(data) {            
        if(data.effectiveness) {
            ef_ctrl = data.value; 
            $s("P14_EFFECTIVENESS", ef_ctrl); 
            } else {
            console.error("No effectiveness was found for the given values.");
        }
        },
        error: function(xhr, textStatus, errorThrown) {
            console.error("Error when obtaining control effectiveness:", errorThrown);
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.