易表-设置表间关联_第1页
易表-设置表间关联_第2页
易表-设置表间关联_第3页
易表-设置表间关联_第4页
易表-设置表间关联_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设置表间关联关于表间关联

易表可以在表与表之间建立关联,例如在订单管理系统中,通常包括客户、产品、定单三个表,其中每个订单都对应着一个客户和一个产品,如果我们能够在客户与订单、产品与订单之间建立某种关联,那么相互之间可以互相引用和定位,例如订单可以引用产品表中的单价数据来计算金额,而选择某一个产品或某一个客户,也可以快速找到所有对应的订单。

设置表间关联

在表菜单上,单击“表间关联”,启动表间关联设置窗口。添加关联

单击“添加”,选择要建立关联的表,指定用于关联的列。左表和右表并没有区别,任何一个表都可以作为左表,也可以作为右表。删除关联

选择要删除的关联,单击删除。定位关联记录利用表间关联,我们可以在其他表中快速定位相关的记录。例如在一个订单管理系统中,如果已经在订单表和产品表之间通过产品编号建立关联,那么在订单表中,一旦选择某一订单,产品表会自动显示对应产品的详细资料;反之一旦在产品表中选择某一产品,订单表也会自动显示该产品对应的第一条订单,由于同一产品可能有多条订单,如果要显示该产品对应的所有订单,可以首先将订单表根据产品编号进行排序。查看关联表数据在“表”菜单中,指向“显示关联表”,会列出所有和当前表有关联的表,单击这些关联表,即可在主窗口的下方显示关联表,而且这些关联表只会显示和当前表的当前记录有关联的数据。下列图是一个入库管理系统,入库单表和入库明细表通过“入库单编号”建立关联,每个入库单记录在入库明细表中对应有多个记录,这是一种典型的父子关系。为便于管理,我们通常选择入库单表〔父子关系中的父方〕进行操作,在“表”菜单中指向“显示关联表”,单击“入库明细”,既可如下列图所示在主窗口下方显示入库明细表,而且这个入库明细表只会显示属于当前入库单的数据。如上图所示,右击入库明细表,通过快捷菜单,你可以增加、插入或删除行,还可以打印报表。

你也可以通过以下快捷键对关联表进行操作:

Ctrl+A

增加一行

Ctrl+I

插入一行

Ctrl+Del

删除行在关联表中增加行,其关联列内容会自动输入。例如上图中,在入库明细表增加一行后,新增行的入库单编号等于入库表当前行的入库单编号。引用关联数据如果已经在两个表之间建立关联,那么就可以在公式中互相引用数据,要引用关联表中的数据,必须同时指定表名和列名,表名和列名之间用符号“!”隔开,例如:[产品!单价]1、关联计算例如在一个订单管理系统中,如果已经在订单表和产品表之间通过产品编号建立关联,可以将订单表中金额列的刷新公式设为:[数量]*[产品!单价]*(1-[折扣])这样我们一旦在订单表输入订购产品数量和折扣,易表就会自动调用产品表中对应的产品单价,然后计算出金额。2、自动输入如果订单表和产品表都包括产品编号、产品名称两列,而产品表已经录入所有的产品编号和产品名称,我们希望在订单表中只需输入产品编号,对应的产品名称即可自动输入。为实现上述目的,首先在订单表和产品表之间通过产品编号建立关联,然后将订单表中的产品列的刷新公式设为:[产品!产品名称],设置完成之后,即可象我们希望的那样,订单表只需输入产品编号,产品名称即可自动输入。RelationRow变量当进行关联计算时,可以用RelationRow变量判断关联表中是否存在关联行(记录),如果存在,那么返回关联行的位置,否那么返回-1。例如,在订单管理的时候,订单表和产品表通过产品编号建立关联,在订单表中输入某个产品编号,如果产品表中存在对应该编号的产品,那么产品名称和单价自动调用产品表中的数据,否那么由用户自己输入。那么在订单表中,产品列和单价列的公式应该分别设为:

if([产品!RelationRow]=-1,[产品名称],[产品!产品名称])

if([产品!RelationRow]=-1,[单价],[产品!单价])统计关联表的数据关联表之间通常还存在某种统计关系,例如下列图是一个入库管理系统,入库单表和入库明细表通过“入库单编号”建立关联,入库单表中的金额等于入库明细表中各行金额之和。为了自动计算入库单表的金额,只需该列的刷新公式设为:

SumFor("入库明细","金额","入库单编号","=",[入库单编号])设置上述公式后,修改关联表(入库明细表)中的数据,入库单表会自动求出总的金额。需要注意的是,只有在入库单表作为主表,入库明细表作为关联表显示的情况下,入库单的金额才会自动计算。自动重算关联表在默认的情况下,如果某一列的刷新公式引用了关联表中的数据,那么关联表中的数据被修改之后,刷新公式并不会重新计算,要得到最新的计算结果,必须在“表”菜单中,单击“重算全表”。例如在产品表中修改单价,那么订单表中只有新增行〔或被重新修改数据的行〕才会采用新单价计算金额,如果希望已经输入的数据也采用新单价重算金额,必须在“表”菜单中,单击“重算全表”。可是很多时候,我们希望修改主表中的数据,关联表的数据能够自动更新,怎样实现呢?很简单。方法一

例如下列图,修改产品表的单价,希望订单表的单价自动更新为新的单价,为达次目的,可以按照如下步骤进行设置:

1、选择产品表的“单价”列,在“列”菜单上,单击“操作公式”

2、将“单价列”的操作公式设为:RecalcRGrid("订单表")

经过上述设置,即可实现在产品表修改某个产品的单价,订单表中对应产品的单价会自动更新为最新的单价。RecalcRGrid函数用于重算关联表,而且仅仅重算已经显示出来的关联表〔主界面和录入窗口均可〕。普通用户可以暂时忽略下面的方法。

方法二:

方法一必须产品表和订单表同时可见,而且订单表是作为关联表出现的情况下才能有效,如果我们希望不管订单表是否可见,修改产品表的单价,订单表的单价都可以自动更新为新的单价,只需按如下步骤设置。

