什么是绑定控件?绑定控件指的是一个窗体上的”对象“,由于创建它的那个控件设置 了显示数据库信息方面的功能,通过设置对象的datasource(数据源)属性和datafield (数据字段)属性,使这个对象“绑定”于一数据库。 数据对象DATA的几个重要属性: 一,connect属性:数据库类型,缺省为ACCESS。 二,databasename属性:选定一个路径下数据库文件,可在属性窗口设置,代码中例 如:Data1.DatabaseName = "d:\vb6\Nwind.mdb" 三,recordsource属性:选定数据库中的一个表,如果不在属性窗口设置,代码中写也 可以,例如:Data1.RecordSource = "个体户管理" 与DATA对象绑定的对象的相关属性: 四。绑定对象的datasource属性:在属性窗口中设置,确定“绑定”到哪个数据对象, 如设置为Data1 五。将绑定对象的datafield属性设置为该表中的某个字段名,如: Text1.DataField = "姓名" 以上是几个最基本的属性。 DATA对象的readonly属性:选择是否以只读方式打开数据库。 Data对象的Exclusive属性:是否以独占方式打开数据库。 Data对象的UpdateRecord方法:在不触发Validate事件的情况下保存绑定控件中的值到 数据库。 Data对象的UpdateControls方法:把数据库中的记录值写到绑定控件中。即忽略当前绑 定控件的值,相当于取消更改。 Validate事件:当数据被增删,修改,添加等操作前引发。 Reposition事件:当记录指针移动到新位置时引发。 ADO是以后发展的趋势,将替代DAO和RDO,ADO可访问本地数据库,也可访问远程数据 库。 基于ADO对象的数据控件:Adodc(使用方法和DATA差不多,但DATA是DAO的),与Adodc 绑定的控件:DataGrid控件显示记录集并可修改;DataList控件;DataCombo控件, DataRepeater控件可同时显示几个绑定控件数据。Hierarchical FlexGrid网格控件,可 排序、合并等,但不能修改。Adodc的主要属性如下: BOFAction属性:返回或设置当其记录集BOF时的动作。 EOFAction属性:返回或设置当其记录集EOF时的动作。 CacheSize:返回或设置在cache中的行数; CommandTimeout:等待命令返回的时间(单位为秒),超时将出错。 CommandType:指明形成记录集的命令的类型,为1-adCmdText表示形成记录集的是SQL命 令,为2-adCmdTable表示记录集由表构成,为4-adCmdStoredProc由存储过程生成记录 集,为8-adCmdUnknown未知命令类型。 ConnectionString:通过对话框来建立连接(返回字符串)。 ConnectionTimeout:等待连接成功的时间(秒)。超时将出错。 CursorLocation:光标位置。为2-adUseServer表示采用服务器端光标,为3-adUseClient 表示采用客户机端光标。 CursorType:光标类型,为1-adOpenKeyset键集光标,为2-adOpenDynamic动态光标,为 3-adOpenStatic静态光标。动态光标允许用户看到其他用户对记录的修改增删,可修改 数据源;静态光标是记录集的拷贝与快照,用户看不到其他用户对记录集的修改,且只 读,键集光标类似动态型光标,但用户不能看到其他用户添加的记录或已删除的记录。 MaxRecord:每次从数据库中取的最大记录数。 UserName:用户名。 password:口令。 Mode:数据库打开模式,0是未知;1是只读;2是写;3是读写;16是可共享读写;4是不 可共享读;8是不可共享写;12是不共享。 RecordSet:记录集。 RecordSource:记录集的数据源,指定记录集数据产生的方法。 Adodc的主要事件: EndofRecordSet: 当记录集EOF/BOF时触发; willChangeField: 当一个字段将被修改前触发;其中的cfields参数:返回发生改变的 字段数目,fields参数:返回发生改变的字段对象。 fieldChangeComplete: 当一个字段被修改后触发; willChangeRecord: 当一个记录将被修改前触发; recordChangeComplete: 当一个记录被修改后触发; willChangeRecordset: 当一个记录集将被修改前触发; recordsetChangeComplete: 当一个记录集被修改后触发; willMove: 一个记录即将成为当前记录前触发; MoveComplete: 一个记录成为当前记录后触发。 对以上事件的参数,以Willmove为例说明如下: adReason返回产生该事件的原因,如返回AdRSNAddnew(值1)是“因添加新记录而触 发”,返回AdRSNClose(9)是“因关闭触发”,adrsndelete(2)是“因删除记录触发”, 返回AdRsnMove(10)是“因记录移动而触发”,返回AdRsnUpdate(3)是“因更新触发”等 等。可到对象游览器中找那个枚举变量去。 adStatus参数设置/返回此事件或(引发事件的)此操作的状态。adStatusOK(1)为引 发事件的操作完成,为2是发生错误,为3是“不能取消引发事件的操作”,为4即 adStatusCancel是“取消引发事件的操作”,如在代码中设adStatus=4,那么就取消了 (引发事件的)此操作,等于没有发生此操作。 pRecordSet参数返回(引发事件的)此操作所作用的记录集。 ★如何完全在代码中使用ADO控件和绑定控件?包括设置ADO的ConnectionString属性和 RecordSource属性;绑定控件的DataSource和DataField属性。举一例如下: Private Sub Form_Load() Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Program Files\VB98\Biblio.mdb;Persist Security Info=False" Adodc1.RecordSource = "Titles" Set Text1.DataSource = Adodc1 Text1.DataField = "Title" End Sub 其中对于ADO控件,设置其ConnectionString和RecordSource属性都是字符串,重点要注 意的就是绑定控件的DataSource属性,它的值是一个对象,一定要用Set赋值。而且有一 点重要常识:绑定控件实质上是绑定到记录集上的,不要简单地理解为绑定到数据控件 或数据环境的Command命令对象上,这是不准确的,你应当试试在代码中直接将 DataSource赋值给一个记录集。(注:对于数据对象ADO是如此,但对于ADODC控件?? 却不是) ★对用户输入的数据进行验证:如用户输入的是无用的数据,则取消保存和更新,对于 ADO控件,应在WillChangeRecord事件中进行验证。ADO对象则在用WithEvents声明的 RecordSet对象WillChangeRecord事件中,一样的。要取消保存就将事件提供的参数 adStatus设为adStatusCancel,或者用CancelUpdate方法。 DataGrid表格控件:DataGrid控件包含1个Columns字段列集合,对单元格,行,列等操 作方便。在设计时,在DataGrid控件上单击鼠标右键,选“检索字段”,这时就会填充 指定datasource中的全部字段,然后再单击鼠标右键,选“编辑”,这时就可随意调整 每列的宽度了。通过设置datagrid控件中columns字段集合的count属性和recordset对象 的recordcount属性,可以规定控件显示的列数和行数。当用户选中某个单元格时,控件 的text和对应column字段对象的Value属性就指向这个单元格,通过修改这两个属性可以 修改当前单元格的内容。 利用datagrid控件,还可在程序运行时对各控件进行数据的动 态绑定。以及随时将不需要的列进行隐藏。 DataGrid控件的属性方法和事件: 属性:AllowAddnew,AllowDelete,AllowUpdate属性:是否允许在表中增添、删除、修改 记录。如果设为false实际等于表只读,也可分别单独设置。 Col,Row属性:运行中当前光标所在的列(col)和行(row),最左上角单元格为0,0开 始。如姓名“李海石”在第7行第0列。 Text属性:运行时当前单元格的文本内容。 ColumnHeaders属性:是否在表的最上1行显示字段标头。 HeadLines属性:字段标头的文本行数(宽度)。缺省为1行。 DataChanged属性:表中的数据是否改变,如果设为false表数据不可修改。 VisibleCols,VisibleRows属性:在表中(不使用滚动条)可见的列数和行数。 Columns字段集合:对每1字段对象的操作。如: DataGrid1.Columns("姓名").Visible = False.隐藏"姓名"字段。用Columns(索引或关健字)来标识每个字段,其实是 columns.item(索引或关健字)的缺省形式,索引值从最小0开始。Columns集合本身有 count(字段列数),item(当前字段),add(在表中添加字段),remove(删除表中 字段)四个属性方法。如x=Datagrid1.Columns.Count.x返回6表示有六个字段。索引为 0—5。每个字段对象有其自身的属性,Alignment——记录中文本的对齐方式(如左、 右、居中);Button——是否在当前记录单元格右边显示下拉箭头;Caption——字段标 题;AllowSizing——是否允许用户调整本字段列宽度;Locked——字段只读; DataChanged——是否有记录被修改(本字段);DataField——捆绑字段(只读?); Text和Value——当前记录的本字段值。 BeforeUpdate,BeforeInsert,BeforeDelete,BeforeColUpdate,BeforeColEdit事件:在 表中修改,插入,删除记录等之前触发,如果要取消修改或删除等,只要将事件中的参 数cancel设为true即可。在修改,添加,删除等操作之后则触发 AfterUpdate,AfterInsert…等事件。 RowResize,ColResize事件:在运行时改变表的行,列宽时引发。 注意:在使用数据绑定控件时,必须把绑定控件和数据控件放在同一窗体上。 Datacombo对象RowSource和listfield属性,指定下拉表框显示的某adodc的某字段,仅 仅是显示而已。datasource,datafield属性,绑定某adodc控件中某字段,注:须认清一 点,在绑定后,在datacombo对象文本框内的的改动会自动更新到当前记录的对应绑定字 段中。也就是说它和文本框一样“用来接受数据输入”。 MSChart控件的功能:将数据以图表的形式显示。 数据库中的“关系”:是建立在两个表“之间”的链接。有一对一,一对多,多对多三 种关系。 [问题:在数据库中删除一个记录时,并不真正将其删除,而只是打上个标记而已,如何 真正删除这些记录呢?对一个打上删除标记的记录,如何恢复为原样,能显示出来呢?] 数据绑定控件的DataFormat属性:自定义数据的不同显示格式(自选)。 datachanged属性:绑定控件的内容是否发生变化。如果设为False,表示本控件中绑定 数据不可修改。(?) ADODC控件的connectionstring属性用来连接一个数据库,除用“连接字符串”建立连接 外,还可选“使用data link文件(链接文件)”的方式建立连接,先随便在VB外创建 (如桌面)一个后缀为udl的文件(只要单击鼠标右键“新建”选“Microsoft数据链 接”即可),然后双击,从“提供者”卡开始完成对话框即可。有了这样一个链接文 件,就可在adodc的connectionstring属性中指定这个Data link文件。使用数据链接文 件的好处是:多个不同程序的ADODC可同用一个这样的链接文件,还有利于简化用ADO对 象编程时代码中写的connectionstring字符串。 ★ 使用数据环境DataEnvironment。 数据环境用于连接数据库,比数据控件更方便有用,在实际的数据库编程中,不少方案 用了数据环境! 添加数据环境:从工程菜单中“更多ActiveX设计器”“Data Environment”就可添加一 个数据环境,最好干脆在新建工程对话框中选择数据工程,还可在工具栏上打开“数据 视图”窗口,其包含的工具栏上有“添加数据环境到当前工程”按纽。 使用数据环境:可将一个数据环境看成一个数据控件如Adodc,但又有ADO对象的特征, 第一步:从工程窗口双击DataEnvironment1打开它,在其中有一个缺省的Connection1对 象,右键单击它,在弹出菜单中选择“属性”,即可设置要连接到的数据源,其实就是 它的ConnectionString。设置好后,单击工具栏上的“添加命令”按纽,给这个 Connection1对象添加一个Command1命令对象。右键选中Command1,选择“属性”,在对 话框中设置从数据源中取得数据的方式(即RecordSource),如选中数据库对象,在其 中选“表”,然后选择一个表名称即可。 第二步:为这个DataEnvironment1添加绑定控件:很简单,只要在DataEnvironment1中 展开设置好RecordSource的Command1命令对象,会出现可用的全部字段,按住鼠标拖动 字段到窗体上即可自动生成绑定控件(一个标答和一个文本框)。可同时向不同的窗体 上拖放字段,都与这个数据环境绑定,可见,DataEnvironment确实比数据控件好,它在 整个工程中都可见。当然也可自行添加绑定控件,需要设置好DataSource, DataField以及DataMember属性,这里多出一个DataMember属性是要绑定到数据环境中的 哪个Command命令对象(因为一个数据环境中经常包含多个命令对象)。 第三步:添加代码控制DataEnvironment.其实它就象是Adodc控件,不过在使用之前要初 始化,否则会出现“对象关闭”的错误提示,初始化的方法是用语句:” DataEnvironment1.命令对象名”,如DataEnvironment1.Command1,这样就可以把 Command1打开了,注意如果在代码中重复使用这句,会出现“对象已打开”的错误提 示,所以应当只使用一次。其他实际的操作,和数据控件类似,比如要使记录的指针向 上移动。可用DataEnvironment1.RecordSets(0).MovePrevious,也是有它的记录集(集 合)的。当然需要指出,因为一个数据环境可有多个连接和命令对象,当在数据环境中 添加多个命令对象时,会有多个记录集,每个命令对象有一个记录集,命名约定是”rs+ 命令对象名”,比如有一个命令对象Command3,那么要操作它所产生的记录集: DataEnvironment1.rsCommand3.MoveNext rsCommand3就是对应于Command3对象的记录集,可用于代码中进行控制。 技巧:一个数据环境可添加多个连接Connection和多个Command对象,当你选中一个对象 时,在属性窗口中会显示出它的属性列表,真的和控件一样哦。 特别说明:缺省情况下,创建的连接对象和命令对象是只读的,不能修改源数据库。需 要在命令对象的属性页“高级”选项卡上将锁定类型设为“3-开放式”,或直接在属性 窗口中将命令对象的LockType属性设置为“3- adLockOptimistic开放式”。注意:实际 上不是命令对象的LockType属性,而是它形成的记录集的LockType属性,一并放到命令 对象的属性页中设置。这点与ADO对象一样,因为ADO只在RecordSet对象中有一个 LockType设置。 ★使用数据环境操作关联表: 大多数数据库都在多表间存在关联。关联有一对一,一对多,多对多三种。最常用的是 一对多的关系。 一、关联: 首先要理解关联:关联就是能够使一个表中的记录与另一个表中的记录链接或关联的两 表间连接。对于一个表中的一条记录,在另一个表中有一条或多条记录与之对应,比如 我在“个体户档案”表中有一条“吴莲秀”的记录: 姓名 地址 执照号码 营业额 行业 备注 吴莲秀 吉富 1386671215 2000 零售贸易 在“发票”表中有“吴莲秀”交纳的多张管理费发票: 发票号码日期 姓名 收费起点 收费终点 金额 备注 0188035 4/1 吴莲秀 1/1/2002 1/31/2002 40 0188047 4/1 吴莲秀 2/1/2002 2/28/2002 40 0188073 4/1 吴莲秀 3/1/2002 3/31/2002 40 0188098 4/1 吴莲秀 4/1/2002 4/30/2002 40 在这种情况下,我们就可把这两个表关联起来,把“个体户档案”作源表,其“姓名” 字段作为主关健字,把“发票”作目的表,其“姓名”字段作为外来关健字,创建一个 一对多的关系,要注意:一个表只能有一个主关健字,可以有多个外来关健字。主关健 字必须具有唯一性,即每个记录要有不同的值,这样才能正确无误地标识每条源记录, 否则关联将崩溃,有一个办法就是将主关健字设为主索引,如先把“个体户档案”的 “姓名”字段设为主索引,当你试图增加另一个叫吴莲秀的记录时就会出错。且最好使 用数值型字段,能“自动增加字段”更好,这里使用的是字符串,不好意思。 如何创建关联?——通过在一个表中包含一个主关健字字段并在另一个表中提供一个外 来关健字段,将一个引用存储到连接的记录上。主关健字是唯一标识表中每个记录的ID 字段,在“可视化数据库管理器”中,以建立索引的同时选中复选框的 “主要的”来设 定即可。(?)外来关健字用于存储另一个表中的主关健字以创建连接。外来关健字不 用特别设定,至多改一下字段名使其与主关健字相同就可以了。 另一方面,实际上,上面两个表原是一个表,即每张发票上的应填内容为发票号码,日 期,姓名,地址,执照号码,行业,营业额,起点,终点,金额,备注等,但因每个个 体户的地址,执照号,行业等对同一户来说都是一样,每张发票上都有这些字段,就会 造成数据的重复。把这样的信息分解到另外的表中,利用关联来实现同样的目的,可节 省不少资源。这种分解数据到多个关联表中以简化结构的过程叫“规范化”(也叫标准 化)。这是设计数据库时一个很重要的步骤。数据库规范化是分解表使信息重复最小化 的过程。 对于两个表中有关联的字段,应使用相同的字段名,如都为“姓名”。 在ACCESS软件中,单击“关系”按纽可显示出各表间的关系,它在有关系的不同表字段 间连起一条线,在源表的主关健字处,上面标有数字1,表示一条记录,到达目的表的对 应外来关健字处,上面标有无穷大符号∞,表示可对应无穷多记录,这是一对多关系, 象VB提供的范例Nwind.mdb数据库中就全部是这样的关系。 一对一关系就是一个表中的一条记录被连接到另一个表的一条记录上。有一点要注意: 不能把一对多关系反过来看成好象一对一,比如上面每张发票记录只对应一个个体户档 案记录,认为是一对一,不对!发票记录的“姓名”不能是主关健字!不唯一,必须是 从主关健字的源表引出一条记录对应另一个目的表的一条记录。如下图一对一:在目的 表端有一个十字线,标明了源表主关健字和目的表外来关健字。另外象上面个体户的一 对多: 目的端有一个分叉,象这种图叫做气泡图,在建立表关联时事先画好作为草图很有用。 多对多在联较为复杂,第一个表中的多条记录被链接到第二个表的多条记录,反过来也 是这样。 二、在数据环境中使用关联: 主要就是建立分级的命令对象,即先建立一个指向源表的Command对象,再为这个命令对 象建立一个子命令对象,使它指向目的表,然后在该子命令属性页“关联”卡上,可以 看到选中了“与父命令关联”复选框,而且还可看到父命令对象是指向源表的那个对象 (本来就是在它下面建立的子对象嘛),在“关联定义”中定义好主关健字(父字段) 和外来关健字(子字段),“添加”即可。这样,与源表(父命令)记录集当前记录关 联的目的表(子命令)所有记录就存储在子命令的记录集中。再说一遍,也就是:先为 源表和目的表在同一Connection连接对象下各建立一个Command对象(只建立一个指向源 表的也可以),再在连接到源表的那个Command对象上建立子命令对象,使它指向目的 表,然后接着在子命令属性页的“关联”选项卡上,选中“与父命令关联”复选框,将 父命令选定源表,在“关联定义”中选择主关健字和外来关健字,单击添加按纽即可。 这时,当指向源表的父命令对象移动记录时,指向目的表的子命令对象将与之关联的记 录都生成到子对象的记录集中。现举一例: 双击工程窗口中的DataEnvironment1,在Connection1上单击右键打开属性页,选择上面 提到的个体户档案的数据库。建立连接。然后在Connection1下建立两个并列的Command 对象(只建一个对象指向源表也可以),在属性页“通用”卡上设置,使之分别指向源 表个体户档案和目的表发票。这时,再在指向源表的那个Command命令下建立子命令对象 (选中源表命令单击“添加子命令”按纽),选中新添的子命令,先在其属性页“通 用”卡上设置使其指向目的表发票,然后单击“关联”选项卡,选中与父命令对象关 联,并在父命令下拉框中选定指向源表的那个命令对象,然后在关联定义框架中将父对 象字段(主关健字)和子对象字段(外来关健字)都选择“姓名”,单击“添加”按 纽,即可。 最后是在窗体上显示源表记录和目的表中的关联记录,对于源表记录,随便怎样都可 以,如直接从数据环境中拖放字段到窗体上,对于关联的目的表,因为可能同时有多条 关联记录(一对多),因此最好用MSHFlexGrid全部列表显示,只要在属性窗口设置 HflexGrid的DataSource和DataMember就可以了,直接将DataMember指定为那个子对象, 如果在代码中设置绑定,可按如下方式写代码: Set MSHFlexGrid1.DataSource = DataEnvironment1.rsCmdUnitRecord.Fields ("CmdSubInvoice").Value 其中rsCmdUnitRecord是源表为个体户档案的对象的记录集,而子对象CmdSubInvoice确 实如数据环境表中显示的那样,成了它的“字段”,只不过其Value值变成记录集,赋予 MSHFlexGrid了(经验:绑定控件的DataSource不仅可指定数据控件或环境,还可直接指 定记录集来绑定)。当然也可老方法绑定:Set MSHFlexGrid1.DataSource = DataEnvironment1 : MSHFlexGrid1.DataMember = "CmdSubInvoice"一样的。 设置好绑定(特别是子对象的绑定)后,当源表对象每移动当前记录时,目的表子对象 的记录集就会更新,记录集中存储的都是与源表当前记录关联的记录,因此绑定到记录集 的MSHFlexGrid会不断更新数据。 ★在数据环境中使用记录分组和参数查询: 这两项工作都是在Command对象的属性页中设置。 将记录按某个字段分组:先设置好Connection1连接和Command1的数据源,然后在 Command1的属性页“分组”选项卡上选中“分组命令对象”复选框,然后从左边选择一 个字段添加到右边框中,确定即可。这样生成的记录集便具有了层次性,和GROUP BY的 效果是一样的,可以用MSHflexgrid或报表Data Report来绑定。 使用带单个参数的SQL查询:在Command1的属性页“通用”卡上选中使用“SQL语句”生 成记录集,然后输入在WHERE子句中带?问号的查询:SELECT [name],[money] FROM [invoice] WHERE [name] LIKE ?。这个问号就是一个参数,可以在代码中赋值,生成不 同记录集。当然,仅这样参数的设置还没完成,在“参数”选项卡上为这个‘问号’设 置属性,如参数名,输入/输出参数,数据类型等。 代码中赋予具体的参数值,很简单,在初始化命令对象的语句 (DataEnvironment1.Command1)后面附上参数值就可以了,如: Private Sub Form_Load() DataEnvironment1.Command2 "符章秀" Set MSHFlexGrid1.DataSource = DataEnvironment1.rsCommand2 End Sub 不过只能包含一个参数。而且有一点问题本人还没解决:就是如何动态地改变参数值, 因为会出现“对象已打开”的错误。 ★数据报表DataReport: 新建工程时选择数据工程,或直接从“工程”菜单中添加Data Report,这时就会在工程 窗口中显示出DataReport1对象,它就象一个Form窗体一样,只不过界面为白色,网格点 变成了稀疏的格线,而且多了几条“页标头”“页注脚”“细节”的横杠,下面就解释 一下: 这几根横杠是“带-Band”,它表示了报表的结构,也是报表中在需要时可多次重复的区 域。主要有:1,报表页眉/页脚,它在整个报表的头尾处出现,可让它们单独占据一 页,只要将ForcePageBreak属性设为1-rptPageBreakAfter即可;当然首先要在报表中单 击鼠桔右键”显示报表页眉/注脚”显示它;2,页面页眉/页脚(在界面中写为页标头和 页注脚),它在报表中每页的头尾处出现,就象WORD的页眉页脚一样;3,组页眉/页 脚,显示分级的查询结果时会出现这些带区,例如在关联表中,组页眉显示主表信息, 其下的细节带则显示更详细的多条关联信息;组页眉/页脚包围在每个细节带的头尾外出 现;4,细节Detail带,它是报表中最重要的带,位于最中心位置,显示最详细的那部分 数据信息,并在一个页面内自动重复多次直到整页全部占满为止。 使用一个数据报表时,先要将它绑定到数据源上,设置其DataSource属性为数据环境, 设置其DataMember为一个命令对象,然后在报表窗体上单击鼠标右键,选择“检索字 段”,这时就会按绑定的命令对象来初始化报表结构,比如分级的具有子命令的命令, 结构中会包含进“分组标头/注脚”带区等,经过检索字段初始化后,可在报表上添加控 件以显示数据,可添加六种特定的控件RptLabel、RptTextBox等,和普通的标签文本框 没什么两样,只不过专用于报表上而已。其中有一点要注意:在这六个控件中,标签, 图片框、直线、形状控件都不能绑定,只有文本框和函数控件可以进行绑定,因此要显 示记录集中不同记录时都要使用文本框(即在细节带区中都要使用文本框)来进行,设 置其DataMember属性和DataField属性。注意:报表中的绑定与普通窗体上的绑定有点不 同,它会自动枚举记录集中每条记录依次显示于报表中。另外,将控件添加到哪个带 区,按具体情况而定,总之是:页标头/注脚带区在每页头尾处重复;细节带区在每页中 都不断重复(其实是枚举记录集记录);分组标头/注脚包围在每次细节带区重复的外面 头尾重复。看你的需要摆放和对齐控件位置。 ★ 数据报表DataReport是一个对象,可以在代码中对其进行操作,如显示报表的Show方 法: Private Sub Command1_Click() DataReport1.Show End Sub ★ 再如将报表内容导出为HTML文档或文本文档:ExportReport方法。 Private Sub Command1_Click() DataReport1.ExportReport rptKeyHTML, "c:\a.htm" End Sub 其中第一个参数指定导出为HTML文档还是文本文档,rptKeyHTML为导出HTML文档, rptKeyText为导出文本文档,rptKeyUnicodeText为导出Unicode文本文档。 RptKeyUnicodeHTML_UTF8为导出HTML Unicode文档,第二个参数指定导出文件的路径和 名字,该方法还有其他可选参数,第三个OverWrite参数指定当文件存在时是否覆盖原文 件,第四个ShowDialog参数为是否显示Export导出对话框,第五个参数Range为是否导出 所有页,缺省为rptRangeAllPages所有页,可选值为rptRangeFromTo设定导出范围。第 六个参数PageFrom和第七个参数PageTo只在前面参数设定为导出范围时需要设置,分别 为范围起始页和终止页。如: DataReport1.ExportReport rptKeyHTML, "c:\abc.htm", True, True, rptRangeFromTo, 2, 3 ★ 再如不经预览直接打印报表:PrintReport方法,如:DataReport1.PrintReport,其 参数都是可选参数,第一个ShowDialog意为是否显示打印对话框,缺省为False,只打印 不显示。第二个参数Range意为是否打印所有页,缺省为rptRangeAllPages所有页,可选 值为rptRangeFromTo打印指定范围,如果是这个值,则需要在第三个和第四个参数中指 定打印范围的起始页及终止页,第三个参数PageFrom和第四个参数PageTo意为打印范围 的起始页和终止页,这两个参数只在第二个参数为rptRangeFromTo指定一个打印范围时 需要设置。例如: DataReport1.PrintReport False, rptRangeFromTo, 1, 4 ★ 报表中的动态变量:也就是程序运行时在报表中会自动代入具体值的类似符号的内置 变量。%t:短格式当前时间;%d:短格式当前日期;%p:当前页码;%P:总页数;%i: 报表标题;%D:当前日期;%T:当前时间。这些动态变量会自动随具体情况不同而调 整,比如在属性窗口中,将一个标签rptLabel的Caption属性设为“第%p页,共%P页。” 当报表运行时,显示的就是具体的数字如“第2页,共9页。”。 ★在报表上显示字段的统计信息:RptFunction控件。可以显示指定字段值的总和,平均 值,最大值,最小值等。注意:此控件只能放在分组注脚或报表注脚中。 控件的使用方法很简单,先向分组注脚(或报表注脚)中添加该控件,然后在属性窗口 中设置其DataMember和DataField属性指到要绑定(统计)的那个字段,然后设置 FunctionType为要统计的方面,有以下可选项:0-rptFuncSum字段值总和;1- rptFuncAve字段平均值;2-rptFuncMin字段最小值;3-rptFuncMax字段最大值;4- rptFuncRCnt字段的行数;5-rptFuncVCnt字段中非空值的行数;6-rptFuncSDEV字段标准 偏差;7-rptFuncSERR字段标准错误。这也就决定了该控件所能进行的所有统计功能。 简单地设置好以上三个属性,就完成了所有的工作,可以打印了。 使用水晶报表Crystal Reports: ★ 使用Crystal Reports水晶报表:首先要从VB6光盘中安装,路径在Common/Tools/ VB/CrysRept/CrysTL32.exe,然后在“外接程序”中打开“报表设计器”。报表是一个 单独的.rpt文件存在的。要在VB中使用,应当添加一个控件:Crystal Report Control 4.6,设置好相关属性即可。最简单只要设置ReportFilename(=报表文件路径)和 Action(=1打印)就可以了。如: Private Sub Command1_Click() CrystalReport1.ReportFileName = "c:\abc.rpt" CrystalReport1.Action = 1 End Sub 关健问题是我们要先用报表设计器设计好一个报表文件:从外接程序中打开“报表设计 器”,创建一个报表的步骤基本上有七步:先单击“File”“New”新建一个 “Standard”报表, 第一步Tables:选择报表的数据源,可以选择一个数据库文件DataFile或ODBC数据源; 第二步Links:自动创建表间关系。这一步不用设置,直接“Next”下一步; 第三步Fields:选择要添加到报表的字段,只要将需要的字段从左边数据库窗口Add到右 边的报表字段窗口就可以了; 第四步Sort:指定一个Group分组字段和排序方式(如升序或降序等); 第五步Total:指定在报表中显示哪些字段的统计信息;缺省情况下,向导将可以计算的 字段都添加到右边TotalFields框中,对于一个统计字段,可以指定统计内容是字段总和 (SUM)还是平均值(AVERAGE),最大值最小值等,只要在下拉框中选择一种即可。 (注意去掉Add Grand Totals复选框),所选择的统计信息将在报表上显示出来; 第六步Select:直接下一步; 第七步Style:选择一种报表样式和输入报表标题。 OK,可以Preview了。 如果这时你对报表还有不满意的地方,可以单击Design设计标签,进行手动调整。 完成后将报表文件进行保存。 VB中提供的Crystal Report控件的属性和方法: Destination属性:报表的输出目标,可选择To Window窗口(预览),To Printer打 印,To File到文件,To MAPI到邮件。 ReportFilename属性:指定要导出的.rpt报表文件。 SelectionFormula属性:导出准则。即设置一个筛选条件,只导出满足条件的记录。注 意格式:为一个字符串“字段-比较符号-值”,但有趣的是{字段}必须用大括号括起, 而不能象SQL那样用中括号!怪!例如:CrystalReport1.SelectionFormula = "{invoice.name} LIKE '符章秀'" GroupSelectionFormula属性:分组导出准则吧? DataFiles属性:报表所属的数据源集合,通常是DataFiles(0)=报表所属的数据库文件 路径。也就是使用单个数据库作为报表数据源。 Action属性:设为1导出报表。 SortFields属性:排序字段(集合),将报表中的记录顺序按指定字段排序。如: SortFields(0)=”+{invoice.name}”,注意格式:字段用大括号,前加+加号表示升 序,前加-减号表示降序。一个报表可同时按多个字段排序,SortFields(1)=”+ {invoice.money}”…。 WindowTitle属性:打印预览窗口的标题文字。 ★使用公式:Crystal Reports支持一套非常丰富的计算工具和函数,可以对一个字段进 行几乎任何类型的计算。 首先创建好一个报表,然后通过insert菜单Formula Field加入一个公式字段,会弹出 Formula Name文本框,输入公式名,接在在“编辑公式”对话框中构造好所需公式。 构造公式的具体方法,特别是其中的语法,本人还没搞清楚! 构造好的公式可以单击Check按纽来检查正确性,如果无误的话,可以单击Accept按纽并 在报表相应位置上放置该字段。 真是没看懂,比如这个公式是什么意思: WhilePrintingRecords;’确保打印时检查公式。 NumberVar Zip5Count; Zip5Count;=Zip5Count+1; 再如下面这个: WhilePringingRecords; NumberVar StateCount; NumberVar StateTotalCount; NumberVar StateCost; NumberVar StateUnitCost; NumberVar FirstClassCount; NumberVar FirstClassCost; If StateCount>=10 then StateCost :=StateCost+(StateCount*StateUnitCost) Else FirstClassCount :=FirstClassCount+StateCount; If StateCount>=10 then StateTotalCount :=StateTotalCount+StateCount; If StateCount>=10 then StateCount; ★改变记录的排序顺序:这是报表中需要最多的一种变化。通过VB代码,将报表中的记 录按不同字段进行排序,使同一个报表的记录可以改换多种打印顺序。只要设置 SortFields属性就行了,如:CrystalReport1.SortFields(0) = "+ {invoice.number}",可以在代码中动态改变,每改变一次后使用Action=1就会Show出一 个不同打印窗口。 ★打印标签:比如信封标签等。全部的工作都在报表设计器中完成。新建一个Mail Label报表,然后选择DataFile数据源,添加需要的Field字段,然后选择一种Label类 型,在Choose Mailing Label Type下拉框中选择一种,非常之多,对于一种选定类型, 还可手动调整它的尺寸大小,就这样吧。 ★在报表中添加图象和线条等:Insert菜单Graphic项或Line项。可以在报表中调整添加 的图象和线条的位置大小,也可以通过在图象或线条上的右键菜单来做更多的调整。 |
|