能否在QReport中调用InterBase的存储过程?(100分)

  • 主题发起人 主题发起人 chengli
  • 开始时间 开始时间
C

chengli

Unregistered / Unconfirmed
GUEST, unregistred user!
我的存储过程是带有Input的Select存储过程,在Form1中给Input输入参数,然后在Form2中
QReport中的TQRDBText要接收存储过程的Output。
 
我的天,IBQUERY它返回的是一个数据集,和普通的数据集一样设置就行。
 
我知道它是个数据集,关键是不能调用带有输入参数的存储过程,就是没有带输入参数的
也不行,一直出现multiple row in singleton select的SQL错误。
 
不要用TIBStoredProc执行返回数据集的存储过程,换用TIBQuery试试,我做的没问题出现

如不行,可能就是你存储过程写的不对,或QReport设置的不对,(你的QReport控件设置

dateset了吗?)
 
外界如何给TIBQuery传参数,就是我们在窗体接收参数,如何通过TIBQuery传给存储过程
输入参数。然后得到我们想要的查询结果数据。可否把查询数据存入个临时表,要是可以
该如何实现。看看我写的存储过程有什么不合适。
CREATE PROCEDURE GET_PHO_PROP (
PHONEID CHAR(10),
PHONENO CHAR(16),
ZONEID SMALLINT,
LOCATION CHAR(255)
) RETURNS (
PHONE_NO CHAR(16),
INSTALLDATE DATE,
ZONE_ID SMALLINT,
LOCATION1 CHAR(255),
PHONE_ID CHAR(10),
ZONENAME CHAR(255),
P001 CHAR(6),
P002 CHAR(6),
P003 CHAR(6),
P004 CHAR(6),
P005 CHAR(6),
P006 CHAR(6),
P008 CHAR(6),
P009 CHAR(6),
P010 CHAR(6),
P011 CHAR(6),
P013 CHAR(6),
P014 CHAR(6),
P310 CHAR(4),
P311 CHAR(4),
P312 CHAR(4),
P313 CHAR(4),
P314 CHAR(4),
P200 CHAR(2),
P202 CHAR(2),
P203 CHAR(2),
P204 CHAR(2),
P205 CHAR(2),
P206 CHAR(2),
P300 CHAR(10),
P301 CHAR(6),
P302 CHAR(2),
P303 CHAR(2),
P305 CHAR(4),
P306 CHAR(2)
) AS
BEGIN
SELECT phone.PHONENO,phone.INSTALLDATE,phone.ZONEID,phone.LOCATION,phone.PHONEID,zone.ZONENAME,addup.P001,addup.P002,addup.P003,addup.P004,addup.P005,addup.P006,addup.P008,addup.P009,addup.P010,addup.P011,addup.P013,addup.P014,
phone.P310,phone.P311,phone.P312,phone.P313,phone.P314,
phone.p200,phone.p202,phone.p203,phone.p204,phone.p205,phone.p206,phone.P300,phone.P301,phone.P302,phone.P303,phone.P305,phone.P306
FROM phone,zone,addup
WHERE phone.PHONEID=addup.PHONEID
AND phone.ZONEID=zone.ZONEID
AND (phone.phoneid = : phoneid
OR phone.ZONEID = : zoneid
OR phone.PHONENO = :phoneno
OR phone.LOCATION = :location)
INTO:PHONE_NO,:INSTALLDATE,:ZONE_ID,:LOCATION1,:PHONE_ID,:ZONENAME,:P001,:P002,:P003,:P004,:P005,:P006,:P008,:P009,:P010,:P011,:P013,:P014,:P310,:P311,:P312,:P313,:P314,:P200,:P202,:P203,:P204,:P205,:P206,:P300,:P301,:P302,:P303,:P305,:P306;
SUSPEND;
END
 
>>外界如何给TIBQuery传参数
IBQuery1.CLOSE;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('SELECT * FROM GETMYDATE(:HH)');
IBQuery1.ParamByName('HH').AsString := Edit1.Text;//Edit1.Text为查询的参数
IBQuery1.Open;
>>可否把查询数据存入个临时表
interbase可能没有临时表这种概念,不过你还是可以把查询获得的数据集存到一个已
存在的表中,语法如下:
INSERT INTO PROJECTS //PROJECTS为目标表
SELECT * FROM NEW_PROJECTS //为查询获得的数据集
WHERE NEW_PROJECTS.START_DATE > '6-JUN-1994';
>>看看我写的存储过程有什么不合适
首先佩服你能写出这么‘复杂’的存储过程,(一看就让我头大,所以字段没细看),不
过确实有点问题,改正如下在:
在SELECT 前面加上FOR
在SUSPEND;上面加上DO
然后再试试应该有数据集返回。
 
谢谢了,不过那该如何在QReport中的TQRDBText设置dataset和datafield呢?
该存储过程要实现的是四个条件,只要选择一条(单独)给存储过程的输入,就能
相应的查询结果。是否有字段(如*)可代替所有的字段,即一个有输入,别的就为*。
 
>>如何在QReport中的TQRDBText设置dataset和datafield呢?
QRListForm:=TQRListForm.Create(application);
QRListForm.QuickRep1.DataSet:=form1.IBQuery1;
QRListForm.QRDBText1.DataSet:=form1.IBQuery1 ;
QRListForm.QRDBText1.DataField:=IBQuery1.Fields[0].FieldName;
QRListForm.QuickRep1.Preview ;
>>该存储过程要实现的是四个条件,只要选择一条(单独)给存储过程的输入,就能
>>相应的查询结果。是否有字段(如*)可代替所有的字段,即一个有输入,别的就为*。
我还没有想到有什么理由把存储过程做成那个样子。
interbase好象没有这个功能,即使SQL好象也没有,如果却实有必要把存储过程做成那个
样子,那么只好改写你的存储过程,在里面自行判断。否则,干脆把一个存储过程写成四
个,自已在程序里面分析输入的参数分别调用,这样倒省事,有灵活性。
 
谢谢您费心了。我只是想省事才想把存储过程写成一个。这样可以在一个QReport实现调用。
先给你分,我还想提个问题,能帮我实现吗?
写一个存储过程,每台电话有多条话单,以电话为Group,统计电话及话费,且条件话费不
能少于300,之后又以地区对电话进行统计,如每个区域收入过300地台数。
 
接受答案了.
 
在存储过程中要返回数据集
要使用 FOR SELECT * FROM TABLE INTO :PARAM
DO
BEGIN
......
SUSPEND;
END
 
同志:请遵守大富翁的规则,对帮你解决问题的同志给予一定的大富翁元,以示对他帮助
的感谢,(尽管不是人民币)
请另申请此问题,并在此告诉我,我会把写好的存储过程给你的。
 
我在c/s中已经出好题目了,欢迎你来!!!
“如何写个存储过程? ”
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
893
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部