请问有人使用过存储过程开发报表吗(0分)

  • 主题发起人 主题发起人 topdelphi
  • 开始时间 开始时间
T

topdelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
请问有人使用过存储过程开发报表吗,请教具体的思路和方法的如何做的,麻烦请指教,
谢谢,
 
这不是和query、table一样的道理吗,
或者你再说清楚些,举个例子。
 
我也不知道具体是如何,但是我的主管他是在存储过程里写报表的,然后再调用过程输出,
我不知道应该怎样写法,在存储过程里用那些函数,请教有没有相关的例子啊.谢谢.
 
...
//create a stored with name 'aa'
//it can return a dataset from table
with query1do
begin
close;
sql.clear;
sql.add('create procedure aa');
sql.add('as');
sql.add('select * from table');
execsql;
end;
//uses the stored aa
with storedprocdo
begin
active := false;
storedprocname := 'aa;1';
active := true;
end;
...
you can use the storedproc as query
 
谢谢你的回答,但是这种写法,如果是开发复杂的报表是不是好难做到呢,好像开发一些订单
报表和交叉报表,又如何做呢?
例如上面的代码只会显示示如下的记录,但如果显示成C,B,A呢,又如何做呢????
ID
A
B
C
 
要排序成c,b,a也行,不过b,a,c就有些麻烦了.
 
事实上用存储过程写报表的也只适合那些取数据相对复杂的报表,我们可以用存储过程把
数据一条条选出来,放在临时表或其它表中,最后再一起select出来,形成一张报表。
比如:
//create a stored with name 'aa'
//it can return a dataset from 3 tables
with query1do
begin
close;
sql.clear;
sql.add('create procedure aa');
sql.add('as');
sql.add('declare @i int, @a float');
sql.add('declare @j float output');
sql.add('declare cur cursor for select id, a from table1 order by id');
sql.add('open cur');
sql.add('fetch cur into @i, @a');
sql.add('set @j = 0');
sql.add('while @@fetch_status = 0 ');
sql.add('begin
');
sql.add(' if @a > 0 update table2 set aa = select aaa from table3 where id = @i');
sql.add(' else
update table2 set aa = select aaa from table4 where id = @i');
sql.add(' set @j = @j + @a');
sql.add(' fetch cur into @i, @a');
sql.add('end');
sql.add('close cur');
sql.add('deallocate cur');
execsql;
end;
以上是一个例子,功能是从table1中读取字段a,如果 a>0 则从 table3 中读取字段 aaa 取代 table2
中的字段 aaa, 如果 a<0 则从 table4 中读取字段 aaa 取代 table2中的字段 aaa,@j是个输出变量。
由于本人的机器上没装sql,所以上面的过程语法上不一定正确,只是给出一个例子。
 
非常感谢你的回答,嘻嘻.~~~不过还真复杂啊,如果要开发一些帐单之类的报表,又是要怎样
开发出来呢,有重画的这些之类函数吗,请问那里有例子啊
,
 
只不过是先在存储过程中理好数据,没什么特别。
 
那先生有什么高见呢, 如果要开发一些帐单之类和交叉的报表,请问用什么方法好呢,
谢谢你的回答.
 
我认为,如果要写的查询(不论是不是写报表)如果简单,则可以不用存储过程;当查询复
杂或很耗时间,则最好用存储过程。
用存储过程的好处是速度快,易维护。这是因为存储过程是在服务器端运行的,而且其过程
也不是用程序生成的,是直接写在服务器上的。(上面的例子只是为了说明它与QUEYR区别不
大)
我曾经写过一个报表,是有关质量考核的,它的运算时间是2分多钟。象这样的报表如果不用
存储过程写,首先面临的问题是连接超时,然后是速度...
 
所谓存储过程开发报表,只不过是利用存储过程进行数据抽取和计算,
然后将结果存入一定格式的中间表,但数据的显示和打印还是要借助于
QuickReport或直接用Printer类,在Delphi中实现。
 
quake4000先生,可以比个详细的例子我吗,如果要份的话,日后定必奉上,小弟在此先谢过了.
 
据一个简单点的例子:
1.先建下面的存储过程:
Create Procedure aa
as
declare @i int,@j int, @k int
if exists(select * from temptable)
begin
delete from temptable
end
declare cur cursor for select aaa,bbb from ccc where somthing
open cur
fetch cur into @i,@j
while (@@fetch_status=0)
begin
[do some calculate processing]
select @k=@i[calculate]@j
insert into temptable(col1,col2,col3)
value (@i,@j,@k)
fetch cur into @i,@j
end
close cur
deallocate cur
2.在Delphi中,设置 storedproc1:TStoredProc,使其参数指向存储过程 aa
3.在Delphi中建立Query1:TQuery ,其中区query1.SQL为select * from tmptable
4.按需要画好QuickReport,并设置好query1的各字段显示
5.具体处理代码如下:
begin
storedproc1.execproc;
query1.open;
quickrep1.print;//or quickrep1.preview;
storedproc1.close;
query1.close;
end;
如果还不清楚,请直接给我的e-mail来信,
我将我项目中的相关的代码寄给你,我要下线了。
我的e-mail:roger2yang@163.com
 
谢谢~~~我的E-MAIL如下,可以讲下这个项目的流程比我吗,谢谢
say-forevers@163.com
 
我已给你发去E-Mail。
 
有关报表的,请看看这个东东能否满足你的要求!
http://www.smartparter.com/download/ReportExpert20.zip
 
后退
顶部