ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle开发 » Oracle Developer Suite » 谁能讲讲web发布中使报表异步运行的方式?

标题: 谁能讲讲web发布中使报表异步运行的方式?
离线 gengmao
谦卑之心


精华贴数 1
个人空间 0
技术积分 1011 (1806)
社区积分 27 (6510)
注册日期 2001-10-9
论坛徽章:6
ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员生肖徽章2007版:鼠生肖徽章2007版:鸡
      

发表于 2003-1-16 14:45 
谁能讲讲web发布中使报表异步运行的方式?

我知道forms可以能异步的方式运行报表,不必等待报表运行完成。
假设报表要运行很久,用户从forms应用中退出了。过了一天之后再登录forms程序,查看报表运行状态。
请问要怎么去找到它的报表呢?
是不是用数据库中一个表来保存提交的报表任务?
请讲讲你的实现方式好吗?


只看该作者    顶部
离线 netfloater
革命尚未成功 同志还须努力


精华贴数 1
个人空间 0
技术积分 1471 (1146)
社区积分 77 (3928)
注册日期 2002-7-18
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2003-1-16 19:01 
我没做过这种应用,但我想提点自己的想法吧!

参考你上述的需求,我有以下几点想法:
1。在用户提交报表后,不想等待报表的运行完成,我想这就应该是个后台运行的问题。
      这就是说你的报表需要一个后台程序去向服务器提交这个报表。
2。如果需要后台程序去提交报表程序,我想就应该要有一个表去存放用户提交的报表信息。
3。我倒觉得提交报表的后台程序可以通过DBMS_JOB设置自动周期地运行。

你上述提到的问题,我觉得是一些应用的普遍问题,尤其是对一些大量数据导入的报表。
你都不知道它什么时候会完,什么时候会出错。

我只是提一些想法,希望一起讨论!!!


__________________
100%  *  100%  =  100%      
50%    *  50%    =  25%
只看该作者    顶部
离线 oracler123
版主



精华贴数 0
个人空间 0
技术积分 1354 (1250)
社区积分 1 (33618)
注册日期 2002-11-25
论坛徽章:2
会员2006贡献徽章授权会员    
      

发表于 2003-1-16 23:28 
在 forms里,提交报表时,立即触发一个后台job, 是一个解决问题的好方法。


__________________
我的主页 http://61.144.28.248/dev 欢迎讨论developer开发问题
只看该作者    顶部
离线 gengmao
谦卑之心


精华贴数 1
个人空间 0
技术积分 1011 (1806)
社区积分 27 (6510)
注册日期 2001-10-9
论坛徽章:6
ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员生肖徽章2007版:鼠生肖徽章2007版:鸡
      

发表于 2003-1-20 10:16 
抱歉这么久才回复。。。

我做了一些有关异步运行报表的测试,得出一些经验,也有些问题没有解决。
基本上,提交一个异步运行的报表任务,代码如下:
DECLARE
v_repobj REPORT_OBJECT := find_report_object('report1');
v_repjob VARCHAR2(100);
BEGIN
--设置为异步运行
set_report_object_property(v_repobj, REPORT_COMM_MODE, ASYNCHRONOUS);
--如果设为RUNTIME,forms service启动reports runtime engine运行报表,结果保存在forms server上。
--设为BATCH并且指定REPORT_SERVER,报表在reports service上运行,结果保存在reports server上。
set_report_object_property(v_repobj, REPORT_EXECUTION_MODE,
BATCH);
set_report_object_property(v_repobj, REPORT_SERVER, 'REPSVR');
--异步方式下,不能设置DESTYPE为PREVIEW, SCREEN。这里设为CACHE,以后可以通过CGI到REPORT SERVER取结果。
set_report_object_property(v_repobj, REPORT_DESTYPE, CACHE);
--设置报表格式
set_report_object_property(v_repobj, REPORT_DESFORMAT, 'PDF');
--运行报表,因为异步运行方式,run_report_object立即返回了一个jobid。
v_repjob := run_report_object(v_repobj);
--我们把这个jobid保存到一个全局变量里。
:global.repjob := v_repjob;
END;

利用刚才保存的jobid,我们可以在以后取报表结果:
DECLARE
v_repjob VARCHAR2(100);
v_repstatus VARCHAR2(20);
BEGIN
v_repjob := :global.repjob;
v_repstatus := report_object_status(v_repjob);
IF v_repstatus = 'FINISHED' THEN
--报表保存在report server上,可以用rwcgi60.exe/getjobid[n]取结果。
web.show_document('rwcgi60.exe/getjobid'||v_repjob||'?server=repsvr');
END IF;
END;
上面的例子使用全局变量保存jobid,实际上我们可以将jobid保存在任何地方,例如数据库表、文本文件中。
前面讲过我的需求是希望用户提交报表后可以退出程序,下次某个时间再登录进入检查报表状态,取报表结果。我对上面代码做了一点改动,将jobid保存到表中,以后再从表中取jobid。然而测试发现了一个问题,退出程序后重新进入,report_object_status(jobid)返回null。看来report_object_status在没有调用run_report_object时使用,是无法得到报表状态的。仅管我们可以用getjobid取结果,但是我们不能看到报表状态,这是个遗憾。用户也不能接受用showjobs显示出来的报表状态,他们希望在fomrs程序中看到。

