存档&改造【07】多表查询和可操控对象的存储

前情摘要

在可操作对象一栏中,默认IS_ALL所有人可见,还可以指定用户和部门,可操作对象存在CODE_SYSTEM_OPERATION(晶码-接入系统操作项)表中,部门/用户ID&NAME存在CODE_SYSTEM_OPERATION_AUTH(晶码-系统操作项权限配置表)表中 ,之间通过字段SYSTEM_OPERATION_ID连接。

表结构:

逻辑关系:

默认IS_ALL,当用户选择"指定部门或角色"则将选定的部门/用户存入权限配置表

但是现实却是单选项之间可以切换&存入,但是另外的字段只能展示,无法存入。

要实现的功能:

1、鼠标点击设备编码和设备名称可查看生成的二维码

(最好能复制,复制不了就复制链接,蒋老师说不是什么问题,截个图的事儿)

在对应字段上设置标识,将原本的"文本"改为"链接",设置链接跳转的内容

这样就能实现点击设备编码和设备名称可查看生成的二维码

效果展示:

没显示事因为对话框大小和样式限制。

2、控制部门/用户选框的显示和隐藏

可根据可操作对象的选择控制部门/用户选框的显示和隐藏

对应的项→创建动态操作→执行JavaScript代码

代码

javascript 复制代码
if ($v('P243_AUTH_RANGE') == 'IS_ALL') {
    $x_Hide('P243_AUTH_ID');
    $x_Hide('P243_AUTH_NAME');
} else {
    $x_Show('P243_AUTH_ID');
    $x_Show('P243_AUTH_NAME');
}

效果展示

3、二维码操作入口设置-新增、编辑

光有可操作对象的值还不行,还得校验指定部门或角色两个都不为空,否则只是勾选"指定角色或部门"但是不去勾选内容不符合规则

修改后

