分享
 
 
 

在.NET中利用FORMULA ONE实现动态报表技术(一)

王朝c#·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

Ø 在.NET中利用FORMULAONE实现动态报表技术(一)

相信对大家Formula One (简称F1) 不会太陌生,它是一个优秀第三方报表制作控件,本人以前一直使用它与PB结合制作动态报表。现在有一.NET项目,有大量报表要实现,那么利用原先的FORMULAONE制作的报表技术能否在.NET中继续延用呢? 经过几天的摸索终于把原来利用Formula One的动态报表解决方案完全的移植到.NET中。

.NET调用COM组件基本原理

在微软.NET通用语言运行时(CLR)中运行的代码称为托管代码,不在CLR中动行的代码被称为非托管代码。可以说所有的COM组件都是非托管代码。而托管代码组件不只依赖CLR,它们还要求与之交互的组件也要依赖于CLR。微软的解决方案是RCW(运行时可调用封装器)----用于从托管代码调用非托管代码的特殊类型的代理。下图显示了如果利用RCWs调用非托管组件。此图包括一个名为NetUI.exe的.NET程序,两个名为BackEnd.dll 和Service.dll的COM组件,以及链接它们的必要技术。

利用TLBIMP转换元数据

并不是.NET首先使用元数据描述公有接口。COM类型库也有描述COM组件公用接口的元数据。其实RCW的功能主要是将COM类型的元数据转换为.NET的元数据。.NET FrameWork 软件开发工具包中有一工具tlbimp(类型库导入器)用来进行此转换。TlbImp从COM类型库中读取元数据并创建与CLR匹配部件以调用COM组件。

也可以利用VS.NET工具以便直接引用COM组件(其实仍然是利用RCW),下面例程使用此方法。

报表模板管理模块实例分析

下面以一个具体的报表模板管理模块为实例,说明怎么在.NET中利用Formula One 技术。

说明:每一张定义的报表有一张对应的模板,模板可在外部利用Excel定义。模板管理是对报表对应的模板增、删、改进行管理的模块。

一、准备工作

1. 确认安装了VS.NET2002或VS.NET2003

2. 安装或注册了F1

3. 安装了SQLSERVER并建Report_List_Data表,表结构如下:

CREATE REPORT_LIST_DATA

(

NUM INT NOT NULL , --主键

RPT_ID INT NOT NULL , --报表表号ID

RPT_NAME VARCHAR(60) NOT NULL , --报表名

RPT_DATA IMAGE NULL , --报表内容

USER_NAME VARCHAR(40) NULL , --制表人

RPT_DATE DATETIME NULL , --报表日期

CONSTRAINT T_RPT_LIB_PK PRIMARY KEY (NUM)

);

二、界面设计

1. 选择工具箱àWindow窗体控件à添加/移除项…àCOM组件,选择Tidestone Formula One 6.0 WorkBook

2. 新建一窗体,把新增加进入工具箱的F1控件,和一些相关的控件加入窗体,界面设计如下图所示:

三、系统设计及编码

1. 一打开模块,模块窗体组合框中检索出所有的数据库中的模板。

在TemplateManger类构造函数中加入comboTemplateFillValue()函数,用来向组合框中填充数据

//向组合框中加入已经保存的模板名

private void comboTemplateFillValue()

{

string strQuery = "Select rpt_id,rpt_name from report_list_data";

SqlDataReader aReader = db.Query(strQuery);

while(aReader.Read())

{

comboTemplate.Items.Add(aReader[1].ToString()+"["+aReader[0].ToString()+"]");

}

aReader.Close();

}

注:其中db.Query()为自定义的数据库操作基类中一查询方法。

2. F1控件能完全兼容Excel格式文档,我们可以把模板利用大家都熟悉的Excel来定义模板,然后读入F1控件。在“读入模板”按键可加入如下脚本.

private void btnRead_Click(object sender, System.EventArgs e)

{

if(openFileDialog1.ShowDialog() == DialogResult.OK)

{

string tplName = openFileDialog1.FileName.ToString();

tplName = tplName.Remove(0,tplName.LastIndexOf("\\")+1);

tplName = tplName.Substring(0,tplName.Length - 4);//去掉扩展名

//MessageBox.Show(FileName);

comboTemplate.Text = "模板"+tplName+"["+GetPKID("report_list_data","rpt_id").ToString()+"]";

//读EXCEL Files

axF1Book1.ReadEx(openFileDialog1.FileName.ToString());

axF1Book1.ShowEditBar = true;

ShowVScrollBar();

btnDel.Enabled = false;

}

}

注:1.读入的模板名命名方式为“模板”+“模板名称”+“[模板ID]”形式

2. 主要语句为axF1Book1.ReadEx(openFileDialog1.FileName.ToString());功能是读取模板文件进入F1控件。

3. 脚本中GetPKID()函数的作用是取得模板唯一ID值,ShowVScrollBar();主要是保存F1控件滑动条一直存在

3. 读入的模块可以在控件中直接修改,也可以调用F1的服务端程序进行修改,调用服务端程序很简单.

private void btnServer_Click(object sender, System.EventArgs e)

{

axF1Book1.AllowDesigner = true;

axF1Book1.LaunchDesigner();

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有