APEX开发过程中需要注意的小细节3

【问题记录】在编辑数据信息时发现辩护的数据无法保存,提示

“ORA-01799: 列不能外部联接到子查询”

仅展示的数据来自主表,这部分都是关联子表重点内容,编辑时无法保存

于是想将扩展表作为主表,在主表进行修改试试

新的报错:

ORA-01779: 无法修改与非键值保存表对应的列

看来单表可以使用Oracle APEX原生的联表增删改只能手敲SQL

【问题记录】展示的是主表数据,关联扩展子表无数据,点击编辑会报错,究其原因,编辑的是子表最新一条数据,子表无数据自然查不到了

【解决方法】新建项,给编辑按钮加上条件,判断子表有数据则显示编辑按钮

项-源-类型“SQL查询”(返回单个值)-已使用“始终替换会话状态中的任何现有值”

给编辑入口添加标识符P261_IS_DATA
select COUNT(PLATFORM_DEMAND_HIS_ID)
from DIGITAL_PLATFORM_DEMAND D
         left join DIGITAL_PLATFORM_DEMAND_HIS H
                   on D.PLATFORM_DEMAND_ID = H.PLATFORM_DEMAND_ID
                       and D.TENANT_ID = H.TENANT_ID
where H.PLATFORM_DEMAND_ID = :P261_PLATFORM_DEMAND_ID
order by H.PLATFORM_DEMAND_HIS_ID desc;

判断子表有数据则显示编辑按钮

想要显示/隐藏的按钮-服务器端条件-类型 “项不为零”-项 “P261_IS_DATA”

效果如图所示:

没有子表记录就不显示编辑按钮

有子表记录就显示编辑按钮

同理,想要根据用户身份控制需求等级字段的显示/隐藏,新增一个标帜项P271_IS_SHOW

select distinct count(1)  from DIGITAL_USER_GROUP_DETAILS
where upper(USER_ID) = upper(:U_ID)
and USER_GROUP_ID in (300018,300121,300120);

【开发小技巧】多个条件合并成一个

之前提到创建项并根据项值判断是否展示按钮/项值/页面,但是如果要判断多个条件,直接判断单项显然不够,这里有两个方案,表达式函数体,点击要设置条件的按钮- 服务器端条件- 类型 “表达式”   语言“PL/SQL”  PL/SQL表达式 (将新建的条件项作为判断写入)

(:P261_IS_DATA != 0 and :P261_IS_SHOW != 0 and :P261_IS_EDIT != 0)

(:P261_IS_DATA != 0 and :P261_IS_SHOW != 0 and :P261_IS_EDIT != 0)
新建项P261_IS_DATA   项-源-类型“SQL查询”(返回单个值)-已使用“始终替换会话状态中的任何现有值”
select COUNT(PLATFORM_DEMAND_HIS_ID)
from DIGITAL_PLATFORM_DEMAND D
         left join DIGITAL_PLATFORM_DEMAND_HIS H
                   on D.PLATFORM_DEMAND_ID = H.PLATFORM_DEMAND_ID
                    --    and D.TENANT_ID = H.TENANT_ID
where H.PLATFORM_DEMAND_ID = :P261_PLATFORM_DEMAND_ID
order by H.PLATFORM_DEMAND_HIS_ID desc;


P261_IS_SHOW
select distinct count(1)  from DIGITAL_USER_GROUP_DETAILS
where upper(USER_ID)  = upper(:U_ID)
and USER_GROUP_ID in (300018,300121,300120);


P261_IS_EDIT
select distinct count(1)  from DIGITAL_USER_GROUP_DETAILS
where upper(USER_ID)  = upper(:U_ID)
and USER_GROUP_ID in (300018,300120);

【问题记录】使用APEX原生交互式网格编辑报错

  • ORA-01799: 列不能外部联接到子查询

  •  ORA-02014: 不能从具有 DISTINCT, GROUP BY 等的视图选择 FOR UPDATE

破案了

【交互式网格】使用了共享组件,类型无法设置为“仅显示”问题的解决

对应的项-只读 设置为“始终”  执行“每一行”

效果

在函数里套函数

场景:

需求负责人有的带工号,有的不带工号,要求全都不带工号

逻辑1.0:

