Oracle APEX 搜索引擎
Oracle APEX Search Engine
我正在使用 Oracle APEX 4.2.6 和 Oracle DB 11gR2
我有一份显示客户列表的交互式报告。
最终用户可以修改客户端的名称。
我的问题是我必须找到一种方法让最终用户通过使用他的旧名称.
搜索来找到修改后的客户端
例如,最终用户将客户端名称从 OLD NAME 修改为 NEW NAME
在交互式报告的搜索引擎中,最终用户必须能够通过其旧名称搜索来找到客户端旧名称
有没有办法在 APEX 端或数据库端管理这种情况。
这在很大程度上是数据库问题,而不是 APEX 问题。当用户修改客户端名称时,您将需要在某处记录旧名称:这可能只是 CLIENTS table 上的 OLD_NAME 列(它只支持知道单个名称的以前名称更改),或者它可以是 CLIENT_NAME_HISTORY table,每次更改客户端名称时都会向其中添加一行。
完成后,您的交互式报告的 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 的内置过滤器只能搜索报告中显示的数据,而以前的名称不会(大概).
添加额外的列可能不是 "scalable" 解决方案。如果另一个用户再次更改名称怎么办?然后再次?再来一次?
存储此数据的更好方法是在由客户端主键和对象版本标识符的组合唯一标识的行中 - 这可以是数字或时间戳或日期范围.这是 Oracle 自己在其许多企业应用程序中使用的方法。
数据示例如下所示。
1.) 使用对象版本号
客户编号 |客户名称 |对象版本号
1 |鲍勃 | 1
1 |山姆 | 2
1 |埃德 | 3
此处,每次用户更改名称时,都会创建一个额外的行,保持相同的 client_id 值,但将对象版本号增加 1。最高的 ovn 表示最新值。您还可以有一个名为 "latest_record" 的列,并在创建新记录时插入值 Y 以表明这是最新记录(将上一个最新记录中的值重置为 N)。同样,您可以简单地存储时间戳而不是数字,并使用它来确定最新记录。
- 使用日期范围
客户编号 |客户名称 |开始日期 |结束日期
1 |鲍勃 | 2017 年 1 月 1 日 | 2017 年 1 月 31 日
1 |山姆 | 2017 年 2 月 2 日 | 2017 年 3 月 2 日
1 |埃德 | 2017 年 3 月 3 日 |
在这种方法中,您要指定名称有效的时间段。一个用例是一个人在婚后采用其伴侣的姓氏。在这种情况下,一个名字从出生之日起至结婚之日有效,另一个名字从结婚之日起有效。
以这种格式准备数据结构后,在顶点报告中,您只需查询单个名称列。我觉得在这种情况下额外的表和列是不必要的开销。
此致,
SJ
我正在使用 Oracle APEX 4.2.6 和 Oracle DB 11gR2
我有一份显示客户列表的交互式报告。
最终用户可以修改客户端的名称。
我的问题是我必须找到一种方法让最终用户通过使用他的旧名称.
搜索来找到修改后的客户端例如,最终用户将客户端名称从 OLD NAME 修改为 NEW NAME
在交互式报告的搜索引擎中,最终用户必须能够通过其旧名称搜索来找到客户端旧名称
有没有办法在 APEX 端或数据库端管理这种情况。
这在很大程度上是数据库问题,而不是 APEX 问题。当用户修改客户端名称时,您将需要在某处记录旧名称:这可能只是 CLIENTS table 上的 OLD_NAME 列(它只支持知道单个名称的以前名称更改),或者它可以是 CLIENT_NAME_HISTORY table,每次更改客户端名称时都会向其中添加一行。
完成后,您的交互式报告的 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 的内置过滤器只能搜索报告中显示的数据,而以前的名称不会(大概).
添加额外的列可能不是 "scalable" 解决方案。如果另一个用户再次更改名称怎么办?然后再次?再来一次?
存储此数据的更好方法是在由客户端主键和对象版本标识符的组合唯一标识的行中 - 这可以是数字或时间戳或日期范围.这是 Oracle 自己在其许多企业应用程序中使用的方法。
数据示例如下所示。
1.) 使用对象版本号
客户编号 |客户名称 |对象版本号
1 |鲍勃 | 1
1 |山姆 | 2
1 |埃德 | 3
此处,每次用户更改名称时,都会创建一个额外的行,保持相同的 client_id 值,但将对象版本号增加 1。最高的 ovn 表示最新值。您还可以有一个名为 "latest_record" 的列,并在创建新记录时插入值 Y 以表明这是最新记录(将上一个最新记录中的值重置为 N)。同样,您可以简单地存储时间戳而不是数字,并使用它来确定最新记录。
- 使用日期范围
客户编号 |客户名称 |开始日期 |结束日期
1 |鲍勃 | 2017 年 1 月 1 日 | 2017 年 1 月 31 日
1 |山姆 | 2017 年 2 月 2 日 | 2017 年 3 月 2 日
1 |埃德 | 2017 年 3 月 3 日 |
在这种方法中,您要指定名称有效的时间段。一个用例是一个人在婚后采用其伴侣的姓氏。在这种情况下,一个名字从出生之日起至结婚之日有效,另一个名字从结婚之日起有效。
以这种格式准备数据结构后,在顶点报告中,您只需查询单个名称列。我觉得在这种情况下额外的表和列是不必要的开销。
此致, SJ