1、选择产品表的“单价”列,在“列”菜单上,单击“操作公式”

2、将“单价列”的操作公式设为:

ReplaceFor("订单表","单价",[单价],"产品名称","=",[产品名称])

3、或者将“单价列”的操作公式设为:

RecalColFor("订单表","单价","产品名称","=",[产品名称])

前提是订单表的单价列的刷新公式设为:[产品表!单价]方法三

如果希望不管订单表处于主表状态还是关联表状态的情况,修改订单表中的数量列,产品表中的总数量和金额都可以即时刷新,可按照如下步骤设计:

1、选择产品表,将总数量、总金额的刷新公式分别设为:

SumFor("订单","数量","产品名称","=",[产品名称])

SumFor("订单","金额","产品名称","=",[产品名称])

2、选择订单表,将其数量列的操作公式设为:

if([产品表!RelationRow]>0,RecalcRow("产品表",[产品表!RelationRow]),True)

也可以设为:

if([产品表!RelationRow]>0,RecalcCell("产品表",[产品表!RelationRow],"总数量")AndRecalcCell("产品表",[产品表!RelationRow],"总金额"),True)公式的理解请参考ReplaceFor、RecalcColFor、RecalcCell、操作公式根据多列建立关联有的时候单单靠某一列是不能唯一区分某行数据的,例如在订单管理系统中,可能需要同时用品名和规格来区分一个产品,此时我们需要在订单表和产品表之间同时建立两个关联,一个关联基于品名,另一个关联基于规格。多个关联的使用和前面提到的单个关联并没有什么不同,在此就不多讲了。父子关联在设置关联的时候,如果关联表之间是父子关系,只需选择“父子”选项即可。什么是父子关系呢?父子关系也叫一对多关系,例如对于产品表和订单明细表,订单明细表中的每一条记录只能对应产品表中的一个产品〔记录〕,而每一个产品在订单明细中可能对应有多个记录〔订单〕,就像一个父亲可以有多个儿子,而一个儿子只能有一个父亲一样,所以这种关系称之为父子关系。在设置关联的时候,“父”指的是左表,“子”指的是“右表”,所以对于父子关联,左表和右表的位置千万不能搞错。对于父子关系的表,如果子表存在对应记录,父表中的对应记录将不能被删除,出于平安考虑,父表中的记录每次只能删除一行。再谈关联计算

前面已经说过,如果已经在两个表之间建立关联,那么就可以在公式中互相引用数据,例如在一个订单管理系统中,如果已经在订单表和产品表之间通过产品编号建立关联,那么订单表可以调用产品表中的单价计算金额,其金额列的刷新公式为:

[数量]*[产品!单价]*(1-[折扣])

如果修改了产品表中的单价,那么新增订单会采用新单价计算金额,原有的订单并不会采用新单价重新计算金额。但是如果修改原有的某一订单,该订单会采用新单价重新计算金额,如果执行重算全表命令,那么原来所有的订单都会采用新单价重新计算金额。

现在的问题是,原来的订单有可能要修改,但是又希望采用原单价,而且原有订单可能局部希望采用原单价,局部采用新单价,按照上述的方法,显然不可能实现这些要求,必须拓展一下思路:哪些订单采用新单价,哪些订单采用旧单价,计算机并不知道,所以最好增加一个标志列〔姑且称之为“标志”列吧〕,将标志列的类型设为逻辑型,如果断定某些订单永久性地采用原单价计算金额,那么在标志列打勾〔其值将为-1〕。

对于某些订单永久性地采用原单价计算金额,那么以后修改产品表中的单价后,如何直观地知道这些订单所采用的单价呢?所以最好还是在订单表中增加一个“单价”列。

将订单表的单价列的刷新公式设为:if([标志]=-1,[单价],[产品!单价])。这个公式的含义是:如果标志列的值为-1,那么单价不变,否那么刷新为产品表中的单价。

最后将产品表中金额列的计算公式改为:[数量]*[单价]*(1-[折扣])

因为刷新公式是从左到右计算的,显然对于订单表,应该先计算单价,后计算金额,所以应该将单价列置于金额列之前。如果你不希望设置标志列,只是希望输入订单的产品名称后,自动从产品表中调入该产品的单价,之后该订单的单价不再和产品表中的单价有任何关系,而且可以手工修改这个单价,那么只需将订单表中单价列的公式设为:if([单价]>0,[单价],[产品!单价])。这个公式的含义是,如果单价大于0,那么单价保持不变,否那么从产品表中取得单价。FindText在指定的表、指定的列中查找指定内容,并返回符合条件的行中指定列的内容。语法:

FindText(Grid,Col,CompareCol,CompareMode,CompareValue,......,Position)

Grid

在表中进行查找,可以用表名表示,也可以用位置表示。

Col

返回该列的内容,可以用列名称表示,也可以用位置表示。

CompareCol

进行比拟的列,可以用列名称表示,也可以用位置表示。

CompareMode

比拟方式,包括=、>、<、>=、<=、<>、Like、Instr共8种比拟方式。

CompareValue

比拟值

Position

这个参数决定返回第几个符合条件的行的数据,如果省略,那么返回第一个符合条件的行中指定列的内容。可以设置多个比拟条件,从第三个参数开始,每三个参数组成一个比拟条件。如果比拟方式选择的是Instr,那么进行包含查询;如果比拟方式选择"Like",那么可以在比拟值中使用通配符进行类似查询。例子:

FindText("订单","数量","客户","=","CS01")

返回订单表中CS01客户的第一个订单的订购数量。FindText("订单","数量","客户","=","CS01","产品","=","PD01")

返回订单表中CS01客户第一次订购产品PD01的数量。FindText("订单","数量","客户","=","CS01","产品","=","PD01",2)

