技术笔记-Forms的错误控制

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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

(

SELKEYNUMBER(28) not null,

ISCONTROL CHAR(10) null,

SELCODE NUMBER(28) null,

SELTYPE VARCHAR2(100)null,

SELTEXT VARCHAR2(200)null,

SELMODULE VARCHAR2(100)null,

SELBLOCKVARCHAR2(100)null,

SELITEM VARCHAR2(100)null,

ORACLECODENUMBER(28) null,

ORACLETEXTVARCHAR2(100)null,

SQLTEXT VARCHAR2(500)null,

SQLSTRVARCHAR2(500)null,

SELLOGDATE null,

SELUSRNUMBER(28) null,

constraint PK_SYSTEM_ERRORLOG primary key (SELKEY)

)

/

-- ============================================================

-- Table: 字典表

-- ============================================================

create table SYSTEM_DICT

(

DICTKEY number(28) not null,

DICTCLASS nvarchar2(100) null,

DICTPROPnvarchar2(100) null,

DICTCODEnvarchar2(100) null,

DICTNAMEnvarchar2(100) null,

UPCLASSKEYnumber(28) null,

MEMOnvarchar2(1000)null,

CRTUSRnumber(28) null,

CRTLOGdate null,

AMDUSRnumber(28) null,

AMDLOGdate 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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航