FOXTABLE编程.docx

上传人:b****6 文档编号:7446547 上传时间:2023-01-24 格式:DOCX 页数:51 大小:39.03KB
下载 相关 举报
FOXTABLE编程.docx_第1页
第1页 / 共51页
FOXTABLE编程.docx_第2页
第2页 / 共51页
FOXTABLE编程.docx_第3页
第3页 / 共51页
FOXTABLE编程.docx_第4页
第4页 / 共51页
FOXTABLE编程.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

FOXTABLE编程.docx

《FOXTABLE编程.docx》由会员分享,可在线阅读,更多相关《FOXTABLE编程.docx(51页珍藏版)》请在冰豆网上搜索。

FOXTABLE编程.docx

FOXTABLE编程

数据绑定

最简单的绑定

首先还是打开我们的示例文件“专业报表.Table”,然后在命令窗口执行下面的代码:

DimdocAsNewPrintDoc

DimrtAsNewprt.RenderText

rt.DataBinding.DataSource=BindTables("订单")'将rt绑定到订单表

rt.Text="[Fields!

产品.Value]"'设置打印字段

doc.body.Children.Add(rt)

doc.Preview()

上述代码会打印出订单表中每一行的产品名称。

DataBinding用于设置打印对象的绑定属性,该属性包括一些子属性,DataSource表示数据来源,数据来源可以是Table,还可以是数组或者集合。

需要注意的是,不能直接绑定到Table,如果要绑定到Table,必须用BindTables来设置,例如:

rt.DataBinding.DataSource=BindTables("订单")

如果对象的内容来自于某一列,其Text属性的设置格式如下:

[Fields!

列名称.Value]

使用表达式

在命令窗口执行下面的代码:

DimdocAsNewPrintDoc

DimrtAsNewprt.RenderText

rt.DataBinding.DataSource=BindTables("订单")'将rt绑定到订单表

rt.Text="[Math.Round(Fields!

金额.Value,1)]"'设置打印表达式

doc.body.Children.Add(rt)

doc.Preview()

留意方括号中的内容:

Math.Round(Fields!

金额.Value,1)

意思是打印的时候将金额列的内容,保留一位小数,你可以在Text属性中使用Foxtable支持的所有函数。

注意表达式必须用方括号括起来。

日期的打印

为了得到常规的日期格式,可以利用Format格式化日期数据:

DimdocAsNewPrintDoc

DimrtAsNewprt.RenderText

rt.DataBinding.DataSource=BindTables("订单")'将rt绑定到订单表

rt.Text="[Format(Fields!

日期.Value,""yyyy-MM-dd"")]"

doc.body.Children.Add(rt)

doc.Preview()

要记得对于字符串中的每一个双引号,都必须用两个双引号来表示。

在命令窗口执行下面的代码:

绑定多个字段

为了打印出订单表中的日期和数量,在命令窗口执行下面的代码:

需要使用容器(RenderArea),将原来的打印对象加入到容器中,这些打印对象不再需要设置绑定,只需为容器设置绑定即可。

例如:

DimdocAsNewPrintDoc

DimrtAsNewprt.RenderText

DimraAsNewprt.RenderArea

ra.Style.Spacing.Bottom=2

ra.DataBinding.DataSource=BindTables("订单")'将容器绑定到订单表

rt.Text="[Fields!

日期.Value]"

ra.Children.Add(rt)'将打印对象添加到容器中

rt=Newprt.RenderText

rt.Text="[Fields!

数量.Value]"

ra.Children.Add(rt)

doc.body.Children.Add(ra)

doc.Preview()

上述的代码将依次打印每一个订单的日期和数量。

打印标签

有了绑定,打印标签比以前更简单。

示例

DimdocAsNewPrintDoc'定义一个报表

Doc.Stacking=prt.StackingRulesEnum.InlineLeftToRight

DimraAsNewprt.RenderArea

DimrtAsprt.RenderText

ra.Width=40'设置标签宽度

ra.SplitHorzBehavior=prt.SplitBehaviorEnum.Never'禁止水平分割

ra.SplitVertBehavior=prt.SplitBehaviorEnum.Never'禁止垂直分割

ra.Style.Spacing.Right=2'设置标签之间的所有和上下间隔为2毫米

ra.Style.Spacing.Bottom=2

ra.Style.Padding.All=1'标签内容距离边框为1毫米

ra.Style.Borders.All=Newprt.Linedef(0.3,Color.Red)'设置边框

ra.DataBinding.DataSource=BindTables("员工")'将容器绑定到员工表

Doc.Body.ChildRen.Add(ra)'将容器加入到报表中