各位有什么好的想法?

ps: 我找到一个有关forms/reports集成的说明,比较有帮助。标题上是9i,实际也适用于6i。
http://otn.oracle.com/products/ias/daily/oct24.html
链接中的文档:


只看该作者    顶部
离线 gengmao
谦卑之心


精华贴数 1
个人空间 0
技术积分 1011 (1806)
社区积分 27 (6510)
注册日期 2001-10-9
论坛徽章:6
ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员生肖徽章2007版:鼠生肖徽章2007版:鸡
      

发表于 2003-1-20 10:26 
刚刚没把文档贴上来


只看该作者    顶部
离线 gengmao
谦卑之心


精华贴数 1
个人空间 0
技术积分 1011 (1806)
社区积分 27 (6510)
注册日期 2001-10-9
论坛徽章:6
ITPUB元老管理团队2006纪念徽章会员2006贡献徽章授权会员生肖徽章2007版:鼠生肖徽章2007版:鸡
      

发表于 2003-1-20 13:27 
[Gengmao Buddy, Nice!


Before we jump to the next issue - 我的需求是希望用户提交报表后可以退出程序,下次某个时间再登录进入检查报表状态,取报表结果。


Might I raise a few questions,

1>. What's 异步运行? Is that set_report_object_property(v_repobj, REPORT_COMM_MODE, ASYNCHRONOUS); mean ASYNCHRONOUS?

Yes.
I mean 异步 is the mode that forms application needn't wait for finishing report. In most translated books, asynchronous is translated to 异步. Hope this Chinese term doesn't make you confused more

1>. before using find_report_object('report1'); to call the REPORT1 object, does we need to declare the report object first inside the form? if so, what properties should we define?
Yes. We need to create a report object in forms builder,  then we can define its properties in property palette or SET_REPORT_OBJECT_PROPERY in run-time, such as FILENAME, EXECUTION_MODE, COMM_MODE, DESTYPE, DESNAME, DESFORMAT, REPORT_SERVER etc.
To run a report object, we must declare a REPORT_OBJECT variable in pl/sql,use FIND_REPORT_OBJECT(report_object_name) to get report object id into the variable. Then call RUN_REPORT_OBJECT by passing this variable as argument.

3>. Most default Report Server has underscore and digit for their names, do they work fine for RUN_REPORT_OBJECT built-in?  If not, what steps/settings do we need to change?
Yes.
If report server has underscore for their name, it will work fine for RUN_REPORT_OBJECT, but can *not* work for REPORT_OBJECT_STATUS. To avoid this, we can add a report service entry in tnsnames.ora on forms server. For example, our default report server name is 'REP60_GENGMAO-ORADEV6I':
Rep60-GENGMAO-OraDev6i,
Rep60-GENGMAO-OraDev6i.world =
        (ADDRESS =
                (PROTOCOL=tcp)
                (HOST=GENGMAO)
                (PORT=1949)
        )
We can add a new 'repsvr' entry point to same report service, then use 'repsvr' as report server name:
repsvr.world =
        (ADDRESS =
                (PROTOCOL=tcp)
                (HOST=GENGMAO)
                (PORT=1949)
        )

4>. The RUN_REPORT_OBJECT returns a reportid that usually is the name of reportserver with a underscore as well as the jobid, eg. REPSVR_100 is the 100th report job in REPSVR report server, right?
Yes. you are right.

If so, does the statement
web.show_document('rwcgi60.exe/getjobid'||v_repjob||'?server=repsvr');
works fine?  Have you gotten a chance to check it in production?

Oh, there maybe exists a mistake. If you use above way to take an alias name for report server, maybe you should use 'server=REP60_GENGMAO-ORADEV6I' instead of 'server=repsvr'. I am not sure about it, but if your report server's actual name is 'repsvr', sure it works. I tested on my home computer, but now I can't test. My home computer installed oracle9i db, oracle forms/reports 6i, it is a client/web server/form server/report server/database server! haha

Thanks for your concern, App. And hope my English doesn't make you give up

-- gengmao


只看该作者    顶部
离线 taoziyuan
初级会员



精华贴数 0
个人空间 0
技术积分 36 (35747)
社区积分 0 (1541438)
注册日期 2007-9-4
论坛徽章:1
ITPUB新首页上线纪念徽章     
      

发表于 2007-10-18 22:17 
Csdn的一个将报表的博客,供参考http://blog.csdn.net/for_report


只看该作者    顶部
离线 alexandre2008



精华贴数 0
个人空间 0
技术积分 62 (23874)
社区积分 0 (1761369)
注册日期 2008-4-24
论坛徽章:0
      
      

发表于 2008-7-21 11:01 
FND_REQUEST.SUBMIT_REQUEST  可提交后台请求,挺方便的


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问