+ -
当前位置:首页 → 问答吧 → Oracle Developer 6i 基础应用

Oracle Developer 6i 基础应用

时间:2010-08-28

来源:互联网

材料库存处理案例讲解:
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)及Triggerre-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<=p_qty Then
      Raise v_exp01;
    End If;
  End If;
  Update mtl_acc
     Set stock_qty=Nvl(stock_qty,0)+(v_type*v_op)*p_qty
        Where mtl_no=p_mtl_no;
  
                                                                       库存处理后台控制程序
建立入库明细表触发子:

CREATE OR REPLACE TRIGGER T_MTL_IN_DETAIL_ALL BEFORE  INSERT  OR DELETE
   OR UPDATE OF "MTL_NO", "QTY" ON "MTL_IN_DETAIL"
FOR EACH ROW Declare
  v_op          Varchar2(1);
  v_type        Varchar2(3):='IN';
Begin
  If Updating Or Deleting Then
    v_op:='D';
    MTL_STOCK_P1(v_type,v_op,:Old.mtl_no,:Old.qty);
  End If;
  If Inserting Or Updating Then
    v_op:='I';
    MTL_STOCK_P1(v_type,v_op,:New.mtl_no,:New.qty);
  End If;
End;
/
建立出库明细表触发子:

CREATE OR REPLACE TRIGGER T_MTL_OUT_DETAIL_ALL BEFORE  INSERT  OR DELETE
   OR UPDATE OF "MTL_NO", "QTY" ON "MTL_OUT_DETAIL"
FOR EACH ROW Declare
  v_op          Varchar2(1);
  v_type        Varchar2(3):='OUT';
Begin
  If Updating Or Deleting Then
    v_op:='D';
    MTL_STOCK_P1(v_type,v_op,:Old.mtl_no,:Old.qty);
  End If;
  If Inserting Or Updating Then
    v_op:='I';
    MTL_STOCK_P1(v_type,v_op,:New.mtl_no,:New.qty);
  End If;
End;  
验证库存处理结果
                                                建立入库明细表触发子:

CREATE OR REPLACE TRIGGER T_MTL_IN_DETAIL_ALL BEFORE  INSERT  OR DELETE
   OR UPDATE OF "MTL_NO", "QTY" ON "MTL_IN_DETAIL"
FOR EACH ROW Declare
  v_op          Varchar2(1);
  v_type        Varchar2(3):='IN';
Begin
  If Updating Or Deleting Then
    v_op:='D';
    MTL_STOCK_P1(v_type,v_op,:Old.mtl_no,:Old.qty);
  End If;
  If Inserting Or Updating Then
    v_op:='I';
    MTL_STOCK_P1(v_type,v_op,:New.mtl_no,:New.qty);
  End If;
End;
/
建立出库明细表触发子:

CREATE OR REPLACE TRIGGER T_MTL_OUT_DETAIL_ALL BEFORE  INSERT  OR DELETE
   OR UPDATE OF "MTL_NO", "QTY" ON "MTL_OUT_DETAIL"
FOR EACH ROW Declare
  v_op          Varchar2(1);
  v_type        Varchar2(3):='OUT';
Begin
  If Updating Or Deleting Then
    v_op:='D';
    MTL_STOCK_P1(v_type,v_op,:Old.mtl_no,:Old.qty);
  End If;
  If Inserting Or Updating Then
    v_op:='I';
    MTL_STOCK_P1(v_type,v_op,:New.mtl_no,:New.qty);
  End If;
End;  
验证库存处理结果
                                                 建立入库明细表触发子:

CREATE OR REPLACE TRIGGER T_MTL_IN_DETAIL_ALL BEFORE  INSERT  OR DELETE
   OR UPDATE OF "MTL_NO", "QTY" ON "MTL_IN_DETAIL"
FOR EACH ROW Declare
  v_op          Varchar2(1);
  v_type        Varchar2(3):='IN';
Begin
  If Updating Or Deleting Then
    v_op:='D';
    MTL_STOCK_P1(v_type,v_op,:Old.mtl_no,:Old.qty);
  End If;
  If Inserting Or Updating Then
    v_op:='I';
    MTL_STOCK_P1(v_type,v_op,:New.mtl_no,:New.qty);
  End If;
End;
/
建立出库明细表触发子:

CREATE OR REPLACE TRIGGER T_MTL_OUT_DETAIL_ALL BEFORE  INSERT  OR DELETE
   OR UPDATE OF "MTL_NO", "QTY" ON "MTL_OUT_DETAIL"
FOR EACH ROW Declare
  v_op          Varchar2(1);
  v_type        Varchar2(3):='OUT';
Begin
  If Updating Or Deleting Then
    v_op:='D';
    MTL_STOCK_P1(v_type,v_op,:Old.mtl_no,:Old.qty);
  End If;
  If Inserting Or Updating Then
    v_op:='I';
    MTL_STOCK_P1(v_type,v_op,:New.mtl_no,:New.qty);
  End If;
End;  
验证库存处理结果
                                                 库存处理后台控制程序
总结:
学习分析总结数据逻辑关系,编写通用处理程序;
学习使用表触发子   
                                                  Report 常用技巧
工具栏Data Model、Layout Model、Parameter Form、Live Previewer切换使用;
菜单栏Window下Object Navigator和各编辑页面之间的切换使用;
菜单栏Tools下Parameter Form Builder 使用
对象嵌套关系;
Layout Model
Select Parent Frame使用;
Confine Model使用;
Snap to Grid
Data Model
View/Tool Palette使用;
快捷创建Group;
Formula Column;
Summary Column;
System Parameters:
orientation:Landscape(横向)/Portrait(纵向)
Copies
User Parameters
直接新增或通过sql自动创建

作者: cyl_it168   发布时间: 2010-08-28

支持一下。没有用过这个工具。

作者: renxiao2003   发布时间: 2010-08-29