rt=Newprt.RenderText

rt.Text="姓名:

[Fields!

姓名.Value]"

ra.Children.Add(rt)'添加到容器中

rt=Newprt.RenderText

rt.Text="部门:

[Fields!

部门.Value]"

ra.Children.Add(rt)'添加到容器中

rt=Newprt.RenderText

rt.Text="职务:

[Fields!

职务.Value]"

ra.Children.Add(rt)'添加到容器中

Doc.Preview()'预览报表

表格与绑定

行组也可以设置绑定,这样我们可以很方便地将一个表格绑定到数据表。

例如,打印订单表中的某些列,代码非常简单:

DimdocAsNewPrintDoc

DimrtAsNewprt.RenderTable

DimtbasTable=Tables("订单")

DimColNamesAsString()=NewString(){"产品","客户","单价","数量","金额"}

ForcAsinteger=0ToColNames.Length-1

   rt.Cells(0,c).Text=ColNames(c)

   rt.Cols(c).Width=tb.Cols(ColNames(c)).PrintWidth

   rt.Cells(1,c).Text="[Fields!

"&ColNames(c)&".Value]"'设置绑定表达式

Next

rt.RowGroups(0,1).Style.TextAlignVert=prt.AlignVertEnum.Center'第一行内容垂直居中

rt.RowGroups(0,1).Header=prt.TableHeaderEnum.All'将第一行作为表头。

rt.RowGroups(1,1).DataBinding.DataSource=BindTables("订单")'将第二行绑定到订单表

doc.Body.Children.Add(rt)

doc.Preview()

注意这一行代码:

rt.RowGroups(1,1).DataBinding.DataSource=BindTables("订单")'将第二行绑定到订单表

该行代码将表格的第二行绑定到订单表,这样第二行将根据订单表中的每一行数据,自动生成副本,完成整个表格的打印。

FOXtable编程基本概念

DataTable和Table

Foxtable中有一个集合DataTables,通过该集合可以获得指定名称的表,例如:

DataTables("产品") '产品表

DataTables("客户") '客户表

DataTables("订单") '订单表

实际上你是看不到DataTable的,你看到的是Table,也就是说,上面的三个图,实际上就是三个Table。

那么什么是Table呢?

你可以这样理解,DataTable就像一个仓库,所有从数据文件中加载的数据,都存放在这里,而且这个仓库是不直接面对用户的;而Table就像一个展厅,是负责和用户打交道的,这个展厅(Table)从仓库(DataTable)中取得数据,并呈现给用户。

同样,Foxtable中也有一个集合Tables,通过该集合可以获得指定名称的Table,在没有建立关联的情况下,我们这个简化的订单管理系统包括三个Table,分别是:

Tables("产品")

Tables("客户")

Tables("订单")

在初始的情况下,Table会从DataTable中提取所有数据呈现给用户,如果你设置了筛选条件,Table就会从DataTable提取符合筛选条件的数据,然后呈现给用户。

例如订单表有1000行数据,那么DataTables("订单")从头到尾,始终都会有1000行数据,不受筛选的影响。

而Tables("订单")却不一样,如果没有进行筛选,那么Tables("订单")也会包括所有数据,也就是1000行数据全部可见。

如果现在从中筛选出产品为PD01的订单,且PD01的订单是200个,那么经过筛选后,Tables("订单")会包括200行数据,也就是你看到的那200个产品为PD01的订单。

所以关于DataTable和Table的关系,较为完整的描述是:

从数据文件加载到Foxtable中的数据,是存放在DataTable中的,它就像一个仓库,不直接面对用户;而Table就像一个展厅,是负责和用户打交道的,它根据指令从仓库(DataTable)中提取符合条件的数据,然后呈现给用户;通过菜单进行的日常数据管理工作,例如增加行、删除行、排序、筛选、汇总等等,都是在Table中进行的;除了编程,用户没有办法直接对DataTable进行操作,因为它是不可见的。

 

在任何时候,DataTable都包括所有已经加载的行。

 

Table中的行,既可以排序,也可以筛选,所有Table中行的数量和顺序都是可变化的,我们平时所看到的、所操作的,都是Table中的行。

 

我们在Table中进行的任何操作,最终都会反映到DataTable,例如我们通过菜单在Table中删除行,DataTable也会删除一行。

关联表和Table

定在上面这个简化的订单管理系统中,我们建立如下两个关联:

父表

子表

关联列

产品

订单

产品编号

客户

订单

客户编号

因为关联的建立,DataTable和Table不再是一一对应的关系,例如我选择产品表的时候,就会出现三个Table,分别是:

