存档&改造【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;

存在的问题:

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

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

重点和难点:

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

设备模板下载和设备导入

厂区-区域的级联展示

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

相关推荐
技术卷3 小时前
详解力扣高频SQL50题之1084. 销售分析 III【简单】
sql·leetcode·oracle
Alla T4 小时前
【通识】数据库
数据库·oracle
MickeyCV5 小时前
MySQL数据库本地迁移到云端完整教程
服务器·数据库·mysql·oracle
IT邦德5 小时前
OGG同步Oracle到Kafka不停库,全量加增量
数据库·oracle·kafka
技术卷6 小时前
详解力扣高频SQL50题之550. 游戏玩法分析 IV【中等】
sql·mysql·leetcode·oracle
技术卷11 小时前
详解力扣高频 SQL 50 题之584. 寻找用户推荐人【入门】
sql·leetcode·oracle
ALLSectorSorft18 小时前
教务管理系统学排课教务系统模块设计
数据库·sql·oracle
极简之美20 小时前
spring boot h2数据库无法链接问题
数据库·spring boot·oracle
zone_z1 天前
告别静态文档!Oracle交互式技术架构图让数据库学习“活“起来
数据库·学习·oracle
种树达人1 天前
数据库常用DDL语言
java·数据库·oracle