业务方提报需求的时候会有一个需求负责人,扩展表在需求更新中也会更新需求负责人,在展示时优先展示扩展表中的数据,当扩展表中无需求负责人数据时会展示主表数据

COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON) AS OWNER
COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON) AS OWNER  --需求负责人

 

对应代码:

select * from (
select D.PLATFORM_DEMAND_ID, --需求id
       D.DEMAND_TITLE,       --需求名称
       D.INITIATOR_NAME,--提出人
       D.DEMAND_CONTENT,--需求描述
       D.INITIATOR_DEPT_NAME,--业务提出方
       D.IS_SHOW,--是否在需求进度中展示 1展示  0不展示
       H.DEMAND_GRADE,--需求等级
       H.DEMAND_CP,--业务对接人
       COALESCE(H.DEMAND_OWNER,D.CHARGE_PERSON) AS OWNER,  --需求负责人
       H.PROGRESS,--进度
        COALESCE(H.STATUS,D.STATUS) AS STATUS,  --状态
       H.CREATED_BY,--创建人
       H.CREATION_DATE,--创建时间
       H.UPDATED_BY,--更新人(用户ID)
       H.UPDATOR,--更新人(文本)
       H.UPDATED_DATE--更新时间
from DIGITAL_PLATFORM_DEMAND D
         left join (
                   select * from (select rank() over (partition by s.PLATFORM_DEMAND_ID order by PLATFORM_DEMAND_HIS_ID desc ) rn,
                                         s.PLATFORM_DEMAND_HIS_ID,
                                         s.PLATFORM_DEMAND_ID,
                                         s.TENANT_ID,
                                         s.DEMAND_GRADE,
                                         s.DEMAND_CP,
                                         s.DEMAND_OWNER,
                                         s.PROGRESS,
                                         s.STATUS,
                                         s.IS_UPGRADE,
                                         s.UPDATOR,
                                         s.CREATED_BY,
                                         s.CREATION_DATE,
                                         s.UPDATED_BY,
                                         s.UPDATED_DATE,
                                         s.DEL_FLAG
                                  from DIGITAL_PLATFORM_DEMAND_HIS s
                                  where s.DEL_FLAG = 0) where rn=1) H
                   on D.PLATFORM_DEMAND_ID = H.PLATFORM_DEMAND_ID
--    and D.TENANT_ID = H.TENANT_ID

where D.SOURCE = 'PLATFORM' --中心级需求
  and to_char(D.CREATED_DATE, 'yyyy') = '2024'
  and D.DEL_FLAG = 0
  )

逻辑2.0:

