1

我将 SQL Server 2005 与 Delphi 2010 一起使用

ventas我有一张id_venta(PK)= id_sale, total(of the sale), (more values), estado=state(active/inactive) 和cumulative.

该表记录了一个商店的所有商品的销售额,我需要逐行记录总和的累计。如果一天中有多个班次,我使用 state 字段来指定班次中的销售额。我使用这个查询:

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<=@id and estado='activo') where id_venta=@id
    select @id=@id+1 
  end 

当我在 SQL 上运行它时,这个查询完全符合我的要求,但是当我在 delphi 上执行它时,它只给了我大约 151 行 431 的累积,没有完成。

这是我的德尔福代码:

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<=@id and estado='+char(39)+'activo'+char(39)+') where id_venta=@id');
conect.Q_equivalencias.SQL.Add('select @id=@id+1 end');
conect.Q_equivalencias.ExecSQL;

我该怎么做才能完成我在 Delphi 中的查询?

编辑:

刚刚发生了奇怪的事情,我尝试了conect.Q_equivalencias.Open;insted of conect.Q_equivalencias.ExecSQL;,当然它抛出了我,error creating cursor handler 但它完成了查询,所有行都更新了,这是为什么呢?

尝试了很多东西,似乎我在 delphi 上的查询只更新了 152 行......

4

1 回答 1

2

也许SET NOCOUNT ON;在查询开头添加 a 可能会解决问题。

也就是说,我会使用单个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'
    );
于 2012-09-09T09:54:44.870 回答