在最近的項目開發過程中,由於客戶的需要,要對數據庫中相同種類的貨物進行匯總統計,經過多方面查閱,發現網上這方面的東西缺乏,於是就寫了一個過程來實現這一功能。由不足之處請大家多多指正,多謝
程序中用到了第三方控件vsflexgrid,過程中變量vsgrid可以換成stringgrid但其中的部分代碼要做必要的刪除。
procedure heji(vsgrid:tvsflexgrid);
var
comn_num,heji,kk,ll:integer; //comn_num: vsgrid的列數 heji:保存合計值 kk:保存程序讀取的行數之差
he:boolean;
begin
ceshi:=vsgrid.Rows-1;
he:=false;
try
for record_flag:=conm to ceshi do
begin
if he=true then begin //為真則合計出現過
if record_flag<conm then //跳過合計
begin
he:=false;
continue; //執行下一循環 跳過本循環
end;
end;
if (vsgrid.TextMatrix[record_flag,0]<>vsgrid.TextMatrix[record_flag+1,0]) then //判斷相鄰紀錄是否同類型
begin //不相同則:
he:=true;
vsgrid.AddItem(vsgrid.textmatrix[record_flag,0]+'合計',record_flag+1); //在record_flag處增加合計行
for comn_num:=5 to vsgrid.Cols-1 do //循環計算要合計的字段值
begin heji:=0;
for record_flag2:=conm to record_flag do //從conm處開始計算
begin
if (trim(vsgrid.TextMatrix[0,col])='周計劃') or (trim(vsgrid.TextMatrix[0,comn_num])='上周欠產') or (trim(vsgrid.TextMatrix[0,comn_num])='當日')
or (trim(vsgrid.TextMatrix[0,comn_num])='累計') or (trim(vsgrid.TextMatrix[0,comn_num])='欠產') then
begin
// if (vsgrid.TextMatrix[record_flag,6]='直供機') or (vsgrid.TextMatrix[record_flag,6]='內提機') then
heji:=strtoint(vsgrid.TextMatrix[record_flag2,comn_num])+heji; //保存合計值
vsgrid.Select(record_flag+1,comn_num); //
vsgrid.CellForeColor:= clwhite; //給合計換顏色
vsgrid.Text:=inttostr(heji); //給vsgrid的cell負值
vsgrid.Select(record_flag+1,11);
vsgrid.Text:=vsgrid.TextMatrix[record_flag,11];
vsgrid.Select(record_flag+1,12);
vsgrid.Text:=vsgrid.TextMatrix[record_flag,12];
end;
end;
vsgrid.Select(record_flag+1,col);
vsgrid.CellBackColor:=clhighlight; //改變背景顏色
end;
conm:=record_flag+2; //增加合計後 conm+2 跳過合計
ceshi:=vsgrid.Rows; //vsgrid增加了一行,重新負值
end;
end;
except
kk:=vsgrid.Rows-record_flag;
end;
//由於當循環到最後兩條記錄時,record_flag+1不存在所以有一條記錄無法計算,在這裡處理,代碼如下:
kk:=vsgrid.Rows-record_flag; //計算行數與比較過的行數之差
if kk>1 then ll:=1 else ll:=0;
if (record_flag+kk)=vsgrid.Rows then
begin
vsgrid.AddItem(vsgrid.textmatrix[record_flag+kk-1,0]+'合計',record_flag+kk);
for comn_num:=5 to vsgrid.Cols-1 do
begin heji:=0;
for record_flag2:=conm to record_flag+ll do
begin
if (trim(vsgrid.TextMatrix[0,col])='周計劃') or (trim(vsgrid.TextMatrix[0,comn_num])='上周欠產') or (trim(vsgrid.TextMatrix[0,col])='當日')
or (trim(vsgrid.TextMatrix[0,col])='累計') or (trim(vsgrid.TextMatrix[0,comn_num])='欠產') then
begin
heji:=strtoint(vsgrid.TextMatrix[record_flag2,comn_num])+heji;
vsgrid.Select(record_flag+kk,comn_num);
vsgrid.CellForeColor:= clwhite;
vsgrid.Text:=inttostr(heji);
vsgrid.Select(record_flag+kk,11);
vsgrid.Text:=vsgrid.TextMatrix[record_flag+kk-1,11];
vsgrid.Select(record_flag+kk,12);
vsgrid.Text:=vsgrid.TextMatrix[record_flag+kk-1,12];
end;
end;
vsgrid.Select(record_flag+kk,comn_num);
vsgrid.CellBackColor:=clhighlight;
end;
exit;
end;
上述算法很簡單,首先把相鄰的兩Rows德number付給兩個變量,然後比較這兩行的種類字段值,相同的話,繼續負值,不相同的話,就在Rows值最大的行上插入和集字段,然後在這一行上合計要進行合計的字段值,合計完畢後,跳過合計行,繼續執行。由於當循環到最後兩條記錄時,最大行+1不存在,所以有一條記錄無法計算,程序最後對這種情況單獨處理。