ORACLE 数据库开发经验总结[2]
添加时间: 2008-4-21 21:36:55 作者: Oracle指导 阅读次数:15 来源: http://www.d9soft.com
---- 二 .ORACLE DEVELOPER 2000 使用技巧:
---- ① 改变 FORM(FMX 模块 ) 运行时的 Runform4.5 的题头 :
---- DEVELOPER2000 中 FMX 默认题头为: Developer/2000 Forms Runtime for Windows 95 / NT 你可以改为自己定义的标题 ,
---- 1. 在 Form 级触发器中添加触发 WHEN-NEW-FORM-INSTANCE
---- 2. 在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT
SYSTEM 欢迎使用 ');
---- ② 如何隐藏菜单中的 window 选项 :
---- 在创建自己的菜单时,最后选项总有 window 项,下面介绍如何去掉它 ,
---- 1. 创建一个 Menu
---- 2. 在 Menu 中建立一个 Item, 命名为 WINDOW 。
---- 3. 设置该 Item 属性如下 :
----
Menu Item Type:Magic
Command Type:Null
Magic Item:Window
Lable: 为空
---- ③ 怎样创建动态下拉列表 List
---- Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的,但那只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手去编个小程序。下面详细介绍怎样去做 :
---- 有块 EBOP_CABLE_ACCOUNT ,下有 SPECIFICATION 数据项,当一进入该模块时,就将 SPECIFICATION 项在数据库中存储的值动态显示出来,先在 Form4.5 中建立一个 PRCEDURE ,命名为 DYN_LIST:
PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)
FROM EBOP_CABLE_ACCOUNT;
CNT NUMBER;
i NUMBER;
TNAME EBOP_CABLE_
ACCOUNT.SPECIFICATION%TYPE;
BEGIN
CLEAR_LIST('EBOP_CABLE_
ACCOUNT.SPECIFICATION');
SELECT COUNT(DISTINCT
(SPECIFICATION)) INTO CNT FROM EBOP
_CABLE_ACCOUNT;
open C1;
FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;
EXIT WHEN C1%NOTFOUND
OR C1%NOTFOUND IS NULL;
ADD_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT
.SPECIFICATION',i,TNAME,TNAME);
END LOOP;
DELETE_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);
CLOSE C1;
END;
然后在 FORM 的 WHEN-NEW
-FORM-INSTANCE 触发子中加入一行:
DYN_LIST;
---- 这样一进入该 FMX ,就会动态刷新该列表。除此之外, SPECIFICATION 数据项改为列表项。
---- ④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面 :
---- 如上图所示, PRN 代码及设备代码在画布 1(CONTENT 型 ) 上,其它数据项在画布 2(STACK 型 ) 上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用 TAB 或敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录时用。主要制作顺序为:先建立两个画布,画布 1(CONTENT 型 ) ,画布 2(STACK 型 ) ,然后建立块,选画布时用画布 1 ,这样所有项都显示在画布 1 上,然后选中除 PRN 代码及设备代码之外的所有数据项,选 TOOLS 菜单下的 PROPERTIES 选项,将这些数据项的 CANVAS 属性选为画布 2(STACK 型 ) ,然后调整整体位置就可以了。
---- ⑤ 如何在 FORM 的受限触发子中提交保存数据
---- 在 FORM 中很多触发子是不能用 COMMIT WORK 语句的,当你在该触发子中使用了 UPDATE , DELETE 等操作并想立即存盘时,就需要 COMMIT WORK 语句了。首先在服务器端建立 DB_SQL_COMMIT 这个过程 ( 采用 ORACLE7.3 数据库 ) ,
PROCEDURE DB_SQL_COMMIT IS
source_cursor integer;
ignore integer;
V7 NUMBER :=2;
BEGIN
source_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(source_cursor,'COMMIT WORK',V7);
ignore:=dbms_sql.execute(source_cursor);
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END;
---- 然后在 FORM 中该触发子中调用过程 DB_SQL_COMMIT; 就可以了,当然你可以根据自己需要将该过程加入参数,这样通过参数可以得到执行 DML 语句的权限。
---- ⑥ 如何在 FORM 中实现某数据项自动按记录序号加一操作
---- 设块名为 VO, 要操作的数据项为 VO_ID, 在该块中建立块级触发子 WHEN-CREATE- RECORD ,加入如下代码:
:VO_ID:=:System.Trigger_Record;
---- 这样每当生成新记录时 VO_ID 就会自动加一了。
---- ⑦ 如何在一个 FORM 中调用另一个 FORM ,或在一个块中调用另一个块时显示特定的记录有时用户会要求在调用另一个 FORM 时,只显示相关的记录,举例如下,在一个 FORM 的块中有一个按钮,在按钮触发子中加入如下代码:
DECLARE
PM
PARAMLIST;
BEGIN
PM:=GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(PM) THEN
DESTROY_PARAMETER_LIST('PM');
END IF;
PM:=CREATE_PARAMETER_LIST('PM');
......................
ADD_PARAMETER(PM,'THE_WHERE',
TEXT_PARAMETER,'EM_NAME=''EM4''
AND EM_PROJECT_NAME='' 支架预制 ''');
OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);
END ;
---- 其中 EM_NAME , EM_PROJECT_NAME 为本 FORM 某块的数据项, PAYMENT 为要调用的 FORM 模块。这样通过传递参数列表就可以得到想要的结果。在 FORM PAYMENT.FMB 中,建立一参数 THE_WHERE , CHAR 型,长 1000 ,然后在 PAYMENT.FMB 中建立 FORM 级触发子 WHEN-NEW-FORM-INSTANCE ,在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT',
DEFAULT_WHERE,:PARAMETER.THE_WHERE);
END IF;
---- 其中 PAYMENT 为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据了。
---- ⑧ 在 FORM 中当有主从块时,连续输入记录如何避免被不断的提示保存:
---- 每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录, FORM 就会提示你是否要保存记录,而你并不希望 FORM 提示,让它自动保存,此时你可以到 Program Units 中找到过程 PROCEDURE Clear_All_Master_Details ,然后在这个过程中找到语句
Clear_Block(ASK_COMMIT);
---- 将其改为 Clear_Block(DO_COMMIT); 就可以了。
---- ⑨ 在 Report 开始时选择排序项 :
---- 在报表开始的 Parameter Form 中选择报表按哪个数据项排序,
---- 1. 先在 USER PARAMETER 中创建 SORT 参数,为字符型,长 20 。
---- 2. 初始值选'责任方' , 然后将这四个值输入到 DATA SELECTION 中,形成列表。
---- 3. 然后处理 QUERY 中的 SQL 语句 :
select CHARGER,FCO_NO,EM_NAME,FCO
_NO,DESCRIPTION, FCR_POINT
from FCR_MAIN
ORDER BY DECODE(:SORT,' 责任方 ',CHARGER,'FCO 号 ',
FCO_NO,'FCR 号 ',FCR_NO,'FCR 号 ',EM_NAME)
---- ⑩ 在 Developer 2000 中如何读写操作系统文件
---- 在用 Developer 2000 的开发工具
发应用程序时,经常碰到需要读写外部文件的问题,可以用 ORACLE 带的包 TEXT_IO 来完成这项需求。例如 :
DECLARE
IN_FILE TEXT_IO.FILE_TYPE;
OUT_FILE TEXT_IO.FILE_TYPE;
LINE_BUFER VARCHAR2(80);
/* 若不用 IN_FILE, 可以将各字段联接在一起赋值给此变量 */
BEGIN
IN_file:=TEXT_IO.FOPEN
(‘C:TEMPTEST1.TXT','r');
OUT_file:=TEXT_IO.FOPEN
(‘C:TEMPTEST2.TXT','w+');
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);
TEXT_IO.PUT(LINE_BUFER);
TEXT_IO.NEW_LINE;
TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....');
TEXT_IO.FCLOSE(IN_FILE);
TEXT_IO.FCLOSE(OUT_FILE);
END;
上一篇文章: ORACLE 数据库开发经验总结[3] 下一篇文章: 如何在复杂环境下监控 ORACLE 数据库性能
相关文章:
相关软件:

