今天接到一个CASE,要求做几个分类汇总,可苦了财务室的魏大侠,以前只是要求对5个片区进行汇总统计,结果今天集团办的领导些要求对各个社区进行汇总统计,六七百个社区啊,全是手动汇总不弄死个人才怪,在了解详细的需求分析后(再一次领会到需求很重要),其实只要一条SQL语句就可以完成,最关键是有些数据要进行人工处理一下后才能方便统计,比如社区名为空的,某些片区不对的,都要手工调整后才能汇总。

于是乎产生一个念头,把系统生成的XLS表格导出后,进行手工处理后,再用工具软件进行分析统计,我需要做的就是做一个分析工具软件,至于手工处理表格,就交给财务室的MM吧,也修改不到多少数据,几分钟就搞定了,关键是分析软件做好,可以节省很多时间,如果全手工的话,恐怕花两天时间整理几百个社区也有点困难哦,关键是全手工处理容易出错,呵呵。

言归正传,看看Delphi如何使用XLS数据源,首先是用ADO连接XLS,其实该SQL连接字符串也可以用于其它语言,连接代码都是一样的。

if OpenDialog1.Execute then
begin
          mydatasrc:=OpenDialog1.FileName;
          try
              con_xls.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+mydatasrc+';Extended Properties=Excel 8.0;Persist Security Info=False';
              con_xls.Connected:=True;
              Application.MessageBox('连接数据源成功!', '提示', MB_OK +
                MB_ICONQUESTION);
          except
              Application.MessageBox('连接数据源失败!', '提示', MB_OK +
                MB_ICONSTOP);
          end; 
end;

将打开的XLS文件作为ADO连接的数据源,连接成功后就可以操作了,excle工作表中第一行会作为字段行,剩下的跟连接SQL SERVER操作一样的。

不过XLS的工作表名要加上$符号,如工作表的名字是fee,那么SQL语句就中表名就应为[fee$],一定要加上[$],不然的话会报SQL语句出错,为了这个中括号,俺找了很多,最后才发现必须加上[],最后附上多字段汇总的SQL,以及汇总统计运算。

procedure TForm1.btn_countClick(Sender: TObject);
var sql:string;
begin
try
    if rb1.Checked then  //按片区汇总
    sql:='select 片区,count(main_id) as 收费户数,sum(缴费金额) as 总金额,sum(缴费周期) as 总周期,sum(优惠天数)'   +' as 总天数,总金额/(总周期+总天数/30) as ARP,(总周期+总天数/30)/收费户数 as 时长 from [fee$] group by 片区'
    else   //按社区名汇总
    sql:='select 社区名,count(main_id) as 收费户数,sum(缴费金额) as 总金额,sum(缴费周期) as 总周期,sum(优惠天数)'  +' as 总天数,总金额/(总周期+总天数/30) as ARP,(总周期+总天数/30)/收费户数 as 时长 from [fee$] group by 社区名';
    qry_fee.Close;
    qry_fee.SQL.Clear;
    qry_fee.SQL.Add(sql);
    qry_fee.Open;
    Sa_myDBGridAutoSize(SamoolGrid1,155,64,70,64,73,130,134,0,0,0);
except
   ShowMessage('ERR');
end;

end;

Last modification:August 16, 2009
稀罕你