资源描述
Cell报表控件成功应用于汽车零配件销售企业管理信息系统【项目背景】经过数十年风雨历程,中国汽车产业已从专属象征的奢侈品跨入大众消费时代,如此庞大的汽车消费市场,带动了中国汽车零配件产业的蓬勃发展。随着中国加入WTO,汽车零配件行业作为产业链中不可或缺的重要环节,已经打破国家地域的限制,形成全球化市场与生产格局,外资同业的介入,将使得国内汽配市场竞争更趋激烈与白热化。信息化在帮助汽配企业降低采购、营销成本,减少库存、优化库存结构,拓展销售渠道、提高服务效率等方面起到了不可替代的作用。所以说,汽配行业信息化建设不是应该的,而是必然的。【系统概述】 该系统主要管理企业中通用的信息化模块,包括工资、仓库管理、采购管理、销售开单管理、pos柜台销售管理、出纳管理、短信管理、P2P(类似RTX)等部分。【报表需求】一、报表需求分析 (1)单据式报表 例如我们需要打印入库单、出库单时,这种情况采用画模版方式完成。 (2)套打类 例如套打发票之类的情况也采用画模版方式完成,只是打印时候隐藏部分内容,cell已有类似例子提供。模板式实现方法 (3)自由报表 有些自由格式的表格,数据可能从数据库、文本文件、或者其他方式,这个时候需要画好表格,然后根据Flag替换填充。 (4)交叉类表格 基于报表组件,可以完成复杂的交叉表,支持行列多表头、支持行列合计、小计、计数、平均值、最大值、最小值、百分计算,支持多个计算字段放在行区或者列区,计算方式支持普通平均值和加权平均值等多种方式计算,支持设定小数点位数等。交叉报表实现流程 (5)数据录入 支持基于cell模版的数据录入,并写入数据库等。 二、Cell应用解析(1) 交叉报表式数据配置界面可以做成通过拖拉组件来设置维护界面,报表怎么显示,通过数据库配置生成。即将显示规则存储到数据库里面,然后写一个类来解析哪些规则,填充,提供或者一个,反正不管你用什么方式,能给我数据源就可以了CDSSource.Data := UISet.GetData(sSQL); CellReport.Cell := Cell; CellReport.CloneClientDataSet(CDSSource, CellReport.CDSSource); CellReport.CloneClientData(CDSSource, CellReport.CDSSource); CellReport.ExecReport(7); (2) 画模版方式完成的报表(例子:出纳系统的现金日记帐打印)(3)普通循环类报表(例子:工资表打印,全动态统计生成!)(4)交叉报表部分(仓库管理系统的实时库存报表)生成这样的报表不需要写代码的,并且可以增加,行列合计、小计、平均值、计数、最大值、最小值、百分比。此组件生成报表之后,允许你写代码或者外接脚本来修改Cell,比如插入表头、表尾或者修改那些单元格颜色、字体之类的,还可以设定表格大小、生成交叉行部分、生成交叉列部分、生成交叉数据、计算整个报表、合并需要合并的单元格等。【用户感受】 Cell确实是一个优秀的报表开发工具,对于软件开发公司,减轻程序员工作量的同时,将报表完美呈现方便客户打印,为中国式复杂报表提供最有效的解决办法。 1、接口丰富、功能强大,易于与开发语言融合;2、文档做的不错,简单、直接,都有小例子,适合各个层次的开发人员;3、目前用cell做报表还没有碰到过做不出来的情况。昆明讯之岭:林红卫mail: hellokunming QQ: 18077968附:实时库存的全部源代码unit UFrmCKRealTimeStorageRep;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, UFrmCKCellEditor, ExtCtrls, UExpandPanel, StdCtrls, CheckLst, Buttons, UDBAPorxy, UUISet, DB, DBClient, UCellReport,CELL50Lib_TLB, UPubicParm, Grids, DBGrids, Menus, ImgList, ComCtrls, ToolWin;type TFrmCKRealTimeStorageRep = class(TFrmCKCellEditor) Panel1: TPanel; ClbStorage: TCheckListBox; SBtnQuery: TSpeedButton; UISet: TUISet; CDSStorage: TClientDataSet; CellReport: TCellReport; CDSSource: TClientDataSet; procedure SBtnQueryClick(Sender: TObject); procedure CellReportAfterExecReport(Cell: TCell); private public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end;var FrmCKRealTimeStorageRep: TFrmCKRealTimeStorageRep;implementation$R *.dfm TFrmCKRealTimeStorageRep constructor TFrmCKRealTimeStorageRep.Create(AOwner: TComponent);var sSQL: string;begin inherited; sSQL := select * from T_CK_BASE_STORAGE; CDSStorage.Data := UISet.GetData(sSQL); ClbStorage.Items.Clear; CDSStorage.First; while not CDSStorage.Eof do begin ClbStorage.Items.Add(CDSStorage.FieldByName(F_NAME).AsString); CDSStorage.Next; end;end;destructor TFrmCKRealTimeStorageRep.Destroy;begin inherited;end;procedure TFrmCKRealTimeStorageRep.SBtnQueryClick(Sender: TObject);var sSQL: string; sStorageList: string; I: Integer;begin inherited; for I := 0 to ClbStorage.Count - 1 do begin if ClbStorage.CheckedI then begin CDSStorage.First; CDSStorage.MoveBy(I); if sStorageList = then sStorageList := CDSStorage.FieldByName(ID).AsString else sStorageList := sStorageList + , + CDSStorage.FieldByName(ID).AsString; end; end; if sStorageList = then raise Exception.Create(请选择仓库); sSQL := select + a.F_CODE, + a.F_NAME as F_ITEM_NAME, + a.F_SPEC as F_SPEC, + d.F_UNIT as F_UNIT, + a.F_PRICE as F_PRICE, + b.F_NAME AS F_STORAGE, + c.F_NUM as F_NUM, + c.F_NUM * a.F_PRICE as F_MONEY + from + T_CK_ITEM a, + T_CK_BASE_STORAGE b, + T_CK_TIME_STORAGE c, + T_SYS_UNIT d + where + c.F_ITEM_ID = A.ID + and c.F_STORAGE = b.ID + and a.F_UNIT = d.ID + and c.F_STORAGE in ( + sStorageList + ); CDSSource.Data := UISet.GetData(sSQL); CellReport.Cell := Cell; CellReport.CloneClientDataSet(CDSSource, CellReport.CDSSource); CellReport.CloneClientData(CDSSource, CellReport.CDSSource); CellReport.ExecReport(7); end;procedure TFrmCKRealTimeStorageRep.CellReportAfterExecReport(Cell: TCell);begin inherited; / 执行后期处理 - 表头 Cell.SetCellString(1, 1, Cell.GetCurSheet, 分仓库实时库存表); Cell.SetCellAlign(1, 1, Cell.GetCurSheet, 36); Cell.SetCellFontStyle(1, 1, Cell.GetCurSheet, 10); Cell.SetCellFontSize(1, 1, Cell.GetCurSheet, 24); Cell.SetRowHeight(1, Cell.GetRowBestHeight(1), 1, Cell.GetCurSheet); Cell.MergeCells(1, 1, Cell.GetCols(Cell.GetCurSheet) - 1, 1); / 制表人 Cell.SetCellString(1, Cell.GetRows(Cell.GetCurSheet) - 1, Cell.GetCurSheet, 制表人: + gUserInfo.UserName); Cell.MergeCells(1, Cell.GetRows(Cell.GetCurSheet) - 1, 3, Cell.GetRows(Cell.GetCurSheet) - 1); / 制表日期 Cell.SetCellString(4, Cell.GetRows(Cell.GetCurSheet) - 1, Cell.GetCurSheet, 制表时间: + DateToStr(Now); Cell.MergeCells(4, Cell.GetRows(Cell.GetCurSheet) - 1, Cell.GetCols(Cell.GetCurSheet) - 1, Cell.GetRows(Cell.GetCurSheet) - 1);end;end.
展开阅读全文