Env:具有Oracle 12c第2版的Oracle APEX v5.1
首先,我创建了一个不基于基础表的交互式网格,因为我将使用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和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,该DA将在该产品编号的末尾添加“ -1”的序列。然后是用户,然后在IG中添加另一行并输入相同的产品编号,然后我希望它在其末尾添加“ -2”。
仅当产品更改编号时,我才需要按照556677将该新产品的序列重置为“ -1”,依此类推。
还应考虑的其他情况如下:
在IG上方,用户再次输入123456,但这应计算出123456的下一个序列为“ -3”
从IG中删除产品时,需要同样注意,但始终要查看该产品的最大序列号。
我一直在考虑可能将APEX_COLLECTIONS用作存储网格中当前内容的一种方式,因为尚未对数据库提交任何更改。
答案 0 :(得分:0)
假设您有一个产品值集合(在这种情况下,我使用的是内置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
输出:
ID | GRID_ROW | PRODUCT | 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
答案 1 :(得分:0)
如前所述,插入产品时输入的数据不会保存到数据库中,因此实际上不会存储在任何地方。 因此,您无法检查该值是否已经存在并输入-2或其他值。
要考虑的一些事情可能是将这些值保存到临时表中,这样您就可以让一个函数检查其中有多少product_item(如123456-%),并使用该数字+1作为新的product_item。 >
或者,您可以采用更艰难的方法,并使用javascript完成所有操作。为此,您将需要以某种方式获取IG中的所有记录,遍历所有记录,查看您有123456次出现,然后插入123456-(不出现+ 1)。