1

Delphi 2010でSQL Server 2005を使用しています

(PK)= id_sale、(ventas販売の)、(その他の値)、=state(active/inactive) および.id_ventatotalestadocumulative

テーブルには店舗の商品のすべての売上が登録されており、行ごとに合計の累積合計を登録する必要があります。1 日に複数のシフトがあった場合、状態フィールドを使用してそのシフトで行われた売上を指定します。このクエリを使用しています:

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 で実行すると正確に実行されますが、デルファイで実行すると、約 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 ofconect.Q_equivalencias.ExecSQL;を試してみましたが、もちろんそれは私をスローしましたerror creating cursor handler が、クエリを終了し、すべての行が更新されました。なぜですか?

多くのことを試しましたが、デルファイでの私のクエリは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 に答える