Oracle自动在多记录块第2部分中插入记录

时间:2018-06-14 09:33:12

标签: oracle oracle11g oracleforms

我的表格如下:

+-------------------+
|Name               |
+-------------------+
|Name1              |
|Name2              |
|Name3              |
|Name4              |
|Name1Jr            |
|Name2Jr            |
|Name4Jr            |
+-------------------+

我的多行块看起来像:

enter image description here

我想知道的是在插入名称后如何插入与Jr具有相同名称的记录。例如,我插入了Name2,它也会将Name2Jr插入到multirow块中。像这样:

enter image description here

注意: 我需要从数据库中获取自动插入数据的值。

我尝试了 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 。如何使用程序,功能或其他东西?提前谢谢!

2 个答案:

答案 0 :(得分:1)

DUPLICATE_RECORD是受限制的程序,您无法在WHEN-VALIDATE-RECORD触发器(或任何其他类型的触发器)中使用它。

由于必须导航到下一条记录(如果要复制它),即使将受限制的过程放入另一个PL / SQL程序单元,一切都只会传播和 - 最终 - 引发同样的错误。所以......你运气不好。

即使您编写了一个(存储过的)程序,该程序也会插入" Jr"在场景后面的某个地方划入数据库,您必须将这些值提取到屏幕上。由于EXECUTE_QUERY是这样做的方式,并且它是(又一个)限制性程序,它也不会起作用。

如果您打算清除数据块并手动填充(通过循环播放),则必须使用NEXT_RECORD导航到下一个(以及下一个和下一个)记录,并且&#39再一次限制性程序。此外,如果它是一个数据块(是的,它是),你实际上为所有记录创建了重复,一旦你保存了更改,它就会失败并且唯一约束违规(这很好),或者您创建重复(更糟糕)。

BTW WHEN-NEW-RECORD-INSTANCE有什么问题?使用它时有什么问题?

答案 1 :(得分:1)

enter image description here

我们需要的是

  • 数据块BLOCK1

    Query Data Source Namemytable

    Number of Records Displayed设置为超过1 (在您的情况下,将其设为 5 )。

  • 一个名为NAME的文本项,与表的列名相同 mytableDatabase Item property设置为Yes
  • Number of Records Displayed设置为1的按钮,

    Keyboard NavigableMouse 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;