出现( 时截取,截取括号前的人名

SELECT SUBSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
       INSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(') - 1) AS result --只截取有(的数据
select D.PLATFORM_DEMAND_ID,                                          --需求id
       D.DEMAND_TITLE,                                                   --需求名称
SUBSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
       INSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(') - 1) AS result --只截取有(的数据
​​​​​​​from DIGITAL_PLATFORM_DEMAND D
         left join DIGITAL_PLATFORM_DEMAND_HIS H
                   on D.PLATFORM_DEMAND_ID = H.PLATFORM_DEMAND_ID
                       --    and D.TENANT_ID = H.TENANT_ID
                       and H.PLATFORM_DEMAND_HIS_ID =
                           (select MAX(e.PLATFORM_DEMAND_HIS_ID)
                            from DIGITAL_PLATFORM_DEMAND_HIS e
                            where e.PLATFORM_DEMAND_ID = D.PLATFORM_DEMAND_ID);

缺点是只能截取有( 的数据,之前没有工号的数据直接不截取也不显示

逻辑3.0:

在最外面再套一层DECODE()函数,DECODE()函数里加一个函数来判断( 出现次数

select (length('10,CLARK,MANAGER')-length(replace('10,CLARK,MANAGER',',','')))/length(',') as result from dual; --返回结果2
-- 1、统计字符出现次数 -- 如:统计以下字符串逗号出现次数 -- 字符串的总长度减去去掉逗号之后的字符串长度,就得到了逗号的个数, -- 第 1 行调用 LENGTH 函数获取字符串总长 ,第 2 行仍然调用 LENGTH 函数获取不含逗号的字符串长度,而逗号的删除则借助了REPLACE 函数 -- 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 -- 原文链接:https://blog.csdn.net/jungeCSND/article/details/123875365

select decode((length(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON)) -
        length(replace(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(', ''))) / length('('), 0, '没有工号', 1,
       '有工号')

若为0则没有工号,执行逻辑1.0;为1则有工号,执行逻辑2.0。

select decode((length(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON)) -
        length(replace(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(', ''))) / length('('), 0, COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
       SUBSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
       INSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(') - 1)) AS OWNERS,  --真正的需求负责人
select decode((length(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON)) -
        length(replace(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(', ''))) / length('('), 0, COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
       SUBSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
       INSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(') - 1)) AS OWNERS,  --真正的需求负责人

代码:

--DESCRIBE:P232 需求概览去除需求负责人工号
select D.PLATFORM_DEMAND_ID,                                                       --需求id
       D.DEMAND_TITLE,                                                             --需求名称
       COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON)                         AS OWNER, --需求负责人
--        SUBSTR(COALESCE(H.DEMAND_OWNER,D.CHARGE_PERSON),1,instr(COALESCE(H.DEMAND_OWNER,D.CHARGE_PERSON),'(',-1))OWNER2,
       decode((length(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON)) -
               length(replace(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(', ''))) / length('('), 0, '没有工号', 1,
              '有工号'),
       decode((length(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON)) -
               length(replace(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(', ''))) / length('('), 0, COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
              SUBSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
              INSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(') - 1)) AS OWNERS,  --真正的需求负责人
       SUBSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), 1,
              INSTR(COALESCE(H.DEMAND_OWNER, D.CHARGE_PERSON), '(') - 1) AS result --只截取有(的
from DIGITAL_PLATFORM_DEMAND D
         left join DIGITAL_PLATFORM_DEMAND_HIS H
                   on D.PLATFORM_DEMAND_ID = H.PLATFORM_DEMAND_ID
                       --    and D.TENANT_ID = H.TENANT_ID
                       and H.PLATFORM_DEMAND_HIS_ID =
                           (select MAX(e.PLATFORM_DEMAND_HIS_ID)
                            from DIGITAL_PLATFORM_DEMAND_HIS e
                            where e.PLATFORM_DEMAND_ID = D.PLATFORM_DEMAND_ID);

【出现问题】筛选展示列的时候只能看到部分字段,无法看到全部

【问题原因】未打开该项的“排序”等

【问题解决】找到对应的项,在 列 -“使用户可以 ”  打开排序,就可以看到该条件

【小技巧】获取当前时间的两种方式

方式一:选中项-默认值 SQL表达式     select sysdate from dual

方式二:选中项-默认值 函数题 :sysdate  

【小技巧】使用自定义编辑后页面设置刷新失败

原:

使用 动态操作 时间  事件-对话框已关闭 选择类型-JavaScript表达式 JavaScript表达式-window 真操作 刷新

新:

使用 动态操作 时间  事件-对话框已关闭 选择类型-区域 区域-需求详情  真操作 执行JavaScript代码  设置 代码- window.location.reload()

【问题记录】明明有值但是新加了需求方对接人就报错

  • ORA-02014: 不能从具有 DISTINCT, GROUP BY 等的视图选择 FOR UPDATE
  • 解决方法:为表中的项添加别名

  • 在用户开始更新过程以后, 数据库中数据的当前版本已经更改。

学到了了测试方法: 

sql报错处理:ora-01722:invalid number_ora01722无效数字报错-CSDN博客

-- 检查您的数据库中是否存在无法转换为数字的字符串值,记得将【】换成英文’[]’
SELECT mycolumn
FROM mytable
WHERE REGEXP_LIKE(mycolumn, '[^0-9]');

正常转换:

无法正常转换:

好像知道怎么个事儿了,STATUS状态在数据库里存的是number类型,0和1表示状态,但是apex中存的是文本字段,自然冲突

破案了,是STATUS类型转换有问题

修改后

修改成功

【问题记录】

长文本长度过长无法完全展示

【解决方法】

设置CSS样式

参考

oracle apex 交互式网格自动换行_oracle自动换行-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_45808673/article/details/133992353

/* 悬浮样式 */
.longlinedots{
    max-width: 900px;	/*设置容器最大宽度*/
    white-space: nowrap;	/* 设置段落文本不换行(不换行才有可能行溢出)*/
    overflow: hidden;		/* 关闭滚动条,超出部分隐藏*/
    text-overflow: ellipsis;	/* 超出部分添加省略号*/
}
/*给该选择器添加悬浮事件,实现悬浮显示全部内容*/
.longlinedots:hover {
    overflow: visible;
    white-space: inherit;
}

/* 直接显示为换行 */
.a-GV-table td  {
    word-wrap: break-word;
	overflow-wrap: break-word;
    overflow: initial;
    white-space: initial;
    text-overflow: initial;
}

效果展示:

通过CSS设置文本内容自适应换行

交互式网格编辑报错

【开发方法】图表默认未选择条件时默认展示所有

之前的做法是给两个筛选条件设置默认值,展示默认数据

默认条件一:专项

默认条件二:P0

代码:

select 
"project_owner",
COUNT("project_owner") 数量
from jas_project_master

where 
to_char("start_date",'yyyy') = '2024'
and "project_class" = :P205_CONDITION_1
and "important_grade" = :P205_CONDITION_2
GROUP BY "project_owner"
ORDER BY 数量 desc

改造后:条件项不用给默认值

代码:

select
"project_owner",
COUNT("project_owner") 数量
from jas_project_master

where
to_char("start_date",'yyyy') = '2024'
and ("project_class" = :P205_CONDITION_1 or nvl(:P205_CONDITION_1 ,'ALL') ='ALL')
and ("important_grade" = :P205_CONDITION_2 or nvl(:P205_CONDITION_2 ,'ALL') ='ALL')
GROUP BY "project_owner"
ORDER BY 数量 desc;

关键函数:

NVL()

直接在条件中做判断,若是为空则默认全选

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/440399.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派+python】实现三色呼吸灯+按钮切换

文章目录 Traffic-lights电路连接在这里插入图片描述代码实现算法设计流程图python环境配置三色呼吸灯实现三色呼吸灯按钮控制 Traffic-lights 电路连接 【元件实物图】 图1为Button,按钮的状态控制SIG引脚的电平值。图2为RGB灯,有三种颜色&#xff1a…

jpg 转 ico 强大的图片处理工具 imageMagick

点击下载 windows, mac os, linux版本 GitHub - ImageMagick/ImageMagick: 🧙‍♂️ ImageMagick 7 1. windows程序 链接:https://pan.baidu.com/s/1wZLqpcytpCVAl52pIrBBEw 提取码:hbfy 一直点击下一步安装 2. 然后 winr键 打开cmd 然…

动态代理详解

动态代理 一、JDK动态代理二、CGLIB动态代理三、Javassist动态代理技术 在程序运行阶段,在内存中动态生成代理类,被称为动态代理,目的是为了减少代理类的数量。解决代码复用的问题。 一、JDK动态代理 DK动态代理技术:只能代理接口…

备份 ChatGPT 的聊天纪录

备份 ChatGPT 的聊天纪录 ChatGPT 在前阵子发生了不少次对话纪录消失的情况,让许多用户觉得困扰不已,也担心自己想留存的聊天记录消失不见。 好消息是,OpenAI 在 2023 年 4 月 11 日推出了 ChatGPT 聊天记录备份功能,无论是免费…

怎么把视频内容快速转为文字?这三款工具助您轻松实现!

在现代社会,视频内容日益丰富多样,但有时我们更希望获得视频中的文字文稿,以便于搜索、编辑或传播。下面我将为您介绍三款优秀的视频转文字工具,它们能够帮助您快速、准确地将视频内容转换为可编辑的文字格式。让我们一起来看看这…

【JavaEE初阶】 JVM类加载简介

文章目录 🍃前言🌲类加载过程🚩加载🚩验证🚩准备🚩解析🚩初始化 🎄双亲委派模型🚩什么是双亲委派模型?🚩双亲委派模型的优点 ⭕总结 &#x1f343…

微服务:Docker篇

1. 初识Docker 1.1. 什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署,环境不一定一…

JavaScript极速入门(2)

JQuery W3C标准给我们提供了一系列函数,让我们可以操作: 网页内容 网页结构 网页样式 但是原生的JavaScript提供的API操作DOM元素时,代码比较繁琐,冗长.我们学习使用JQuery来操作页面对象. JQuery是一个快速,简洁且功能丰富的JavaScript框架,于2006年发布.它封装JavaScript常…

3dmax画图卡顿解决方法---模大狮模型网

当你在使用3D Max进行画图时遇到卡顿问题,可以尝试以下方法来解决: 减少模型复杂度:如果你的场景中有过多的高细节模型,可能会导致卡顿。尝试减少模型的复杂度,合并或简化多边形数量过多的模型。这将减轻计算机的负担&…

定制红酒:与客户的互动沟通,提升定制满意度

在云仓酒庄洒派,云仓酒庄洒派深知与客户之间的互动沟通对于提升定制满意度至关重要。因此,云仓酒庄洒派始终致力于与消费者建立积极、进一步的沟通,确保他们能够获得满意的红酒定制体验。 首先,云仓酒庄洒派通过多种渠道与客户建立…

扭蛋机小程序开发,互联网时代下的创新发展

近几年,扭蛋机市场迎来新生,逐渐火爆,受到了年轻一代消费者的钟爱。扭蛋机商品价格低廉,种类丰富,根据IP能够不断进行创新,收藏价值极高。在市场的发展下,扭蛋机行业也成为了一个蓝海市场&#…

算法打卡day12|二叉树篇01|144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历

二叉树理论基础篇 二叉树的定义 二叉树的定义和链表是差不多的,相对于链表 ,二叉树的节点里多了一个指针,一共有两个指针,指向左右孩子。 JAVA的定义如下,需要理解性记忆,因为面试手撕代码可能会用。 p…

VBA中类的解读及应用第十讲:限制文本框的输入,使其只能输入数值(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。 类,是非常抽象的,更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

10大AI工具

ChatGPT ChatGPT是由OpenAI开发的人工智能聊天机器人程序,全称为Chat Generative Pre-trained Transformer。它基于GPT-3.5架构,能够生成回答并根据聊天上下文进行互动。ChatGPT具备强大的对话能力,能在同一会话中回答上下文相关的问题&…

SpringCloud之Nacos入门与实战系列

目录 一、Nacos介绍 1.1、配置中心和注册中心的概念 1.2 Nacos 优点 二、Nacos的使用 2.1 以单机模式启动Nacos 2.2 Nacos部署方式介绍 2.3 配置数据源 2.4 开启控制台权限登录 三、配置中心的使用 3.1 创建配置信息 3.2 SpringBoot使用配置中心 四、注册中心的使用 4…

知识管理系统:初创企业的智慧助手

一、什么是知识管理系统 用通俗易懂的语言来解释,知识管理系统就像一个超级大脑,帮助企业和团队更好地记住、分享和使用他们学到的东西。无论是工作中的经验、方案还是项目成果,这个系统都能帮大家保存下来,并方便以后查找和使用。…

程序如何知道mqtt设备是否在线

在做物联网设备的时候经常会碰到设备的在线与掉线 问题:emqx如何来实现这个在线与掉线 实现:添加一个规则,程序监控这个规则 1、SELECT * FROM "$events/client_connected", "$events/client_disconnected" 2、添加一…

全面认识计算机

目录 一、计算机的发展史 1. 电子管计算机时代 2. 晶体管计算机时代 3. 小、中规模集成电路计算机时代 4. 大、超大规模集成电路计算机时代 二、计算机硬件组成 1. 输入设备 2. 输出设备 3. 存储器 4. 运算器 5. 控制器 三、计算机硬件间的连接 四、计算机系统的结…

AlpacaEval Leaderboard大模型排行榜

参考 Model NameWin RateLengthGPT-4 Turbo 📄50.00%2049Contextual AI (KTO-Mistral-PairRM) 📄33.23%2521Yi 34B Chat 📄29.66%2123Claude 3 Opus (02/29) 📄29.04%1388Claude 3 Sonnet (02/29) 📄25.56%1420GPT-4 …

数睿通2.0数据接入升级——支持增量字段同步,表单独映射

引言 上次数睿通 2.0 更新是在 23 年12 月 底,已经过去了接近三个月的时间,中间由于过年加上年前年后实在是工作繁忙,所以一直没有腾出空来更新代码,希望大家可以理解,平台的发展离不开你们的支持,在此表示…