三层调用要指定日期段有返回值的存储过程,总是少了两天的数据? (50分)

  • 主题发起人 主题发起人 懒少爷
  • 开始时间 开始时间

懒少爷

Unregistered / Unconfirmed
GUEST, unregistred user!
一个存储过程,指定日期及其它参数,它会返回结果,但是总是少了两天的数据,在后台SQL ANALYZER
和两层(CLIENT/SERVER)上调用是正常的!如何解决?

CDSmonthlyRpt.Params[1].Value :=CBtype.Text;
CDSmonthlyRpt.Params[2].Value :=CBmodel.Text;
CDSmonthlyRpt.Params[3].Value :=CBver.Text;
CDSmonthlyRpt.Params[4].Value :=DTPfrmD.Date;
CDSmonthlyRpt.Params[5].Value :=DTPtoD.Date;
CDSmonthlyRpt.Open;
如果要取得2002.06.01到现在的数据,你一定要把DTPfrmD.Date赋为2002.05.30.
如果赋为2002.05.31,只能得到2002.06.02到现在的数据!
困死我了!!
 
用的midas还是dicom,还是corba
 
用的是midas. SocketConnection.
 
你写一个过程,传递一个Date的Value到服务器,然后显示Date出来看有没有变化
应该不是这个问题,我用rds,用Variant传date值是正常的
 
谢谢QDYOUNG-------
在服务器如何看客户端传来的VALUE?不行呀!
我追踪过了,在传入一刻,日期VALUE是对的!
--------------------------------------------
我真算是服了,服务器端把ADOstoredproc和DatasetProvider去掉,保存,编译.再把他们加上,重新做过,
编译,结果一样!!客户端也如此,把Clientdataset去掉,保存,编译,再把他们加上,重新做过,结果一样!!!
I 服了YOU!!!
 
服务器端可以在delphi中运行调试看,或者插入某个临时数据库,或者ShowMessage,
或者写入文件,如果服务器端得到的值一样那就奇怪了
我有同事用sql server,直接把date的值与sql server日期字段转成float进行比较,
就是要查几天,原因应该是sql server的日期字段转成float起点与delphi的不同。
不知这对你有没启发。
 
Sql的日期和delphi的日期上是以float存的,不同版本起始日不同,你可以在同一日期,找出相差的值
sql存程:
CREATE PROCEDURE ccc1 @dat1 float,@dat2 float AS
SELECT xbm,zwm,rq,sl AS jc
FROM yidong
WHERE ((sl > 0 AND bz <> '入手') OR
(sl < 0 AND bz = '入手')) AND( convert(float,rq)+2 >= @dat1 AND convert(float,rq)+2 <= @dat2)
ORDER BY rq
Delphi程序:
datajllr1.sums.CLOSE;
datajllr1.sums.unprepare;
datajllr1.sums.PARAMBYNAME('@dat1').Asfloat:=dtp1.datetime;
datajllr1.sums.PARAMBYNAME('@dat2').Asfloat:=dtp2.datetime;
datajllr1.sums.Prepare;
datajllr1.sums.execproc;
datajllr1.sums.open;
//datajllr1.sums :storedproc
 
两位都说[red]起点不同[/red],难道BORLAND和MS没有一个标准协议的吗?天哪,这可叫我们如何是好?!
但我尝试用FLOAT比较,却在SQL ANALYZER都得不到数据?!
不如贴我的存储过程出来,蓝色的是改为FLOAT比较用的.
CREATE PROCEDURE [MonthlyReport] @T char(15),@M char(20),@V char(10),@frmD datetime,@toD datetime
[blue]---CREATE PROCEDURE [MonthlyReport] @T char(15),@M char(20),@V char(10),@frmD float,@toD float[/blue]
AS
/*
Purpose :
从DAILYCPK表里统计每月有多少项的cp&amp;cpk >1.33 or <=1.33
*/
declare @Gcp int --Good Cp >1.33
declare @Bcp int --Bad Cp <=1.33
declare @GCpk int
declare @BCpk int
declare @curDate datetime
[blue]---declare @curDate float[/blue]
set nocount on
--临时表
create table #MonthlyRpt(
ActionDate Datetime,
GoodCp int,
BadCp int,
GoodCpk int,
BadCpk int
)
set @curDate=@FrmD
while @curDate<=@toD
begin
set @GCp=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(char(8),Actiondate,112)=convert(char(8),@curDate,112) AND cp>1.33 )
set @BCp=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(char(8),Actiondate,112)=convert(char(8),@curDate,112) AND cp<=1.33 )
set @GCpk=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(char(8),Actiondate,112)=convert(char(8),@curDate,112) AND cpk>1.33 )
set @BCpk=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(char(8),Actiondate,112)=convert(char(8),@curDate,112) AND cpk<=1.33 )
if (@Gcp<>0 or @Bcp<>0 or @GCpk<>0 or @BCpk<>0 )
begin
insert into #MonthlyRpt values(@curDate,@Gcp,@Bcp,@GCpk,@Bcpk)
end
set @curDate=@curDate+1 --NEXT DAY
continue
end

[blue]/*
set @curDate=@FrmD
while @curDate<=@toD
begin
set @GCp=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(float,Actiondate)=@curDate AND cp>1.33 )
set @BCp=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(float,Actiondate)=@curDate AND cp<=1.33 )
set @GCpk=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(float,Actiondate)=@curDate AND cpk>1.33 )
set @BCpk=( select count(*) from dailycpk where modeltype=@T and model=@M and Ver=@V and convert(float,Actiondate)=@curDate AND cpk<=1.33 )
if (@Gcp<>0 or @Bcp<>0 or @GCpk<>0 or @BCpk<>0 )
begin
insert into #MonthlyRpt values(@curDate,@Gcp,@Bcp,@GCpk,@Bcpk)
end
set @curDate=@curDate+1
continue
end
*/[/blue]
set nocount off
select * from #MonthlyRpt order by ActionDate

//////////////////////////////////////////////////////
 
to 懒少爷:
xuhuizhe说的没错,并不是三层的问题,你把程序换成两层试一下,保证问题依旧。
sql server中定义的时间类型的形参,Delphi以float或Datetime为实参传递调用的话,肯定
有2天的差异。
建议你实参用字符串
 
ziyu:
两层没有问题!!在VB和DELPHI中试过都没有问题!
 
to 懒少爷
没问题?
试试下面的代码,你就会发现问题了
表: tbltest:
字段: ID int, begin
date datetime,enddate datetime
code:
adoquery1.close;
adoquery1.sql.text:='insert into tbltest(id,begin
date,enddate) values(1,'
+floattostr(now)+','+floattostr(now+1)+')';
adoquery1.execsql;
 
来迟了!
ABS(DELPHI.DATE - SQL.DATE) = 2天!
用STRING传递就没问题了!
 
多谢各位,我用字符串传递了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部