Hi Med + Sieghard.
I would propose this:
procedure tmsebufdataset.sumfield(const afield: tfield; out asum: currency);
var
int1,int2: integer;
index1: integer;
po1: precheaderty;
po2: pprecheaderty;
bo1,bo2: boolean;
state1: tdatasetstate;
begin
checksumfield(afield,[ftinteger,ftbcd,ftfloat]); // this changed
index1:= afield.fieldno - 1;
asum:= 0;
bo1:= filtered and assigned(onfilterrecord);
state1:= settempstate(tdatasetstate(dscheckfilter));
try
int2:= ffieldinfos[index1].base.offset;
po2:= pointer(findexes[0]);
case ffieldinfos[afield.fieldno-1].base.fieldtype of
ftinteger: begin // this added
if bo1 then begin
for int1:= 0 to fbrecordcount - 1 do begin
fcheckfilterbuffer:= pdsrecordty(pchar(ppointeraty(po2)[int1])-
sizeof(dsheaderty));
bo2:= true;
onfilterrecord(self,bo2);
if bo2 and getfieldflag(
@fcheckfilterbuffer^.header.fielddata.nullmask,index1) then
begin
asum:= asum + pinteger(pchar(@fcheckfilterbuffer^.header)+int2)^;
end;
end;
end
else begin
for int1:= 0 to fbrecordcount - 1 do begin
po1:= ppointeraty(po2)^[int1];
if getfieldflag(@po1^.fielddata.nullmask,index1) then begin
asum:= asum + pinteger(pchar(po1)+int2)^;
end;
end;
end;
end;
ftbcd: begin
if bo1 then begin
for int1:= 0 to fbrecordcount - 1 do begin
fcheckfilterbuffer:= pdsrecordty(pchar(ppointeraty(po2)[int1])-
sizeof(dsheaderty));
bo2:= true;
onfilterrecord(self,bo2);
if bo2 and getfieldflag(
@fcheckfilterbuffer^.header.fielddata.nullmask,index1) then
begin
asum:= asum + pcurrency(pchar(@fcheckfilterbuffer^.header)+int2)^;
end;
end;
end
else begin
for int1:= 0 to fbrecordcount - 1 do begin
po1:= ppointeraty(po2)^[int1];
if getfieldflag(@po1^.fielddata.nullmask,index1) then begin
asum:= asum + pcurrency(pchar(po1)+int2)^;
end;
end;
end;
end;
ftfloat: begin
if bo1 then begin
for int1:= 0 to fbrecordcount - 1 do begin
fcheckfilterbuffer:= pdsrecordty(
pchar(ppointeraty(po2)^[int1])-sizeof(dsheaderty));
bo2:= true;
onfilterrecord(self,bo2);
if bo2 and getfieldflag(
@fcheckfilterbuffer^.header.fielddata.nullmask,index1) then
begin
asum:= asum + pdouble(pchar(@fcheckfilterbuffer^.header)+int2)^;
end;
end;
end
else begin
for int1:= 0 to fbrecordcount - 1 do begin
po1:= ppointeraty(po2)^[int1];
if getfieldflag(@po1^.fielddata.nullmask,index1) then begin
asum:= asum + pdouble(pchar(po1)+int2)^;
end;
end;
end;
end;
end;
finally
restorestate(state1);
end;
end;
____________________________________________________
But if you allow to sum integers into currency variable, there is no reason
why not to do it too to sum integer into double variable.
Fre;D
--
Sent from: http://mseide-msegui-talk.13964.n8.nabble.com/
_______________________________________________
mseide-msegui-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mseide-msegui-talk