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

前情摘要

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

表结构:

存档&改造【07】多表查询和可操控对象的存储_第1张图片

逻辑关系:

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

存档&改造【07】多表查询和可操控对象的存储_第2张图片

存档&改造【07】多表查询和可操控对象的存储_第3张图片

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

要实现的功能:

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

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

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

存档&改造【07】多表查询和可操控对象的存储_第4张图片

存档&改造【07】多表查询和可操控对象的存储_第5张图片

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

效果展示:

存档&改造【07】多表查询和可操控对象的存储_第6张图片

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

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

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

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

存档&改造【07】多表查询和可操控对象的存储_第7张图片

代码

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');
}

效果展示

存档&改造【07】多表查询和可操控对象的存储_第8张图片

存档&改造【07】多表查询和可操控对象的存储_第9张图片

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

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

存档&改造【07】多表查询和可操控对象的存储_第10张图片

修改后

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

效果展示:

存档&改造【07】多表查询和可操控对象的存储_第11张图片

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

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

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

存档&改造【07】多表查询和可操控对象的存储_第12张图片

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

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

  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 语句无法包含表达式。

存档&改造【07】多表查询和可操控对象的存储_第13张图片

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;

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

存档&改造【07】多表查询和可操控对象的存储_第14张图片

存档&改造【07】多表查询和可操控对象的存储_第15张图片

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

存档&改造【07】多表查询和可操控对象的存储_第16张图片

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

【原因】查看会话发现状态是“已插入”,但是项值还是为0,所以修改后提示失败

存档&改造【07】多表查询和可操控对象的存储_第17张图片

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

存档&改造【07】多表查询和可操控对象的存储_第18张图片

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;

重点和难点:

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

设备模板下载和设备导入

厂区-区域的级联展示

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

你可能感兴趣的:(错误记录,PL/SQL,oracle,apex,apex,oracle,pl/sql)