三个Table的作用为:

Tables("产品"):

主表,用于显示所有产品

Tables("产品.订单"):

如果在Tables("产品")中选定一个产品,这里会显示该产品的全部订单。

Tables("产品.订单.客户"):

如果在Tables("产品.订单")中选定一个订单,这里会显示该订单所属的客户。

同样在选择客户表的时候,也会出现三个Table:

Tables("客户")

Tables("客户.订单")

Tables("客户.订单.产品")

而选择订单表,出现的三个Table为:

Tables("订单")

Tables("订单.产品")

Tables("订单.客户")

由此我们可以看出,同一个DataTable可以有多个Table,例如下面三个Table:

Tables("产品")

Tables("订单.产品")

Tables("客户.订单.产品")

它们的数据全部来自于DataTables("产品")。

由此可见,DataTable的数量是固定的,而Table的数量会随着关联的增加而增加,同一个DataTable可以有多个Table,每个Table都各取所需地从DataTable中提取数据呈现给用户。

DataTable概述

通过DataTables集合,可以获得指定名称的DataTable(表)。

例如:

DimdtAsDataTable

dt=DataTables("订单")

DataCol表示DataTable中的列。

通过DataCols集合,可以获得指定名称的DataCol(列)。

例如:

DimdtAsDataTable=DataTables("订单")

DimdcAsDataCol=dt.DataCols("日期")

DataRow表示DataTable中的行。

通过DataRows集合,可以获得某一位置的DataRow(行)。

例如:

DimdrAsDataRow

dr=DataTables("订单").DataRows(0)

行是从0开始编号的,所以0表示第一行,1表示第二行。

通过列名称,我们可以得到或设置某一行指定列的内容。

例如:

DimrAsDataRow

DimvAsDouble

r=DataTables("订单").DataRows(0)

r("数量")=100

v=r("折扣")

由此可知,DataTable、DataRow、DataCol构成了表、行、列这样一个完整的结构体系,接下来我们具体介绍这三个对象。

DataTable常用属性

通过DataTables集合,可以获得指定名称的DataTable(表)。

例如:

DimdtAsDataTable

dt=DataTables("订单")

如果要禁止编辑某个DataTable,只需将其AllowEdit属性设为False,例如:

DataTables("订单").AllowEdit=False

在命令窗口执行上述代码,你会发现订单表的左上角出现一个锁形标记,表示此表已经被锁定,不能在其中输入数据。

如果你要取消锁定表,只需将其AllowEdit属性重新设为True:

DataTables("订单").AllowEdit=True

下表列出了DataTable的常用设置属性,它们的用法和AllowEdit属性完全一样:

属性名

说明

AllowEdit

是否允许修改表中数据

AllowAddNew

是否允许增加行

AllowClipBoard

是否允许复制粘贴数据

AllowInitialize

是否允许初始化此表

AutoAddNew

是否允许自动增加行,也就是在最后一行的最后一个单元格按回车键时,是否自动增加一行

AllowDelete

是否允许删除行

AllowLockRow

是否允许锁定行

AllowUnlockRow

是否允许取消锁定行

我们在编辑数据的时候,如果按回车键或Tab键,光标会向右移到下一单元格,通过下面的属性,你可以改变这种默认的光标移动方式:

属性名

说明

EnterKeyActionDown

按回车键是否向下移到另一单元格

TabKeyActionDown

按Tab键是否向下移到另一单元格

例如你希望按回车键向下移动光标,而不是向右移动,只需将EnterKeyActionDown属性设为True即可:

DataTables("订单").EnterKeyActionDown=True

最后三个常用的属性为:

属性名

说明

Name

返回DataTable的名称

Type

返回一个整数,表示DataTable的类型:

1内部数据表

2内部查询表

3外部数据表

4外部查询表

5临时表

HasChanges

逻辑型,判断DataTable的数据是否已经被修改

例如执行下面的代码,将列出所有已经修改过的DataTable:

