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
|