返回订单表中CS01客户第二次订购产品PD01的数量。利用FindText函数,我们可以在不建立表间关联的情况下引用其他表中有关联的数据。例如订单表和产品表都包括品名、规格、单价等数据,而产品表已经录入所有的品名、规格和单价,我们希望在订单表中只需输入品名和规格,单价即可自动输入。为实现上述目的,我们只需将订单表中单价列的刷新公式设为:FindText("产品表","单价","品名","=",[品名],"规格","=",[规格])合并关联表在“表”菜单中,单击“合并关联表”,可以将两个关联表合并为一个新表。两个关联表必须有一个为父表,一个为子表,并分别指定用于关联的列,以及需要包括在新表中的列。那么如何确定父表和子表呢?我们知道关联表之间往往存在着一种一对多的关系,例如客户表中的某个客户在订单表中对应着多条订单,而一个订单只能对应着一个客户,所以客户表就是父表,订单表就是子表。关联筛选在表与表之间建立关联后,一个表中的每条记录在关联表中也应该有对应的一条记录,但是由于数据输入错误或其他原因,某些记录可能在关联表中没有对应记录。为了快速找出这些记录,可以利用“筛选”菜单中的“关联筛选”命令。

不仅是关联表,任何存在一定关系的表,都可以进行这种关联筛选。

例如在人事管理中,在根本信息表中按下列图所示进行关联筛选,即可快速找出在根本信息表中有记录而在工资表中没有记录的员工。显然,可以利用关联筛选得到两个结构相同的表的交集或差集,至于并集,可以利用前面提到的合并表的功能来实现。在子方设计下列图是一个入库管理系统,入库单表和入库明细表通过“入库单编号”建立关联,每个入库单记录在入库明细表中对应多个记录,为便于管理,我们通常选择入库单表进行操作,通过菜单命令“表-显示关联表”来显示当前入库单对应的入库明细数据。如果要打印一张入库单,显然应该包括入库单数据和该入库单对应的所有入库明细数据,由于入库单和入库明细存在一对多的关系,所以这张报表按照常规的方法在入库单表设计是不行的,因为没有方法逐一调用入库明细表中的有关数据;为了解决这个问题,我们可以在入库明细表中设计入库单报表,设计过程和普通的报表一样,而且可以很方便地通过[表名!列名]的格式调用入库单表中的数据,因为入库明细表中每条记录在入库单表中只有唯一的一条对应记录。在入库明细表设计好入库单报表之后,再回到入库单表,需要打印入库单的时候,右击入库明细表,从快捷菜单中指向“打印报表”,单击“入库单”即可。这是在入库明细表中设计的入库单报表:这是入库单打印效果:在父方设计在子方设计一对多报表有一个缺乏,就是每次只能打印父方一条记录,对于批量打印报表非常不便。为解决这个问题,我们也可以考虑在父方设计报表,不过相对要繁琐一些。

要在父方设计一对多报表,必须掌握FindText函数,我们知道FindText可以按照指定的条件从指定表中返回指定列的内容,而且可以用参数决定返回第几个符合条件的数据,例如:

FindText("入库明细","存货编码","入库单编号","=",[入库单编号],1)

表示从入库明细表中找出第一个入库单编号等于当前入库单编号的记录,并返回该记录存货编码列的内容。

FindText("入库明细","数量","入库单编号","=",[入库单编号],6)

表示从入库明细表中找出第六个入库单编号等于当前入库单编号的记录,并返回该记录数量列的内容。利用FindText设计一对多的关联报表时,首先应该估计父方每条记录最多可能对应子表中多少条记录,例如一个入库单,最多可能包括多少种产品,假定这个最大数为Rows,子表最大的列数是Cols,那么就在报表的细节区绘制一个(Rows+1)*Cols的表,第一行打印子表的列标题,其他各行用FindText函数调用子表数据进行打印,如下列图所示。为了提高效率,我们可以先设置好第二行的对象,然后复制、粘贴,将新粘贴的对象拖到第三行,然后稍作修改即可,其他各行也用类似的方法处理。上图中,第2行第3列的内容为:

FindText("入库明细","规格","入库单编号","=",[入库单编号],1)

第7行第6列的内容为:

findtext("入库明细","数量","入库单编号","=",[入库单编号],6)其他单元格的内容类推,下面是打印效果:你也许留意到上图中最后两行是空的,这是因为设计报表的时候,预留了7行数据,而当前入库单只有5条入库明细。明细字段明细字段如果将列类型设为明细型,那该列中的每一个单元格都会包含一个明细表,单击单元格右边的按钮,可以翻开明细表。例如在下列图中,家属和工作经历两个字段都是明细型。右击明细表,通过弹出的快捷菜单你可以设置明细表的栏目,列表工程、刷新公式,也可以排序、添加行、删除行。在明细表的最后一个单元格按回车键,会自动增加一行。你也可以通过以下快捷键对明细表进行操作:

Ctrl+A

增加一行

Ctrl+I

插入一行

Ctrl+Del

删除行引用主表中的数据1、明细表不管引用的是哪一个主表的数据,都必须同时包括表名和列名,例如[产品!单价]2、明细表虽然不能和主表建立表间关联,但是可以利用FindText函数到达和关联相似的效果。假定有一个名为产品表的主表,已经输入编号、品名、单价等数据,希望在明细表中只需输入产品编号,对应的品名和单价即可自动输入。为实现上述目的,我们只需将明细表中产品列的刷新公式设为:FindText("产品","品名","编号","=",[编号]),单价列的刷新公式设为:FindText("产品","单价","编号","=",[编号])引用明细表中的数据利用SubCell可以返回明细表中的指定位置的内容。语法:SubCell(ColName,SubRow,SubCol)ColName明细列的名称

SubRow

行坐标,如果设为-1,那么返回最后一行的数据。

SubCol

