//2.按统计分类计算明细费用
with ADOQuery_RbdmxBzcz do
begin
Close;
SQL.Clear;
SQL.Add('Select * from Sf_RbdMxBZCZT where 0>1');
Open;
end;
with TADOQuery.Create(nil) do
try
Connection := ADOConnection_Zhsf;
Close;
//这段就是一个sql查询,大家可以不必要看
Sql.Clear;
Sql.Add('Select left(mx.XmDm,1) XmDm, ');
if Param_sf_410 then //410-按收入所属科室/分片进行结帐(1-是)
Sql.Add(' Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc TjXmMc, ')
else
Sql.Add(' Mx.TjXmMc TjXmMc, ');
Sql.Add(' Coalesce(Mx.BZ_CZ, ''0'') BZ_CZ, Coalesce(sf.Bz_FkFs, ''0'') bz_Fkfs,');
Sql.Add(' Sum(Coalesce(Mx.Je,0)) Je ');
Sql.Add('From Sf_ShoufeiInfomx Mx ');
Sql.Add(' Left Join Sf_ShoufeiInfo Sf On (Mx.Sfid=Sf.Sfid) ');
Sql.Add('Where Sf.Bz_Sf = ''1'' and Sf.Bz_jz = ''0'' ');
Sql.Add(Format(' and Sf.Sfrq Between ''%s'' and ''%s''', [mDate1, mDate2]));
Sql.Add(Format(' and Sf.Sfrdm=''%s''', [p_RyDm]));
if vStrfkfs <>'-' then
SQl.Add(Format(' and sf.BZ_fkfs =''%s''', [vStrfkfs]));
if vWorkMode='1' then//非正常模式
SQl.Add(' and ((sf.sflb=''1'' and sf.BZ_Mode =''1'') or sf.sflb <>''1'')')
else
SQl.Add(' and (sf.Bz_Mode is null or sf.BZ_Mode=''0'')');
SQl.Add('Group By Coalesce(Mx.BZ_CZ, ''0''), Coalesce(sf.Bz_FkFs, ''0''), left(mx.XmDm,1), ');
if Param_sf_410 then //410-按收入所属科室/分片进行结帐(1-是)
begin
SQl.Add(' Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc ');
SQl.Add('order by Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc, left(mx.XmDm,1), Coalesce(Mx.BZ_CZ, ''0'')');
end else
begin
SQl.Add(' Mx.TjXmMc ');
SQl.Add('order by left(mx.XmDm,1), mx.TjXmMc, Coalesce(Mx.BZ_CZ, ''0'')');
end; Open;
First;
while not Eof do//你之前从数据库中检索出来了若干条记录,保存在数据集中,Eof指的是数据集的最后
begin
//这个if是不是从上面的sql中查询出的je字段不为空时,执行下面的语句
if FieldByName('Je').AsFloat <> 0 then//这句吗?这是delphi中去的数据集中记录的方式,取的就是数据集中当前记录的值,AsFloat就是说取出的值是Float类型的,比如说,如果你想把数据集中的记录一条一条的取出来,就可以用一个循环,从数据集的第一条开始到最后一条,
begin
//这句看不太懂。我知道这是从Select * from Sf_RbdMxBZCZT where 0>1中的Sf_RbdMxBZCZT表里查询TjXmMc字段值与上面那段sql查询出来的TjXmMc里的值作比较,当不相等时就执行下面的语句。就添加,否则就是修改,可是ADOQuery_RbdmxBzcz不是一个结果集吗?奇怪用if.
if not ADOQuery_RbdmxBzcz.Locate('TjXmMc', FieldByName('TjXmMc').AsString, []) then
begin
ADOQuery_RbdmxBzcz.Append;
ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm;
ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId;
ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1;
ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString;
ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString;
ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString;
end else
ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是 //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat;
if FieldByName('BZ_FkFs').AsString = '1' then//支票
begin
mZpje := mZpje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat;
end else
begin
mXjje := mXjje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat;
end;
ADOQuery_RbdmxBzcz.Post;
end;
Next;
end;
mZje := mXjje + mZpJe;//总金额=现金金额+支票金额
finally
Free;
end;
with ADOQuery_RbdmxBzcz do
begin
Close;
SQL.Clear;
SQL.Add('Select * from Sf_RbdMxBZCZT where 0>1');
Open;
end;
with TADOQuery.Create(nil) do
try
Connection := ADOConnection_Zhsf;
Close;
//这段就是一个sql查询,大家可以不必要看
Sql.Clear;
Sql.Add('Select left(mx.XmDm,1) XmDm, ');
if Param_sf_410 then //410-按收入所属科室/分片进行结帐(1-是)
Sql.Add(' Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc TjXmMc, ')
else
Sql.Add(' Mx.TjXmMc TjXmMc, ');
Sql.Add(' Coalesce(Mx.BZ_CZ, ''0'') BZ_CZ, Coalesce(sf.Bz_FkFs, ''0'') bz_Fkfs,');
Sql.Add(' Sum(Coalesce(Mx.Je,0)) Je ');
Sql.Add('From Sf_ShoufeiInfomx Mx ');
Sql.Add(' Left Join Sf_ShoufeiInfo Sf On (Mx.Sfid=Sf.Sfid) ');
Sql.Add('Where Sf.Bz_Sf = ''1'' and Sf.Bz_jz = ''0'' ');
Sql.Add(Format(' and Sf.Sfrq Between ''%s'' and ''%s''', [mDate1, mDate2]));
Sql.Add(Format(' and Sf.Sfrdm=''%s''', [p_RyDm]));
if vStrfkfs <>'-' then
SQl.Add(Format(' and sf.BZ_fkfs =''%s''', [vStrfkfs]));
if vWorkMode='1' then//非正常模式
SQl.Add(' and ((sf.sflb=''1'' and sf.BZ_Mode =''1'') or sf.sflb <>''1'')')
else
SQl.Add(' and (sf.Bz_Mode is null or sf.BZ_Mode=''0'')');
SQl.Add('Group By Coalesce(Mx.BZ_CZ, ''0''), Coalesce(sf.Bz_FkFs, ''0''), left(mx.XmDm,1), ');
if Param_sf_410 then //410-按收入所属科室/分片进行结帐(1-是)
begin
SQl.Add(' Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc ');
SQl.Add('order by Coalesce(Mx.BmMc, '''')+''.''+Mx.TjXmMc, left(mx.XmDm,1), Coalesce(Mx.BZ_CZ, ''0'')');
end else
begin
SQl.Add(' Mx.TjXmMc ');
SQl.Add('order by left(mx.XmDm,1), mx.TjXmMc, Coalesce(Mx.BZ_CZ, ''0'')');
end; Open;
First;
while not Eof do//你之前从数据库中检索出来了若干条记录,保存在数据集中,Eof指的是数据集的最后
begin
//这个if是不是从上面的sql中查询出的je字段不为空时,执行下面的语句
if FieldByName('Je').AsFloat <> 0 then//这句吗?这是delphi中去的数据集中记录的方式,取的就是数据集中当前记录的值,AsFloat就是说取出的值是Float类型的,比如说,如果你想把数据集中的记录一条一条的取出来,就可以用一个循环,从数据集的第一条开始到最后一条,
begin
//这句看不太懂。我知道这是从Select * from Sf_RbdMxBZCZT where 0>1中的Sf_RbdMxBZCZT表里查询TjXmMc字段值与上面那段sql查询出来的TjXmMc里的值作比较,当不相等时就执行下面的语句。就添加,否则就是修改,可是ADOQuery_RbdmxBzcz不是一个结果集吗?奇怪用if.
if not ADOQuery_RbdmxBzcz.Locate('TjXmMc', FieldByName('TjXmMc').AsString, []) then
begin
ADOQuery_RbdmxBzcz.Append;
ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm;
ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId;
ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1;
ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString;
ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString;
ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString;
end else
ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是 //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat;
if FieldByName('BZ_FkFs').AsString = '1' then//支票
begin
mZpje := mZpje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat;
end else
begin
mXjje := mXjje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat;
end;
ADOQuery_RbdmxBzcz.Post;
end;
Next;
end;
mZje := mXjje + mZpJe;//总金额=现金金额+支票金额
finally
Free;
end;
begin
ADOQuery_RbdmxBzcz.Append;
ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm;
ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId;
ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1;
ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString;
ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString;
ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString;
end else
ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是 //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat;
if FieldByName('BZ_FkFs').AsString = '1' then//支票
begin
mZpje := mZpje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat;
end else
begin
mXjje := mXjje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat;
end;
ADOQuery_RbdmxBzcz.Post;
end;
Next;
end;
mZje := mXjje + mZpJe;//总金额=现金金额+支票金额
finally
Free;
end;
我搞不懂了.如果ADOQuery_RbdmxBzcz.Post之前的是修改,那
if not ADOQuery_RbdmxBzcz.Locate('TjXmMc', FieldByName('TjXmMc').AsString, []) then
begin
ADOQuery_RbdmxBzcz.Append;
ADOQuery_RbdmxBzcz.FieldByName('JgDm').AsString := p_JgDm;
ADOQuery_RbdmxBzcz.FieldByName('RbdId').AsString := vRbdId;
ADOQuery_RbdmxBzcz.FieldByName('Xh').AsInteger := ADOQuery_RbdmxBzcz.RecordCount+1;
ADOQuery_RbdmxBzcz.FieldByName('XmDm').AsString := FieldByName('XmDm').AsString;
ADOQuery_RbdmxBzcz.FieldByName('TjXmMc').AsString := FieldByName('TjXmMc').AsString;
ADOQuery_RbdmxBzcz.FieldByName('BZ_CZ').AsString := FieldByName('BZ_CZ').AsString;
上面这段也是修改?不是添加一条新的记录吗?下面的else就只包含ADOQuery_RbdmxBzcz.Edit;这一句话,还是包含了直到ADOQuery_RbdmxBzcz.Post;end;这里结束?
end else
ADOQuery_RbdmxBzcz.Edit;//这是什么,是修改?怎么看不到修改的语句.修改语句就在下面啊,ADOQuery_RbdmxBzcz.Post之前的都是 //mZje, mXjje, mZpje: Double;//总金额.现金金额.支票金额
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xmje').AsFloat+FieldByName('Je').AsFloat;
if FieldByName('BZ_FkFs').AsString = '1' then//支票
begin
mZpje := mZpje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Zp').AsFloat+FieldByName('Je').AsFloat;
end else
begin
mXjje := mXjje + FieldByName('Je').AsFloat;
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat :=
ADOQuery_RbdmxBzcz.FieldByName('Xj').AsFloat+FieldByName('Je').AsFloat;
end;
ADOQuery_RbdmxBzcz.Post;
end;
Next;
end;
mZje := mXjje + mZpJe;//总金额=现金金额+支票金额
finally
Free;
end;
ADOQuery_RbdmxBzcz.Edit;是修改一条记录
在数据库操作中,增加和修改最终都需要一条ADOQuery_RbdmxBzcz.Post以把修改提交给数据库,我看了一下,那段程序是做了一个判断,符合一种条件就增加一条记录,否则修改当前记录,两个操作公用了一个ADOQuery_RbdmxBzcz.Post,这样些够乱的!
修改操作:
ADOQuery_RbdmxBzcz.Edit;
赋值语句,,
ADOQuery_RbdmxBzcz.Post;插入操作:
ADOQuery_RbdmxBzcz.Append;
赋值语句,,
ADOQuery_RbdmxBzcz.Post;你按这个结构对照一下就清楚了