ITPub博客

首页 > 数据库 > Oracle > FORM!

FORM!

原创 Oracle 作者:YoungEric 时间:2007-10-12 10:22:02 0 删除 编辑
FORM![@more@]

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:WINNTNOTEPAD.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(排列)下的命令来控制大小,对齐,成组,排序等功能。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10484922/viewspace-976093/,如需转载,请注明出处,否则将追究法律责任。

上一篇: tree
下一篇: FORM2!
请登录后发表评论 登录
全部评论

注册时间:2007-12-18

  • 博文量
    79
  • 访问量
    211213