javascript 复制代码
if (($v('P243_AUTH_RANGE').length == 0 || ($v('P243_AUTH_ID').length == 0 && $v('P243_AUTH_NAME').length ==0) ) {
    alert('可操作对象不能为空');
    return false;
}

效果展示:

【错误记录】PL/SQL: ORA-00971: 缺失 SET 关键字。

Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-06550: 第 40 行, 第 35 列:

PL/SQL: ORA-00971: 缺失 SET 关键字。

清晰易懂的Update多表联合修改方法

SQL Update多表联合修改_update连表修改_辰辰辰cc的博客-CSDN博客https://blog.csdn.net/weixin_44635886/article/details/125196255我参考范例写的修改语句:

sql 复制代码
  UPDATE CODE_SYSTEM_OPERATION SET AUTH_RANGE =
       (SELECT AUTH_NAME,JOB_NUMBER FROM CODE_SYSTEM_OPERATION_AUTH
       WHERE CODE_SYSTEM_OPERATION_AUTH.SYSTEM_OPERATION_ID = CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID)
    WHERE EXISTS
        (SELECT * FROM CODE_SYSTEM_OPERATION_AUTH
        WHERE CODE_SYSTEM_OPERATION_AUTH.SYSTEM_OPERATION_ID = CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID
        AND CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID =:P243_SYSTEM_OPERATION_ID );
     v_row_count := SQL%ROWCOUNT;
     apex_util.set_session_state('P243_ROW_COUNT',v_row_count);

【问题记录】PLS-00372: 在一个过程中, RETURN 语句无法包含表达式。

Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-06550: 第 14 行, 第 1 列:

PLS-00372: 在一个过程中, RETURN 语句无法包含表达式。

sql 复制代码
declare
    v_err_msg   nvarchar2(2000);
    v_user_ids  varchar2(2000);
    v_dept_ids  varchar2(2000);
    v_row_count number(10) := 0;
--     v_user_ids varchar2(2000) := 'JA063198';
--     v_dept_ids varchar2(2000) := '100';
begin

    if :AUTH_RANGE = 'IS_ALL' then
        -- 主表新增一条数据(验证是否存在);
        update CODE_SYSTEM_OPERATION
        set OPERATION_NAME = :P243_OPERATION_NAME,
            DESCRIPTION    =:P243_DESCRIPTION,
            AUTH_RANGE     =:P243_AUTH_RANGE
        where SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID;
        v_row_count := SQL%ROWCOUNT;
        apex_util.set_session_state('P243_ROW_COUNT', v_row_count);

    else
        -- 主表新增一条数据 (验证是否存在)
        --- 查询本次要新增的人员数据
        for c in ( select u.JOB_NUMBER
                   from (select JOB_NUMBER
                         from MPF_USER_DEPT_MAIN_ASSO_V
                         where EXT_USER_ID in (
                             select *
                             from JA_UTILS_PKG.SPLIT_STR(v_user_ids, ',')
                         )
                         union
                         select JOB_NUMBER
                         from MPF_USER_DEPT_MAIN_ASSO_V
                         where EXT_ORG_ID in (
                             select *
                             from JA_UTILS_PKG.SPLIT_STR(v_dept_ids, ',')
                         )) u
                            left join CODE_SYSTEM_OPERATION_AUTH a on u.JOB_NUMBER = a.JOB_NUMBER
                   where a.SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID
                     AND TENANT_ID = :USERTENANT
                     AND DEL_FLAG = 0)
            loop
                UPDATE CODE_SYSTEM_OPERATION
                SET OPERATION_NAME = :P243_OPERATION_NAME,
                    DESCRIPTION    =:P243_DESCRIPTION,
                    AUTH_RANGE     = (SELECT AUTH_NAME
                                      FROM CODE_SYSTEM_OPERATION_AUTH
                                      WHERE CODE_SYSTEM_OPERATION_AUTH.SYSTEM_OPERATION_ID =
                                            CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID)
                WHERE EXISTS
                          (SELECT *
                           FROM CODE_SYSTEM_OPERATION_AUTH
                           WHERE CODE_SYSTEM_OPERATION_AUTH.SYSTEM_OPERATION_ID =
                                 CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID
                             AND CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID);
                v_row_count := SQL%ROWCOUNT;
                apex_util.set_session_state('P243_ROW_COUNT', v_row_count);
            end loop;
    end if;

exception
    when others then
        v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
        DBMS_OUTPUT.PUT_LINE(v_err_msg);
end;

明明获取到但是提示没获取到

【问题原因】未在页中设置项
【解决办法】添加对应的项

【问题】编辑数据后保存,提示"保存失败"

【原因】查看会话发现状态是"已插入",但是项值还是为0,所以修改后提示失败
sql 复制代码
declare
    v_err_msg   nvarchar2(2000);
    v_user_ids  varchar2(2000);
    v_dept_ids  varchar2(2000);
    v_row_count number(10) := 0;
--     v_user_ids varchar2(2000) := 'JA063198';
--     v_dept_ids varchar2(2000) := '100';
begin

    if :P243_AUTH_RANGE = 'IS_ALL' then
        -- 主表新增一条数据(验证是否存在);
        update CODE_SYSTEM_OPERATION
        set OPERATION_NAME = :P243_OPERATION_NAME,
            DESCRIPTION    =:P243_DESCRIPTION,
            AUTH_RANGE     =:P243_AUTH_RANGE
        where SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID;
        v_row_count := SQL%ROWCOUNT;
        apex_util.set_session_state('P243_ROW_COUNT', v_row_count);

    else
        -- 主表新增一条数据 (验证是否存在)
        --- 查询本次要新增的人员数据
        for c in ( select u.JOB_NUMBER
                   from (select JOB_NUMBER
                         from MPF_USER_DEPT_MAIN_ASSO_V
                         where EXT_USER_ID in (
                             select *
                             from JA_UTILS_PKG.SPLIT_STR(v_user_ids, ',')
                         )
                         union
                         select JOB_NUMBER
                         from MPF_USER_DEPT_MAIN_ASSO_V
                         where EXT_ORG_ID in (
                             select *
                             from JA_UTILS_PKG.SPLIT_STR(v_dept_ids, ',')
                         )) u
                            left join CODE_SYSTEM_OPERATION_AUTH a on u.JOB_NUMBER = a.JOB_NUMBER
                   where a.SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID
                     AND TENANT_ID = :USERTENANT
                     AND DEL_FLAG = 0)
            loop
                UPDATE CODE_SYSTEM_OPERATION
                SET OPERATION_NAME = :P243_OPERATION_NAME,
                    DESCRIPTION    =:P243_DESCRIPTION,
                    AUTH_RANGE     = (SELECT AUTH_NAME
                                      FROM CODE_SYSTEM_OPERATION_AUTH
                                      WHERE CODE_SYSTEM_OPERATION_AUTH.SYSTEM_OPERATION_ID =
                                            CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID)
                WHERE EXISTS
                          (SELECT *
                           FROM CODE_SYSTEM_OPERATION_AUTH
                           WHERE CODE_SYSTEM_OPERATION_AUTH.SYSTEM_OPERATION_ID =
                                 CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID
                             AND CODE_SYSTEM_OPERATION.SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID);
                v_row_count := SQL%ROWCOUNT;
                apex_util.set_session_state('P243_ROW_COUNT', v_row_count);
            end loop;
    end if;

exception
    when others then
        v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
        DBMS_OUTPUT.PUT_LINE(v_err_msg);
end;

【解决方法】在数据定义将v_row_count初始值从0→1

sql 复制代码
declare
    v_err_msg   nvarchar2(2000);
    v_row_count number(10) := 1;

begin

    update CODE_SYSTEM_OPERATION
    set OPERATION_NAME = :P243_OPERATION_NAME,
        DESCRIPTION    =:P243_DESCRIPTION,
        AUTH_RANGE     =:P243_AUTH_RANGE
    where SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID;

    if :P243_AUTH_RANGE = 'IS_ALL' then

        delete CODE_SYSTEM_OPERATION_AUTH
        where SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID
          and TENANT_ID = :USERTENANT;

    else

        --- 查询本次要新增的人员数据
        for c in ( select u.EXT_USER_ID,u.JOB_NUMBER, u.NAME
                   from (select EXT_USER_ID,JOB_NUMBER, NAME, :P243_SYSTEM_OPERATION_ID SYSTEM_OPERATION_ID
                         from MPF_USER_DEPT_MAIN_ASSO_V
                         where EXT_USER_ID in (
                             select *
                             from JA_UTILS_PKG.SPLIT_STR(:P243_USER_ID, ':')
                         )
                         union
                         select EXT_USER_ID,JOB_NUMBER, NAME, :P243_SYSTEM_OPERATION_ID SYSTEM_OPERATION_ID
                         from MPF_USER_DEPT_MAIN_ASSO_V
                         where EXT_ORG_ID in (
                             select *
                             from JA_UTILS_PKG.SPLIT_STR(:P243_DEPT_ID, ':')
                         )) u
                            left join CODE_SYSTEM_OPERATION_AUTH a
                                      on u.EXT_USER_ID=a.AUTH_ID AND u.JOB_NUMBER = a.JOB_NUMBER and a.TENANT_ID = :USERTENANT
                   and a.SYSTEM_OPERATION_ID = :P243_SYSTEM_OPERATION_ID)

            loop
                insert into CODE_SYSTEM_OPERATION_AUTH(system_operation_id, auth_id, auth_name, job_number, tenant_id,
                                                       created_by, creation_time)
                values (:P243_SYSTEM_OPERATION_ID, c.EXT_USER_ID, c.NAME, c.JOB_NUMBER, :USERTENANT, :USER_ID, sysdate);

            end loop;
    end if;
    apex_util.set_session_state('P243_ROW_COUNT', v_row_count);
exception
    when
        others then
        rollback;
        apex_util.set_session_state('P243_ROW_COUNT', 0);
        v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
        JA_WRITE_LOG('P' || :APP_PAGE_ID || ':' || :APP_PAGE_ALIAS, 'error', v_err_msg, :USER_ID, :USERTENANT,
                     :APP_NAME || ':' || :APP_ID);

end;

存在的问题:

级联树形列表刷新后只能保存一次数据(后续需刷新)

二维码操作入口-列表展示-可操作对象应该设置成仅展示,不能更改(更改在设置里)

重点和难点:

二维码的生成、预览、批量下载

设备模板下载和设备导入

厂区-区域的级联展示

二维码操作入口-操作项设置-设置可操作对象

相关推荐
ClouGence8 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
ClouGence14 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
曹牧15 天前
Oracle EXPLAIN PLAN
数据库·oracle
贤时间15 天前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心15 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
Curvatureflight15 天前
MySQL 深分页越来越慢?从 LIMIT OFFSET 改成游标分页
数据库·oracle
XZ-07000115 天前
MySQL事务
数据库·mysql·oracle
tiancaijiben15 天前
阿里云函数计算FC如何实现网站的定时任务与自动化
数据库·oracle·dba
xfhuangfu15 天前
Oracle 19c 多租户体系架构介绍
数据库·oracle·架构
杨云龙UP15 天前
Spotlight 接入 Oracle 数据库监控操作指南 2026-06-16
数据库·oracle·性能监控·预警·阈值·spotlight·瓶颈分析