Oracle Developer 6i 基礎應用,含遍歷BLOCK

longwansheng發表於2011-03-01
轉自 下面是OMF021 分廠延貨單的CODE,在單頭審核時,自動給單身的單筆次數賦值. declare lc number; result number:=0; dc number:=-1; cursor cur is select line_id from gobo_yhd_lines where header_id=:gobo_yhd_headers_v.header_id; cursor cur0(p_org_id number,p_order_number number) is select max(yh_ver) yhnum from gobo_yhd_headers where org_id=p_org_id and order_number=p_order_number and open_flag='Y' and LAST_UPDATE_DATE0 then bell; set_alert_property('jj',ALERT_MESSAGE_TEXT,'OH,當前廠當前訂單號此延貨單前還有'||LC||'筆沒審核,請依順序逐筆審核.'); result:=show_alert('jj'); :gobo_yhd_headers_v.Open_flag:='N' ; RAISE Form_Trigger_Failure; end if; select count(*) into lc from gobo_yhd_headers where org_id=:gobo_yhd_headers_v.org_id and ou_id=:gobo_yhd_headers_v.ou_id and order_number=:gobo_yhd_headers_v.order_number and yhd_no=:gobo_yhd_headers_v.yhd_no and nvl(open_flag,'N')='N' ; if nvl(lc,0) = 0 then bell; set_alert_property('jj',ALERT_MESSAGE_TEXT,'此延貨單早前已審核過.'); result:=show_alert('jj'); :gobo_yhd_headers_v.Open_flag:='Y' ; RAISE Form_Trigger_Failure; end if; --BEGIN if :gobo_yhd_headers_v.open_flag='Y' then dc:=-1; for rec in cur loop begin dc:=0; select count(*) into dc from gobo_yhd_line_details d where d.line_id=rec.line_id and rownum<2 if then raise end for in loop end exception when others then raise end if dc="-1" dc="and" then raise end end loop for in loop end exit when end exception when others then>[@more@]以下是轉過來的全文. Oracle Developer 6i 基礎應用 材料庫存處理案例講解: 1.建表 2.Form/後臺過程 3.Report 1. 建表 材料名稱表 材料庫存賬目表 入庫頭表 入庫明細表 出庫頭表 出庫明細表 基本程式碼維護表 建表要素: (唯一鍵)唯一可檢索性,一個欄位或多個欄位組合; 歷史追溯性:建立建檔人、建檔日期等,供歷史追溯用; 合理運用主從表; 建Form 材料品名資訊維護Form 材料庫存賬目Form 入庫Form 出庫Form 基本程式碼維護Form 材料名稱Form製作 步驟: 用嚮導建立Data Block及Canvas、Windows; 介面處理知識點: 視窗標題顯示:修改Window名字; 系統選單及工具欄:MENU-MODULE:DEFAULT&SMARTBAR 視窗最大化:WHEN-NEW-FORM-INSTANCE: Set_Window_Property(FORMS_MDI_WINDOW, Window_State, Maximize); set_window_property('材料名稱資訊表',Window_State, Maximize); Data block與cavas的對應設定 當前記錄行加亮顏色設定:Current Record Visual Attribute Group 格式設定:Fomat Mask:Date(: yyyy-mm-dd) Number(fm999,999.00) 初始值設定:initial Value:日期 $$date$$ 不可修改鎖定:Enable/Update Allowed(False) 許可權限制查詢:Where Clause 禁止複製記錄:KEY-DUPREC 編譯:直接執行即生成或Ctl-T 小結:涉及內容含Data Block、Canvas、Windows、Trigers,及一些常用的Data Block和Items的屬性設定方法(Property Palette) 材料庫存賬目Form製作 步驟: 用嚮導建立Data Block及Canvas、Windows; 介面處理知識點: 依上一個Form做常用處理(含數字右對齊、格式等); 增加非基表專案(品名、規格、單位); 材料品名等資訊顯示: 用post-change實現顯示品名等項,舊版本存在弊端,管控時會導致查詢停止; 建立一個取品名的通用過程(program unit),對新增及查詢狀態做分開處理,用mtl_no的valid事件和block的post_change事件呼叫取品名過程; PROCEDURE get_mtl_name(p_status Varchar2,p_mtl_no Varchar2,p_mtl_name out Varchar2 ,p_mtl_spec out Varchar2,p_mtl_unit out Varchar2) IS Begin Select mtl_name,mtl_spec,mtl_unit Into p_mtl_name,p_mtl_spec,p_mtl_unit From mtl_name Where mtl_no=p_mtl_no; EXCEPTION When Others then p_mtl_name:=''; p_mtl_spec:=null; p_mtl_unit:=null; if p_status'QUERY' Then message('沒有該料號或取品名資料出錯,請核對'); Raise Form_Trigger_Failure; end if; END; 材料庫存賬目Form製作 Alert使用: 建立一個Alert,設定確定、取消按鈕,設定其Title; 在指定Data Block增加新增Trigger:Key-delrecProperties中設定各欄位與介面欄位的繫結關係; Set_Alert_Property('Alert_yn', alert_message_text,'確定刪除?'); If Show_Alert('alert_yn')=Alert_Button1 Then delete_record; End if; 彈出選擇框製作及引用 新增Record Groups Select mtl_no,mtl_name,mtl_spec,mtl_unit from mtl_nameorder by mtl_no 新增Lovs,將其Record Groups屬性設定成上述Record Group;並在Column Maping Properties中設定各欄位與介面欄位的繫結關係; 在對應item增加Trigger:When-mouse-doubleclick: DECLARE b_value BOOLEAN; BEGIN b_value := Show_Lov('lov_mtl'); If Not b_value Then Message('沒有選中值'); End If; END; 下拉框製作 新增Record Groups Select mtl_no,mtl_name,mtl_spec,mtl_unit from mtl_nameorder by mtl_no 增加Trigger:When-New-Form-Instance: Declare v_group Pls_integer; Begin v_group:=Populate_group('RECORD_TYPE'); Populate_list('MTL_ACC.MTL_TYPE','RECORD_TYPE'); End; 材料庫存賬目Form製作 彙總欄位: Data Block的Query All Records必須設定的Query All Records必須設定成Yes; 顏色可例外設定,不繼承當前記錄顏色; 遍歷Data Block匯出文字: 新增非資料塊Data Block,新增資料匯出按鈕; 新增Trigger:When-Botton-Pressed; Declare file_name Varchar2(40):='C:mtl.txt'; out_file Text_io.file_type; Begin --Work_p; out_file:=text_io.fopen(file_name,'W'); Text_io.put(out_file,'料號'||Chr(9)||'品名'||Chr(9)||'規格'||Chr(9)||'單位'||Chr(9)||'庫存'||Chr(10)); GO_BLOCK('MTL_ACC'); FIRST_RECORD; LOOP Text_io.put(out_file,:mtl_acc.mtl_no||Chr(9)); ….. Text_io.put(out_file,:mtl_acc.stock_qty||Chr(10)); Exit when :System.Last_Record='TRUE'; next_record; END LOOP; Text_io.fclose(out_file); Message('成功匯出,檔案目錄:'||file_name); :system.message_level:=0; Exception When others then Text_io.fclose(out_file); Message('出錯,請檢查檔案'||file_name||'是否處於開啟狀態,如果開啟了請先關閉後再試.'); End; 材料庫存賬目Form製作 Form引數Parameters: 引用基礎程式碼維護Form,設定Form引數,增加Fomr Parameters:p_group_desc 設定指定Data Block的查詢條件以便觀察Parameters傳遞情況 group_desc=Nvl(:parameter. p_group_desc,group_desc) 結合group_desc的Initial Value(:p_group_desc)及Trigger:Pre-Form設定當p_group_desc非空時鎖定許可權設定,為空時:不鎖定隨意設定(授權管理人員) If :parameter.p_group_desc Is Null Then Set_Item_Property('mtl_code_info.group_desc',Enabled,Property_True); Else Set_Item_Property('mtl_code_info.group_desc',Enabled,Property_False); End If; 在材料庫存賬目視窗加一個按鈕,When-Botton-Pressed (順便介紹regedit/path) Declare p paramlist; BEGIN p := CREATE_PARAMETER_LIST('P'); ADD_PARAMETER(p,' p_group_desc ',TEXT_PARAMETER,'料號大類'); CALL_FORM('f_code',HIDE,DO_REPLACE,NO_QUERY_ONLY,p); DESTROY_PARAMETER_LIST('P'); END; Botton圖示設定 Iconic:yes Icon Filename:icon檔名 Tooltip:提示資訊 引用icon相簿路徑設定:regedit/oracle/ui_icon 總結:學習使用讀取外圍表資訊作為非基表顯示項;學習彙總欄位應用、學習提示確認資訊框、選擇輸入窗、下拉框、Form引數、圖示按鈕等使用,涉及Alert,lovs,Record Group等,同時介紹遍歷資料塊匯出文字檔案等常用功能語法. 材料入庫Form製作 步驟: 用嚮導建立主入庫從表; 刪除關聯關係及相關triggers,改塊名為head/detail,介紹手動建relation的方法,注意Prevent Masterless Operations 的使用; 改head.slip_type為下拉框,依前面介紹改window名、視窗最大化、日期/數值格式,初始值、當前記錄另色顯示等; 顯示品名和規格等和材料庫存表類似,故做一個後臺通用取品名過程,不需要每個Form定義 CREATE OR REPLACE PROCEDURE get_mtl_name( p_status Varchar2, p_mtl_no Varchar2, p_mtl_name out Varchar2, p_mtl_spec out Varchar2, p_mtl_unit out Varchar2, p_msg out Varchar2) IS Begin Select mtl_name,mtl_spec,mtl_unit Into p_mtl_name,p_mtl_spec,p_mtl_unit From mtl_name Where mtl_no=p_mtl_no; EXCEPTION When Others then p_mtl_name:=null; p_mtl_spec:=null; p_mtl_unit:=null; If p_status'QUERY' Then p_msg:='沒有該料號或取品名資料出錯,請核對'; End If; END; / 總結:學習應用主從表關聯關係;學習建立/呼叫後臺過程函式。 材料出庫Form製作 步驟: 複製入庫Form作為模板; 更改window名,更改資料塊與後臺表關聯,更改入庫型別等描述字眼為出庫,更改入庫型別Record Group為出庫型別等即完成出庫Form製作; 總結:學習複製方式製作Form. 庫存處理後臺控制程式 CREATE OR REPLACE PROCEDURE MTL_STOCK_P1 ( p_slip_type Varchar2,   --單據型別(IN/OUT) p_op Varchar2, --操作型別(Insert/Delete) p_mtl_no Varchar2, p_qty Number) Is v_type Number; v_op Number; v_qty Number; v_exp01 Exception; Begin If Nvl(p_qty,0)=0 Then Return; End If; If p_slip_type='IN' Then --IN (入庫) OUT (出庫) v_type:=1; Else v_type:=-1; End If; If p_op='I' Then --I (Insert) D (Delete) v_op:=1; Else v_op:=-1; End If; If v_type*v_op=-1 Then --扣庫存,先檢查庫存量是否夠 Select Nvl(Sum(stock_qty),0) Into v_qty From mtl_acc Where mtl_no=p_mtl_no; If v_qty

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/92289/viewspace-1046673/,如需轉載,請註明出處,否則將追究法律責任。

相關文章