列坐标例如下列图中,订单列是明细型,订单明细表第3行第2列位置的内容为7,所以subcell("订单",3,2)=7统计明细表数据请参考一下函数:SubSumSubAvgSubMaxSubMinSubRows合并明细表对于明细字段来说,数据分布在不同的明细表中,不便于进行统一的分析处理。在“表”菜单中,单击“合并明细表”,可以将某个明细列的数据合并到一个单独的表中,而且可以包括主表中的局部列,这样就可以和主表一样,随心所欲地对明细数据进行统计分析,以及其他各种操作。自动复制明细行由于明细数据分散在不同的明细表中,如果有相同内容的数据要输入,必须一个一个明细表去录入,很不方便。为解决这个问题,最新版本的易表增加了自动复制明细行的功能,在某一个明细表中,输入要复制到所有明细表的内容,然后右击复制内容所在的行,从弹出的快捷菜单中执行“自动复制”命令即可。注意这项操作必须在主窗口进行,对于录入窗口无效。如何打印明细表数据明细表数据不能直接打印,只能利用SubCell函数在报表中打印。假定某个明细表的列数为Cols,最大行数为Rows,那么就在报表中绘制一个Rows*Cols大小的表格,在每个单元格中利用SubCell函数设置打印内容。例如下列图就是用subcell函数来打印员工的工作简历。明细表和关联表明细表的大局部功能都可以用关联表实现,大多数时候,我们推荐采用关联表。使用公式计算的根底:列类型为了确保公式计算结果的准确性,在设计表的时候,一定要正确设置列的类型,例如对于一个订单管理系统,必须将“数量”、“单价”、“折扣”等列设为数值型,将日期列设为时间型,客户、产品、雇员等列设为字符型。刷新公式关于刷新公式

通过设置刷新公式,某些列的值可以由其它列的值计算得出。例如在订单表中,可以将“金额”列的刷新公式设为:

[数量]*[单价]*(1-[折扣])

这样一旦增加或修改数据,金额即可根据数量、单价、折扣的值自动求得。为了确保计算结果为两位小数,我建议将公式改为:

Round([数量]*[单价]*(1-[折扣]),2)设置刷新公式

选择要设置刷新公式的列,在“列”菜单上,单击“刷新公式”,启动公式生成器,输入刷新公式,单击“确定”

刷新公式不需要在开始位置输入等于号,而且列名称必须用方括号括起来,例如对于“订单”表中的“金额”列,正确的刷新公式为:

Round([数量]*[单价]*(1-[折扣]),2)

以下的公式那么都是错误的:

