2011年8月23日 星期二

FORM 簡易開發流程(轉)


製作登入、資料登錄畫面,按鈕觸發:       
      When-Button-Pressed   
        要實現下面幾個功能。        1。保存功能      輸入資料以後,按此按鈕保存到對應變數裏。   
        2。消除功能      消除所有輸入,恢復到原始狀態   
        3。輸出功能      將此表輸出到C:\aaa   
        4。翻頁功能      pageup   翻到上個畫面,pagedown下個畫面。   
        5。數據登入      順序排列,比如輸入   D,B,C,A   登陸時候按照A,B,C,D   排列   
        6。條件判斷      比如A項必須填寫,否則彈出錯誤對話方塊;如果填寫B項,但是資料庫裏面沒有B,也彈出對話方塊。   
        7。可能出現的錯誤、問題和bug  

   第一步   當然是建表了   
  example   :   --   create   table     
  drop   table   t_tname;   
  create   table   t_tname(xh     number(2),                  --   序號   
           xm      varchar2(10),                            --   姓名   
           csrq     date,                                       --   出生日期   
           bz       varchar2(100),                           --   備註   
          constraint   pk_t_tname   primary   key(xh));  

  下面以表格   t_tname   為例   
    
  第二步   就是實現功能了   
  打開form   builder   前期準備工作   
  首先要有一個畫布、視窗(假如將其名字名為cc_main,w_main)兩者必須對應,然後就是添加資料塊(就是選擇你建立的表格)佈局畫面,按照提示一步一步完成了,最後將你需要實現什麼功能添加功能按鈕,放在另外一個非資料庫塊   
    
  然後就是代碼編寫了。   
  1.WHEN-NEW-FORM-INSTANCE(進入FROM時執行)   所要做的就是初始化視窗和一些自己需要的查詢   
      1.1   將初始化視窗寫成一個過程   
    
  PROCEDURE   Prc_Init_Windows   IS   
    
  BEGIN   
      Set_Window_Property(Forms_Mdi_Window,TITLE,'WINDOW_NAME');             --設置多文檔視窗標題   
      Set_Window_Property(Forms_Mdi_Window,WINDOW_STATE,maximize);           --設置多文檔視窗最大化   
      Set_Window_Property('W_Main',WINDOW_STATE,maximize);                        --設置主視窗最大化   
      :System.Message_Level:='15';                                                             --設置資訊提示級別   
  END;   
  然後直接調用過程在WHEN-NEW-FORM-INSTANCE觸發器裏   
  --   code     
  Prc_Init_Windows;   
  GO_BLOCK('t_tname');   
  SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_false);   
  SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);   
  execute_query;     --   內置副程式執行查詢(查詢所有記錄)   
    
  2.添加   (所要做的就是保證序號不能為空,關鍵字)   
  兩種操作方法一種直接在介面上輸入,二種彈出另外一個視窗進行操作   
  就講第一種吧,定義一個form參數p_xh   (在物件導航器裏面定義)   
  declare   
      nXH NUMBER(2);   
  BEGIN   
    
      GO_BLOCK('t_tname');   
      SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_TRUE);   
      SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);   
      last_record;   
      create_record;   
      select   max(xh)   into   nXH   from   t_tname;   
      :parameter.p_xh   :=   nXH;   
      :t_tname.xh   :=   :parameter.p_xh;   
    
  END;   
    
  t_tname資料塊中添加WHEN-NEW-RECORD-INSTANCE觸發器   
      if   get_block_property('t_tname',insert_allowed)   =   'true'   then   
          if   :t_tname.xh   is   null   then   
              :parameter.p_xh   :=   :parameter.p_xh   +   1;   
              :t_tname.xh   :=   :parameter.p_xh;   
          end   if;   
      end   if;   
    
  3.修改   
      GO_BLOCK('t_tname');   
      IF   :t_tname.XH   IS   NOT   NULL   THEN   
          SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);   
          SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_TRUE);   
      END   IF;   
    
  4.刪除   
        
      GO_BLOCK('t_tname');   
      IF   :t_tname.XH   IS   NOT   NULL   THEN   
          SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_true);   
          delete_record;   
          commit;   
          SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_false);   
      END   IF;   
    
  5.保存   
      GO_BLOCK('t_tname');   
      COMMIT;   
      SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_FALSE);   
      SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);   
      SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_FALSE);   
    
  6.撤銷   
  DECLARE   
      P_WHERE       VARCHAR2(200);   
  BEGIN   
      GO_BLOCK('t_tname');         
      CLEAR_BLOCK(NO_COMMIT);   
      P_WHERE   :=   GET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE);   
      SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);   
      EXECUTE_QUERY;   
  END;   
    
  7.查詢   
    
  以姓名和出生日期為欄位進行查詢,從新添加一個視窗和畫布,一個查詢非資料塊(例如塊名為BLK_QUERY)   
    
  DECLPARE   
      P_WHERE       VARCAHR2(200)   :=   '1=1';   
  BEGIN   
      IF   :BLK_QUERY.XM   IS   NOT   NULL   THEN   
          P_WHERE   :=   P_WHERE||'   AND   XM   =   '||CHR(39)||:BLK_QUERY.XM||CHR(39);   
      END   IF;   
      IF   :BLK_QUERY.CSRY   IS   NOT   NULL   THEN   
          P_WHERE   :=   P_WHERE||'   AND   TO_CHAR(CSRY,''YYYYMMDD'')   =           '||CHR(39)||TO_CHAR(:BLK_QUERY.CSRY,'YYYYMMDD')||CHR(39);   
      END   IF;   
    
      GO_BLOCK('t_tname');   
      CLEAR_BLOCK(NO_VALIDATE);   
      SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);   
      EXECUTE_QUERY;   
  END;