我刚开始使用 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代码中
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);
}
});
}