Round(数量*单价*(1-折扣,2)

=Round([数量]*[单价]*(1-[折扣]),2)

[金额]=Round([数量]*[单价]*(1-[折扣]),2)

提示:刷新公式对于汇总模式、框架模式下的分组行是无效的,如果要对分组行进行计算,请在“列”菜单上,单击“重算列”,输入计算公式,计算范围选择分组行。条件计算有的时候,条件不同,计算公式不同,此时需要用IF函数进行条件判断,If函数有三个参数,第一个参数为条件判断式,第二个参数为条件成立的计算公式,第三个参数为条件不成立的计算公式。

例子一,下面是订单表中金额列的刷新公式,数量超过50的订单给与5%的折扣:

if([数量]>50,[数量]*[单价]*0.95,[数量]*[单价])

例子二,某单位营业员的奖金计算公式,回款额不同,计算公式不同,这是一个典型的IF函数嵌套使用例子:

if([回款额]<=1100,0,

if([回款额]<=1500,([回款额]-1100)*0.1+70,

if([回款额]<=1800,([回款额]-1500)*0.3+110,

if([回款额]<=2100,([回款额]-1800)*0.35+200,

if([回款额]<=2400,([回款额]-2100)*0.4+305,

if([回款额]<=2700,([回款额]-2400)*0.45+425,

0))))))

例子三,只有符合某一条件才进行计算,例如只有结账等于0时,才重新计算金额:

if([结账]=0,[数量]*[产品!单价]*(1-[折扣]),[金额])

结账列是一个逻辑列,[结账]=0表示还未结帐,这样我们修改产品表中的单价后,并不会影响已结帐的订单。触发条件刷新公式是自动计算的,但是这个自动计算也是有条件的,只有在相关列的数据被修改后,刷新才会自动计算。例如下列图中,只有单价、数量、折扣等相关列的内容被修改后,金额列的内容才会自动刷新。

何谓相关列呢?就是刷新公式引用了该列的数据,而且引用格式为:[列名称],所以对于金额列的刷新公式:

Round([数量]*[单价]*(1-[折扣]),2)

数量、单价、折扣三列就是相关列。对于大多数公式来说,都是直接引用列名称进行计算,无需在这方面进行过多的考虑。但是一些特殊情况下,我们就不得不考虑触发条件了。例如在下面的表中,有A、B、C三列,C列用于记录A列最后一次被修改的时间。易表中返回当前时间的函数是Now()。显然简单地将C列的刷新公式设置为Now()是不行的,因为此时A列不是相关列,修改A列数据后,C列的刷新公式并不会自动计算,为到达目的,我们可以将C列的刷新公式设为:IF([A]=[A],Now(),""),现在A列就是C列刷新公式的相关列,这样一旦A列数据变化,就会重算C列的刷新公式,由于条件[A]=[A]在任何时候都是成立的,所以A列内容变化后,C列就会自动记录当前时间。

此外,如果用户直接修改某列的内容,也会自动重算该列的刷新公式,所以对于任何一列的刷新公式来说,该列本身也算是一个关联列。流水账关于流水账

流水账是经常使用的一种记账方式,局部数据都要结合本行和之前行的数据计算得出。例如下列图所示,我们希望修改任意一行的进仓或出仓数量,所有行的结存均能自动刷新,且在分组行显示最新的结存。

设置刷新公式

显然本行结存是由上行结存加上本行进仓,再减去本行出仓,那么如何来引用上一行中的结存呢,我们需要使用Cell函数,Cell函数用于引用指定单元格,例如Cell(2,5)表示位于第2行第5列的单元格,此外Cell函数通常和变量Row、Col结合使用,Row表示当前行,Col表示当前列,所以Cell(Row-1,Col)表示同一列中上一行的单元格。此外,我们要注意第一行的结存和其它行的计算方法是不同的,第一行的结存的计算公式直接就是“[进仓]-[出仓]”,易表中有一个变量FirstRow,该变量代表每个分组的第一行。综上所述,上图中结存列的刷新公式应设为:

if(Row=FirstRow,[进仓]-[出仓],Cell(Row-1,Col)+[进仓]-[出仓])

如果要在第一行输入上一期的结存,那么刷新公式应该设为:

if(Row=FirstRow,[结存],Cell(Row-1,Col)+[进仓]-[出仓])

设置框架模式

要在同一本流水账包括多种产品,必须使用框架模式。例如要到达上图中的流水账效果,必须根据产品列进行分组,并对结存列进行统计,统计类型为流水账,如下列图所示:

自动输入分组名

在上例中,如果将“产品”列的默认值设为:Cell(ParentRow,Col),那么我们新增行时,会自动输入产品名称。ParentRow是一个变量,代表当前行所属的分组行,所以Cell(ParentRow,Col)表示同一列中分组行单元格的内容。

需要特别注意的

除了流水账计算,请不要轻易地在刷新公式中同时使用Cell函数和Row变量,否那么会将刷新公式看作流水账计算公式,修改当前行的数据,那么当前行之后的所有行都会重新计算,大大降低了程序的运行效率。同一行中的单元格应该用列名称来引用,而不是用Cell函数。例如下面两个公式的计算结果是一样的:

IF(Cell(Row,"未开票数量")=0,"OK","")

IF([未开票数量]=0,"OK","")

但是第二个公式的运算效率远远高过第一个公式,如果表的行数较多,而且在表的开始位置修改数据,那么两者的速度差异将是百倍、千倍甚至万倍。为什么计算速度这么慢?不少用户反响,自己设置的刷新公式运算速度特别慢。要提高易表的运算速度,要把握两个原那么;1、尽量用刷新公式,而不是单元格公式来计算。

2、除了流水账外,在设置刷新公式时,绝不可在Cell函数中出现Row变量,同一行中的单元格应该用列名称来引用,而不是用Cell函数。例如下面两个公式的计算结果是一样的:

IF(Cell(Row,"未开票数量")=0,"OK","")

IF([未开票数量]=0,"OK","")

但是第二个公式的运算效率远远高过第一个公式,如果表的行数较多,而且在表的开始位置修改数据,那么两者的速度差异将是百倍、千倍甚至万倍。为什么会这样呢,因为如果cell函数中出现row变量,会将该刷新公式作为流水账计算公式,修改当前行的数据,当前行之后的所有行的公式都会重新计算。默认值公式关于默认值公式

每一列都可以设置一个默认值公式,增加新行时,将自动计算该公式,并将结果填入到对应的列中。

例如,在“员工资料”表中,可以将“城市”列的默认值设为:"北京"。当用户在表中添加行时,会在“城市”列中自动输入北京,如果该员工不是北京的,录入员也可以输入其他城市的名称。

再例如在“订单”表中,可以将“日期”列的默认值设为:Today(),当用户在表中添加行时,会在“日期”列中自动输入当天日期。设置默认值公式

选择要设置默认值公式的列,在“列”菜单上,单击“默认值公式”。一个默认值使用技巧

新增行数据和上一行的数据有些经常是相似或相同的,对于相似或相同的列,我们可以将其默认值设为:cell(row-1,col),这样新增行的数据会自动从上一行继承这些列的内容,无需再次输入。cell函数说明默认值只是在新增行的时候计算一次,其他任何时候都不会自动计算的。重算列关于重算列

重算列可以按照指定的公式、指定的范围重新计算某一列,这种操作是一次性的。而刷新公式是一个属性,一旦设置那么永久生效。例如在订单表中,希望给数量超过500的订单增加5%的折扣,此时就只能就利用重算列来实现,而不能使用刷新公式,因为这种操作是一次性的。

操作步骤

在“列”菜单上,单击“重算列”,输入重算公式,指定重算范围,单击“确定”。

范围选项选项说明所有行重算所有行选定行重算选定行分组行只重算汇总模式或框架模式下的分组行符合条件的行只刷新符合指定条件的行,单击“...”可以启动表达式生成器来输入条件。包括隐藏行是否重算隐藏行单元格公式关于单元格公式

通过设置单元格公式,某些单元格的值可以由其它单元格的值计算得出。请注意单元格公式和刷新公式的差异,前者是针对单个单元格的,后者是针对整列的,而且如果可能,我们推荐尽量使用刷新公式,因为刷新公式的效率更高。

设置单元格公式

用鼠标右键单击要设置公式的单元格,从弹出的快捷菜单中单击“单元格公式”,启动公式生成器,输入单元格公式,单击“确定”。单元格公式不需要在开始位置输入等于号,直接输入计算式即可。

单元格公式不需要在开始位置输入等于号,下面的单元格公式可以正确运算:

CELL(1,2)+CELL(1,3)

以下的单元格公式那么是错误的:

=CELL(1,2)+CELL(1,3)

必须掌握的几个函数

在单元格公式中经常使用的函数有:Cell、Aggregate、Sumfor、Countfor

注意:和刷新公式不同,修改数据之后,单元格公式不会自动计算,在任何时候,按F8键,可重算单元格公式。如果你希望修改数据之后,自动计算单元格公式,可在“表”菜单上,单击“计算选项”,选择自动计算单元格公式即可。再次强调应该尽可能用刷新公式,而不是单元格公式。自动计算设置在默认情况下,刷新公式是自动计算的,一旦修改或增加数据,会立即得到最新的计算结果,而单元格公式在默认情况下,那么不会自动计算,修改数据之后,按“F8”键可重新计算所有单元格公式。如果设置了较多的单元格公式和刷新公式,那么程序的运行速度会降低,大面积地复制和粘贴数据的时候,更是如此。

为了提高效率,可以暂停自动计算。在“表”菜单中,单击“选项设置”,可以设置修改数据后,是否自动计算刷新公式、单元格公式以及分组统计结果。除非你的数据量很小,而且所设置的单元格公式不是很复杂,否那么最好不要选择自动计算单元格公式。暂停自动计算后,如果需要得到最新的计算结果,可以在“表”菜单上指向“重新计算”,即可重算刷新公式、单元格公式或分组统计结果,也可以重算选定的行、列,或者重算整个表。直接输入计算式在输入数据时,可以直接输入计算式,程序会自动对该计算式求值,并将结果填入单元格。例如在单元格中输入:=2*3,那么实际输入的将是6。注意在单元格中输入的公式,必须以等于号开始。可以在公式中使用函数、列名,例如:=INT([数量]*[单价])。

直接输入的公式是一次性的,计算结束后,该公式并不会保存,如果需要设置永久性的公式,请参考:刷新公式、单元格公式时间计算两种列类型

易表有两种和时间有关的列类型,时间型和时段型,前者表示某一个日期或时间,后者表示一个时间间隔。有效的时间数据99-01-01

12:30:12有效的时段数据28:12

12:30:12无效的时间数据28:12无效的时段数据99-01-01如何得到时间间隔

利用函数Number可以计算时间间隔,例如:

Number($"1999-3-1")-Number($"1999-2-1")=28

Number($"7:30")-Number($"1:30")

=0.25

Number函数是将时间转换为以日为单位的数字,所以用这种方式计算得出的时间间隔是以日为单位的。

时段数据的特别之处

时段型数据通常表示两个时间的间隔,并且是以秒为单位的〔尽管显示为时分秒〕,所以用Number得到两个时间的间隔之后,还必须乘以每天的秒数〔86400〕,才能得到真正的时段型数据,例如:

(Number($"7:30")-Number($"1:28"))*86400=6:02

需要的注意的是,上述的公式只有用在时段型列才有效,否那么会得到以秒表示的时间间隔:

(Number($"7:30")-Number($"1:28"))*86400

=21720

可以用CTime函数将数值转换为时段数据,例如:

CTime(21720)=6:02

时段数据可以直接进行加减,例如下列图中,后三列全部为时段型,合计列的刷新公式为:[上班时间]+[加班时间]

例如一

在打字速度考试中,知道每个学员的用时和字数,如何求得每分钟的平均打字速度呢?很简单,将“用时”列设为时段型,时段型数据参与运算的时候,将转换为以秒为单位的数值,例如时段“0:01:30”等于90秒,所以将转换为数值90参与计算。综上所述,平均每分钟打字速度的计算公式为:

[字数]/[用时]*60

例如二

在一个工资管理系统中,员工每天的工资按小时计算,每小时的工资为8元,那么工资列的刷新公式应该为:

(Number([下班时间])-Number([上班时间]))

*24*8

如果需要知道每人每天的工作时间长度,可增加一列“工作时数”,将其列类型设为时段型,刷新公式设为:

(Number([下班时间])-Number([上班时间]))

*86400

然后将工资列的刷新公式设为:

[工作时数]/3600*8

怎么理解上面的公式呢,函数Number求出的时间差是以天为单位,乘以24才是小时数,乘以86400(24*3600)得到的才是时段数据。行验证公式关于行验证公式

通过设置行验证公式,可以对输入的数据进行验证。在执行命令或移动到其它行之前,程序会根据行验证公式检验当前行的有效性,如果当前行不符合行验证公式要求,那么不能执行任何操作。

行验证公式必须是一个逻辑表达式。设置验证公式

在“表”菜单上,指向“公式设置”命令,单击“验证公式”,即可输入行验证公式。例如在订单管理系统中,要求每个订单的订货数量必须大于20,而且折扣不能超过10%,那么可以将行验证公式设为:

[数量]>20And[折扣]<=0.1行验证公式的触发条件

换行、切换表、执行菜单命令都会触发行验证公式,在同一行不同的列中移动不会触发验证公式。验证提示对于一个友善的应用系统,应该在数据不符合验证条件的时候,给用户一个明确的错误提示。要实现这个目标,必须用MsgBox函数。语法

MsgBox(Message,Option,Icon)

Message

提示信息

Option

决定MsgBox函数的返回值,设为0返回False,设为1返回True,设为2那么根据用户的选择返回值,用户选择“是”返回True,选择“否”返回False。

Icon

可选参数,指定提示窗口显示的图标,1错误,2询问,3警告,4提示几个例子

1、在订单表中,将行验证公式设为:if([折扣]>0.15,msgbox("折扣不能超过15%!",0),True)

如果用户输入的折扣超过0.15,将提示“折扣不能超过15%”,而且用户必须作出更正,才能进行其他操作。2、在订单表中,将行验证公式设为:if([折扣]>0.15,msgbox("折扣不能超过15%!",1),True)

如果用户输入的折扣超过0.15,将提示“折扣不能超过15%”,但是用户可以不作出更正,继续进行其他操作。3、在订单表中,将行验证公式设为:if([折扣]>0.15,msgbox("折扣最好不要超过15%,是否接受现在的折扣?",2),True)

如果用户输入的折扣超过0.15,将提示“折扣最好不要超过15%,是否接受现在的折扣?”,如果用户选择“是”,将接受用户输入的折扣,如果选择“否”,那么用户必须做出更正,才能继续进行其他操作。注意上述公式中的True,True是一个逻辑值,表示“成立”。验证公式必须返回True,才能通过验证,上述公式中,如果折扣不大于0.15,表达式直接返回True,也就是说折扣不大于0.15是符合验证公式要求的。防止输入重复内容假定有一个编号列,希望对于每一条记录来说,这个编号是唯一的,为达此目的,只需将行验证公式设为:

FindRow(Gridname,"编号","=",[编号],2)=0如何理解这个公式呢?等于号左边的关键在于最后一个参数“2”,表示返回第2个与当前行相同编号的行的行号,如果等于0,表示不存在相同编号的行,也就是当前行的编号是唯一的。不仅仅是验证行验证公式不仅仅可以用来验证数据,还可以在行验证公式中使用一些操作函数,完成各种操作,接下来我们将提供两个典型的应用实例。自动锁定行例如在下列图中,将验证公式设为:

if([审核]=-1,LockRow(Row),true)

这样一旦某一行数据通过审核〔在审核列打勾〕,换行后即可自动锁定该行,防止被人继续修改。自动增加行在一个人事管理系统中,有“雇员资料”和“工资数据”两个表。假设希望在“雇员资料”表中新增一个雇员后,“工资数据”也能自动增加一条该雇员的记录,为达此目的,可以将“雇员资料”表的行验证公式设为:If(FindRow("工资数据",""编号","=",[编号])=0,Addrow("工资数据","编号,姓名,部门",[编号],[姓名],[部门]),True)该公式首先在“工资数据表”中查找相同编号的记录,如果没有找到,就在“工资数据表”新增一行,并将该雇员的编号、姓名、部门等内容复制到“工资数据”表的新增行中。有关函数的理解,请参考:

FindRow

AddRow利用刷新公式进行数据验证我们前面已经知道,可以利用行验证公式对某一行的数据进行验证,但是行验证公式也有缺乏:

1、它是针对整行数据的,而且不是即时生效的,只有在移到其他行之前,才会进行计算判断。

2、不具备自动纠错功能。为解决这个问题,我们可以利用刷新公式进行数据验证。例如我们要求订单表中的折扣不能超过0.15,可以将折扣列的刷新公式设为:

if([折扣]>0.15,"",[折扣])

上述公式的含义是,如果输入的折扣大于0.15,那么拒绝接受〔去除折扣内容〕,否那么保持折扣不变。

你也可以这样设置公式:

if([折扣]>0.15,"错误!",[折扣])

这样一旦折扣列的内容超过0.15,将在折扣列显示“错误!”表验证公式表验证公式在存盘或切换到其他表之前执行,如果不符合表验证公式要求,将不能存盘或切换到其他表。除了验证之外,表验证公式还可以用来在存盘或切换到其他表之前,对当前表进行一些处理。

在“表”菜单上,指向“公式设置”,单击“验证公式”,可以设置表验证公式,注意不要和行验证公式混淆。验证的例子

例如在离开表之前,希望某一列的内容必须全部输入,不能存在空值,假定该列的名称为A,那么可以将表验证公式设为:

FindRow(GridName,"A","=","")=0处理的例子

例如在离开表之前,希望删除所有A列没有输入内容的行,那么可以将表验证公式设为:

DelFor(GridName,"A","=","")清理现场

我们知道,离开某个表之前,如果没有关闭录入窗口、备注窗口、图片窗口、明细窗口或关联表窗口,那么下次进入这个表,上述窗口就会自动翻开,为了保证每次进入这个表都能得到一个“干净”的环境,我们可以通过表验证公式来“清理现场”:

CloseWindow()AndCloseColWindiow()AndCloseRGrid()

由于存盘的时候,同样会执行表验证公式,这样上述公式会造成存盘时窗口自动关闭,为防止这种情况,可以将公式改为:

if(Status=0,CloseWindow()AndCloseColWindiow()AndCloseRGrid(),True)

Status是一个系统变量,存盘的时候返回1,其他时候返回0。

公式的理解请参考相关函数。行预处理公式在“表”菜单上,指向“公式设置”,单击“预处理公式”,可以设置预处理公式。预处理公式分为两种,分别为表预处理公式和行预处理公式,表预处理公式留待下一节讲述。每次进入某一行数据的时候,都会立即执行行预处理公式,这样我们就可以在用户编辑该行数据之前进行一些操作,例如锁定不应该编辑的列,解锁可以编辑的列,或者给操作者一些提示。使用实例

在下列图中,我们希望如果A列选中,那么禁止编辑B列和D列,否那么允许编辑这两列。

为实现上述目标,可按如下步骤操作:在“表”菜单上,指向“公式设置”,单击“预处理公式”。将行预处理公式设为:

IF([A]=-1,Lockcol("B")andLockcol("D"),unLockcol("B")andunLockcol("D"))

这样每次换行的时候,都会检查当前行A列的值,如果A列的值为-1〔打勾〕,那么自动锁定B列和D列,否那么解锁B列和D列。但是目前还有一个缺乏,就是如果在换行后修改A列的值,不会即时执行有关操作,为了解决这个问题,可以将A列的操作公式也设为:

IF([A]=-1,Lockcol("B")andLockcol("D"),unLockcol("B")andunLockcol("D"))表预处理公式一旦进入某个表,首先就会执行该表的预处理公式,这样我们就可以在用户操作这个表之前,进行一些预处理工作。例如翻开指定的录入窗口、菜单方案、列视图等等,还可以锁定或隐藏局部符合条件的行,甚至预先进行一些提示。

在“表”菜单上,指向“公式设置”,单击预处理公式,可以设置表预处理公式,注意不要和行预处理公式混淆。例子一例如我们希望在进入某个表的时候,能够自动翻开第一个录入窗口;而且当前用户如果是管理员,就同时翻开第二个列视图,否那么翻开第一个列视图;为达此目的,可以将这个表的表预处理公式设为:

OpenWindow(1)and

If(Username="管理员",OpenView(2),OpenView(1))

例子二if(UserType=2,

LockAll(),UnlockFor("雇员",UserName))

该公式的含义是:如果是分组码等于2的用户,那么锁定所有行,使得该用户只能查看而不能编辑数据;如果是其他分组的用户,那么锁定所有非该用户(雇员)的数据,使得该用户只能编辑属于自己负责的数据。例子三if(LocateFor("截止日期","=",Today(),"执行完毕","=",0)>0,Msgbox("有今天截止且未执行的记录!",0),True)

设置上述表预处理公式后,每次进入表,都会查找是否有截止日期为当天且未执行完毕的记录,如果有,就出现提示。

如果希望出现提示后,还能够自动筛选出这些记录,可以将公式改为:

if(LocateFor("截止日期","=",Today(),"执行完毕","=",0)>0,Msgbox("有今天截止且未执行的记录!",0)And

Filterfor("截止日期","=",Today(),"执行完毕","=",0),True)操作公式如果希望某一列的内容发生变化后,能够自动执行某项操作,就需要使用操作公式了。

例如在下列图中,我们希望某一行数据通过审核〔在审核列打勾〕后,能够自动锁定该记录,防止被人继续修改,为达此目的:

1、选择“审核”列

2、在“列”菜单上单击“操作公式”

3、将操作公式设为:if([审核]

=-1,LockRow(Row),"")其实前面用行验证公式也同样实现了这个功能,用操作公式和行验证公式有什么差异呢?操作公式是即时执行的,只要单击审核列,就会立即锁定当前行,而行验证公式是在换行的时候执行,所以单击审核列后,并不会立即锁定当前行,直到换行。如果操作公式需要进行多项操作,可以用符号And连起来,例如:

RecalcRGrid("订单明细")AndLockRow(Row)AndLockRowFor("订单明细","订单编号","=",[订单编号])操作公式的触发条件和刷新公式完全一样,请参考:刷新公式的触发条件。

操作公式还可以用来实现关联表之间的自动计算,请参考:自动重算关联表权限管理公式在“表”菜单中,指向“公式设置”,单击“权限管理公式”,可以设置权限管理公式在两种情况下会执行权限管理公式:

1、进入表的时候。

2、执行筛选、撤销筛选等命令或函数的时候。如果希望用户进入某个表后,能够根据不同的用户身份,隐藏局部行,使得每个用户只能查看和修改自己有权操作的行,此时就需要使用权限管理公式。假定希望在订单管理系统中,如果是普通用户登录,那么只显示该用户〔雇员〕负责的订单,如果是管理员登陆,那么显示所有数据。只需将订单表的权限管理公式设为:

if(UserName="管理员",ShowAll(),ShowFor("雇员",UserName))你也许会问,用表预处理公式不是同样可以到达目的吗?其实不然,因为表预处理公式在执行筛选〔包括撤销筛选〕命令或函数后是不会执行的,这样用户就可能看到他不应该看到的数据。但是如果你仅仅希望在用户进入某个表的时候,能够预先锁定局部符合条件的行,那么用表预处理公式是更恰当的。需要注意的是,权限管理公式用来显示、隐藏行的函数是专用的,与通用函数不同。

有关权限管理公式的详细用法,将在“用户与权限管理”一章中进行详细介绍。文件预处理公式文件预处理公式在翻开文件后执行,在“文件”菜单上,指向“文件设置”,单击“文件预处理公式”,即可设置文件预处理公式。

注意不要在文件预处理公式中使用操作当前表的函数,例如HideGrid、FilterFor等等,因为此时并没有表翻开,也就是不存在当前表。

文件预处理公式可以直接用表名来指定要操作的表,例如:RecalcGrid("销售统计")。

但是不能用GridName来指定表,因为GridName表示当前表,而此时并不存在当前表。例如希望在翻开文件后,能够立即翻开指定的菜单方案,可以将文件预处理公式设为:

OpenMenu("自定义菜单方案名称")

当然在第一个表的表预处理公式设置同样的公式,也能到达目的,但是文件预处理公式只执行一次,而表预处理公式每次进入表,都要执行一次,显然前者效率更高。当然如果希望不同的表,采用不同的菜单方案,就需要采用表预处理公式了。

文件验证公式在关闭文件之前,会执行文件验证公式,如果文件验证公式不成立,那么将不能关闭当前文件。在“文件”菜单上,指向“文件设置”,单击“文件验证公式”,即可设置文件验证公式。各种公式的简介易表有多达11种公式,其中与列有关有:刷新公式、默认值公式、操作公式,与表相关的有:表验证公式、填充公式、统计公式、表预处理公式、权限管理公式,与行相关的有:行预处理公式、行验证公式,此外还有单元格公式。对于大多数用户来说,只需掌握刷新公式即可。

刷新公式

用于设置列与列之间的计算关系,例如订单表中金额列的刷新公式应该是:[数量]*[单价]*(1-[折扣])默认值公式

用于设置某一列的默认值,例如订单管理系统中,可以将日期列的默认值公式设为:Today(),这样新增行会自动输入当天的日期。

操作公式

操作公式并非用来计算,通常用来根据用户输入数据的变化,来完成某项操作,例如锁定行或锁定某列。行验证公式

行验证公式是一个逻辑表达式,用于验证当前记录是否符合某一指定的条件。在换行或者执行任何命令之前,都会计算这个逻辑表达式,如果表达式不成立,那么会拒绝换行或执行命令。行验证公式也可以用来在换行前执行某些操作。表验证公式

表验证公式是一个逻辑表达式,用于验证当前表是否符合某一指定的条件。在存盘或者切换到其他表之前,都会计算这个逻辑表达式,如果表达式不成立,那么会拒绝存盘或切换到其他表。表验证公式也可以用来在存盘或切换到其它表之前执行某些操作。填充公式

用于设计统计系统,通常用于从其他表中提取分组信息,重算全表的时候,首先执行的是填充公式。统计公式

用于设计统计系统,重算全表的时候,最后计算的是统计公式,通常用于对统计好的数据进行进一步的分析处理,例如删除无效行、设置汇总模式等等。

表预处理公式

用户翻开某个表的时候,就会执行预处理公式,通常用来自动翻开录入窗口、列视图、菜单方案,或者锁定(取消锁定)符合条件的行,还可以对用户进行一些预先提示。行预处理公式

用户进入某行数据的时候,就会立即执行预处理公式,通常用来根据当前用户和当前行数据进行一些操作,例如提示用户考前须知,或者锁定〔或解锁〕某些列,行预处理公式通常和列的操作公式配合使用。权限管理公式

翻开某个表,或者执行筛选、取消筛选的命令或者函数的时候,就会执行“权限管理公式”。通常用来根据不同用户身份,隐藏局部行,使得每个用户只能查看

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论