程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 動態生成合計

動態生成合計

編輯:Delphi
在最近的項目開發過程中,由於客戶的需要,要對數據庫中相同種類的貨物進行匯總統計,經過多方面查閱,發現網上這方面的東西缺乏,於是就寫了一個過程來實現這一功能。由不足之處請大家多多指正,多謝 程序中用到了第三方控件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不存在,所以有一條記錄無法計算,程序最後對這種情況單獨處理。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved