壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10073|回复: 49

Oracle EBS Form & Report 问题大全

    [复制链接]
发表于 2008/7/25 15:18:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
1
Developer/2000中各键盘触发子所对应的“按键”

封装过程    键触发子
含义          对应按键

ABORT_QUERY
   Key-EXIT
[退出/取消]

BLOCK_MENU
   Key-MENU
[块菜单]        F5
CLEAR_BLOCK   Key-CLRBLK
[
清空块]        Shift+F5

CLEAR_FORM
   Key-CLRFRM
[清空FORM]       Shift+F7

CLEAR_RECORD
  Key-CLRREC
[清空记录]       Shift+F4

COMMIT_FORM
   Key-COMMIT
[提交/存盘]       F10

COUNT_QUERY
   Key-CQUERY
[计算查询记录总数]   Shift+F2

CREATE_RECORD
  Key-CREREC
[插入新记录]      F6

DELETE_RECORD
  Key-DELREC
[删除记录]       Shift+F6

DOWN
      Key-DOWN
[下滚记录]       Ctrl+l、下箭头

DUPLICATE_ITEM
 Key-DUP-ITEM
[复制域/项]       F3

DUPLICATE_RECORDKey-DUPREC
[
复制记录]       F4

EDIT_TEXTITEM
  Key-EDIT
[打开编辑器]      Ctrl+E

ENTER
      Key-ENTER
[Enter]

ENTER_QUERY
   Key-ENTQRY
[输入查询条件]     F7

EXECUTE_QUERY
  Key-EXEQRY
[执行查询]       F8

EXIT_FORM
    Key-EXIT
[退出/取消查询]     Ctrl+Q

HELP
      Key-HELP
[帮助]         F1

LIST_VALUES
   Key-LISTVAL
[显示值列表LOV]     F9

LOCK_RECORD
   Key-UPDREC
[Lock Record]

NEXT_BLOCK
   Key-NXTBLK
[下一块]        Ctrl+Page Down

NEXT_ITEM
    Key-NEXT-ITEM
[下一域/项]       Ctrl+Tab、Tab、Enter

NEXT_KEY
    Key-NXTKEY
[定位到下一个主键项]  Shift+F3

NEXT_RECORD
   Key-NXTREC
[下一条记录]      Shift+Down

NEXT_SET
    Key-NXTSET
[下一个记录集]     Ctrl+>

PREVIOUS_BLOCK
 Key-PRVBLK
[前一块]        Ctrl+Page Up

PREVIOUS_ITEM
  Key-PREV-ITEM
[前一域/项]       Shift+Tab、Shift+Ctrl+Tab

PREVIOUS_RECORD Key-PRVREC
[
前一条记录]      Shift+Up

PRINT
      Key-PRINT
[打印当前屏幕]     Shift+F8

SCROLL_DOWN
   Key-SCRDOWN
[下翻屏]        Page Down

SCROLL_UP
    Key-SCRUP
[上翻屏]        Page Up

UP
       Key-UP     [上滚记录]       Ctrl+p、上箭头

Esc
       取消

Backspace
    向后删除

Ctrl+U
     清除域/项

Ctrl+F1
     显示有效的功能键列表

Shift+F1
    发生错误时,显示错误窗口
 楼主| 发表于 2008/7/25 15:19:06 | 显示全部楼层
1
FORM中,当光标走到块的最后一项时,如何让按“enter回车”键时,光标自动走到下一条记录的第一项?
设置块属性
导航器风格:改变记录
 楼主| 发表于 2008/7/25 15:19:26 | 显示全部楼层
3        如何在启动FORM程序时直接登录到Oracle数据库上?

1、        调入Form Builder,打开一个新的FORM
2、        在表格级新建一个ON_LOGON触发器
3、        在ON_LOGON里输入以下代码:
DECLARE
PASS1 VARCHAR2(80); --PASS1为密码参数
BEGIN
LOGON('USER1','USER1'||'@'||'TNS1');
SELECT PASS INTO PASS1 FROM T_PASSWORD WHERE USERNAME='USER2';
LOGOUT;
LOGON('USER2',PASS1||'@'||'TNS1');
END;
 楼主| 发表于 2008/7/25 15:19:45 | 显示全部楼层
1
FORM中,如何通过 ODBC 访问 Acress 数据?
1.
在控制面板中选取 ODBC 控制源
2.
系统 DSN
3.
添加(D)...
4.
选定您需要的驱动程序来安装数据源(S):Microsoft Acress Driver (*.mdb)
5.
完成(F)
6.
Date Source Name:aaa(aaa就是数据源名称,也就是在应用程序中所要使用的)
7.
选择一个mdb数据库文件(select)
8.
高级属性:设置用户名、口令
9.
OK
10.
打开一个FORM
11.
文件(F)—>连接(E)
12.
[email=用户名/口令@odbc:aaa]用户名/口令@odbc:aaa[/email]
13.
连接(O)
 楼主| 发表于 2008/7/25 15:20:05 | 显示全部楼层
1
从FORM中调用REPORT时,如何使打印结果直接输出到打印机上?
parameter list中加入parameter_form=No
Add_parameter(list_id,'PSRAMETER_FORM',TEXT_PARAMETER,'NO');
2
FORM调用REPORT时,如何去掉report server
Add_parameter(list_id,'ORACLE_SHUTDOWN',TEXT_PARAMETER,'YES');
3
FORM中,如何实现屏幕同步刷新?
现象说明:
FORM中,在做一连串大的操作时,有时希望用message来显示提示信息,但屏幕却不刷新,
解决方法:
message('信息1');
synchronize;(同步屏幕显示)
message('信息2');
synchronize;
 楼主| 发表于 2008/7/25 15:20:22 | 显示全部楼层
1
在Developer/2000中如何读写文本型操作系统文件?
PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下:

declare

file_handle utl_file.file_type;


begin

file_handle:=utl_file.fopen('C:\','TEST.TXT','A');
--TEST.TXT
是文件名


utl_file.put_line(file_handle,'
写入的信息');


utl_file.fclose(file_handle);

end;


Developer/2000中,可以用Text_IO读写操作系统文件。如下:

DECALRE

in_file
Text_IO.File_Type;


out_file
Text_IO.File_Type;


BEGIN

in_file:=Text_IO.Fopen('
文件名', 'R');


Text_IO.Get_Line(in_file,linebuf);


Text_IO.Fclose(in_file);



out_file:=Text_IO.Fopen('
文件名', 'W');


Text_IO.Put_Line(out_file,'
写入信息');


Text_IO.Fclose(out_file);


END;

--常用TEXT_IO
Declare

out_file
text_io.file_type;
--
定义

Begin

out_file:=text_io.fopen('prn','w');
--
打开文件prn


text_io.new_line(out_file,' ');
--
新建一行


text_io.put_line(out_file,' ')
--
写入一行


text_io.fclose(out_file);
--
关闭文件

End;

---文本输入输出

TEXT_IO


TEXT_IO.PACKAGE


TEXT_IO.FCLOSE


TEXT_IO.FILE_TYPE


TEXT_IO.FOPEN


TEXT_IO.IS_OPEN


TEXT_IO.GET_LINE


TEXT_IO.NEW_LINE


TEXT_IO.PUT


TEXT_IO.PUTF


TEXT_IO.PUT_LINE

Declare

Out_file
Text_io.file_type;


L
Varchar2(100);


L1
Varchar2(100);


L2
Varchar2(100);

Begin

Out_file :=text_io.fopen('c:\ll\login.txt','r');


If text_io.is_open(Out_file) then


text_io.get_line(Out_file,L);

text_io.get_line(Out_file,L1);

text_io.get_line(Out_file,L2);

Else


Null;


End if;

End;
 楼主| 发表于 2008/7/25 15:20:35 | 显示全部楼层
1
如何改变FORM(FMX模块)运行时的title
1、
Developer/2000中FMX默认title为:Developer/2000 Forms Runtime for Windows 95 / NT
2、
在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
3、
在此触发器中写如下代码:
4、
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,TITLE,'您的提示');
2
FORM中,如何修改系统提示信息(默认英文)为中文?
1、
调入Form Builder,打开一个新的FORM
2、
在表格级新建一个ON_ERROR触发器
3、
在ON_ERROR里输入以下代码:
begin
if
    error_code=40100 then message('已在第一 条记录!');
 elsif error_code=40102 then message('您已在最后一条记录,请先输入处理此记录,然后再输入下一条记录!');
 elsif error_code=40200 then message('此项仅用于查询参考,您无法更改此项!');
 elsif error_code=40202 then message('此项必须输入! 产生错误原因:您未输入值,或您删去了原有值!');
 elsif error_code=40203 then message('值必须输入完全! 产生错误原因:该项有定长要求!');
 elsif error_code=40207 then message('您输入的值不在有效范围之内,请输入有效范围之内的值!');
 elsif error_code=40401 then message('您没有修改或输入任何新的记录,无须保存!');
 elsif error_code=40508 then message('编码不能相同,不能有相同编码的记录,编码必须唯一!');
 elsif error_code=40509 then message('严重操作错误!,您可能输入了一个空的记录,无法保存记录!');
 elsif error_code=41802 then message('您只能在输入新的记录时使用[复制记录]键,来复制上一条记录!');
 else message(error_type||'_'||to_char(error_code)||':'||error_text);
end if;
raise form_trigger_failure;
end;
 楼主| 发表于 2008/7/25 15:20:52 | 显示全部楼层
1
FORM中,怎样创建动态下拉列表List
1、打开Form Builder
2、文件(F)→新建(N)→表格(F)
3、新建一个非数据块,取名为tool
4、鼠标右键布局编辑器(E)
5、建一个列表项,名为xl(属于tool块)
6、新建一过程,内写如下的代码

PROCEDURE create_xl IS                    --动态显示学历过程
    CURSOR A IS SELECT DISTINCT(xl) FROM t_xl;      --建立a游标,从学历档案表取原始数据(有可能动态变化)
    CNT
NUMBER;
                    --记录总数变量,用于生成列表的总项数

    i
NUMBER;
                    --循环变量

    TNAME
t_xl.name%TYPE;
                --TNAME变量和t_xl表中name项具有相同的结构

BEGIN
    CLEAR_LIST('tool.xl');                --清空列表tool.xltool块上的xl项)
    SELECT COUNT(DISTINCT(name)) INTO CNT FROM t_xl;   --计算列表总数
    OPEN A;                        --打开游标
    FOR i IN 1..CNT LOOP                 --开始循环
        FETCH A INTO TNAME;              --取数
        EXIT WHEN A%NOTFOUND;             --退出条件
        ADD_LIST_ELEMENT('tool.xl',i,TNAME,TNAME);  --把查询出的值加入列表中(序号,实际值,显示值)
    END LOOP;                       --结束循环
    CLOSE A;                       --关闭游标
END;

7、在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE


在此触发器中写如下代码:create_xl;

   使FORM程序一启动,就调用此过程,达到动态生成下拉列表List的效果。

附:
--学历档案表
create table t_xl(name varchar2(6));
insert into
t_xl values('
小学');

insert into
t_xl values('
初中');

insert into
t_xl values('
职高');

insert into
t_xl values('
技校');

insert into
t_xl values('
高中');

insert into
t_xl values('
中专');

insert into
t_xl values('
大专');

insert into
t_xl values('
本科');

insert into
t_xl values('
研究生');

commit;
 楼主| 发表于 2008/7/25 15:21:07 | 显示全部楼层
1
FORM中,如何引入图像,制作封面?
1、
打开Form Builder
2、
文件(F)→新建(N)→表格(F)
3、
鼠标右键→布局编辑器(E)
4、
文件(F)→导入(I)→图象(I)
5、
可调入作好的图像,以制作封面。
6、
所支持的图像格式有:TIF、JPG、BMP、TGA、PCX、PCT、GIF、CAL、RAS、OIF、PCD等
2
运行FORM时,如何使按钮变灰(即无效)?
set_item_property('按钮名称',ENABLED,PROPERTY_FALSE);

3
FORM中,设置应用特性(光标类型)
在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
SET_APPLICATION_PROPERTY(CURSOR_STYLE,'CROSSHAIR'|'BUSY'|'HELP'|'DEFAULT'|'INSERTION');
4
运行FORM时,如何使窗口(runtime窗口、画布窗口)自动变成最大化、最小化?
1.
在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
2.
在此触发器中写如下代码:
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,WINDOW_STATE,MAXIMIZE);--最大化
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW,WINDOW_STATE,MINIMIZE);--最小化
5
FORM中,WINDOW标题的设置
1.
在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE
SET_WINDOW_PROPERTY(FORMS_MDI_WINDOW, title,'你要写的标题');
或用以下方法
2. 对象导航器→窗口→WINDOW0(窗口的名字)→属性→标题→修改其属性
 楼主| 发表于 2008/7/25 15:21:29 | 显示全部楼层
1
FORM中,Exception(例外)都有哪些,如何书写?
BEGIN

PL/SQL块》;

Exception


when no_data_found then
--
没有找到数据

                     《响应命令》;

when too_many_rows then
--
返回多行,隐式光标每次只能检索一行数据

                     《响应命令》;

when invalid_number then
--
字符向数字转换失败

                     《响应命令》;

when zero_divide then
--
被零除

                     《响应命令》;

when dup_val_on_index then
--
向唯一索引中插入重复数据

                     《响应命令》;

when invalid_cursor then
--
非法游标操作

                     《响应命令》;

when value_error then
--
数字的,数据转换,截字符串或强制性的错误

                     《响应命令》;

when others then
--
发生其它任何错误


null;
--
选择一:什么也不做,就当错误没发生


raise form_trigger_failure;
--
选择二:挂起当前程序


END;


2
如何在FORM运行中,使定制菜单中的“窗口(W)”菜单项不显示?
对象导航器→窗口→WINDOW0(窗口的名字)→属性→模式→修改其属性
  设置窗口属性:模式=是
 楼主| 发表于 2008/7/25 15:21:52 | 显示全部楼层
1
FORM中,如何屏蔽默认的功能键?
1. Form级触发器中添加触发KEY-OTHERS
2. 在此触发器中写如下代码:


null;

3. 这样FORM程序运行后,大部分的功能键都被屏蔽(包括一些必需键,如:上箭头、下箭头、退出...),


要想让这些键再恢复功能,就为这些键各自编程:



按键       触发器       代码        说明



上箭头       KEY-DOWN       DOWN;        上滚记录



下箭头       KEY-UP        UP;         下滚记录



Page Up
       KEY-SCRUP       SCROLL_UP;     上翻屏



Page Down
      KEY-SCRDOWN      SCROLL_DOWN;    下翻屏



F1
         KEY-HELP       HELP;        显示帮助



F3
         KEY-DUP-ITEM     DUPLICATE_ITEM;   复制项



F4
         KEY-DUPREC      DUPLICATE_RECORD;  复制记录



F5
         KEY-MENU       BLOCK_MENU;     块导航菜单



F6
         KEY-CREREC      CREATE_RECORD;   插入记录



F7
         KEY-ENTQRY      ENTER_QUERY;    输入查询条件



F8
         KEY-EXEQRY      EXECUTE_QUERY;   运行查询



F9
         KEY-LISTVAL      LIST_VALUES;    显示LOV



F10
         KEY-COMMIT      COMMIT;       存盘



Enter
Tab     KEY-NEXT-ITEM     NEXT_ITEM;     下一项



SHIFT+TAB
      KEY-PREV-ITEM     PREVIOUS_ITEM;   前一项



Ctrl+Q
       KEY-EXIT       EXIT_FORM;     退出/取消查询


2
FORM中,触发子exit_form的两种功能是什么?
1、退出FORM


exit_form;

2、取消查询


if :System.Mode = 'ENTER-QUERY' then




exit_form;



end if;
 楼主| 发表于 2008/7/25 15:22:13 | 显示全部楼层
1
FORM中如何存取图象?如何把图象从一个表中导到另一个表中?
1SQL*Plus

SQL> create table t_photo1(photo1 long raw);


SQL> create table t_photo2(photo2 long raw);


2
、硬盘上c:\下有一个图象文件tmp.bmp

3
、打开FORM

   新建两个块:t_photo1t_photo2

t_photo1
块是数据库块,连接的表是数据库中的一个表t_photo1


t_photo2
块也是数据库块,连接的表是数据库中的另一个表t_photo2(备份表)


t_photo1
块上新建一个图象项,名为photo1,对应的是即表t_photo1中的photo1


t_photo2
块上也新建一个图象项,名为photo2,对应的是即表t_photo2中的photo2

   新建一按钮1,输入以下程序,这个按钮实现读入图象到表里,即录入图象到表里
BEGIN

GO_BLOCK('t_photo1');--
到块1


READ_IMAGE_FILE('c:\tmp.bmp','bmp','t_photo1.photo1');


--
读入外部图象文件tmp.bmp(图象类型为BMP)到t_photo1块的photo1项,也就是到了t_photo1表里


COMMIT;--
存盘


END;

   新建一按钮2,输入以下程序,这个按钮实现图象的倒表(t_photo1t_photo2

BEGIN


GO_BLOCK('t_photo1');--
到块1


execute_query;


--
查询出表中的图象,这时,表中的图象到了FORM中的图象项上


WRITE_IMAGE_FILE('c:\tmp.bmp','bmp','t_photo1.photo1');


--
把图象项中图象写入外部图象文件tmp.bmp


GO_BLOCK('t_photo2');--
到块2


READ_IMAGE_FILE('c:\tmp.bmp','bmp','t_photo2.photo2');


--
把外部图象文件tmp.bmp读入到t_photo2块的photo2项,也就是到了t_photo2表里


COMMIT;--
存盘


END;


   运行此程序,点击此按钮观察效果。

   注释:t_photo1.photo1是正式图片表中的图象项(数据库项)(t_photo1photo1


t_photo2.photo2
是备份图片表中的图象项(数据库项)(t_photo2photo2

 楼主| 发表于 2008/7/25 15:22:26 | 显示全部楼层
1
FORM中如何存取声音?
1、
硬盘上c:\下有一个声音文件tmp.wav
2、
打开FORM
   新建一个块:t_sound

t_sound
块上新建一个声音项,名为sound1

   新建一按钮1,输入以下程序

BEGIN


GO_ITEM('sound1');


READ_SOUND_FILE('c:\tmp.wav','wave','sound1');


PLAY_SOUND('sound1');


END;

   运行此程序,点击此按钮观察效果。

2
FORM中,当用鼠标点击标签画布的某一“标签页”时,如何判断点击的是哪一页?
1. Form级触发器中添加触发WHEN-TAB-PAGE-CHANGED

2.
在此触发器中写如下代码:


DECLARE


canvas_id
VARCHAR2(30);
--
标签页ID


BEGIN


canvas_id := GET_CANVAS_PROPERTY('
标签画布名', topmost_tab_page);


IF canvas_id='
标签页1'
then go_block('
1');end if;


IF canvas_id='
标签页2'
then go_block('
2');end if;


IF canvas_id='
标签页3'
then go_block('
3');end if;


execute_query;


END;

3
FORM中,常用快捷键有哪些?

CTRL+S
保存

CTRL+T
编译文件

CTRL+R
运行FORM

CTRL+J
连接

F1
调用帮助

F2
布局编辑器

F4
属性选项板
 楼主| 发表于 2008/7/25 15:23:28 | 显示全部楼层
1
如何发布Developer/2000应用程序?

2
FORM中,点击按钮实现字段排序?
3
为什么在触摸屏上,我的按纽不响应我的“按”动作?
4
为什么我的FMX程序里没有Message line?
5
FORM
中,如何设置水平滚动条? 6
FORM
中,触发子POST-CHANGE的作用 7
FORM
中,触发子WHEN-VALIDATE-ITEM的作用 8
FORM
中,触发子POST-QUERY的作用 9
怎样在form中使用宏?
FOXPRO 中, 能, FORMS 能, "&","*" 的, FORMS 写, FORMS 能, NAME_IN()COPY() 能。Name_in() 值, COPY() 象。 例:
FORM 构:
  B
   L1L2L3L4L5L6
    L1。。。L6

DELCATE

strItemName
varchar2(20);

BEGIN

for I in 1 …6 loop



strItemName:=':b.l"||to_char(i);



copy(null,strItemNmae);


end loop;


END;

----
NAME_IN 些, 时, 码。

----


FORM
结构:

养老:
  块:YLYJ(养老应缴)
  项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
  块:YLSJ (养老实缴)
  项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
工伤:
  块:GSYJ(工伤应缴)
  项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
  块:GSSJ (工伤实缴)
  项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
医疗:
  块:YILYJ(医疗应缴)
  项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
  块:YILSJ (医疗实缴)
  项:DWJTC(单位缴统筹),DWJZH(单位缴帐户),GRJF(个人缴费)
----
同, 同, 样, 缴, NAME_IN 时, 序, NAME_IN 的。 下:


FUNCTION FUN_JF (PRE_BLOCK_NAME


IN VARCHAR) RETURN BOOLEAN IS


BEGIN

if name_in(pre_block_name||'sj.dwjtc')

>name_in(pre_block_name||'yj.dwjtc')
or


name_in(pre_block_name||'sj.dwjzh')


>name_in(pre_block_name||'yj.dwjzh') or


name_in(pre_block_name||'sj.grjf')


>name_in(pre_block_name||'yj.grjf')
then


message('
');


return false;

end if;
return true;


END;

----
NAME_IN COPY " " 能, 用, 作。
 楼主| 发表于 2008/7/25 15:26:23 | 显示全部楼层
1
Oracle中Forms与Reports的集成
Oracle产品Developer 2000中包括多种开发工具,其中在具体工作时用得最多的是FormsReportsForms是一个设计表单的工具,利用它可以灵活方便地定义各种表单对象,以简化用户在运行期对相关数据库的操作(查询、插入、删除和更新等);Reports则是一个设计报表的工具,利用它可以按照用户的要求方便地生成报表。
Oracle应用系统中,大量的具有交互性的功能是由Forms实现的。利用Forms所生成的表单模块可以彼此调用,实现业务流程的控制并完成与数据库有关的复杂操作;而由Reports所设计的报表模块往往当做最底层的功能被表单模块所调用。对于一些Oracle用户来说,独立地用好FormsReports是没有问题的,但他们却很少考虑如何使二者有机地结合起来,利用Forms对数据操纵的灵活性,由Forms模块向Reports模块传送大量结构化或非结构化的实时数据,减少(或避免)Reports对数据库的访问,从而高速地生成报表并保证报表数据与表单数据的一致性。本文通过实例介绍一种利用Forms的封装例程RUN_PRODUCT( )Forms模块中集成Reports模块的方法,利用该方法可以把FormsReports有机地结合起来,减少不必要的操作,提高工作效率。
RUN_PRODUCT例程
Forms模块中调用Reports模块,最有效的方法是利用Forms的封装例程RUN_PRODUCT()。目前,很多程序开发人员在Forms模块中调用Reports模块时,或者没有采用这一例程,或者虽然采用这一例程但并没有充分利用参数表来传递表单中现成的数据,或者只是利用参数表来传递少量的文本参数(非结构化数据)作为Reports中的查询条件,报表的数据仍然要从数据库中查询得到,这样既增加了数据库服务器的负载,又增加了网络的流量,而且报表生成的速度慢,丧失了数据的实时性与一致性。因此,深入了解并熟练掌握参数表的使用方法便显得非常重要。
在使用RUN_PRODUCT( )之前要先建立参数表,并向参数表中添加参数。RUN_PRODUCT( )的使用格式如下:
RUN_PROCDUT(REPORTS, ‘report_name', SYNCHRONOUS, RUNTIME, FILESYSTEM, pl_id, NULL);
其中各参数含义如下:
●REPORTS:说明被调模块是报表模块;
●report_name:被调模块的完整路径名;
●SYNCHRONOUS 说明被调模块以同步的通信方式运行(被调模块退出之后主调模块才能继续执行,否则为ASYNCHRONOUS,即异步方式);
●RUNTIME:说明被调模块的执行方式为前台方式(否则为BATCH,即后台方式);
●FILESYSTEM:说明被调模块的存储位置是文件系统(否则为DATABASE,即数据库系统);
●pl_id:用户定义的参数表标识符。
使用参数表的要领
Forms模块向Reports模块传递的数据可分为两类:一类是非结构化数据,即报表表头(表尾)的数据;另一类是结构化数据,即报表表目的二维数据。在如图1所示的报表中,学年、学期、班级编号、班级名称、专业名称、课程编号、课程名称、学分、班级人数等,属于表头数据;而学号、姓名、性别、修读性质、平时成绩、考试成绩、总评成绩、任课教师等属于表目数据。
1 Reports模块执行情况
参数表中的参数有两种,文本参数(TEXT_PARAMETER)和数据参数(DATA_PARAMETER)。文本参数是对字符型数据的引用,数据参数是对记录组的引用。对于非结构化数据,可借文本参数将数据加入参数表(注意:文本参数只接受字符型数据,对于其他类型的数据要通过TO_CHAR( )函数先转化为字符型数据);而对于结构化数据,则先要将数据存入记录组(RECORD_GROUP),然后借数据参数才能将数据加入到参数表中。注意:Forms模块的记录组中的各列和Reports模块中的查询(QUERY)对象的各列在名称、类型和顺序上要完全一致。这里文本参数是字符串指针,数据参数是记录组(结构数组)的指针,而参数表则是存储上述指针的指针数组。
如果RUN_PRODUCT( )的参数表中未加入与Reports模块中的查询对象同名的数据参数,则Reports 从数据库中查找与其模块中的查询对象相匹配的数据;如果RUN_PRODUCT( ) 的参数表中加入了与Reports模块中的查询对象同名的数据参数,则Reports 并不从数据库中查找数据,而是以参数表中的同名数据参数所引用的记录组作为其模块中的查询对象的数据源,在这种情况下,Reports查询对象的SELECT语句所映射的数据集合是不起作用的。
实现集成的具体方法
本文例子中用Forms模块来对学生的期末成绩进行管理,Forms模块运行如图2所示。
其中:
标以单位、班级、课程、成绩的各个块对象间存在级联的主从关系;
各个块对象中,有的项因不需要使用人员予以关注,故将其定义为非显示项,未在画布(canvas)上显示,但这并不影响对它们的引用,例如,班级块中的班级编号(BJBH),课程块中的课程编号(KCBH)等;
标以课程的块对象是基于视图(view)而非基于表(table)的;
画布上显示的项并非都是基表项(块对象所基于的表或视图中的列),而是通过触发子从其他的表或视图中查询的,这也不影响对它们的引用,例如,课程块中的名称(MC)和学分(XF)等。
1.bmp
 楼主| 发表于 2008/7/25 15:27:43 | 显示全部楼层
2 Forms模块运行情况
程序实现的步骤如下:
Sqlplus下创建一个与图1所示的表目一致的表(或视图)REPT_001当做Reports模块的查询对象Q_001的虚拟数据源:
CREATE TABLE REPT_001( / 期末成绩表 /
XH VARCHAR2(9), / 学号 /
XM VARCHAR2(10), / 姓名 /
XB VARCHAR2(2), / 性别 /
XDXZ VARCHAR2(4), / 修读性质 /
PSCJ NUMBER, / 平时成绩 /
KSCJ NUMBER, / 考试成绩 /
ZPCJ NUMBER, / 总评成绩 /
RKJS VARCHAR2(10) / 任课教师 /);
注意:该表仅供Reports定义查询对象Q_001之用(仅援引其列名与类型),与整个应用系统的数据库结构无关,不需要向该表插入任何数据(保持该表为空表),不存在数据的完整性和一致性的问题。
Reports中定义报表模块,源模块的名称为REP_001.rdf。在该模块中,定义与表目数据相关的查询对象Q_001
SELECT XH,XM,XB,XDXZ,PSCJ,KSCJ,ZPCJ,RKJS FROM REPT_001
再定义与表头数据相关的用户参数:
P_XN1 / 学年学期 /
P_XN2
P_XQ
P_BJBH / 班级编号 /
P_BJMC / 班级名称 /
P_ZYMC / 专业名称 /
P_KCBH / 课程编号 /
P_KCMC / 课程名称 /
P_XF / 学分 /
P_BJRS / 班级人数 /
Reports的布局编辑器中调整美化报表的输出格式,最后生成目标模块REP_001.rep
Forms模块中定义<报表>按钮以实现对Reports模块REP_001.rep的调用。
<报表>按钮定义WHENBUTTONPRESSED触发子:
DECLARE
PL_ID PARAMLIST;
RG_ID RECORDGROUP;
GC_XH GROUPCOLUMN;
GC_XM GROUPCOLUMN;
……
BEGIN
/ 定义用来捆绑表目数据的记录组G_001/
RG_ID:=FIND_GROUP(‘G_001’);
IF ID_NULL(RG_ID) THEN
RG_ID:=CREATE_GROUP(‘G_001’);
/ 定义记录组内各列,注意各列的列名、类型、顺序均要和Reports模块所定义的查询对象Q_001中的各列相一致 /
GC_XH:=ADD_GROUP_COLUMN(RG_ID,‘XH’,CHAR_COLUMN);
GC_XM:=ADD_GROUP_COLUMN(RG_ID‘XM’,CHAR_COLUMN);
……
ELSE
DELETE_GROUP_ROW(RG_ID,ALL_ROWS);
GC_XH:=FIND_COLUMN(RG_ID,‘XH’,
CHAR_COLUMN);
GC_XM:=FIND_COLUMN(RG_ID,‘XM’,
CHAR_COLUMN);
……
END IF;
/ Forms模块中的数据传送到记录组中 /
GO_BLOCK(‘CJZB’);
FIRST_RECORD;
ROW_NUM:=1;
FOR LOOP
ADD_GROUP_ROW(RG_ID,END_OF_GROUP);
SET_GROUP_CHAR_CELL(GC_XH,ROW_NUM,:CJZB.XH);
SET_GROUP_CHAR_CELL(GC_XM,ROW_NUM,:CJZB.XM);
……
EXIT WHEN :SYSTEM.LAST_RECORD=‘TRUE’;
LOW_NUM:=LOW_NUM1;
NEXT_RECORD;
END LOOP;
/ 建立参数表 /
PL_ID:=GET_PARAMETER_LIST(‘CJ_LIST’);
IF NOT ID_NULL(PL_ID) THEN
DESTROY_PARAMETER_LIST(‘CJ_LIST’);
END IF;
PL_ID:=CREATE_PARAMETER_LIST(‘CJ_LIST’);
/ 通过向参数表中加入文本参数的方式传送表头数据。其中,第1个参数是参数表标识符,第2个参数是键(参数名),应与Reports模块中定义的用户参数同名,第3个参数指定参数的种类是文本参数,第4个参数引用Forms模块的数据项 /
ADD_PARAMETER(PL_ID, ‘P_XN1’,
TEXT_PARAMETER,:START.XN1);
ADD_PARAMETER(PL_ID, ‘P_XN2’,
TEXT_PARAMETER,:START.XN2);
……
/ 向参数表传送表目数据。其中,第1个参数是参数表标识符,第2个参数是键(参数名),应与Reports模块中定义的查询对象同名,第3个参数指定参数的种类是数据参数,第4个参数引用Forms模块的记录组 /
ADD_PARAMETER(PL_ID, ‘Q_001’,

DATA_PARAMETER,‘G_001’);
/ 调用报表模块REP_001 /
RUN_PRODUCT(REPORTS,‘C:\Apps\REP_001’,SYNCHRONOUS,RUNTIME,FILESYSTEM,PL_ID);
END;

通过上述方法,借助参数表实现Forms模块对Reports模块的集成,既能快速生成报表(包括实时的业务单据的套打),又提高了系统的效率。如果巧妙地将报表标题、栏目标题、表头数据、格式线段、表目数据等均通过参数传送,并借助Reports的格式触发子和SWR包的模块(过程、函数和例外处理),还可以生成各种复杂的动态报表,免除了使用第三方工具带来的麻烦和副作用(如增加新的连接等)。
 楼主| 发表于 2008/7/25 15:28:06 | 显示全部楼层
1
在DEVELOPER2000中利用DDE将数据倒入到EXCEL文件中的方法
在实际的工作中,经常遇到用户要将EXCEL文件中的数据倒入到ORACLE数据库中,也经常遇到用户要将ORCLE数据库中的数据倒入到EXCEL文件中,这方面的资料并不多见(PB6的这项功能很简单,只需在DATAWINDOW控件中加入dw_1.save()这一函数就可以了),通常的做法是利用DEVELOPER 2000自带的示例进行修改来完成任务,但效果也不好,尤其是对初学者,面对示例中的OLE示例可能如入雾里,我在实际工作中利用DDE将数据倒入到EXCEL文件中,效果也不错,在这里向大家作一介绍.
所谓DDE,就是动态数据交换,相信各位并不陌生.运用DDE倒数据的先提条件是先在本机安装微软office中的EXCEL,C:盘上建立一空的EXCEL文件如EXCEL.xls,打开该文件,然后运行自己开发的FORM文件.
下面我就我工作中遇到的实际工作遵照原意逐步进行介绍:
先用form4.5(5.0当然更可以)建立一个新FORM,canvas上的新blok中建一个button,然后在该button中的WHEN-BUTTON-PRESSED触发子中,输入以下代码:
DECLARE
CROW

varchar2(8);

CCOL1

varchar2(8);

CCOL2

varchar2(8);

CCOL3

varchar2(8);

CCOL4

varchar2(8);

CCOL5

varchar2(8);

CCOL6

varchar2(8);

CCOL7

varchar2(8);

CCOL8

varchar2(8);

CCOL9

varchar2(8);


TEMP

VARCHAR2(8);

ConvID

PLS_INTEGER;


/*该游标c1是用来从ORACLE提取数据,
并将数据倒入到EXCEL文件中的*/
CURSOR C1 IS SELECT
A.SHIPMENT_NO,A.ARRIVAL_DATE,
B.DELIVERY_REF_1,B.DELIVERY_REF_3,
B.DELIVERY_REF_2,C.CASE_NO,C.LRCM_CODE,
C.ANN_QUANTITY,C.QUANTITY_DESCRIPTION,
C.SPARE_PART,C.TRANSFER_NUMBER,
C.TRANSFER_DATE
FROM

ACM A,ACMCONTRACT B,ACMDELIVERY_PL D,
ACMCASE_PL C
WHERE
A.SHIPMENT_NO=B.SHIPMENT_NO AND
A.CONTRACT_NO=B.CONTRACT_NO AND
B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND
B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND
B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND
D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND
D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND
D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND
D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND
C.TRANSFER_NUMBER IS NOT NULL
AND C.TRANSFER_DATE IS NOT NULL;

SHIPMENT_NO_TMP
ACM.SHIPMENT_NO%TYPE;

ARRIVAL_DATE_TMP
ACM.ARRIVAL_DATE%TYPE;

DELIVERY_REF_1_TMP
ACMCONTRACT.DELIVERY_REF_1%TYPE;

DELIVERY_REF_3_TMP
ACMCONTRACT.DELIVERY_REF_3%TYPE;

DELIVERY_REF_2_TMP
ACMCONTRACT.DELIVERY_REF_2%TYPE;

CASE_NO_TMP
ACMCASE_PL.CASE_NO%TYPE;

LRCM_CODE_TMP
ACMCASE_PL.LRCM_CODE%TYPE;

ANN_QUANTITY_TMP
ACMCASE_PL.ANN_QUANTITY%TYPE;

QUANTITY_DESCRIPTION_TMP
ACMCASE_PL.QUANTITY


_DESCRIPTION%TYPE;

SPARE_PART_TMP
ACMCASE_PL.SPARE_PART%TYPE;

TRANSFER_NUMBER_TMP
ACMCASE_PL.TRANSFER


_NUMBER%TYPE;

TRANSFER_DATE_TMP
ACMCASE_PL.TRANSFER


_DATE%TYPE;


NCOUNT
NUMBER;


BEGIN
/*NCOUNT为游标循环的总记数*/

SELECT COUNT(*) INTO NCOUNT
FROM
ACM A,ACMCONTRACT B,ACMDELIVERY_PL D,


ACMCASE_PL C

WHERE
A.SHIPMENT_NO=B.SHIPMENT_NO AND
A.CONTRACT_NO=B.CONTRACT_NO AND
B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND
B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND
B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND
D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND
D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND
D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND
D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND
C.TRANSFER_NUMBER IS NOT NULL AND
C.TRANSFER_DATE IS NOT NULL;

/*
初始化DDE,EXCEL及文件建立联系,

此时要确保EXCELEXCEL.XLS文件打开
*/

ConvID := DDE.Initiate('EXCEL', 'C:\excel.xls');

/*
先在EXCEL文件中第一行加入字段名称,

其中DDE.CF_TEXT为文本型数据,10001000毫秒
*/


DDE.Poke(ConvID, 'R1C1','
船运号',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C2','
到达日期',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C3','
包装箱号',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C4','LRCM
',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C5','SO
标识',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C6','
移交单',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C7','
移交日期',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C8','
移交数量',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C9','
设备材料描述',


DDE.CF_TEXT, 1000);


OPEN C1;
FOR i IN 1..NCOUNT LOOP


/*
循环从此开始*/

FETCH C1 INTO SHIPMENT_NO_TMP,
ARRIVAL_DATE_TMP,DELIVERY_REF_1_TMP,
DELIVERY_REF_3_TMP,DELIVERY_
REF_2_TMP,CASE_NO_TMP,
LRCM_CODE_TMP,ANN_QUANTITY_TMP,
QUANTITY_DESCRIPTION_TMP,SPARE_PART_TMP,
TRANSFER_NUMBER_TMP,TRANSFER_DATE_TMP;
EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;

/*下面是EXCEL.XLS文件的CELL,
'R2C2'就是第二行第二列*/

CROW:=I+1;


CCOL1:='R'||CROW||'C1';


CCOL2:='R'||CROW||'C2';


CCOL3:='R'||CROW||'C3';


CCOL4:='R'||CROW||'C4';


CCOL5:='R'||CROW||'C5';


CCOL6:='R'||CROW||'C6';


CCOL7:='R'||CROW||'C7';


CCOL8:='R'||CROW||'C8';


CCOL9:='R'||CROW||'C9';



TEMP:=ANN_QUANTITY_TMP;


/*NUMBER
型数据要先转化为varchar*/



DDE.Poke(ConvID, CCOL1, SHIPMENT_NO_TMP,


DDE.CF_TEXT, 2000000000);

/*日期型要用tochar()进行转换*/

DDE.Poke(ConvID, CCOL2, TO_CHAR(ARRIVAL_DATE_TMP),

DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID,CCOL3,DELIVERY_REF_1_TMP

||DELIVERY_REF_3_TMP||



DELIVERY_REF_2_TMP||

CASE_NO_TMP,
DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL4, LRCM_CODE_TMP, DDE.CF_TEXT,

2000000000);

DDE.Poke(ConvID, CCOL5, SPARE_PART_TMP, DDE.CF_TEXT,

2000000000);

DDE.Poke(ConvID, CCOL6, TRANSFER_NUMBER_TMP,

DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL7, TO_CHAR(TRANSFER_DATE_TMP),

DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL8, TEMP, DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID, CCOL9, QUANTITY_DESCRIPTION_TMP,

DDE.CF_TEXT, 2000000000);


END LOOP;
CLOSE C1;

DDE.Terminate(ConvID);
/*结束DDE会话,此时数据已经全部倒入到EXCEL文件中了*/
END;
在做好以上工作后, 编译运行该fmx文件, 此时确保打开excel.xls文件,用鼠标点击按钮,然后将焦点移到excel.xls文件中,你就会发现一行行数据正在被倒入到EXCEL文件中,等完成后, EXCEL文件保存起来就可以了.
 楼主| 发表于 2008/7/25 15:30:38 | 显示全部楼层

在DEVELOPER2000中利用DDE将数据倒入到EXCEL文件中的方法
在实际的工作中,经常遇到用户要将EXCEL文件中的数据倒入到ORACLE数据库中,也经常遇到用户要将ORCLE数据库中的数据倒入到EXCEL文件中,这方面的资料并不多见(PB6的这项功能很简单,只需在DATAWINDOW控件中加入dw_1.save()这一函数就可以了),通常的做法是利用DEVELOPER 2000自带的示例进行修改来完成任务,但效果也不好,尤其是对初学者,面对示例中的OLE示例可能如入雾里,我在实际工作中利用DDE将数据倒入到EXCEL文件中,效果也不错,在这里向大家作一介绍.
所谓DDE,就是动态数据交换,相信各位并不陌生.运用DDE倒数据的先提条件是先在本机安装微软office中的EXCEL,C:盘上建立一空的EXCEL文件如EXCEL.xls,打开该文件,然后运行自己开发的FORM文件.
下面我就我工作中遇到的实际工作遵照原意逐步进行介绍:
先用form4.5(5.0当然更可以)建立一个新FORM,canvas上的新blok中建一个button,然后在该button中的WHEN-BUTTON-PRESSED触发子中,输入以下代码:
DECLARE
CROW

varchar2(8);

CCOL1

varchar2(8);

CCOL2

varchar2(8);

CCOL3

varchar2(8);

CCOL4

varchar2(8);

CCOL5

varchar2(8);

CCOL6

varchar2(8);

CCOL7

varchar2(8);

CCOL8

varchar2(8);

CCOL9

varchar2(8);


TEMP

VARCHAR2(8);

ConvID

PLS_INTEGER;


/*该游标c1是用来从ORACLE提取数据,
并将数据倒入到EXCEL文件中的*/
CURSOR C1 IS SELECT
A.SHIPMENT_NO,A.ARRIVAL_DATE,
B.DELIVERY_REF_1,B.DELIVERY_REF_3,
B.DELIVERY_REF_2,C.CASE_NO,C.LRCM_CODE,
C.ANN_QUANTITY,C.QUANTITY_DESCRIPTION,
C.SPARE_PART,C.TRANSFER_NUMBER,
C.TRANSFER_DATE
FROM

ACM A,ACMCONTRACT B,ACMDELIVERY_PL D,
ACMCASE_PL C
WHERE
A.SHIPMENT_NO=B.SHIPMENT_NO AND
A.CONTRACT_NO=B.CONTRACT_NO AND
B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND
B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND
B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND
D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND
D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND
D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND
D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND
C.TRANSFER_NUMBER IS NOT NULL
AND C.TRANSFER_DATE IS NOT NULL;

SHIPMENT_NO_TMP
ACM.SHIPMENT_NO%TYPE;

ARRIVAL_DATE_TMP
ACM.ARRIVAL_DATE%TYPE;

DELIVERY_REF_1_TMP
ACMCONTRACT.DELIVERY_REF_1%TYPE;

DELIVERY_REF_3_TMP
ACMCONTRACT.DELIVERY_REF_3%TYPE;

DELIVERY_REF_2_TMP
ACMCONTRACT.DELIVERY_REF_2%TYPE;

CASE_NO_TMP
ACMCASE_PL.CASE_NO%TYPE;

LRCM_CODE_TMP
ACMCASE_PL.LRCM_CODE%TYPE;

ANN_QUANTITY_TMP
ACMCASE_PL.ANN_QUANTITY%TYPE;

QUANTITY_DESCRIPTION_TMP
ACMCASE_PL.QUANTITY


_DESCRIPTION%TYPE;

SPARE_PART_TMP
ACMCASE_PL.SPARE_PART%TYPE;

TRANSFER_NUMBER_TMP
ACMCASE_PL.TRANSFER


_NUMBER%TYPE;

TRANSFER_DATE_TMP
ACMCASE_PL.TRANSFER


_DATE%TYPE;


NCOUNT
NUMBER;


BEGIN
/*NCOUNT为游标循环的总记数*/

SELECT COUNT(*) INTO NCOUNT
FROM
ACM A,ACMCONTRACT B,ACMDELIVERY_PL D,


ACMCASE_PL C

WHERE
A.SHIPMENT_NO=B.SHIPMENT_NO AND
A.CONTRACT_NO=B.CONTRACT_NO AND
B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND
B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND
B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND
D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND
D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND
D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND
D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND
C.TRANSFER_NUMBER IS NOT NULL AND
C.TRANSFER_DATE IS NOT NULL;

/*
初始化DDE,EXCEL及文件建立联系,

此时要确保EXCELEXCEL.XLS文件打开
*/

ConvID := DDE.Initiate('EXCEL', 'C:\excel.xls');

/*
先在EXCEL文件中第一行加入字段名称,

其中DDE.CF_TEXT为文本型数据,10001000毫秒
*/


DDE.Poke(ConvID, 'R1C1','
船运号',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C2','
到达日期',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C3','
包装箱号',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C4','LRCM
',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C5','SO
标识',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C6','
移交单',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C7','
移交日期',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C8','
移交数量',


DDE.CF_TEXT, 1000);


DDE.Poke(ConvID, 'R1C9','
设备材料描述',


DDE.CF_TEXT, 1000);


OPEN C1;
FOR i IN 1..NCOUNT LOOP


/*
循环从此开始*/

FETCH C1 INTO SHIPMENT_NO_TMP,
ARRIVAL_DATE_TMP,DELIVERY_REF_1_TMP,
DELIVERY_REF_3_TMP,DELIVERY_
REF_2_TMP,CASE_NO_TMP,
LRCM_CODE_TMP,ANN_QUANTITY_TMP,
QUANTITY_DESCRIPTION_TMP,SPARE_PART_TMP,
TRANSFER_NUMBER_TMP,TRANSFER_DATE_TMP;
EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;

/*下面是EXCEL.XLS文件的CELL,
'R2C2'就是第二行第二列*/

CROW:=I+1;


CCOL1:='R'||CROW||'C1';


CCOL2:='R'||CROW||'C2';


CCOL3:='R'||CROW||'C3';


CCOL4:='R'||CROW||'C4';


CCOL5:='R'||CROW||'C5';


CCOL6:='R'||CROW||'C6';


CCOL7:='R'||CROW||'C7';


CCOL8:='R'||CROW||'C8';


CCOL9:='R'||CROW||'C9';



TEMP:=ANN_QUANTITY_TMP;


/*NUMBER
型数据要先转化为varchar*/



DDE.Poke(ConvID, CCOL1, SHIPMENT_NO_TMP,


DDE.CF_TEXT, 2000000000);

/*日期型要用tochar()进行转换*/

DDE.Poke(ConvID, CCOL2, TO_CHAR(ARRIVAL_DATE_TMP),

DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID,CCOL3,DELIVERY_REF_1_TMP

||DELIVERY_REF_3_TMP||



DELIVERY_REF_2_TMP||

CASE_NO_TMP,
DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL4, LRCM_CODE_TMP, DDE.CF_TEXT,

2000000000);

DDE.Poke(ConvID, CCOL5, SPARE_PART_TMP, DDE.CF_TEXT,

2000000000);

DDE.Poke(ConvID, CCOL6, TRANSFER_NUMBER_TMP,

DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL7, TO_CHAR(TRANSFER_DATE_TMP),

DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL8, TEMP, DDE.CF_TEXT, 2000000000);
DDE.Poke(ConvID, CCOL9, QUANTITY_DESCRIPTION_TMP,

DDE.CF_TEXT, 2000000000);


END LOOP;
CLOSE C1;

DDE.Terminate(ConvID);
/*结束DDE会话,此时数据已经全部倒入到EXCEL文件中了*/
END;
在做好以上工作后, 编译运行该fmx文件, 此时确保打开excel.xls文件,用鼠标点击按钮,然后将焦点移到excel.xls文件中,你就会发现一行行数据正在被倒入到EXCEL文件中,等完成后, EXCEL文件保存起来就可以了.
 楼主| 发表于 2008/7/25 15:31:02 | 显示全部楼层
1
使用设置菜单项属性及form 数据项属性限制不同用户的访问范围
----
一个应用系统往往有不同的用户,比如: 一个劳资系统中,一个用户负责管理职工基本档案部分,另一个用户负责管理职工工资部分,管理职工基本档案的用户对职工档案只有查询的权限而不能有修改的权限。实现上述功能的一个简单的实现办法是:

----
设置两个全局变量分别记录用户名和密码,在进入系统时,两个用户分别输入不同的用户名和密码,判断用户名,使SET_MENU_PROPERTY(MENU1,ENABLED,FALSE)语句设置没有查询权限的用户不能访问菜单项'MENU1'

2
提高表连接的查询速度
在表连接查询时,常常用下列查询方法查询数据是:
SELECT
RECORDNO,NAME,AGE

FROM
1

WHERE 1.RECORDNO NOT IN

(SELECT RECORDNO


FROM
2


WHERE
BIRTHDAY='710618');

笔者发现,如果表1的长度为6000条记录,表2的长度为1000条记录, 则要4分钟才能出结果。原因是使用了比较运算符 NOT IN ,它的逻辑测试速度是最慢的。利用外连接替换NOT IN 运算符,查询时间则缩短为50秒。修改方法如下:
SELECT
RECORDNO,NAME,AGE

FROM
1,2

WHERE 1.RECORDNO=2.RECORDNO(+)
AND
2.RECORDNO IS NULL

AND
2.BIRTHDAY(+)='710618';

3
利用用库模块实现模块资源共享
在编程中很多FROM 模块需要共用一个程序单元。ORACLE FORM 4.5提出了库模块的概念。使用库模块建立共享程序单元库,既减少了磁盘占用空间,又增加程序的可维护性。使用库模块共享程序单元的过程是:点击系统菜单的file-new-liberary选项,建立一库模块,program units节点下增加一程序单元, 写入需共享程序的单元编码, 编译后存盘。当FORM模块需共享时,在模块的Attached Libraries节点下连接库模块(此时屏幕会提示是否要删除路径,用户选择NO)。这样,用户便可在FORM模块中直接使用共享程序单元了。
4
易导致查询数据错误的原因
在执行数据查询时,经常发现查询结果与预想的不同,主要原因是:
1.使用 SELECT * FROM <表名> WHERE <字段名> LIKE '%' 语句查询不出 <字段名>NULL的字段。此时需对字段为NULL的情况另外处理。如:SELECT * FROM <表名> WHERE <字段名> LIKE '%' OR <字段名> IS NULL
2.使用union 字段连接各表时,连接顺序不是按书写的先后顺序,而是按连接表的第一个字段排序。因此,为了使表按预想的顺序连接,需在各表中插入第一字段指定排序序号。
5
使用视图组织报表数据简单且易于维护
ORACLE REPORT2.5提供了多种报表格式,但在报表中定义各种统计信息不仅繁琐而且不利于今后的维护,使用视图预先将各种统计、汇总数据准备好,可以起到事半功倍的作用,一旦数据源有所调整,只需修改后台视图,而不用再改前端程序了。
1结构为:
UNIT
NAME
RECORENO
SEX

              办公室    王五
1

              财务科    李四
2


..
..
..
..

1. 首先建立视图对数据进行汇总:
CREATE VIEW
RYTJ (UNIT, BOY,GIRL)

AS SELECT UNIT, SUM(DECODE(SEX,''
,1,0)) , SUM(DECODE(SEX,'',1,0) )
FROM
1

2. 使用 ORACLE REPORT 2.5 对视图'RYTJ'建立报表。
 楼主| 发表于 2008/7/25 15:31:37 | 显示全部楼层
1
给报表加序号的简单办法
ORACLE REPORT 2.5 没有提供加序号功能,使用下述简单方法可实现给报表自动加序号:在数据模板中, 向查询组中加入一个公式列 CF_XH NUMBER(4), 赋初值为0, 点击[EDIT] 按钮, 插入编码RETURN(:CF_CH+1)

2
用FORMS 实 现ORACLE 数 据 库 与 其 它 数 据 源 数 据 的 交 换
---- Developer/2000 接, 扣, 3GL ODBC DLL 现, 杂。 Developer/2000 TEXT_IO 法。 作, 式。 用:( d2kwfile.dll 用)
DECLARE

filename varchar2(128):=null;


filenum text_io.file_type;


linebuf varchar2(100);


r_temp
temp%rowtype;

BEGIN

filename:=d2k_file_dialog.show

('请选择缴费工资台帐原文件','c:\','源文件(*.txt)|*.txt|');

if filename is null then


raise form_trigger_failure; end if;


filenum:=text_io.fopen(filename,'r');


loop


BEGIN


text_io.get_line(filenum,linebuf);


TEXT_IO.PUT(linebuf);TEXT_IO.NEW_LINE;


exception when no_data_found then


exit;


END;


BEGIN


v_temp.l1=substr(linebuf,1,9);


v_temp.l2:= to_number(substr(linebuf,10,5));


insert into temp(l1,l2) values (v_temp.l1,v_temp.l2);


exception when others then


END;


< < end_loop > >


null;


end loop;

END;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 11:38 , Processed in 0.042328 second(s), 15 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表