我试图防止在 Oracle Apex 20.2 的交互式网格中输入重复的项目。发生这种情况时,我确实会遇到唯一约束错误,但这是针对条形码扫描库存控制应用程序的,唯一约束错误仅在扫描有很多对象的房间后保存时才会发生。然后很难找到重复的字段。您也不能使用排序,因为它想要刷新页面并丢失所有扫描的项目。我无法预排序,因为我希望最后扫描的项目位于顶部。
我能够在页面加载时添加 Javascript,从而创建一个包含所有条形码的数组。然后,我在扫描时检查此数组,并且在要将重复的条形码添加到数组中时不添加新的交互式网格行。
除此之外,当手动输入交互式网格行时,我需要添加相同的内容。为此,我想在交互式网格中的条形码列上添加一个 Javascript 动态操作,以便再次检查全局数组的唯一性。但是我有几个问题:我无法弄清楚如何在更改动态操作 Javascript 中获取输入的条形码值,有时它会显示以前更改的值(可能是这个错误虽然我在 20.2 中)并且在输入值后按 Enter 键时,Change 事件似乎也触发了两次(一次用于新行(这次我的代码与点击 Tab 时不同),一次用于下面的下一行)。最后一个似乎很糟糕,从那时起它将尝试检查现有值(下一行)并给出不应该发生的错误;但是我没有看到像 On Row Submit 这样的更合适的事件。不确定是否有办法检查 Change 事件中的值是否发生了变化。
我目前拥有的代码是从这里获得的。我假设这意味着 Oracle Apex 没有在 Javascript 动态操作中获取交互式网格列值的标准方法。不确定这是否在 20.2 或 21 中发生了变化。我拥有的代码是:
console.log($(this.triggeringElement));
var grid = apex.region('LINES').widget().interactiveGrid('getViews', 'grid');
var model = grid.model;
var selectedRow = grid.view$.grid('getSelection');
var id = $(selectedRow[0][0]).data('id');
var record = model.getRecord(id);
let bcode = model.getValue(record, 'BARCODE');
console.log(id);
console.log(record);
console.log($(selectedRow[0][0]));
console.log(bcode);
if(barcodes.includes(bcode)) {
apex.message.showErrors([{
type: "error",
location: "page",
message: "The entered barcode is already in the list.",
unsafe: false
}]);
}
当我console.log(record)
可以看到输入到条形码列中的值时,但我不知道如何遍历对象树以便从record
. 我不明白它在控制台日志中显示的对象。它似乎与其他人在上述代码中所做的点访问遍历无关。我可以record
在顶部看到数组,但条形码列显示的是前一个值;然而,在下面它确实将新输入的值显示为第三 (2) 个索引,但我不知道如何编写 Javascript 来访问它。
如果我可以从record
对象访问以前的值和新值,我可以检查更改并将新值与全局数组进行比较。我如何访问record
对象中的这些值,或者是否有更好的方法来实现我的目标?bcode
打印以前的值,所以我想如果那不是错误,我已经有了。