熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

技術筆記-Forms的錯誤控制

2013-11-13 15:57:08  來源: Oracle 

   前言  
  對於新接觸OracleDeveloper編程的同仁而言當完成的系統交給用戶時經常性出現沒有保存需要修改視圖不可以更新之類的錯誤提示是非常尴尬的事
  系統交付用戶使用後用戶一定會回饋一些BUG然而讓用戶重現BUG又是一件非常艱難的工作
  面對這些問題解決的途徑仍與其它開發工具一樣就是錯誤處理的控制在其它語言中我們可以通過類似On Error Do xxx之類的語句來實現但是在FORMS中錯誤控制卻往往令新進同仁頭疼不已不知該在哪裡屏蔽錯誤信息
  本文對Forms的錯誤處理進行簡單論述和應用並提供錯誤控制基本的程序包以解決新進同仁對困惑同時也拋磚引玉希望各同仁可以不斷充實本文涉及的程序包和錯誤字典使之成為更加實用的共享代碼
  
   技術要點 
  復雜的問題仍是由最簡單的方法來實現
   錯誤處理相關觸發器
  FORMS的錯誤全部由On Error和On Message兩個觸發器來控制比較麻煩的是這兩個觸發器有時會一起觸發有時又只觸發一個
  最好的辦法就是將觸發器的響應程序做得一個程序包在兩個觸發器中都進行控制
  
   相關錯誤代碼
  在On Error觸發器中一般使用Error_CodeError_TextError_Type系統變量錯誤代號/錯誤名稱/錯誤類型
  在On Message觸發器中一般使用Message_CodeMessage_TextMessage_Type系統變量
  如果是Oracle後台錯誤則通過DBMS_Error_Code和DBMS_Error_Text來獲取相關信息
  
   實現與功能
   體系架構
   創建字典表數據表和相關視圖存儲在屏蔽的錯誤信息此時程序的BUG信息仍可以<當然也可以不>顯示於用戶界面
   創建錯誤日志數據表存儲用戶使用過程中的每一個錯誤信息該數據表可以為將來系統維護提供非常重要的支持
   創建後台程序包對錯誤進行處理所謂處理在實例中是將錯誤信息寫入錯誤日志並判斷字典表確認該錯誤信息是否顯示於用戶界面
   創建前台程序包對錯誤進行處理所謂處理在實例中只是調用後台程序包而已
  
  所有相關文件及代碼點擊此處下載armokrar
  
   創建數據庫運行環境
   ============================================================
    Table: 錯誤日志數據表                   
   ============================================================
  create table SYSTEM_ERRORLOG
  (
    SELKEY     NUMBER()       not null
    ISCONTROL    CHAR()        null  
    SELCODE     NUMBER()       null  
    SELTYPE     VARCHAR()     null  
    SELTEXT     VARCHAR()     null  
    SELMODULE    VARCHAR()     null  
    SELBLOCK    VARCHAR()     null  
    SELITEM     VARCHAR()     null  
    ORACLECODE   NUMBER()       null  
    ORACLETEXT   VARCHAR()     null  
    SQLTEXT     VARCHAR()     null  
    SQLSTR     VARCHAR()     null  
    SELLOG     DATE          null  
    SELUSR     NUMBER()       null  
    constraint PK_SYSTEM_ERRORLOG primary key (SELKEY)
  )
  /
  
   ============================================================
    Table: 字典表                   
   ============================================================
  create table SYSTEM_DICT
  (
    DICTKEY     number()       not null
    DICTCLASS    nvarchar()     null  
    DICTPROP    nvarchar()     null  
    DICTCODE    nvarchar()     null  
    DICTNAME    nvarchar()     null  
    UPCLASSKEY   number()       null  
    MEMO      nvarchar()    null  
    CRTUSR     number()       null  
    CRTLOG     date          null  
    AMDUSR     number()       null  
    AMDLOG     date          null  
    constraint PK_SYSTEM_DICT primary key (DICTKEY)
  )
  /
  
   ============================================================
    Table: 錯誤日志序列                   
   ============================================================
  系統錯誤日志KEY用於生成系統錯誤日志的主鍵
  CREATE SEQUENCE SQ_System_SelKey INCREMENT BY START WITH
    MAXVALUE E MINVALUE NOCYCLE 
    CACHE NOORDER
  /
  
   ============================================================
    Table: 要屏蔽的錯誤信息                   
   ============================================================
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict不能在此創建記錄NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict域被保護防止更新NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict不能在視圖插入或更新數據NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict不能更新此記錄NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict沒修改需要保存NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict沒有查詢到記錄NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict在第一條記錄NullSysDateSysDate);
  
  Insert Into System_Dict 
  (DictKeyDictClassDictPropDictCodeDictNameUpClassKeyCrtLogCrtUsrAmdLogAmdUsr) 
    Values 
   (ErrorMsgAppDict已查詢到最後一條記錄NullSysDateSysDate);
  
   ============================================================
    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 : ::
    Purpose : 系統維護
   
    登記前台系統的錯誤
    Function FN_SystemErrorLog
     (P_SelCode Number
       P_SelType Varchar
From:http://tw.wingwit.com/Article/program/Oracle/201311/17570.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.