1 前言 对于新接触OracleDeveloper编程的同仁而言,当完成的系统交给用户时,经常性出现“没有保存需要修改”,“视图不可以更新”...之类的错误提示是非常尴尬的事。
系统交付用户使用后,用户一定会回馈一些BUG,然而让用户重现BUG又是一件非常艰难的工作。
面对这些问题,解决的途径仍与其它开发工具一样,就是错误处理的控制。在其它语言中,我们可以通过类似On Error Do xxx...之类的语句来实现,但是在FORMS中,错误控制却往往令新进同仁头疼不已,不知该在哪里屏蔽错误信息。
本文对Forms的错误处理进行简单论述和应用,并提供错误控制基本的程序包,以解决新进同仁对困惑;同时也抛砖引玉,希望各同仁可以不断充实本文涉及的程序包和错误字典,使之成为更加实用的共享代码。
2 技术要点 复杂的问题,仍是由最简单的方法来实现。
2.1 错误处理相关触发器
FORMS的错误,全部由On Error和On Message两个触发器来控制,比较麻烦的是这两个触发器有时会一起触发,有时又只触发一个。
最好的办法,就是将触发器的响应程序做得一个程序包,在两个触发器中都进行控制。
2.2 相关错误代码
在On Error触发器中,一般使用Error_Code,Error_Text,Error_Type系统变量,错误代号/错误名称/错误类型
在On Message触发器中,一般使用Message_Code,Message_Text,Message_Type系统变量
如果是Oracle后台错误,则通过DBMS_Error_Code和DBMS_Error_Text来获取相关信息
3 实现与功能 3.1 体系架构
3.1.1 创建字典表数据表和相关视图,存储在屏蔽的错误信息,此时程序的BUG信息仍可以<当然也可以不>显示于用户界面
3.1.2 创建错误日志数据表,存储用户使用过程中的每一个错误信息,该数据表可以为将来系统维护提供非常重要的支持
3.1.3 创建后台程序包,对错误进行处理。所谓“处理”,在实例中是将错误信息写入错误日志,并判断字典表确认该错误信息是否显示于用户界面
3.1.4 创建前台程序包,对错误进行处理。所谓“处理”,在实例中只是调用后台程序包而已。
所有相关文件及代码:点击此处下载armok0199700.rar
3.2 创建数据库运行环境
-- ============================================================
-- Table: 错误日志数据表
-- ============================================================
create table SYSTEM_ERRORLOG
(
SELKEY NUMBER(28) not null,
ISCONTROL CHAR(10) null ,
SELCODE NUMBER(28) null ,
SELTYPE VARCHAR2(100) null ,
SELTEXT VARCHAR2(200) null ,
SELMODULE VARCHAR2(100) null ,
SELBLOCK VARCHAR2(100) null ,
SELITEM VARCHAR2(100) null ,
ORACLECODE NUMBER(28) null ,
ORACLETEXT VARCHAR2(100) null ,
SQLTEXT VARCHAR2(500) null ,
SQLSTR VARCHAR2(500) null ,
SELLOG DATE null ,
SELUSR NUMBER(28) null ,
constraint PK_SYSTEM_ERRORLOG primary key (SELKEY)
)
/
-- ============================================================
-- Table: 字典表
-- ============================================================
create table SYSTEM_DICT
(
DICTKEY number(28) not null,
DICTCLASS nvarchar2(100) null ,
DICTPROP nvarchar2(100) null ,
DICTCODE nvarchar2(100) null ,
DICTNAME nvarchar2(100) null ,
UPCLASSKEY number(28) null ,
MEMO nvarchar2(1000) null ,
CRTUSR number(28) null ,
CRTLOG date null ,
AMDUSR number(28) null ,
AMDLOG date null ,
constraint PK_SYSTEM_DICT primary key (DICTKEY)
)
/
-- ============================================================
-- Table: 错误日志序列
-- ============================================================
--系统错误日志KEY,用于生成系统错误日志的主键
CREATE SEQUENCE SQ_System_SelKey INCREMENT BY 1 START WITH 1
MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 20 NOORDER
/
-- ============================================================
-- Table: 要屏蔽的错误信息
-- ============================================================
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112001,'ErrorMsg','AppDict','41051','不能在此创建记录',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112002,'ErrorMsg','AppDict','40200','域被保护防止更新',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112003,'ErrorMsg','AppDict','40602','不能在视图插入或更新数据',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112004,'ErrorMsg','AppDict','41050','不能更新此记录',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112005,'ErrorMsg','AppDict','40401','没修改需要保存',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112006,'ErrorMsg','AppDict','40350','没有查询到记录',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112007,'ErrorMsg','AppDict','40100','在第一条记录',Null,SysDate,1,SysDate,1);
Insert Into System_Dict
(DictKey,DictClass,DictProp,DictCode,DictName,UpClassKey,CrtLog,CrtUsr,AmdLog,AmdUsr)
Values
(112008,'ErrorMsg','AppDict','40352','已查询到最后一条记录',Null,SysDate,1,SysDate,1);
-- ============================================================
-- Table: 要屏蔽的错误信息清单视图
-- ============================================================
Create Or Replace View VW_System_JumpMsg_Qry AS
Select
--创建字典视图:要屏蔽的系统信息
DictKey
,DictClass
,DictProp
,DictCode
,DictName
From System_Dict
Where
Upper(DictClass)=Upper('ErrorMsg')
And Upper(DictProp)=Upper('AppDict')
Order By DictKey
/
-- ============================================================
-- Table:错误信息后台程序包
-- ============================================================
create or replace package PKG_System_Assert is
-- Author : RUBYXUE
-- Created : 2004-4-11 12:59:44
-- Purpose : 系统维护
--登记前台系统的错误
Function FN_SystemErrorLog
(P_SelCode Number
,P_SelType Varchar