交互式网格:仅使用不基于表的 PL/SQL 处理
Posted
技术标签:
【中文标题】交互式网格:仅使用不基于表的 PL/SQL 处理【英文标题】:Interactive Grid:Process with PL/SQL only that isn't based off a table 【发布时间】:2019-11-12 11:53:54 【问题描述】:环境:Oracle APEX v5.1 和 Oracle 12c 第 2 版
首先,我创建了一个不基于基础表的交互式网格,因为我将使用 PL/SQL 手动处理它。
我一直使用以下内容作为指导:
https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/6361/index-en.html
我基本上有以下查询:
select
level as id,
level as grid_row,
null as product,
null as product_item
from dual connect by level <= 1
只专注于 product_item 列将是只读列并且只能输入产品编号的 product_item 列,我想实现以下目标:
Product Product Item
---------- -------------
123456 123456-1
123456 123456-2
556677 556677-1
654321 654321-1
654321 654321-2
654321 654321-3
123456 123456-3
根据上面的内容,当用户键入产品然后从字段中跳出标签时,我希望触发一个 DA,它将“-1”序列添加到该产品编号的末尾。然后是用户然后在 IG 中添加另一行并输入相同的产品编号,然后我希望它在其末尾附加“-2”。
仅当产品更改编号时,我需要按照 556677 等将新产品的序列重置为“-1”。
还应考虑的其他情况如下:
从上面的 IG,用户再次输入 123456 但这应该计算出 123456 的下一个序列是“-3”
当产品从 IG 中移除时,同样需要考虑,但始终查看该产品的最大序列号。
我在考虑可能使用 APEX_COLLECTIONS 作为存储网格中当前内容的一种方式,因为尚未对数据库进行任何更改。
【问题讨论】:
似乎没有问题(尽管有很多关于您的意图和想法的陈述)。如果您确切地阐明了您的要求(或者您拥有什么代码以及错误是什么),这将有所帮助。 @MT0 - 我正在寻求帮助,了解如何根据输入的产品价值最好地在 product_item 中生成和维护序列,并同时处理提到的两种情况。希望这更清楚一些。 【参考方案1】:假设您有一个产品值的集合(在这种情况下,我使用的是内置的 SYS.ODCINUMBERLIST
,它是一个 VARRAY
数据类型),那么您输出的 SQL 将是:
SELECT id,
id AS grid_row,
product,
product || '-' || ROW_NUMBER() OVER ( PARTITION BY product ORDER BY id )
AS product_item
FROM (
SELECT ROWNUM AS id,
COLUMN_VALUE AS product
FROM TABLE(
SYS.ODCINUMBERLIST(
123456,
123456,
556677,
654321,
654321,
654321,
123456
)
)
)
ORDER BY id
输出:
身份证 | GRID_ROW |产品 | PRODUCT_ITEM -: | --------: | ------: | :----------- 1 | 1 | 123456 | 123456-1 2 | 2 | 123456 | 123456-2 3 | 3 | 556677 | 556677-1 4 | 4 | 654321 | 654321-1 5 | 5 | 654321 | 654321-2 6 | 6 | 654321 | 654321-3 7 | 7 | 123456 | 123456-3
db小提琴here
【讨论】:
从您的解决方案中我可以看到,您正在提供一个查询。我实际上需要根据产品列中输入的值动态计算 product_item 序列。需要维护此序列,因为实际上没有任何内容存储在数据库中。最后,用户最终会按下“应用”按钮,然后将信息存储在后端。【参考方案2】:正如您所提到的,您输入的数据在您插入产品时不会保存到数据库中,因此它实际上并没有存储在任何地方。 所以你不能去检查那个值是否已经存在并输入 -2 或其他。
需要考虑的一些事情是将值保存到临时表中,这样您就可以使用函数检查其中有多少 product_item(如 123456-%),并将该数字 +1 用作您的新 product_item。
或者你可以更艰难地使用 javascript 来完成这一切。为此,您需要以某种方式获取 IG 中的所有记录,查看所有记录并查看 123456 的出现次数,然后插入 123456-(出现次数 + 1)。
【讨论】:
以上是关于交互式网格:仅使用不基于表的 PL/SQL 处理的主要内容,如果未能解决你的问题,请参考以下文章