Oracle APEX 24.1:将 <table name: field value> 转换为指向包含该记录的表的表单的链接

问题描述 投票:0回答:1

我正在将旧的 Perl/MySQL 数据库应用程序转换为 Oracle APEX,旧系统中有一个功能我一直无法找到实现方法...

假设每个表格由列表屏幕(交互式网格)、仅查看屏幕(所有字段设置为只读的表单)和输入/编辑屏幕(第二个表单)组成;并且有一个 ID(主键)、名称和注释(文本区域)字段,尽管它们显然还有许多其他字段。 为此,假设我们有名为 table_1、table_2 和 table_3 且具有顺序 ID 的表,然后名称分别具有值 name_1、name_2 和 name_3。

当前系统使用所谓的“自由格式链接”,以便在输入屏幕上输入的表:名称将显示指向与名称匹配的实际记录或记录的链接。

示例: 如果他们在 table_1 输入表单的 Comments 字段中输入 ,则在 table_1 的视图表单上,它会显示为指向该记录的可点击链接,并且如果 name_3 不唯一(不要求如此),则它会显示为该记录的可单击链接。将显示匹配记录的列表。

有什么方法可以在 APEX 中做到这一点吗? 任何建议将不胜感激。

我尝试更改 URL 以使用名称字段而不是 ID(主键),但失败了。 我没有找到编写过滤器脚本的方法或任何其他方法来执行此操作。

filter oracle-apex record
1个回答
0
投票

这可以使用源类型为“返回 SQL 查询的 PL/SQL 函数体”的报告来实现。 emp/dept 样本表的示例。用户可以输入 ENAME:KING 以获取 KING 表单的链接,或输入 DEPT:ACCOUNTING 以获取 ACCOUNTING 表单的链接。示例位于第 142 页,表单的链接不传递主键参数,但这应该是微不足道的。

页面项目

创建文本字段 P142_SEARCH_TERM 类型的页面项目

经典报告

创建“返回 SQL 查询的 PL/SQL 函数体”类型的经典报告。使用以下来源:

DECLARE
    l_query varchar2(4000);
    l_table_name varchar2(400);
    l_key varchar2(400);
    l_search_term_t apex_t_varchar2 := apex_t_varchar2();
    --ORA-06533: Subscript beyond count
    subscript_beyond_count EXCEPTION;
    PRAGMA EXCEPTION_INIT (subscript_beyond_count, -06533);
    invalid_search_args EXCEPTION;
BEGIN
    BEGIN
        l_search_term_t := apex_string.split(NVL(:P142_SEARCH_TERM,'EMP:KING'),':');
        l_table_name := l_search_term_t(1);
        l_key := l_search_term_t(2);
    EXCEPTION WHEN subscript_beyond_count THEN
        RAISE invalid_search_args;
    END;
    IF l_table_name = 'EMP' THEN
        l_query := 
        q'!select
                          ename,
                          apex_page.get_url(
                            p_page => 142
                          )
                       from
                          emp
                       where 
                          ename = '%0'!';
    ELSIF l_table_name = 'DEPT' THEN 
        l_query := 
        q'!select
                          dname,
                          apex_page.get_url(
                            p_page => 141
                          )
                       from
                          dept
                       where 
                          dname = '%0'!';
    ELSE        
        RAISE invalid_search_args;
    END IF;
    l_query := apex_string.format(l_query, l_key);
    apex_debug.info(p_message =>'SO Debug: '||l_query);
    return(l_query);
EXCEPTION WHEN invalid_search_args THEN 
    l_query := 
    q'!select
                      'Invalid search argument: "'||:P142_SEARCH_TERM||'"'
                   from
                      dual!';
    return(l_query);
END;

设置要提交的页面项目、通用列名称和通用列计数(这是必需的,因为否则 APEX 将从 INIT 子句中添加 order by 子句)

enter image description here

动态动作

针对 P142_SEARCH_TERM 的更改创建动态操作以刷新经典报告区域。

© www.soinside.com 2019 - 2024. All rights reserved.