经过之前的学习,已经能创建简单的交互式网格并设置自定义增删改按钮,但是实现上还是存在一些问题,来完善优化一下。
首先是修改,正常修改都会弹出修改框,里面是之前存储的信息,根据实际需要对其进行修改,如何获取对应id的数据就成了问题
我设想通过列表动态获取
在数据库查询一下
但是出错了
begin
select ID,
NAME,
GENDER,
AGE,
ADDRESS,
SKILL
from ROLE_INTRODUCTION2 where ID =:P6_ROW_ID;
end;
给了一个SQL查询
SQL 查询
输入返回 SQL 查询以生成动态列表的列表 SQL 查询列表或函数。单击示例可查看示例 SQL 查询。
SQL 查询语法:
select level, labelValue label, [targetValue] target, [is_current] is_current_list_entry, [imageValue] image, [imageAttributeValue] image_attribute, [imageAltValue] image_alt_attribute, [attribute1] attribute1, [attribute2] attribute2, [attribute3] attribute3, [attribute4] attribute4, [attribute5] attribute5, [attribute6] attribute6, [attribute7] attribute7, [attribute8] attribute8, [attribute9] attribute9, [attribute10] attribute10 from ... where ... order by ...
返回 SQL 查询的函数的语法:
RETURN 'select level, labelValue label,'|| ' [targetValue] target,'|| ' [is_current] is_current_list_entry,'|| ' [imageValue] image,'|| ' [imageAttributeValue] image_attribute, '|| ' [imageAltValue] image_alt_attribute,'|| ' [attribute1] attribute1,'|| ' [attribute2] attribute2,'|| ' [attribute3] attribute3,'|| ' [attribute4] attribute4,'|| ' [attribute5] attribute5,'|| ' [attribute6] attribute6,'|| ' [attribute7] attribute7,'|| ' [attribute8] attribute8,'|| ' [attribute9] attribute9,'|| ' [attribute10] attribute10'|| 'from ...'|| 'where ...'|| 'order by ...';
注: is_current 列可以设置为以下三个值之一: 'YES', 'NO' 或 NULL。如果设置为 NULL, 则列表条目的货币将基于列表条目的目标页。
重新写一个
RETURN 'select level, labelValue label,' ||
' [targetValue] target,'||
' [is_current] is_current_list_entry,'||
' [imageValue] image,'||
' [imageAttributeValue] image_attribute, '||
' [imageAltValue] image_alt_attribute,'||
' [name] name,'||
' [gender] gender,'||
' [age] age,'||
' [address] address,'||
' [skill] skill,'||
'from ROLE_INTRODUCTION2'||
'where id =: P6_ROW_ID';
出现报错
对于源类型“返回SQL查询的函数体”,当区域保存在构建器中时,顶点引擎将验证pl/sql块,并检查是否返回有效的查询。因此,如果pl/sql块中有绑定变量(如:P1_DATE
),这些变量将无法正确绑定(因为这是在构建器中而不是运行时),并且该块将无法编译。要解决这个问题,请确保所有绑定变量在函数体中都有默认值。
再来一次
select name,
gender,
age,
address,
skill
from ROLE_INTRODUCTION2
where id =: P6_ROW_ID;
验证成功!
选择区域模板
创建动态列表成功!设置模板选项
配置 功能:主题样式选择
应用上去直接给我寄了
请与您的应用程序管理员联系。
ORA-06512: 在 "APEX_220200.WWV_FLOW_PAGE", line 1932 ORA-06512: 在 "APEX_220200.WWV_FLOW_DISP_PAGE_PLUGS", line 1655 ORA-06512: 在 "APEX_220200.WWV_FLOW_REGION_LIST", line 901 ORA-06512: 在 "APEX_220200.WWV_FLOW_DYNAMIC_EXEC", line 1337 ORA-06512: 在 "SYS.DBMS_SYS_SQL", line 2120 ORA-06512: 在 "SYS.WWV_DBMS_SQL_APEX_220200", line 837 ORA-06512: 在 "APEX_220200.WWV_FLOW_DYNAMIC_EXEC", line 1332 ORA-06512: 在 "APEX_220200.WWV_FLOW_REGION_LIST", line 849 ORA-06512: 在 "APEX_220200.WWV_FLOW_REGION_LIST", line 1049 ORA-06512: 在 "APEX_220200.WWV_FLOW_REGION_LIST", line 1124 ORA-06512: 在 "APEX_220200.WWV_FLOW_REGION_LIST", line 1286 ORA-06512: 在 "APEX_220200.WWV_FLOW_REGION_NATIVE", line 2404 ORA-06512: 在 "APEX_220200.WWV_FLOW_PLUGIN", line 2766 ORA-06512: 在 "APEX_220200.WWV_FLOW_DISP_PAGE_PLUGS", line 1023 ORA-06512: 在 "APEX_220200.WWV_FLOW_DISP_PAGE_PLUGS", line 1584 ORA-06512: 在 "APEX_220200.WWV_FLOW_PAGE", line 1880
啊???
删掉刚刚创建的列表就好了,好家伙ORZ
下午在边做边学习的过程中有了一些灵感:
修改按钮点击后会获取原先数据,数据是从哪里来的?
是在test1的修改按钮→点击修改→执行服务器端的代码 中来的
begin
apex_util.set_session_state('P3_ROW_ID', :P6_ROW_ID);
end;
改写之后运行报错:
Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-20987: APEX - ERR-1002 在应用程序 "273" 中未找到项 "P3_ROW_ID" 的项 ID。 - 意外错误, 在应用程序级别或页级别上未找到项名。
破案了
p3的字段是P3_ID,不是P3_ROW_ID
还是有错,查了修改缺少返回值
P6test1修改行为操作未定义
修改按钮→行为 操作 由动态操作定义→执行验证
好像可以获取原值了,但是有新的错误
Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01008: 并非所有变量都已绑定。
输入项和返回项要和pl/sql代码上的数据一一对应
为中间表添加外键(至于删除时是级联还是设为空值看实际需要)
创建结果
和主菜单设置跳转链接
动态操作,新建 行选中,执行JavaScript语句
var map = new Map();
map.set('P30_DEPT_ID', 'DEPT_ID');
utils.set(this.data, map);
console.log($v('P30_DEPT_ID'));
提示为完成无法保存
declare
v_row_count number(10) := 0;
begin
update DEPT_TEST_WXX set NAME = :P32_NAME, DESCRIBE =: P32_DESCRIBE,UPDATE_DATE = sysdate where DEPT_ID = :P32_DEPT_ID;
v_row_count := SQL%ROWCOUNT;
apex_util.set_session_state('P32_ROW_COUNT',v_row_count);
end;
没有的项需要手动创建
if ($v('P32_ROW_COUNT') > 0) {
alert('修改成功');
return true;
} else {
alert('修改失败');
return false;
}
部门表单新增同理
服务器端代码
declare
v_row_count number(10) := 0;
begin
INSERT INTO DEPT_TEST_WXX(NAME,DESCRIBE,CREATE_DATE,UPDATE_DATE)VALUES(:P32_NAME,:P32_DESCRIBE,sysdate,sysdate);
v_row_count := SQL%ROWCOUNT;
apex_util.set_session_state('P32_ROW_COUNT',v_row_count);
end;
设置完记得保存,转回部门信息表P30
记得设置删改要有ID传入
客户端条件→类型 JavaScript表达式
!utils.checkNull($v('P30_DEPT_ID')) && $v('P30_DEPT_ID').split(',').length == 1
假操作
if (utils.checkNull($v('P30_DEPT_ID'))) {
alert('请选择修改的数据');
return false;
}
$v('P30_DEPT_ID').split(',');
if ($v('P30_DEPT_ID').split(',').length > 1) {
alert('只能修改单条数据');
return false;
}
删除前应该有确认提示
删除前验证
if (utils.checkNull($v('P30_DEPT_ID'))) {
alert('请选择要删除的数据');
return false;
} else {
if (confirm('确定要删除选中的数据吗?')) {
return true;
} else {
return false;
}
}
删除请求后台
DECLARE
V_COUNT NUMBER(18):=0;
BEGIN
-- 删除关联的部门用户数据
DELETE DEPT_USER_TEST_WXX WHERE DEPT_ID IN(SELECT * FROM TABLE(SPLITSTR(:P30_DEPT_ID,',')));
--删除部门数据
DELETE DEPT_TEST_WXX WHERE DEPT_ID IN(SELECT * FROM TABLE(SPLITSTR(:P30_DEPT_ID,',')));
V_COUNT:= SQL%ROWCOUNT;
APEX_UTIL.SET_SESSION_STATE('P30_ROW_COUNT',V_COUNT);
END;
删除后验证
if($v('P30_ROW_COUNT')>0){
alert('删除成功');
}else{
alert('删除失败');
return false;
}
刷新
受影响的元素→ 类型 区域 →区域 部门信息表
往里面添加数据受阻
原来是处理没有添加,添加处理(点击新增转到表单页)
点击新增,报错
Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX"."NAME")。
1、数据库中字段值为"非空"类型,而传入的参数为null。
"非空"类型的字段,参数必须传值。
看一眼SQL
CREATE TABLE "DEPT_TEST_WXX"
( "DEPT_ID" NUMBER NOT NULL ENABLE,
"NAME" NVARCHAR2(64) NOT NULL ENABLE,
"DESCRIBE" NVARCHAR2(256),
"CREATE_DATE" DATE,
"UPDATE_DATE" DATE,
CONSTRAINT "DEPT_TEST_WXX_PK" PRIMARY KEY ("DEPT_ID")
USING INDEX ENABLE
)
/
CREATE OR REPLACE EDITIONABLE TRIGGER "BI_DEPT_TEST_WXX"
before insert on "DEPT_TEST_WXX"
for each row
begin
if :NEW."DEPT_ID" is null then
select "DEPT_TEST_WXX_SEQ1".nextval into :NEW."DEPT_ID" from sys.dual;
end if;
end;
/
ALTER TRIGGER "BI_DEPT_TEST_WXX" ENABLE
/
可以看到新建的触发器假设NEW.DEPT_ID为空则从已有数据库中获取.nextval
删除触发器试试
还是不行
再试试方案二
在sql语句上加条件
原先的sql语句
CREATE TABLE "DEPT_TEST_WXX"
( "DEPT_ID" NUMBER NOT NULL ENABLE,
"NAME" NVARCHAR2(64) NOT NULL ENABLE,
"DESCRIBE" NVARCHAR2(256),
"CREATE_DATE" DATE,
"UPDATE_DATE" DATE,
CONSTRAINT "DEPT_TEST_WXX_PK" PRIMARY KEY ("DEPT_ID")
USING INDEX ENABLE
)
/
后来的
在ID后加标红部分
CREATE TABLE "APEX_TEST_DEPT" ( "DEPT_ID" NUMBER GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE NOT NULL ENABLE, "NAME" NVARCHAR2(64) NOT NULL ENABLE,
"CREATED_BY" NUMBER(20,0) DEFAULT 1,
"CREATION_DATE" DATE DEFAULT sysdate,
"UPDATED_BY" NUMBER(20,0) DEFAULT 1,
"UPDATE_DATE" DATE DEFAULT sysdate,
"REMARK" NVARCHAR2(512),
"PARENT_ID" NUMBER, PRIMARY KEY ("DEPT_ID") USING INDEX ENABLE )
/
改不了一点,受不了辣,重新写一个P37
创建交互式网格
测试一下新增
可以新增,那可以着手自定义增删改了。
先对列进行一些简单的设置
创建按钮和隐藏项
设置动态操作
处理(页面从交互式网格跳转到表单)
!!!要设置项
还有P32的表单,修改这里一定要记得设提交项和返回项啊啊啊!!!!
表单修改完数据之后也要记得设置返回项
新增也一样
测试出了新的问题
因为一直出错Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX"."DEPT_ID")。ora-01400 无法将NULL插入 ID 解决方法https://www.cnblogs.com/newlooker/p/3631177.html为了解决
这个问题很多时候是没有为该表建立触发器导致的,或者是序列没建立。于是建了个触发器,
-- 建立触发器
CREATE OR REPLACE TRIGGER "TEST_TRI" BEFORE
INSERT ON DEPT_TEST_WXX
FOR EACH ROW
BEGIN
SELECT test_seq.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
结果新的问题出现了
Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-04098: 触发器 'YWJA.TEST_TRI' 无效且未通过重新验证。
自定义sql
select DEPT_ID,
NAME,
DESCRIBE,
CREATE_DATE,
UPDATE_DATE
from DEPT_TEST_WXX
运行还是无法将null插入数据表中
主打一个乱七八糟
需要手动创建项——所属部门,设置源→类型 数据库列→数据库列 DEPT_NAME→数据类型 varchar2
满头问号???
将部门 源 类型从“表/视图”改成“SQL查询”
自动生成
select DEPT_ID,
NAME,
DESCRIBE,
CREATE_DATE,
UPDATE_DATE
from DEPT_TEST_WXX2
选中部门要进行修改,跳转到警告页面
与您的应用程序管理员联系。 通过调试 ID "2128080" 提供有关此意外事件的详细信息。
ORA-06512: 在 "APEX_220200.WWV_FLOW_FORM_REGION", line 2299 ORA-06512: 在 "APEX_220200.WWV_FLOW_FORM_REGION", line 2260 ORA-06512: 在 "APEX_220200.WWV_FLOW_FORM_REGION", line 2341 ORA-06512: 在 "APEX_220200.WWV_FLOW_PROCESS_NATIVE", line 1332 ORA-06512: 在 "APEX_220200.WWV_FLOW_PLUGIN", line 3163 ORA-06512: 在 "APEX_220200.WWV_FLOW_PROCESS", line 170
报错
Exception in "begin declare v_row_count number(10) := 0; begin INSERT INTO DEPT_TEST_WXX2(NAME,DESCRIBE,CREATE_DATE,UPDATE_DATE)VALUES(:P32_NAME,:P32_DESCRIBE,sysdate,sysdate); v_row_count := SQL%ROWCOUNT; apex_util.set_session_state('P32_ROW_COUNT',v_row_count); end; end;": Error Stack: ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX2"."DEPT_ID") ORA-06512: 在 line 4 ORA-06512: 在 "SYS.DBMS_SYS_SQL", line 2120 ORA-06512: 在 "SYS.WWV_DBMS_SQL_APEX_220200", line 837 Backtrace: ORA-06512: 在 line 4 ORA-06512: 在 "SYS.DBMS_SYS_SQL", line 2120 ORA-06512: 在 "SYS.WWV_DBMS_SQL_APEX_220200", line 837 ORA-06512: 在 "APEX_220200.WWV_FLOW_DYNAMIC_EXEC", line 2614 ORA-06512: 在 line 4 ORA-06512: 在 "SYS.DBMS_SYS_SQL", line 2120 ORA-06512: 在 "SYS.WWV_DBMS_SQL_APEX_220200", line 837 ORA-06512: 在 "APEX_220200.WWV_FLOW_DYNAMIC_EXEC", line 2614 |
2 | 4% |
Error: Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX2"."DEPT_ID")。 |
0.00011 | Error: Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX2"."DEPT_ID")。 |
将P37设置的 处理→目标类型→PL/SQL Code改为Region Source
begin
case :APEX$ROW_STATUS
when 'C' then
insert into DEPT_TEST_WXX2 ( name,describe,create_date,update_date )
values ( :NAME, :DESCRIBE, sysdate, sysdate )
returning dept_id into :P37_DEPT_ID;
when 'U' then
update DEPT_TEST_WXX2
set name = :NAME,
describe = :DESCRIBE,
create_date = sysdate,
update_date = sysdate
where dept_id = :P37_DEPT_ID;
when 'D' then
delete DEPT_TEST_WXX2
where dept_id = :P37_DEPT_ID;
end case;
-- WRITE_LOG( 'P6', 'debug' , 'APEX$ROW_STATUS' || :APEX$ROW_STATUS , -1 , 1 );
end;
【错误记录】ORA-01400: 无法将 NULL 插入 ("YWJA"."DEPT_TEST_WXX2"."DEPT_ID")。
关于报错可以f12查看错误来源,
可以看到设置的输入项和输出项,同时数据data显示undefined
写了一个左连接在用户查询
SELECT ATU.USER_ID AS USER_ID,ATU.NAME as NAME,ATU.GENDER AS GENDER,ATU.REMARK AS REMARK,ATU.UPDATE_TIME,
listagg(ATD.NAME,',') within GROUP (order by ATD.NAME) AS DEPT_NAME
FROM USER_TEST_WXX ATU
LEFT JOIN DEPT_USER_TEST_WXX ATDU ON ATU.USER_ID = ATDU.USER_ID
LEFT JOIN DEPT_TEST_WXX2 ATD ON ATDU.DEPT_ID = ATD.DEPT_ID
group by ATU.USER_ID,ATU.NAME,ATU.GENDER,ATU.REMARK,ATU.UPDATE_TIME