`

学习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的学习笔记DOC”显然包含了作者深入学习Oracle Form的详细记录,包括理论知识、实践技巧以及可能的截图示例,为初学者提供了宝贵的资源。 在Oracle Form中,开发者可以创建交互式的用户界面,这些界面...

    oracle学习笔记,oracle学习教材,oracle学习教程,oracle课件

    ### Oracle学习笔记与教程知识点详解 #### Oracle 9i概览与重要性 **Oracle 9i**,作为Oracle数据库发展史上的一个里程碑,不仅是一个简单的数据库服务器产品,更是一个全面的应用系统运行与开发平台。它标志着...

    Oracle erp个人学习笔记

    ### Oracle ERP个人学习笔记知识点详解 #### 一、系统配置:深入理解Forms6i与TNSNAMES.ORA 在Oracle ERP的学习与实践过程中,系统配置是基础且关键的环节,尤其是在部署和运行Oracle Forms 6i时。配置正确与否...

    FORM个性化学习笔记.doc

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

    Oracle EBS 开发笔记

    - **前言**:这部分主要介绍了作者王重东的学习心得和笔记整理的过程。 #### 三、EBS 入门指南 - **入门一周之口水贴**:介绍EBS的基础概念、术语和常见操作流程。 - **入门二周之口水贴**:深入讲解如何使用EBS...

    Oracle9i备课笔记——吕海东

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

    Oracle数据库培训笔记

    ### Oracle数据库培训笔记知识点概述 #### 一、数据库基础 - **版本简介**:Oracle数据库经历了从Oracle 7.3.4、8.0.6到8i、9i、10g、11g等多个版本的发展。其中,8i版本开始采用Java作为核心编程语言,实现了平台...

    extjs+韩顺平—玩转oracle视频教程笔记

    在"韩顺平—玩转oracle视频教程笔记"中,你将深入学习Oracle的使用技巧和管理方法,涵盖数据库设计、SQL查询、存储过程、触发器、索引优化等多个方面。教程可能还会涉及数据库备份与恢复、性能监控与调优,这些都是...

    Oracle-ERP开发笔记

    ### Oracle-ERP开发笔记知识点概览 #### 一、Oracle Forms基础 **1. 设置ITEM为必填项** - 在Oracle Forms中,可以为特定的ITEM(字段)设置必填属性,确保用户在提交表单之前必须填写这些字段。这通常通过属性...

    ORACLE SPATIAL 笔记(完整版)

    ### ORACLE SPATIAL 学习笔记知识点梳理 #### 一、SDO_GEOMETRY 数据类型详解 **SDO_GEOMETRY** 是 Oracle Spatial 提供的一种特殊的数据类型,用于存储空间数据,广泛应用于 GIS(地理信息系统)、CAD(计算机...

    ORACLE EBS OAF开发笔记

    对于那些从传统FORM环境转向OAF开发或从Java领域进入EBS领域的开发者来说,这份笔记提供了宝贵的入门指南。 #### 二、准备工作与环境配置 ##### 2.1 下载并安装JDeveloper - **下载**:访问Oracle官方网站或通过...

    软件工程师学习笔记大全(C++ JAVA)

    笔记可能包含Action、Form、Result、Interceptor、Tiles等组件的用法,以及Struts 2框架的配置和最佳实践。 这些笔记集合为学习者提供了一条系统性学习C++和JAVA的路径,通过阅读和实践,可以逐步提升软件工程师的...

    Oracle-ERP(NEW)笔记

    ### Oracle ERP(NEW)笔记概览与核心知识点 #### 一、Oracle EBS(Enterprise Business Suite)入门 Oracle EBS是Oracle公司推出的一款全面的企业管理软件解决方案,它整合了财务、供应链、制造、项目管理、客户服务...

    Oracle的初学者入门心得

    开发主要是编写存储过程、触发器等,还有就是使用Oracle的Develop工具做form。需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭;管理则需要对Oracle数据库的原理有深刻的认识,有全局操纵的能力和...

    ORACLE EBS R12弹性域笔记整理——说明性弹性域v1.0

    ### ORACLE EBS R12 弹性域笔记整理——说明性弹性域v1.0 #### 一、概述 在Oracle E-Business Suite (EBS) R12中,**弹性域**是一项核心功能,它允许用户在现有的业务结构之上增加自定义的字段信息,从而增强系统...

    oracle培训笔记

    根据提供的“oracle培训笔记”内容,我们可以从中提炼出与Oracle数据库及Web开发相关的多个关键知识点。下面将逐一展开这些知识点: ### Oracle基础知识 #### 1. 数据类型与表定义 在Oracle数据库中,数据类型的...

    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...

Global site tag (gtag.js) - Google Analytics