Output.Show("已经修改的数据表:

")

ForEachdtAsDataTableInDataTables

   Ifdt.Type=1Orelsedt.Type=3Then

       Ifdt.HasChangesThen

           Output.Show(dt.Name)

       EndIf

   EndIf

Next

DataTable常用方法

AddNew

在DataTable中增加一行或多行,并返回所增加的第一行。

AddNew()

AddNew(Count)

Count:

可选参数,要增加的行数,如果省略,则只增加一行。

例如:

DimdrAsDataRow

dr=DataTables("订单").AddNew()

dr("日期")=Date.Today'将新增行的日期设为当天日期。

其实我们很少直接向DataTable增加行,更多的时候,我们是向Table中增加行,原因以后会讲述。

Save

保存数据。

语法:

Save()

Save(Setting)

Setting:

可选参数,是否保存设置。

例如单单保存数据:

DataTables("订单").Save()

同时保存数据和设置:

DataTables("订单").Save(True)

保存设置比较耗时,会影响保存速度。

菜单中的保存命令是同时保存数据和设置的。

如果你学会了设计菜单或窗口,你可以自己设计一个保存按钮,将其代码设为:

ForEachdtAsDataTableInDataTables

   dt.Save()

Next

这样单击这个按钮就能保存所有表,但是不会保存设置;对于一个成熟的、已经交付使用的项目,有时是没有必要保存设置的。

GetValues

从指定列中,获取不重复的值,以集合的形式返回。

语法:

GetValues(ColumnName,Filter,Sort)

ColumnName:

列名称,从此列中提取不重复的值。

Filter:

    可选参数,指定一个条件表达式,只返回符合此条件的值;请参考表达式的运算符和函数和条件表达式

Sort:

      可选参数,指定排序列,如果省略,则根据取值列排序,通常无需设置。

示例一

列出产品表中所有的产品名称:

DimProductsAsList(OfString)

Products=DataTables("产品").GetValues("产品名称")

ForEachProductAsStringInProducts

   Output.Show(Product)

Next

示例二

返回的值默认按照取值列排序,我们可以另外指定排序列;例如按产品编号顺序,列出产品表中所有的产品名称:

DimProductsAsList(OfString)

Products=DataTables("产品").GetValues("产品名称","","产品编号")

ForEachProductAsStringInProducts

   Output.Show(Product)

Next

示例三

给排序列加上DESC关键词,返回值可以降序排序,例如按最近一次订货的日期顺序,列出订单表中的客户名单:

DimCustomersAsList(OfString)

Customers=DataTables("订单").GetValues("客户","","日期Desc")

ForEachCustomerAsStringInCustomers

   Output.Show(Customer)

Next

示例四

可以设置取值条件,列出产品表中单价大于100的产品:

DimProductsAsList(OfString)

Products=DataTables("产品").GetValues("产品名称","单价>100")

ForEachProductAsStringInProducts

   Output.Show(Product)

Next

示例五

可以同时设置取值条件和排序列,例如按日期顺序,列出2012年6月1日后订购过PD01产品的客户名单:

DimCustomersAsList(OfString)

Customers=DataTables("订单").GetValues("客户","[产品]='PD01'And[日期]>#6/1/2012#","日期")

ForEachCustomerAsStringInCustomers

   Output.Show(Customer)

Next

示例六

下面这个例子,一般用户客户忽略。

可以同时从多列提取不重复的值,此时返回的不是字符的集合,而是字符数组的集合。

例如从客户列和产品列提取不重复的值:

'定义数组集合的时候,要在类型后加上括号,表示这是一个数组集合。

DimArysAsList(OfString())

Arys=DataTables("订单").GetValues("产品|客户")'列名用符号|分割

'注意循环变量是字符型数组,所以类型是String(),而不是String

ForEachAryAsString()InArys

   Output.Show(Ary(0)&"|"&Ary

(1))

Next

上面的代码是从客户和产品两列提取不重复的值,返回的不是一个字符集合,而是一个字符数组集合,每个数组包括两个元素,第一个元素是客户值,第二个元素是产品值。

GetComboListString

从指定的列中提取不重复的值,用符号"|"将这些值连接成一个字符串,并返回这个字符串。

此方法通常用于动态设置列表项目。

语法:

GetComboListString(ColumnName,Filter,Sort)

ColumnName:

列名称,从此列中提取不重复的值。

Filter:

    可选参数,指定一个条件表达式,只返回符合此条件的值。

Sort:

      可选参数,指定排序列,如果省略,则根据取值列排序,通常无需设置。

请参考表达式的运算符和函数和条件表达式

示例一

列出订单表所有的客户:

DimsAsString =DataTables("订单").GetComboListString("客户")

output.show(s)

示例二

返回的值默认按取值列排序,可以另外指定排序列,例如按产品编号顺序,列出产品表中所有的产品名称:

DimsAsString=DataTables("产品").GetComboListString("产品名称","","产品编号")

output.show(s)

示例三

可以给排序列加上关键词,例如按最近一次订货的日期顺序,列出订单表中的客户名单:

DimsAsString =DataTables("订单").GetComboListString("客户","","日期Desc")

Output.Show(s)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1