`

学习Oracle Form的一点笔记

阅读更多

培养计划中还要掌握Form的开发,本以为就是Report稍微变更了一下,或者VB关联上数据库,但是实际却不是那么回事,很是不习惯。今天陆陆续续看了一些资料,零零碎碎的记了一些笔记,还是心中没底。

1、将相关项目组织成为功能单位。无物理表示方式,两种类型——数据块(与表或者视图相关)控制块。

2、在数据块中新建Item,默认与数据库相关,可以在属性数据库设置中可以设定不相关,同时可以在一般属性中设定这个Item的类型,是文本还是按钮等。在物理属性中设定这个Item属于哪个Canvas。

3、复制对象的时候会询问是拷贝还是创建子类。

4、拷贝属性——可以将一个属性值拷贝复制到另一个属性。
Properties -〉Copy Properties

5、使用Shift+双击可以打开第二个对象的属性面板,从而可以进行两个对象的比较。以此类推,N个都行。

6、可以在运行的时候设置对象的属性。以窗口对象为例,有Set_Window_Property('my_window',VISIBLE,PROPERTY_ON)在运行时设置窗口显示。同样有很多其他的一些内建过程、SET_BLOCK_PROPERTY、SET_CANVAS_PROPERTY、SET_FORM_PROPERTY、SET_ITEM_PROPERTY、SET_LOV_PROPERTY、SET_MENU_ITEM_PROPERTY、SET_PARAMETER_ATTR、SET_RADIO_BUTTON_PROPERTY、SET_RECORD_PROPERTY、SET_RELATION_PROPERTY、SET_VIEW_PROPERTY、SET_WINDOW_PROPERTY。其中,Set_Item_Property可以设置按钮、文本等任何类型的项目。

7、四种类型模块
有五种创建数据模块的方法,表、引用游标的过程、使用记录表的过程、事务触发器、FROM因子。可以通过Data Module Wizard修改这些设置。

8、至于具体数据项的对应通过属性“数据库”和“高级数据库”来设置。

1、基于过程的块
在包头中说明的过程,在包体中一定要定义,定义必须连参数的名称也必须一至。
在使用过程(procedure)建立数据块的时候,在包中分别建立查询、插入、更新、删除、锁定5个过程。用来操作数据。其中,查询的IN OUT的参数为REF CURSOR类型,而对表单记录的DML和加锁语句,IN OUT的参数为TABLE类型。

例子:
下面就是一个包中对记录进行查询和插入。
包头:
create or replace package test_emp_maint is
  -- Public type declarations
  TYPE emp_t IS RECORD(
       id test02.id%TYPE,
       name test02.name%TYPE,
       sex test02.sex%TYPE,
       age test02.age%TYPE,
       manager_id test02.manager_id%TYPE);

  --游标类型,用于查询参数    
  TYPE rc_emp IS REF CURSOR
       RETURN emp_t;
      
  --表类型,用于DML以及加锁
  TYPE t_emp IS TABLE OF
       emp_t
       INDEX BY BINARY_INTEGER;
      
  PROCEDURE slct(
           p_empqry IN OUT rc_emp);
          
  PROCEDURE ins(
           p_emprec IN OUT t_emp);           

end test_emp_maint;   
包体:
create or replace package body test_emp_maint is
   
  -- SELECT DATA
  PROCEDURE slct(
           p_empqry IN OUT rc_emp)
  IS
  BEGIN
    OPEN p_empqry
    FOR
        SELECT * from test02;
  END;
 
  -- INSERT DATA
 PROCEDURE ins(
           p_emprec IN OUT t_emp)   
  IS
    --v_message VARCHAR(100);
  BEGIN
    --v_message := 'INSERT INTO TABLES TEST02 RECORDS';
    For v_ct IN 1 .. p_emprec.count
    LOOP
   
    INSERT INTO test02(
           id,
           name,
           sex,
           age,
           manager_id)
    VALUES (
       p_emprec( v_ct ).id,
       p_emprec( v_ct ).name,
       p_emprec( v_ct ).sex,
       p_emprec( v_ct ).age,
       p_emprec( v_ct ).manager_id                                  
    );              
    END LOOP;       

  END;

END test_emp_maint;

2、当在数据块中设定插入、更新的相关属性之后,FORM BUILDER会自动创建INSERT-PROCEDURE/UPDATE-PROCEDURE/DELETE-PROCEDURE等过程。
NOTES:在填入参数类型的时候,一定要将参数类型写完整,将包的名字写上。例如上述插入参数的类型应该为test_emp_maint.t_emp,而不是t_emp。

3、数据库服务器和表单:
在何处放置代码:数据库服务器还是表单
面向表单的代码放置在表单一侧,因为服务器不能解释类似于SET_BLOCK_PROPERTY这样的代码。数据库对象的代码则在表单和服务器上都可以存放。

4、其它数据库代码源:
1、数据库触发器
2、基于视图的块
3、基于过程的块

5、程序库的三种级别:
通用程序库(可分为对数据库操作和不对数据库操作)、应用程序专用的程序库(应用程序调用的数据程序包的代码)、表单专用程序库

6、放置代码的通用准则:
尽可能多的使用存储在数据库服务器中的代码实现对数据的访问和操作。Forms不应该使用PL/SQL代码打开游标或者执行缺省查询,以及DML机制外的查询。
写的代码尽量通用。如果创建表单用的专用的实用程序是可重用的,则将其放置于程序库中。
使用Package来使代码模块化。
如有可能在Form的最高级编写触发器代码。(有三个等级Form->Block->Item)

7、全局变量在session的生命周期内存在。
赋值:GLOBAL.my_var := TO_CHAR(:order.total * .85);
使用:calculate_discount(TO_NUMBER(:GLOBAL.my_var));
Destory:Erase('GLOBAL.my_var');

8、调用内置程序:
Go_Item('customer.cust_id');
Focus到customer块的cust_id项。

9、使用函数:
注意函数的返回类型。
:control.item_A := Message_Text;
Go_Item(Get_Block_Property('customer',LAST_ITEM));
IF Show_LOV('customer_list') THEN  
Message('Good Selection.');
ELSE
Message('No Customer was Selected.');
END IF;

10、传递参数给子程序:
Resize_Window (window_name, width, height);
Resize_Window('my_window',50,35);

11、使用常量:
Exit_Form(DO_COMMIT,NO_ROLLBACK);

12、使用默认的参数值:
Open_Form('order_entry');
Open_Form('order_entry',ACTIVATE,NO_SESSION);

13、通过名字引用Form Builder中的对象:
Resize_Window('status_window',50,35);
'block_name.item_name'
'record_group_name.column_name'
'blockname.columnname_itemname'

14、引用Form Builder中项目的值:
:ord.total := price * .85;

15、通过内部ID引用Form Builder中的对象:
DECLARE
id_var WINDOW;
  BEGIN
  id_var := Find_Window('my_window');
END;
使用内部ID的理由:
提高性能,易于维护

16、系统变量:基于表单级,例如SYSTEM.BLOCK_STATUS

17、调用用户命名的触发器:
只能在内建触发器/菜单命令/用户命名的子程序调用。用户命名的触发器只能在特定位置存在,大多数情况是用户编写子程序,然后在触发器或者菜单命令中调用。

18、触发器有如下类目:
Block processing triggers
Interface event triggers
Master-Detail  triggers
Message-handling triggers
Navigational  triggers
Query-time triggers
Transactional triggers
Validation triggers
Other  triggers

19、使用外部连接可以将表连接在自己身上。
在某些情况下,使得字段信息成为统一记录的一部分,按照这种方式建立视图,可以大大减少网络流量。

1. 子程序的作用范围
   1.1在表单模块中的用户定义的子程序只能从触发器或者同模块中的其他子程序调用。
   1.2在菜单模块中定义的子程序只能在菜单命令中调用。
   1.3在库模块中的子程序能够别任何触发器或者菜单命令调用,如果这个类图attached表单或者菜单模块。

2. 定义参数
   数据类型,函数的参数为VARCHAR2, DATE, NUMBER, or BOOLEAN 或者Form Builder对象类型。过程的参数类型为有效的PL/SQL类型。
   参数模式:IN/OUT/IN OUT,注意参数是否可写。在使用OUT/IN OUT时,参数总是被赋值,即使在程序中没有显示赋值。
   使用参数的默认值,例如:PROCEDURE calculate_discount(multiplier IN NUMBER :=15);

3. 关于类库
   类库支持动态载入,一个modul可以有多个类库,一个类库可以应用到多个modul。
   全局类库,打开的forms都可以共享。
   只能在原来建立类库的地方修改,不能在引用类库的地方编辑修改。在当前表单中建立类库并不能立刻应用,还是需要先保存,然后引入当前尽表单。两者在对象浏览器中的节点位置不同。

4. 在库程序单元访问forms绑定变量
   库程序独立于菜单、forms绑定变量(the values of form items, system and global variables, and parameters ),所以不能直接引用。
   程序单元中不能引用如下对象:
   :block_name.item_name
   :GLOBAL.variable_name
   :SYSTEM.variable_name
   :PARAMETER.my_param
   而只能非直接引用:
   Name_In('block_name.item_name')
   Name_In('GLOBAL.variable_name')
   Name_In('SYSTEM.variable_name') 
   非直接设定值
   Copy('28876', 'block_name.item_name'); 
   Copy('standard', 'GLOBAL.variable_name'); 
   Copy('FALSE', 'System.Supress_Working'); 

5. 数据库触发器
   可以在数据库对象中创建存储过程。
   可以在数据库对象中创建触发器。
   数据库触发器是与一张表关联PL/SQL块,在对表进行插入、更新、删除的时候激发。可以在对每行进行操作产生效果之前或者之后激发,所以组合起来共有12中可能。触发器通常运行在创建者的安全域中,而不是当前用户。例如:
CREATE OR REPLACE TRIGGER update_on_weekends_check
  BEFORE UPDATE OF sal ON EMP
  FOR EACH ROW
DECLARE
  my_count number(4);
BEGIN
  SELECT COUNT(u_name) FROM WEEKEND_UPDATE_OK INTO my_count
    WHERE u_name = user_name;
  IF my_count=0 THEN
    RAISE_APPLICATION_ERROR(20508, 'Update not allowed');
  END IF;
END;
使用RAISE_APPLICATION_ERROR提示错误,错误代码参数在20000-20999 之间。
删除记录,触发一下事件序列。
5.1 Form Builder locks the record to be deleted.
5.2 Operator presses [Commit].
5.3 Form Builder fires the PRE-COMMIT trigger.
5.4 Form Builder fires the PRE-DELETE trigger.
5.5 Form Builder issues a DELETE statement to delete the row.
5.6 The database fires the BEFORE DELETE trigger.
5.7 The database fires the BEFORE DELETE FOR EACH ROW trigger.
5.8 The database deletes the record.
5.9 The database fires the AFTER DELETE FOR EACH ROW trigger.
5.10 The Database AFTER DELETE trigger fires.
5.11 Form Builder fires the POST-DELETE trigger.
5.12 Form Builder fires the POST-COMMIT trigger.

6. 关于记录组
   类似于数据库的表的Form builder的内部结构。有三种类型:
   Query record group 在设计或者运行时创建或者修改。关联一个Select语句。
   Non-query record group 运行时,不关联Select语句。
   Static record group 设计时输入。
   有三种值来源:
   Select语句(Query record group)
   内部子程序填充的数据(query groups and non-query groups)
   设计时输入的数据 (static record groups)
   记录组有如下的内置函数:
Creating and deleting groups:
CREATE_GROUP (function)
CREATE_GROUP_FROM_QUERY (function)
DELETE_GROUP (procedure)
Modifying a group's structure:
ADD_GROUP_COLUMN (function)
ADD_GROUP_ROW (procedure)
DELETE_GROUP_ROW (procedure)
Populating groups:
POPULATE_GROUP (function)
POPULATE_GROUP_WITH_QUERY (function)
SET_GROUP_CHAR_CELL (procedure)
SET_GROUP_DATE_CELL (procedure)
SET_GROUP_NUMBER_CELL (procedure)
Getting cell values:
GET_GROUP_CHAR_CELL (function)
GET_GROUP_DATE_CELL (function)
GET_GROUP_NUMBER_CELL (function)
Processing rows:
GET_GROUP_ROW_COUNT (function)
GET_GROUP_SELECTION_COUNT (function)
GET_GROUP_SELECTION (function)
RESET_GROUP_SELECTION (procedure)
SET_GROUP_SELECTION (procedure)
UNSET_GROUP_SELECTION (procedure)
Object ID functions:
FIND_GROUP (function)
FIND_COLUMN (function)


一个使用组记录的例子:
FUNCTION Is_Value_In_List( the_value     VARCHAR2,
               the_rg_name   VARCHAR2,
               the_rg_column VARCHAR2)
RETURN NUMBER IS
  the_Rowcount   NUMBER;
  rg_id          RecordGroup;
  gc_id          GroupColumn;
  col_val        VARCHAR2(80);
  Exit_Function  Exception;
BEGIN

  rg_id := Find_Group( the_rg_name );
 
  IF Id_Null(rg_id) THEN
    Message('Record Group '||the_rg_name||' does not exist.');
    RAISE Exit_Function;
  END IF;

  gc_id := Find_Column( the_rg_name||'.'||the_rg_column );
 
  IF Id_Null(gc_id) THEN
    Message('Column '||the_rg_column||' does not exist.');
    RAISE Exit_Function;
  END IF;

  the_Rowcount := Get_Group_Row_Count( rg_id );
 
  FOR j IN 1..the_Rowcount LOOP
    col_val := GET_GROUP_CHAR_CELL( gc_id, j );

    IF UPPER(col_val) = UPPER(the_value) THEN
      RETURN j;
    END IF;
  END LOOP;

  RAISE Exit_Function;
EXCEPTION
  WHEN Exit_Function THEN
    RETURN 0;
END;


7. LOVs
   每个LOV都与特定的记录组关联。LOV是允许操作者察看、滚动和选择存储在记录组中的数据值的界面。   
   有LOV的地方一定要有记录组。
   运行时可以对记录组进行的操作,可以进行:
   modify its structure by adding columns and rows
   populate the group
   modify the query associated with a query group
   add and delete rows
   set and get column values
   mark and unmark rows as "selected"
   创建好query record,通过POPULATE_GROUP填充数据或者如果与LOV关联,LOV显示时也会填充数据。
   创建LOV值列表,基于记录组。可以在LOV属性面板中修改Select状态,移除显示隐藏列,创建列标题,指定LOV返回的ITEM。
   可以通过Select语句指定LOV返回的ITEM。例如:
   SELECT id, name, contact, phone INTO :cust.id, :cust.name :cust.contact, :cust.phone FROM   CUSTOMER; 
   可以设定LOV的属性,是否自动显示,是否验证。如果验证,输入正确值,LOV不显示。
   可以在设计时将ITEM的LOV设置,也可以通过程序来设置,例如:
   Set_Item_Property('emp.empno',LOV_NAME,'lov2');
   IF Get_Item_Property('emp.empno',LIST) = 'lov1' THEN      
   Set_Item_Property('emp.empno',LIST,'lov2');
   END IF;

   也可以通过程序显示LOV。
   LIST_VALUES:如果当前ITEM为文本类型,并且已经有一个LOV关联这个ITEM。
   通常在When-New-Item-Instance或者Key-LISTVAL中使用。
   SHOW_LOV:并不要求ITEM为文本类型。返回BOOLEAN值。例如:dummy := Show_LOV('my_lov',15,10);

   在运行时设置LOV的属性:
   GET_LOV_PROPERTY
   SET_LOV_PROPERTY

8. Form参数提供一种为Form初始化定义和设定输入参数值
   参数类型为CHAR, NUMBER, DATE。可以在执行内建CALL_FORM, NEW_FORM, OPEN_FORM,  RUN_PRODUCT 方法时调用。参数通过Parameter Lists来传递,有两种类型Text Parameters和Data Parameters。后者通常为记录组传递给RUN_PRODUCT内置子程序。

 

9. 定义编辑器
   默认、系统、用户三种编辑器。
   默认就是普通的TEXT项目。
   系统编辑器,使用系统的编辑器,通过设置系统的环境变量FORMS60_EDITOR =C:\WINNT\NOTEPAD.EXE
   用户定义的编辑器:在默认编辑器基础上进行一些属性设置。
   通过菜单“编辑-〉编辑”察看。
   或者通过命令:
   Go_Item('cust.comments');
   Edit_TextItem; 或者
   SHOW_EDITOR(editor_name, message_in, x, y, message_out, result);

10.菜单
   三种菜单,form menus,menu toolbars,popup menus。
   使用默认的菜单,这是Form Builder中内置的组件。在具体的菜单项的属性中,可以指定这个菜单是否出现在工具栏中。主要通过修改menudef.mmb菜单模块。对于一个form而言,在其属性“Menu Module”中设定菜单模块文件的名称就可以。

11.使用弹出菜单
  可以在很多控件上弹出菜单——canvas,以及除了check/radio/iconic/OLE之外的控件上都可以弹出。只需要在控件属性中设定建立好的弹出菜单,然后当在控件上点击右键的时候,便可以弹出菜单。实现这种机制。

12.定义对象视觉属性
   定义好视觉属性,在对象的属性中选择设定,可以统一风格。

13.排列对象
   对于画布上的对象可以通过Arrary(排列)下的命令来控制大小,对齐,成组,排序等功能。

1. 对象组
   将数据块加入对象组,数据中的项、触发器、关系等不在对象组中显示。
   只有顶级对象才能包含在对象组中。所以不能将items, item-level triggers, block-level triggers, relations不能包含在对象组中。
   一个组中的对象必须在同一个模块中定义。
   对象组不能包含其他对象组。
   组中的对象别删除时,组也被删除。
   删除组时,同时删除其中的对象。
   对象组中并不拷贝对象,而只是保留指向对象的指针(子类化的组除外)。
2. 对象库
   将对象拖入对象库,则创建了一个新版本的对象。
   将这个对象设置为SmartClass,这样新建一个对象时,右键点击这个对象,刚才建立的SmartClass会出现在菜单中,选择应用。
3. 属性类
   可以在form和menu中定义。
   如果一个对象基于属性类,如果对象的属性在属性类中存在,可以继承,否则忽略。
   当删除属性的时候,从属性类继承的属性设置为默认值。
   属性类只能从其它属性类继承。
   属性类与视觉属性类似,但是也有不同,例如:视觉属性只能定义视觉效果的属性,可以在运行时更改视觉属性,视觉属性如果与属性类的属性冲突的话,视觉属性优先。
4.设定List控件
   当时用List控件与记录组关联的时候,记录组必须只能是两列,一列是名称,一列是值。例如:
   SELECT name,TO_CHAR(id) id FROM test02
5.利用AUTO_HINT属性保存状态
   可以使用AUTO_HINT等属性保存与Item相关的信息。
   例如:将BOOLEAN保存在其中。
   Get_Item_Property('BTN_SAVE',AUTO_HINT);
   Set_Item_Property('BTN_SAVE',AUTO_HINT,PROPERTY_TRUE);
分享到:
评论

相关推荐

    FORM个性化学习笔记.doc

    FORM个性化学习笔记是基于Oracle E-Business Suite(EBS)的个性化学习笔记,旨在帮助学习者更好地理解和掌握FORM个性化的基本操作和高级应用。下面是该笔记的详细知识点总结: 概述 FORM个性化学习笔记是EBS中的...

    Oracle9i备课笔记——吕海东

    Oracle9i备课笔记——吕海东 第1讲 Oracle9i简介 目的: 1. 了解数据库的发展,关系数据库的基本原理。 2. 了解目前市场上流行的数据库产品及特点 3. 了解Oracle数据库的发展 4. 掌握Oracle9i产品系列 5. 掌握Oracle...

    ORACLE EBS OAF开发笔记

    ORACLE EBS OAF开发笔记.适合从FORM转到OAF开发的同学们及JAVA转到EBS的同学们。

    J2EE框架_笔记_b

    2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记 4-Struts入门笔记 005_Struts+DAO登陆 6-Struts标签-BEAN标签笔记 7-Struts标签 -LOGIC标签笔记 8-Struts标签- HTML...

    J2EE框架_笔记_c

    2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记 4-Struts入门笔记 005_Struts+DAO登陆 6-Struts标签-BEAN标签笔记 7-Struts标签 -LOGIC标签笔记 8-Struts标签- HTML...

    Java/JavaEE 学习笔记

    Oracle学习笔记...............121 前言....................................121 第一章 Selecting Rows.....................124 第二章 Limiting Selected Rows.......127 第三章 Single Row Functions.............

    J2EE三大框架_笔记_a

    2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记 3-JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记 4-Struts入门笔记 005_Struts+DAO登陆 6-Struts标签-BEAN标签笔记 7-Struts标签 -LOGIC标签笔记 8-Struts标签- HTML...

    Oracle WEB ADI开发笔记(抽丝拨茧篇).pdf

    WEB ADI全称是WEB Application Development Integrator,原来是Oracle HRMS 模块提供的一个利用浏览器 来进行存取的,在服务器段运行的self-service应用程序。后来经过不断地发展,也可以用于其他模块的数据导入。现...

    javaEE框架笔记,识货人下

    10-Struts高级部分(2)(常用Action、验证框架、动态Form)笔记.pdf 11-留言管理程序_使用Struts + DAO完成笔记.pdf 12-Struts + DAO分页笔记.pdf 13-Hibernate入门(上)笔记.pdf 14-Hibernate入门(下)笔记.pdf ...

    J2EE学习笔记(J2ee初学者必备手册)

    Oracle学习笔记...............121 前言....121 第一章 Selecting Rows.....................124 第二章 Limiting Selected Rows.......127 第三章 Single Row Functions..........127 第四章 Displaying Data from ...

    2009达内SQL学习笔记

    export ORACLE_HOME=/oracledata/.../bin: 一、注意事项: 大小写不敏感,即不区分大小写。提倡关键字大写,便于阅读和调式。 “!”在SQL环境下执行Unix命令。 SQL语句是由简单的英语单词构成;这些英语单词...

    Java学习笔记-个人整理的

    {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

Global site tag (gtag.js) - Google Analytics