我的表格如下:
+-------------------+
|Name |
+-------------------+
|Name1 |
|Name2 |
|Name3 |
|Name4 |
|Name1Jr |
|Name2Jr |
|Name4Jr |
+-------------------+
我的多行块看起来像:
我想知道的是在插入名称后如何插入与Jr具有相同名称的记录。例如,我插入了Name2,它也会将Name2Jr插入到multirow块中。像这样:
注意: 我需要从数据库中获取自动插入数据的值。
我尝试了 WHEN-NEW-RECORD-INSTANCE 触发器(Sir @Littlefoot在我上一个问题上的答案):
if :system.trigger_record = 1 and :test.name is null then
-- do nothing if it is the first record in a form
null;
else
duplicate_record;
if substr(:test.name, -2) = 'Jr' then
-- you've duplicated a record which already has 'Jr' at the end - don't do it
:test.name := null;
else
-- concatenate 'Jr' to the duplicated record
:test.name := :test.name || 'Jr';
end if;
end if;
现在,我想知道是否有办法在 WHEN-VALIDATE-RECORD 触发器上执行此操作。问题在于 WHEN-VALIDATE-RECORD 触发器中无法使用 duplicate_record 。如何使用程序,功能或其他东西?提前谢谢!
答案 0 :(得分:1)
DUPLICATE_RECORD
是受限制的程序,您无法在WHEN-VALIDATE-RECORD
触发器(或任何其他类型的触发器)中使用它。
由于必须导航到下一条记录(如果要复制它),即使将受限制的过程放入另一个PL / SQL程序单元,一切都只会传播和 - 最终 - 引发同样的错误。所以......你运气不好。
即使您编写了一个(存储过的)程序,该程序也会插入" Jr"在场景后面的某个地方划入数据库,您必须将这些值提取到屏幕上。由于EXECUTE_QUERY
是这样做的方式,并且它是(又一个)限制性程序,它也不会起作用。
如果您打算清除数据块并手动填充(通过循环播放),则必须使用NEXT_RECORD
导航到下一个(以及下一个和下一个)记录,并且&#39再一次限制性程序。此外,如果它是一个数据块(是的,它是),你实际上为所有记录创建了重复,一旦你保存了更改,它就会失败并且唯一约束违规(这很好),或者您创建重复(更糟糕)。
BTW WHEN-NEW-RECORD-INSTANCE
有什么问题?使用它时有什么问题?
答案 1 :(得分:1)
我们需要的是
带
的数据块(BLOCK1
)
Query Data Source Name
是mytable
,
且Number of Records Displayed
设置为超过1 (在您的情况下,将其设为 5 )。
NAME
的文本项,与表的列名相同
mytable
,Database Item property
设置为Yes
。将Number of Records Displayed
设置为1的按钮,
Keyboard Navigable
和Mouse Navigate
属性设置为No
并具有以下代码(在WHEN-BUTTON-PRESSED
触发器内):
commit;
Query_Block1;
使用此代码Query_Block1
位于Program Units
节点下方的位置:
PROCEDURE Query_Block1 IS
BEGIN
execute_query;
last_record;
down;
END;
POST-INSERT
节点下的BLOCK1
触发器,代码为:
insert into mytable(name) values(:name||'Jr');
表单级别的ON-MESSAGE
触发器带有代码(在提交之后禁止消息):
if Message_Code in (40400, 40401) then
null;
end if;
WHEN-NEW-FORM-INSTANCE
触发代码:
Query_Block1;