甲骨文APEX搜索引擎



我正在使用Oracle APEX 4.2.6和Oracle DB 11gR2

我有一个显示客户端列表的交互式报告。

最终用户可以修改客户端的名称。

我的问题是我必须找到一种方法,允许最终用户通过使用他的旧名称来查找修改后的客户端。

例如,最终用户将客户端的名称从名称修改为新名称

在交互式报表的 serach 引擎中,最终用户必须能够通过按旧名称OLD名称对其进行 serch 来查找客户端

有没有办法在 APEX 端或数据库端管理这种情况。

这在很大程度上是一个数据库问题,而不是 APEX 问题。 当用户修改客户端名称时,您需要在某处记录旧名称:这可能只是 CLIENTS 表上的一个OLD_NAME列(它只支持知道单个名称更改的先前名称),或者它可以是一个 CLIENT_NAME_HISTORY 表,每次更改客户端名称时都会向其添加一行。

完成此操作后,可以修改交互式报表的 SQL,以搜索旧名称和新名称以查找客户端 - 例如:

select ...
from clients
where (name like :P1_NAME or old_name like :P1_NAME)

select ...
from clients c
where (c.name like :P1_NAME or exists (select null
from client_name_history h 
where h.client_id = c.client_id
and h.name like :P1_NAME)

请注意,我认为您需要为名称筛选器创建一个页面项,因为 IR 的内置筛选器只能搜索报表中显示的数据,而以前的名称不会(大概)。

拥有其他列可能不是"可扩展"的解决方案。如果其他用户再次更改名称怎么办?再说一遍?再说一遍?

存储此数据的更好方法是在行中,这些行由客户端的主键和对象版本标识符(可以是数字、时间戳或日期范围)的组合唯一标识。这是Oracle自己在其许多企业应用程序中使用的方法。

数据示例如下所示。

1.) 使用对象版本号

客户端编号 |客户端名称 |对象版本号

1 |鲍勃 |1

1 |山姆 |阿拉伯数字

1 |艾德 |3


在这里,每次用户更改名称时,都会创建一个额外的行,保持相同的client_id值,但将对象版本号递增 1。最高的 ovn 表示最新值。您还可以有一个名为"latest_record"的列,并在创建新记录时插入值 Y,以显示这是最新记录(将上一条最新记录中的值重置为 N)。同样,您可以简单地存储时间戳并使用它来确定最新记录,而不是数字。

  1. >使用日期范围

客户端编号 |客户端名称 |开始日期 |结束日期

1 |鲍勃 |01-一月-2017 |31-一月-2017

1 |山姆 |02-二月-2017 |02-三月-2017

1 |艾德 |03-三月-2017 |


在此方法中,您将指定名称有效的时间段。一个用例是个人在婚后采用其伴侣的姓氏。在这种情况下,一个名字从出生到结婚之日有效,另一个名字从结婚之日起有效。


以这种格式准备数据结构后,只需在 apex 报表中查询单个名称列。我觉得在这种情况下,额外的表和列是不必要的开销。

问候 SJ

最新更新