procedure Tmain.SpeedButton1Click(Sender: TObject);
var
i:integer;
x,y:double;
t:tdatetime;
begin
with adoquery3 do //给y,t第一次赋值
begin
close;
sql.Clear;
sql.Add('select 卡片余额,消费金额,消费时间 from trade '+
'where 消费时间 in (select top 1(消费时间) from trade '+
'where 消费时间<:b and 卡号='''+combobox1.text+''' order by 消费时间 desc) and 卡号='''+combobox1.text+''' ');
parameters.ParamByName('b').Value := strtodatetime('2006-7-1 1:00:00') ;
open;
y:=FieldValues['卡片余额']+FieldValues['消费金额'];
t:=fieldvalues['消费时间'];
end;
with adoquery1 do //把数据装入adoquery1进行循环
begin
close;
sql.Clear;
sql.add('select 交易编号,卡号,人员姓名,消费金额,卡片余额,消费时间 '+
'from trade '+
'where 卡号='''+combobox1.text+''' and 消费时间>=(select top 1(消费时间) from trade '+
'where 消费时间<:b and 卡号='''+combobox1.text+''' order by 消费时间 desc) order by 消费时间');
Parameters.ParamByName('b').Value := strtodatetime('2006-7-1 1:00:00') ;
open;
end;
//for i:=0 to adoquery1.Fields.Count-1 do
adoquery1.First;
while not adoquery1.Eof do
begin
//adoquery4.active:=false;
adoquery4.Close; //将充值数据截取
adoquery4.SQL.Clear;
adoquery4.SQL.Add('select 购买金额 from buy where 购买日期>:e and 购买日期<:f and 卡号='''+combobox1.text+'''');
adoquery4.parameters.ParamByName('e').Value :=t;
adoquery4.parameters.parambyname('f').value :=adoquery1.fieldvalues['消费时间'];
adoquery4.open;
t:=adoquery1.fieldvalues['消费时间'];
//adoquery4.Active:=true;
if (adoquery4.fieldcount=1) and (adoquery4.FieldValues['购买金额']=null) then//两时间点没有充值
begin
adoquery1.Edit;
x:=adoquery1.fieldvalues['消费金额'];
adoquery1.fieldvalues['卡片余额']:=y-x;
y:=adoquery1.fieldvalues['卡片余额'];
adoquery1.Post;
end;
if (adoquery4.fieldcount=1) and (adoquery4.fieldvalues['购买金额']<>null)then //充值一次
begin
adoquery1.Edit;
x:=adoquery1.fieldvalues['消费金额'];
adoquery1.fieldvalues['卡片余额']:=y-x+adoquery4.FieldValues['购买金额'];
y:=adoquery1.fieldvalues['卡片余额'];
adoquery1.Post;
end;
if adoquery4.Fieldcount>1 then//充值多次
begin
showmessage('充值记录过多,请手动改动');
end;
adoquery1.Next;
end;
insert into mytest values('a001',20,100)
insert into mytest values('a001',30,20)
insert into mytest values('a001',10,10)
insert into mytest values('a001',8,2)
declare mycursor cursor
for
select FID, FConsume,FSpare
from Mytest
for update of FSpare
open mycursor
fetch mycursor
into @FID, @FConsume, @FSpare
while @@Fetch_status = 0
begin
if @FID1 = @FID
begin
set @FSpare1 = @FSpare1 - @FConsume
update mytest set FSPare = @FSpare1
where current of mycursor
end
else begin
set @FID1 = @FID
set @FSpare1 = @FSpare
end
fetch next from mycursor into @FID, @FConsume, @FSpare
end
insert into mytest values('a001',20,100)
insert into mytest values('a001',30,20)
insert into mytest values('a001',10,10)
insert into mytest values('a001',8,2)
declare mycursor cursor
for
select FID, FConsume,FSpare
from Mytest
order by FID
for update of FSpare
open mycursor
fetch mycursor
into @FID, @FConsume, @FSpare
while @@Fetch_status = 0
begin
if @FID1 = @FID
begin
set @FSpare1 = @FSpare1 - @FConsume
update mytest set FSPare = @FSpare1
where current of mycursor
end
else begin
set @FID1 = @FID
set @FSpare1 = @FSpare
end
fetch next from mycursor into @FID, @FConsume, @FSpare
end