在块非常慢的预言机表单上搜索记录



我有输入访问编号并在块上搜索记录的程序。但是此过程搜索记录需要 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触发器,但是 - 如果用户使用鼠标导航出搜索字段怎么办?该触发器不会触发。我会说按钮是一个更简单的选择。

最新更新