我有输入访问编号并在块上搜索记录的程序。但是此过程搜索记录需要 3 到 4 分钟的时间,并且块有 12672 条记录。如何优化程序以快速搜索记录。
法典:
DECLARE
BEGIN
IF :CTRL_BLOCK.SRCH_VISITNO IS NULL THEN
MESSAGE('Please enter Visit No...');
GO_ITEM('SRCH_VISITNO');
ELSE
BEGIN
GO_BLOCK('cpvdtl');
FIRST_RECORD;
LOOP
IF :cpvdtl.visitno = :CTRL_BLOCK.srch_visitno THEN
exit;
ELSE
NEXT_RECORD;
END IF;
EXIT WHEN :SYSTEM.LAST_RECORD='TRUE';
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
MESSAGE('No Data found...!');
END;
END IF;
:CTRL_BLOCK.srch_visitno := null;
go_item('cpvdtl.visitno');
END;
为什么要重新发明轮子?
默认表单功能运行良好,就像:
- 在表上创建块
- 运行表单
- 进入查询模式
- 在任何列中输入搜索条件(包括通配符(
- 执行查询
如果任何记录符合条件,它将显示在屏幕上。
如果您坚持自己的搜索字段,请创建它(这是您已经执行的操作(。然后:
- 我建议您创建一个按钮
- 创建一个
WHEN-BUTTON-PRESSED
触发器,它将- 利用内置
SET_BLOCK_PROPERTY
,使用ONETIME_WHERE
(或DEFAULT_WHERE
;看看哪个更适合(属性,通过将搜索字段的值设置为块的where
子句 EXECUTE_QUERY
- 利用内置
为什么是按钮,而不仅仅是搜索字段?因为然后你会使用WHEN-VALIDATE-ITEM
触发器来SET_BLOCK_PROPERTY
,但你不能EXECUTE_QUERY
该触发器,因为它是一个受限制的过程。是的,您可以使用KEY-NEXT-ITEM
触发器,但是 - 如果用户使用鼠标导航出搜索字段怎么办?该触发器不会触发。我会说按钮是一个更简单的选择。