我正在使用Oracle Forms Builder,我有一个包含多个记录的块。代码看起来有点像
first_record;
IF NAME_IN('SYSTEM.LAST_RECORD') != 'TRUE' THEN
LOOP
IF name_in('QOTLNDET_LINES.SERIAL_NUMBER') IS NOT NULL THEN
QOTLNDET_LINES_REMOVE.Delete_Row;
clear_record;
ELSE
next_record;
END IF;
EXIT WHEN NAME_IN('SYSTEM.LAST_RECORD') = 'TRUE';
END LOOP;
execute_query;
COMMIT;
go_block('QOTHDDET_MAIN');
END IF;
在next_record之前,在ELSE段内,我需要删除当前记录并重新插入它。问题不在于删除记录,而是重新插入记录。有任何想法吗?提前致谢。
答案 0 :(得分:2)
我同意APC,而不是重新插入记录,这意味着删除然后再次插入,更简单的方法是更新DB(或非DB)块中的字段。像 -
这样的东西Go_Block('Block_B1');
Last_Record;
L_num_records := :system.cursor_record;
FOR i in 1..L_num_records
LOOP
Go_Block('Block_B1');
Go_Record(i);
--update the fields in the row
:Block_B1.item1 := 'Set your value';
:Block_B1.item2 := 'Set your value';
...
...
Next_Record;
END LOOP;
First_Record;
答案 1 :(得分:0)
我同意APC和Annjawn认为更新似乎是正确的方法。在查看代码时,您似乎将代码放在pll库中。当您使用name_in()而不是直接引用该项时。如果这是真的,则意味着在将值分配给项目时,您自然无法使用直接引用。相反,你必须使用copy()。这是因为我使用了name_in()和copy(),但这样的事情应该有效:
IF NAME_IN('SYSTEM.LAST_RECORD') != 'TRUE' THEN
LOOP
IF name_in('QOTLNDET_LINES.SERIAL_NUMBER') IS NOT NULL THEN
QOTLNDET_LINES_REMOVE.Delete_Row;
clear_record;
ELSE
Copy('new value', 'QOTLNDET_LINES.INVENTORY_ITEM');
next_record;
END IF;
EXIT WHEN NAME_IN('SYSTEM.LAST_RECORD') = 'TRUE';
END LOOP;
execute_query;
COMMIT;
go_block('QOTHDDET_MAIN');
END IF;