2012-09-06 63 views
1

进出口使用SQL Server 2005中使用Delphi 2010SQL查询犯规完成

我有一个表ventasid_venta(PK)= id_sale,total(的销售),(以上数值),estado =状态(有效/无效)和cumulative

该表注册商店的所有物品的销售,我需要注册总行逐行的累计总和。如果一天中有多个班次,则使用状态字段指定班次中的销售额。即时通讯使用此查询:

Declare @id integer; 
set @id=(Select min(id_venta) from ventas where estado='activo'); 

while(select @id)<=(Select max(id_venta) from ventas) 
    begin 
    update ventas set acumulado=(select sum(total) from ventas 
    where id_venta<[email protected] and estado='activo') where [email protected] 
    select @[email protected]+1 
    end 

此查询确实exacly我想要的东西,当我在SQL运行,但是当我做它在德尔福它只是给了我大约151行的431,不整理COMULATIVE。

这是我的Delphi代码:

conect.Q_equivalencias.Active:=false; 
conect.Q_equivalencias.SQL.Clear; 
conect.Q_equivalencias.SQL.Add('Declare @id integer; set @id=(Select min(id_venta) from ventas where estado='+char(39)+'activo'+char(39)+');'); 
conect.Q_equivalencias.SQL.Add('while(select @id)<=(Select max(id_venta) from ventas) begin'); 
conect.Q_equivalencias.SQL.Add('update ventas set acumulado=(select sum(total) from ventas '); 
conect.Q_equivalencias.SQL.Add('where id_venta<[email protected] and estado='+char(39)+'activo'+char(39)+') where [email protected]'); 
conect.Q_equivalencias.SQL.Add('select @[email protected]+1 end'); 
conect.Q_equivalencias.ExecSQL; 

我有什么做的,所以我在Delphi查询完成?

编辑:

奇怪的事情发生了,我试着用conect.Q_equivalencias.Open; insted的的conect.Q_equivalencias.ExecSQL;和ofcourse它扔我一个error creating cursor handler 但它完成了查询,所有行进行了更新,这是为什么?

试了很多东西,看来我的德尔福查询只更新152行...

+0

您正在使用哪个数据库组件? – RRUZ

+0

TQuery,TDataSource,通过ODBC连接,我有更多的插入,更新,选择查询,但这是唯一一个给我一个问题,查询本身做什么必须在SQL管理Studio Express中做但在Delphi 2010中不完。 –

+0

我见过一个类似的问题,那就是查询花费的时间长度,如果它占用了一定的数量,它将只是无限期地挂起。这是几年前,我不记得我们如何解决它。 –

回答

2

也许在您的查询可能解决问题的开头添加一个SET NOCOUNT ON;

这就是说,我会使用单个UPDATE声明(或更好的VIEW或计算列),而不是这样一个奇怪的查询。我不确定查询是否确实按照您的要求进行了操作,但以下单个语句应该做相同的操作:

UPDATE ventas 
    SET acumulado=(
     SELECT SUM(v.total) 
     FROM ventas v 
     WHERE v.id_venta<=ventas.id_venta AND estado='activo' 
    ) WHERE id_venta>=(
     SELECT MIN(id_venta) 
     FROM ventas 
     WHERE estado='activo' 
    ); 
+0

该查询工作,至少在SQL中,而不是在Delphi中,但即时通讯不太擅长SQL,因此与此查询相比,这是一个奇怪的查询......你的工作非常完美,谢谢。 –