经过之前的学习,已经能创建简单的交互式网格并设置自定义增删改按钮,但是实现上还是存在一些问题,来完善优化一下。
首先是修改,正常修改都会弹出修改框,里面是之前存储的信息,根据实际需要对其进行修改,如何获取对应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';
【错误记录】ORA-20001: Query must begin with SELECT or WITH
出现报错
- ORA-20001: Query must begin with SELECT or WITH
对于源类型“返回SQL查询的函数体”,当区域保存在构建器中时,顶点引擎将验证pl/sql块,并检查是否返回有效的查询。因此,如果pl/sql块中有绑定变量(如:P1_DATE
),这些变量将无法正确绑定(因为这是在构建器中而不是运行时),并且该块将无法编译。要解决这个问题,请确保所有绑定变量在函数体中都有默认值。
再来一次
select name,
gender,
age,
address,
skill
from ROLE_INTRODUCTION2
where id =: P6_ROW_ID;
验证成功!
选择区域模板
创建动态列表成功!设置模板选项
配置 功能:主题样式选择
应用上去直接给我寄了
呈现区域 "test1" 时出错。
请与您的应用程序管理员联系。
技术信息(仅提供给开发人员使用)
- is_internal_error: true
- apex_error_code: APEX.REGION.UNHANDLED_ERROR
- ora_sqlcode: -1008
- ora_sqlerrm: ORA-01008: 并非所有变量都已绑定 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
- component.type: APEX_APPLICATION_PAGES
- component.id: 273000000006
- component.name: test1
- error_backtrace:
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的修改按钮→点击修改→执行服务器端的代码 中来的
beginapex_util.set_session_state('P3_ROW_ID', :P6_ROW_ID);
end;
【错误记录】ORA-20987- 意外错误, 在应用程序级别或页级别上未找到项名。
改写之后运行报错:
Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-20987: APEX - ERR-1002 在应用程序 "273" 中未找到项 "P3_ROW_ID" 的项 ID。 - 意外错误, 在应用程序级别或页级别上未找到项名。
解决方法:
破案了
p3的字段是P3_ID,不是P3_ROW_ID
改过来
还是有错,查了修改缺少返回值
P6test1修改行为操作未定义
修改按钮→行为 操作 由动态操作定义→执行验证
【错误记录】ORA-01008: 并非所有变量都已绑定
好像可以获取原值了,但是有新的错误
Ajax 调用为Execute Server-Side Code返回了服务器错误ORA-01008: 并非所有变量都已绑定。
解决方法:
输入项和返回项要和pl/sql代码上的数据一一对应
创建部门用户权限应用表
1.创建数据表
1.1部门表DEPT_TEST_WXX
1.2创建用户表USER_TEST_WXX
1.3创建DEPT_USER_TEST_WXX
中间表DEPT_USER_TEST_WXX
为中间表添加外键(至于删除时是级联还是设为空值看实际需要)
创建结果
2.创建交互式网格
2.1部门信息表P26(带表单p27) P30(单网格 表单p32)
2.2 用户信息表P28(带表单p29) P33(单网格 表单p3)
初始界面
3,相关操作
3.1设置部门名 标识→类型 链接→链接 目标32(部门表单)
和主菜单设置跳转链接
3.2 创建项(后续数据用得到,行选中、查看是否成功新增删除……)
动态操作,新建 行选中,执行JavaScript语句
var map = new Map();map.set('P30_DEPT_ID', 'DEPT_ID');
utils.set(this.data, map);console.log($v('P30_DEPT_ID'));
提示为完成无法保存
原来是这里没选择
3.3 还有依次设置部门对应表单修改动态操作
3.3.1执行JavaScript代码(验证必填项都填了)
3.3.2执行服务器端代码
declarev_row_count number(10) := 0;beginupdate 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;
没有的项需要手动创建
【错误记录】提示ORA_01008:并非所有变量都已绑定
原因及解决方法:
创建时间和更新时间是隐藏项
3.3.3执行JavaScript代码(返回修改成功/失败提示)
if ($v('P32_ROW_COUNT') > 0) {alert('修改成功');return true;
} else {alert('修改失败');return false;
}
3.3.4关闭对话框
部门表单新增同理
服务器端代码
declarev_row_count number(10) := 0;
beginINSERT 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传入
△修改要先选中内容,所以涉及一个判断,判断选中的id不为空,判断一次只能选中一个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;}
}
删除请求后台
DECLAREV_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;
}
刷新
受影响的元素→ 类型 区域 →区域 部门信息表
往里面添加数据受阻
原来是处理没有添加,添加处理(点击新增转到表单页)
【错误记录】ORA-01400: 无法将 NULL 插入
点击新增,报错
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为了解决
ORA-01400: 无法将 NULL 插入
这个问题很多时候是没有为该表建立触发器导致的,或者是序列没建立。于是建了个触发器,
-- 建立触发器
CREATE OR REPLACE TRIGGER "TEST_TRI" BEFOREINSERT ON DEPT_TEST_WXXFOR EACH ROW
BEGINSELECT test_seq.NEXTVAL INTO :NEW.ID FROM DUAL;
END;
结果新的问题出现了
ORA-04098: 触发器
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
【问题记录】选中修改后不会自动刷新返回用户界面,需要手动关闭
【问题记录】每次关闭表单后回到首页而网格不是对应交互式网格
解决方法:
表单关闭后跳转的页码,这里对应其交互式网格
【错误记录】会话状态保护违规: 这可能是因为手动变更了受保护的页项 P37_ROW_COUNT。如果您不确定导致此错误的原因, 请与应用程序管理员联系, 以获取帮助。
满头问号???
部门信息表
将部门 源 类型从“表/视图”改成“SQL查询”
自动生成
select DEPT_ID,NAME,DESCRIBE,CREATE_DATE,UPDATE_DATEfrom DEPT_TEST_WXX2
选中部门要进行修改,跳转到警告页面
ORA-01403: 未找到任何数据
与您的应用程序管理员联系。 通过调试 ID "2128080" 提供有关此意外事件的详细信息。
技术信息(仅提供给开发人员使用)
- is_internal_error: false
- ora_sqlcode: 100
- ora_sqlerrm: ORA-01403: 未找到任何数据 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
- component.type: APEX_APPLICATION_PAGE_PROCESS
- component.id: 201420217511504299
- component.name: 初始化表单 部门信息表_表单
- association_type: REGION
- region_id: 201414172851504304
- error_backtrace:
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
报错
将P37设置的 处理→目标类型→PL/SQL Code改为Region Source
begincase :APEX$ROW_STATUSwhen 'C' theninsert into DEPT_TEST_WXX2 ( name,describe,create_date,update_date )values ( :NAME, :DESCRIBE, sysdate, sysdate )returning dept_id into :P37_DEPT_ID;when 'U' thenupdate DEPT_TEST_WXX2set name = :NAME,describe = :DESCRIBE,create_date = sysdate, update_date = sysdate where dept_id = :P37_DEPT_ID;when 'D' thendelete DEPT_TEST_WXX2where 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 ATULEFT JOIN DEPT_USER_TEST_WXX ATDU ON ATU.USER_ID = ATDU.USER_IDLEFT 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