菜鸟也能用foxtable开发自己的应用程序整理篇_第1页
菜鸟也能用foxtable开发自己的应用程序整理篇_第2页
菜鸟也能用foxtable开发自己的应用程序整理篇_第3页
菜鸟也能用foxtable开发自己的应用程序整理篇_第4页
菜鸟也能用foxtable开发自己的应用程序整理篇_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、菜鸟也能用foxtable开发自己的应用程序整理篇(word版本)第一部分所需要的文件及讲解提纲1.创建我们的第一张表会员表表结构如下图:同时设置字段的类型,其他的暂时不要考虑;2.分析我们的第一张表,看看是否有什么事件会发生?可以按照以下的思路去分析这样,一个一个部分的来做1)增加的时候是否有什么动作发生?当添加一个新会员的时候,各个字段的状态会员卡号,默认为会员编号;会员等级,默认为普通;卡片状态,默认为正常;过期时间,默认为今天+一年;卡片余额,默认为0;积分数量,默认为0;折扣字段怎么操作呢?这些分析完毕之后,想想怎么达成你的目的呢?既然是新增的时候发生的事情,那么就找到表事件当我们点

2、击 datarowadding的时候,就会看到帮助的动态提示DataRowAdding增加一行时执行,此时新增行(DataRow)已经创建,但并未真正增加到DataTable中,通常在此处对新增行进行默认值的设置。e参数属性:DataTable:返回增加行的数据表。DataRow: 返回新增加的行。示例一例如希望新增行的日期设为当前系统日期,姓名设为当前登录用户名,可以将DataRowAdding事件的代码设置为:e.DataRow(日期) =Date.Today()e.DataRow(姓名) = User.Name有了这个提示,以上的内容是不是就迎刃而解了呢?是不是觉得其实弄这个也挺简单的嘛

3、!代码如下:e.DataRow(会员等级) = 普通e.DataRow(会员卡状态)= 正常e.DataRow(登记时间)= Date.todaye.DataRow(过期日期) = e.DataRow(登记时间).AddDays(365)e.DataRow(卡片余额) = 0e.DataRow(会员积分) = 0这里面仅有一个地方需要解释一下e.DataRow(过期日期) = e.DataRow(登记时间).AddDays(365)这里是什么意思呢?过期日期是需要自动填充的,什么时候呢?是登记日期后的365天,那么我们怎么获得这个addday呢?e.DataRow(登记时间)= Date.to

4、day后面点一个,按tab立即就出来帮助了这个是不是很方便这个部分介绍一下修改的时候发生的事情,以及如何解决1.进入单元格的时候希望通过窗口操作,其他操作一律取消;2.双击单元格,打开一个窗口 默认情况下激活编辑功能,一旦编辑功能受限,那么激活doubleclick功能3.希望此表作为副本表或者其他表的时候,怎么双击都可以弹出一个窗口;我们查看一下表的属性,观察事件这些事件,主要涉及的是编辑的控制,我们需要的是双击单元格的时候,取消其默认的编辑功能,同时打开某个窗口。方法如下:取消默认的编辑:当我们打开prepareedit的时候,自动弹出帮助文件PrepareEdit准备编辑单元格的时候执行

5、。e参数属性:Table: 准备编辑的表Row: 准备编辑的行Col: 准备编辑的列IsFocusCell: 逻辑型,是否是焦点单元格Cancel: 逻辑型,默认为False,设为True取消编辑。重要提示:千万不要在PrepareEdit事件显示Messagebox这样的对话框,因为每次进入单元格就会出现提示,这样会导致死循环的出现。在prepareedit中,写入:e.Cancel=True双击一个单元格,打开一个窗口:将DoubleClick事件代码设为:Forms(窗口1).Open接下来这个部分介绍保存的时候发生的变化以及需要的事件首先,我们点击表属性,看看涉及保存的事件有哪些?其次

6、,看看哪些属性适用于我们的系统?我们看到这里只见到有一个属性,beforesavedatarowBeforeSaveDataRow在保存某一数据行之前执行,可以在此对数据进行最终的验证。e参数属性:DataTable:返回正在保存的数据表。DataRow:返回正在保存的数据行。Cancel:逻辑型,设为True,取消正在进行的保存。而我们需要些什么呢?需求:1,保存的时候,需要部分列字段不能为空,否则就不能保存;2,被编辑的行如果状态不是保存状态,那么不能离开下一行;3,如果离开,那么对该行数据的操作就会被撤销;我们一个个的来解决!第一个问题:部分列字段不能为空,否则就不能保存;假设,会员姓名

7、和手机号码列不能为空,那么我们可以这样做Ife.DataRow(会员姓名) =Then 假设-正在保存的数据行-的列为空值MessageBox.Show(会员姓名必须输入) 那么弹出一个消息Elsee.Cancel=True 逻辑型,设为True,取消正在进行的保存.EndIf目前阶段,我们还不会用更复杂的语句,先用这些吧接下来,我们设置手机号码不能为空Ife.DataRow(手机号码) =Then 假设-正在保存的数据行-的列为空值MessageBox.Show(手机号码必须输入) 那么弹出一个消息Elsee.Cancel=True 逻辑型,设为True,取消正在进行的保存.EndIf这样做

8、了之后,是不是已经完成了这样的目标呢?第二个问题:被编辑的行如果状态不是保存状态,那么不能离开下一行;这个时候,我们关注的是:数据行的状态在帮助中搜索关键词“行的状态”我们来模拟一下,如果该行状态没有发生变化,那么就新增一行。Ife.DataRow.RowState=DataRowState.UnchangedThen如果该行的状态为 unchangedReturn终止执行下面的程序ElseDimResultAsDialogResult否则,定义一个对话框 Result = MessageBox.Show(你是否需要增加一行?,提示, MessageBoxButtons.YesNo, Mess

9、ageBoxIcon.Question)IfResult = DialogResult.noThenReturnElse e.DataTable.AddNew()EndIfEndIf第三个问题:如果离开,那么对该行数据的操作就会被撤销;上一节中,我们接触到对话框,当点击确定的时候就增加,否则就撤销帮助文件中搜索关键词“撤销”Reject撤销自打开文件或最近一次保存以来,对该行做出的修改。如果是新增加的行,执行此方法,会删除行。这样的描述很清楚。我们只需要加一条e.datarow.reject()即可完成任务!关于保存相关的事件,是不是很简单?你也可以操作一下,遇到不熟悉的,就翻翻帮助知识链接:

10、在帮助文件中搜索“保存”,你得到哪些结果呢?是不是有您需要的?更为复杂的不能为空的操作,先给出思路,先做一下,不懂再发问吧1)定义多个不能为空的字段集2)定义一个数据行3)在保存的时候遍历这个数据行,如果某列为空,就提示按照之前的顺序,有没有字段需要设置为表达式?帮助文件中,搜索关键词编号,你会找到下面的答案前面已经提到,由于自动编号列_Identify的存在,我们可以删除原来的产品编号、客户编号、订单编号等列,新增一个同名的整数型表达式列,表达式设为:_Identify会员编号,需要自动增加;因此这个,只需要设计表达式就可以了但是在我们第一阶段的案例文件中却看到如下的代码这个是关于自动编号美

11、化的问题如果学习还不是很深入,这个部分先可以不用了解,直接使用就可以了这个帖子是会员表设计以及事件设计的最后一个部分我们来关注一下,是不是有一些字段需要设置项目列表的?在会员表中,等级,性别,状态需要设置为列表项目;按照传统的方法,可以直接在列属性中设置这种方式基本属于傻瓜式操作,大家按照需要设置就可以了接下来,我们介绍会员表中的一些特殊的字段。有没有字段需要特殊的设置?1.会员照片列,需要设置为图片这个很简单,如图2.备注列,设置为可以单独输入;如果你不想用备注列,希望将该列作为一个普通的字符列使用,但是希望也能用窗口形式输入内容。解决的办法很简单,只需将该列的列表项目设置为“.”截止到现在

12、,我们的第一张表已经成功创建了;而且具备了基本的功能。让我们再来回顾一下:从这个图上,你学到了什么呢?这个表从最开始做,到完成,我最开始学习的时候花了 3天的时间去完成,理解花了3个月,不知道您现在理解了么?对于这张表,你还有哪里不清楚的呢?或者有更多的功能需要添加?欢迎您交流!正如PPT中所述,千万不要一开始就大而全,具备基本的功能后再考虑其他!至此,第一章节结束!第二章,第一部分,快速建立会员充值表,并设置表事件1)会员充值表的表结构,如图(同时设置其各个字段的类型)我们还是按照步骤来做吧系统设置的预见性系统设置的预见性增加时候的事件当添加一条新的充值记录的时候,各个字段的状态充值编号,自

13、动增加;会员卡号,默认为主表的会员卡号;支付金额,赠送金额,默认0;充值金额为:支付金额+赠送金额;(这个需要即时呈现,因此需要用表达式,否则用代码)支付时间:为当前时间:操作类型:默认为充值操作操作人:为系统登录用户备注:特定格式操作人,时间,为,某人,执行,操作类型,金额为;(其中),这个部分不需要即时显示,采用代码既可上述是分析的结果,现在我们来实现这个功能充值编号:设置表达式,为_identify,同时进行美化,代码如下CZ + SubString(, 1, 6 - Len(Convert(_Identify,System.String) + Convert(_Identify, Sy

14、stem.String)支付金额,赠送金额,支付时间,操作类型,操作人的设置:e.DataRow(支付金额) = 0e.DataRow(赠送金额) =0e.DataRow(支付时间) =Date.Todaye.DataRow(操作类型) =充值操作e.DataRow(操作人) = User.Name充值金额,计算方法为:充值金额=支付金额+赠送金额这个因为需要即时显示出来,所以用表达式比较靠谱系统设置的预见性编辑修改的候的事件1.进入单元格的时候希望通过窗口操作,其他操作一律取消;2.双击单元格,打开一个窗口 默认情况下激活编辑功能,一旦编辑功能受限,那么激活doubleclick功能3.希望

15、此表作为副本表或者其他表的时候,怎么双击都可以弹出一个窗口;我们查看一下表的属性,观察事件此主题相关图片如下:43.png这些事件,主要涉及的是编辑的控制,我们需要的是双击单元格的时候,取消其默认的编辑功能,同时打开某个窗口。方法如下:取消默认的编辑:当我们打开prepareedit的时候,自动弹出帮助文件PrepareEdit准备编辑单元格的时候执行。e参数属性:Table: 准备编辑的表Row: 准备编辑的行Col: 准备编辑的列IsFocusCell: 逻辑型,是否是焦点单元格Cancel: 逻辑型,默认为False,设为True取消编辑。重要提示:千万不要在PrepareEdit事件显

16、示Messagebox这样的对话框,因为每次进入单元格就会出现提示,这样会导致死循环的出现。在prepareedit中,写入:e.Cancel=True 双击一个单元格,打开一个窗口: 将DoubleClick事件代码设为:Forms(窗口1).Open()系统设置的预见性保存时候的事件按照第一章节的讲述,需要设置的事件可能有几个类型1)某些字段不能为空2)保存的时候删除一些为空的数据行其实,我们细分发现,这两个其实有矛盾的,既然已经显示某些字段不能为空,怎么会有为空的数据行呢?这里只是作为学习的一种演示。按照第一章节的介绍,我们很容易的设置某些字段为空,这里不细讲了,假如我们设置“会员姓名”

17、,“充值金额”不能为空,代码如下Ife.DataRow(会员姓名) =ThenMessageBox.Show(这个字段不能为空)End If保存的时候需要删除,会员姓名为空的数据行,怎么处理呢?通过查询帮助关键词“删除符合条件的行”,得到结果DeleteFor删除符合条件的行。语法:DeleteFor(Filter)我们的代码如何写呢?Deletefor(“会员卡号 is null”)为什么会这么写?首先,我们关注这个结构:DeleteFor(Filter),其中的filter是一个条件表达式,既然是表达式,那么必须用双引号括起来。至于,那个非必须的,当然我们也可以写成Deletefor(“会

18、员卡号is null”)关于空值和非空值,为了避免以后再出问题,总结帮助文件得出结论如下:一般情况下,尽量采用is null和isnot null,其他的可以不考虑;具体细节请参见帮助文件对于空值的描述!如果大家觉得,写条件表达式还是比较有困难的话,推荐大家一款免费的好用的,评价度极高的辅助软件【EBQ】,可以帮助大家!截图如下:依靠这个软件,基本的条件表达式应该没有什么问题了。第二章,第一部分,快速建立会员充值表,设置其他属性(表达式、列表项目、特殊字段)参考步骤图此主题相关图片如下:543.png这里有一点需要提出来讲一下:备注字段的设置,我们需要当充值金额发生变化的时候,备注列能显示,某

19、人何时为某人充值了多少钱?这个自然语言可以转化为以下的计算机语言:充值人+时间+被充值人+充值金额这之间的+,在计算机语言中用 &来替代,具体请参考帮助文件中的字符串连接章节计算机语言如下:充值人&时间&被充值人&充值金额接下来,我们来获取这些值。充值人,e.datarow(“操作者”),也可以用系统 变量 时间,e.datarow(“充值时间”),元可以用系统变量date.today()充值金额,e.datarow(“充值金额”)被充值人,按照原理来讲,应为,e.datarow(“被充值人“)但是这个数据却提示报错,为什么呢?因为在数据表中,根本不存在“被充值人”这个数据列

20、那怎么办呢?这个问题先留着到下一个章节的时候再讲述。至此,会员充值表创建完成,基本的事件功能也设置完毕第二章,第二部分,快速建立会员消费表,并设置表事件系统设置的预见性增加时候的事件(这个部分涉及的知识点较多,请大家多多留意)我们先观察一下会员消费表的表结构及字段情况此主题相关图片如下:1.png当我们添加一个消费记录的时候,会出现什么情况?哪些部分是需要我们特别注意的地方呢?1.消费编号按需要进行自动编号;解决的办法是什么呢?设置为_identify2.消费日期,需要添加的时候自动生成;自动生成很简单,用系统代码(已经多次提到date.today());3.消费金额,是计算会员本次消费产品的

21、金额总和;这里也许有些困惑了,都不知道消费什么产品怎么知道总金额呢?此处暂时留下第二个问题;4.折扣,需要根据会员的卡号自动从会员表获取;一般情况下,我最开始的想法就是像Excel一样,直接引用不就可以了吗?但是怎么做呢?毫无头绪。等会讲述。5.折后金额,是【消费金额】*【折扣】可以通过表达式计算,也可以通过代码计算;这里注意一下区别,表达式是立即显示的,代码不是即时显示的(我的理解)6.备注列,会员于什么时候,充值了多少钱?这里需要将自然羽然转化为计算机foxtable识别的语言7.会员卡号需要自动从附表中继承。也就是从会员表引用。这里有几个重点,大家突出学习一下一,跨表引用数据;二,表间的

22、关联设置;现在我们打开表属性,为几个简单的列设置属性此主题相关图片如下:11.png我们关注到,消费金额、折扣、备注列我们暂时无法去做。这个时候,我们考虑到表的关联问题;在帮助文件中搜索关键词“表间关联”我们按照帮助设置一下,会员表和会员消费表之间的关联。此主题相关图片如下:22.png这个时候,我们发现一个很大的问题,关联表的列选中中,根本不存在。会员卡号这个一个列。头大了吧。回想一下,我们刚刚是不是把会员表中的会员卡号和会员消费表中的卡号都设置成了_identify,这个是表达式。再看看帮助,提示:1、表达式列不能作为关联列使用。2、父表关联列和子表关联列的数据类型必须相同。3、如果你的项

23、目中有较多的表和关联,那么千万不要用po、co这样过于简洁的关联名称,而应该使用可读性更强的名称,例如“产品_订单”、“客户_订单”看看帮助第一点:表达式列不能作为关联列使用。难道这么好的东西我们却无法使用?这个时候解决的办法有两个1,放弃使用自动编号2,让这个自动编号列成为正常列第一种方法是我们不希望做的。但是如何使一个表达式列成为正常列呢?能不能再建立一个列,让这个正常列获取那个表达式列的数据?获取某行某列的数据,我们已经知道啦,e.datarow(“列名”),是不是?那么现在只需要将这个值赋予一个正常列不就可以了。好,这个表达式列是自动添加的,那么当这个列添加完成之后,我们将他的值写到一

24、个正常列,这个时候,我们的代码如下e.DataRow(会员卡号) =e.DataRow(会员编号)这样是不是蛮简单的。在打开关联表设置,我们是不是在会员表中看到了“会员卡号”这么一列呢?同样的办法,我们将已经做过的几个表的自动编号,凡是涉及到以后要设置关联的地方全部都设置为正常列e.DataRow(消费编号) =e.DataRow(消费编号公式)e.DataRow(充值编号) =e.DataRow(充值编号公式)按照这样的方法,我们设置了会员表和会员消费表之间的关联。此主题相关图片如下:33.png在如上的下半部分图中,可以直接对某个会员进行消费操作。这样是不是很容易?紧接着,我在回到字段设置

25、的最初。关于折扣列的设置。既然折扣列需要从会员表取值,那么属于跨表引用的问题。在帮助中搜索“跨表引用”里面详细介绍了,引用的两种方法1,建立关联,用表达式引用2,直接用代码这里我们都介绍一下。用表达式的方法,简单易行。我们在会员消费表中建立一个列,折扣表达式此主题相关图片如下:44.png表达式如下Parent(会员表_会员消费表).折扣当我们设置完成之后,回到会员表,你在关联表中增加一行数据,你看看您发现了什么?此主题相关图片如下:55.png折扣表达式列是不是自己出来了?用代码的方法,可靠,不需要建立任何关联,也就是说,你想在哪个数据表中取数,都没有任何问题。以下的代码需要去做的,在会员表

26、中查找当前的会员卡号,然后将会员表的折扣写入到本表的折扣列中1,DimdrAsDataRow2,dr= DataTables(会员表).Find(会员卡号 = &e.DataRow(会员卡号)&)3,IfdrIsNot Nothing Then4,e.DataRow(折扣) =dr(折扣)5,End If6,MessageBox.Show(dr(折扣)观察第一行数据,这里是定义一个数据行,既然是在数据库中操作,那么免不了就要定义datarow了第二行,是查找语句,是最关键的地方,意思是从会员表中查找 会员卡号 等于当前会员卡号的一条数据;关于find语句本身简单,但是条件却比较复杂。Find(

27、Filter,Sort,Index)Filter是表达式,当然用“”括起来会员卡号= &e.DataRow(会员卡号)&会员卡号这个地方,是列名 ,不用解释了后面的地方为什么用 单引号呢?表达式中的日期用符号#括起来,数值则不需要任何符号括起来,这些和代码中的格式是一样的,唯一不同的是字符串用单引号括起来。实际上应该为会员卡号=需要查找的内容而和需要查找的内容之间是字符需要用&连接 既然是表达式,所以又需要一个双引号于是分开这样看:会员卡号=“& e.datarow(“会员卡号”) &”找到结果之后,立即将会员表的折扣赋值给当前行的折扣列。接下来,我们关注本表的最后一列,备注列。先贴出代码:e

28、.DataRow(备注) =Date.Today&e.DataRow.GetParentRow(会员表)(会员姓名)&消费了&e.DataRow(折后金额)&元这串代码其实很容易理解,中间是字符连接符,其中有一点,提出来说明一下。e.DataRow.GetParentRow(会员表)(会员姓名)因为设置了关联,那么当前行的父表就有对应的行,引用父表对应行,直接用getparentrow。第二章,第二部分,快速建立会员消费表,并设置表事件系统设置的预见性修改编辑事件系统设置的预见性保存事件这两个部分在之前的两张表中有过详细的描述,这里就做过多的说明了。大家按照原来介绍的方法去设置就可以了第二章,

29、第二部分,快速建立会员消费表,设置其他属性(表达式、列表项目、特殊字段)其他事项表达式这里涉及到引用父表数据和统计子表数据的知识点。大家先看看帮助,回头有详解。代码如下:消费金额 = sum(Child(会员消费表_会员消费明细表).合计金额)折扣 =Parent(会员表_会员消费表).折扣其他事项项目列表此表中没有项目列表需要设置其他事项特殊字段主要是备注列,已经做过解释至此,关于我们的第三张 “ 会员消费表” 创建完成,并已经设置了基本是事件。接来下的两张表基本都根据前面讲述的知识点进行设置,讲述的速度回快一点。配合案例,应该比较容易理解,大家有什么不明白的可以在论坛发帖。第二章,第三部分

30、,快速建立消费明细表和产品表,并设置表事件创建会员消费明细表,如图此主题相关图片如下:01.png创建产品表,如图此主题相关图片如下:02.png说明:这两个表本身很简单,没有什么需要特殊设置的。真正的难点在于如何弄清楚两个表之间的关系。我们还是按照夕然的模式进行分析。对于产品表,基本上没有需要特别说明的地方,建议大家先把产品表建立完成。对于消费明细表,主要消费来自于产品表;我们主要关注消费明细表的设置;会员消费表之系统设置的预见性增加时候的事件当产生一个新的消费明细的时候,有如下的列发生变化:1.消费编号,需要继承会员消费表的消费编号这里只需要通过关联设置即可;2.产品名称,希望能够模糊输入

31、或者下拉选择(这个是本节的重点讲述内容)3.当模糊输入产品名称后,其他的列希望能自动输入(这个是本节的重点讲述内容)4.产品数量,就是另外一个需要手动输入的内容;这个无须多讲了5.合计金额为表达式列,自动计算这里只需要设置表达式即可;要求:在单元格输入的时候,能自动弹出一个窗口,能进行模糊搜索,输入产品名称之后,自动填入单价信息。我们来分析这个需求,其实有两个信息需要去解释:1.自动弹出窗口,能进行模糊搜索,将搜索的结果填入产品名称字段2.输入产品名称之后,自动填入相关信息;第一个问题:根据帮助文件,搜索自定义录入界面;帮助文件已经写得非常详细了,我把心得给大家分享一下。这里我主要参考 自定义

32、录入界面三。界面如下:此主题相关图片如下:34.png当我们点击产品列进行输入的时候,就会自动弹出一个窗口首先设计一个下拉窗口这个窗口含一个表,这个表 通过 单元格的输入情况 进行显示我们将这句话,变成计算机语言在dropdownopen中设计如下DimtxtAsString= e.Form.DropDownBox.TextDimtblAsTable=Tables(窗口1_Table1)Iftxt = Then Tables(窗口1_Table1).Filter = Else txt =*& txt &* tbl.Filter =客户ID Like & txt & Or 公司名称 Like &

33、 txt & Or 地址 Like & txt & Or 联系人 Like & txtEndIfe.Form.DropDownBox.Select()将输入焦点返回下拉列表框这样下拉窗口显示后,会自动根据下拉列表框的内容,筛选出可能的客户,并将输入焦点返回到下拉列表框。这个是帮助源文件,大家可以根据实际情况进行设置接着,双击某行数据,这个行数据就会填充到当前的单元格。首先,双击之后这个窗口关闭,执行关闭代码Forms(窗口1).DropDownBox.CloseDropDown()这样在下拉窗口双击某个客户,就会关闭下拉窗口。关闭的时候执行另外一个操作,将选择的值,填入到单元格将窗口的Drop

34、DownClosed事件代码设置为:Ife.SelectedThen如果选择了值 DimtblAsTable=Tables(窗口1_Table1) Iftbl.CurrentIsNotNothingThen e.Form.DropDownBox.Value = tbl.Current(客户ID) EndIf e.Form.DropDownBox.CloseDropDown()EndIf这样关闭下拉窗口后,可以自动将选定客户的客户ID输入到下拉列表框中。在我们的系统中,一样类似的设置,输入产品名称之后,自动填入单价信息。其他,更为详细的设置,请参见帮助文件。这里只穿针引线。第二个问题,就是当输入

35、产品名称之后需要自动填入其他相关信息;看起来似乎很复杂,其实就是将窗口的当前行的某列输入到表中当前行的某列吗?table().current(a) = 窗口.current(a)类似这样的做法。其实我们在之前学习过,利用表达式的方法获取数据的技术,这里当然也可以用find只不过两张表同时为当前表,你看得见的,就不用find了类似这样如果除了客户ID列,还要同时从客户表选择其它多列内容输入到订单表,可以将DropDownClosed事件代码改为:Ife.SelectedThen如果选择了值 DimtblAsTable=Tables(窗口1_Table1) Iftbl.CurrentIsNotNo

36、thingThen e.Form.DropDownBox.Value = tbl.Current(客户ID)Tables(订单).Current(其它列1) = tbl.Current(其它列1)Tables(订单).Current(其它列2) = tbl.Current(其它列2)Tables(订单).Current(其它列3) = tbl.Current(其它列3) EndIf e.Form.DropDownBox.CloseDropDown()EndIf这样设置之后,会员消费明细表,增加事件就完成了关于会员消费明细表中的编辑、保存事件,大家如果有需要就按照之前的方法进行设置,这里不再细讲

37、了。这个部分主要介绍一下会员消费明细表的其他属性设置,包括特殊字段,表达式列,项目列表等1,消费编号列,需要自动增加这里重点强调一下,为什么有了消费编号列,为嘛还要添加一个 做辅助列 ?(主要是为了关联方便)2,合计金额需要即时显示,因此设置为 表达式就可以了至此,会员表,会员充值表,会员消费表,消费明细表,均已经创建完成,产品表属于基本的内容,不做讲述了。到现在,这几张表已经具备操作的基本的功能。各个表之间的关联也已经完成;其实软件的核心部分已经突出了不知道您做的怎样了?接下来的部分,主要围绕这几张表来展开。第三章,分析各表之间的关系,建立必要的关联设置实话说,当初狐表最吸引我的地方也许就是

38、这个地方了,所以要单独提出来讲述一下。表间的关联看似很简单,但是在狐表中的显示方式我觉得非常的方便。一个主表可以和任意多的子表进行关联,同时在主表的窗口中显示子表相关信息。在我们的这个系统里涉及到几个关系:会员表和充值表的关系,会员表和消费表的关系,消费表和消费明细表的关系,消费明细表和产品表的关系。前两个关系通过会员卡号关联,消费表和消费明细表通过消费编号关联,明细表和产品表通过产品编号关联。设置本身比较简单,不细讲了,这里主要提出说明三点。1,表达式列是不能作为关联列的,在选择的地方根本没得选,2,关联列的类型要一致,不然关联会出错。3,万一碰到关联删除不掉的情况,我有个办法就是先改名,再

39、删除。当我们设置好关联之后,就可以在各个主表中看到相关关联的表了。如图:此主题相关图片如下:1.png下图是会员表主表显示的关联表此主题相关图片如下:2.png 下图是消费表和明细表之间的关联显示此主题相关图片如下:3.png这里需要在回顾一下为什么在案例中要设置那么多的辅助列了。第四章设置简单的导航菜单及窗口导航,其实就是菜单。菜单实现的方式有很多种,最简单的莫过于用数据表的标签来实现了,而这根本不需要我们进行学习,Excel本身也是这样的,不是?为了让这些导航功能更为具体,我想到的有几种方式:共有窗口+任务列表;共有窗口+导航栏;共有菜单+菜单;纯窗口的方式;在这里,作为初学,我们采用共有

40、窗口+任务列表的方式来实现导航;首先创建一个共有窗口:此主题相关图片如下:1.png取名字为导航。在窗口中加入一个topicbar任务栏控件。参考帮助文件topicbar的设置;此主题相关图片如下:2.png这样设置的好处是简单明了。同时设置每个任务的事件,代码如下:SelectCasee.Link.Name Case任务一在此加入相应的代码Case任务二在此加入相应的代码Case任务三在此加入相应的代码Case任务四在此加入相应的代码EndSelect在这个例子中,我采用的方法是偷懒才采用模板套用的方法,即套用狐表介绍文件.table这样我们只用修改部分连接名称就能换成自己的窗口了。这里特别

41、需要讲述的是每个连接点击之后会发生的事件。我们分析一下窗口afterload事件此主题相关图片如下:3.png第一部分,主要是风格的设置,如果不是很了解,复制就可以了第二部分,是设置主任务栏的。第三部分,是设置各个主任务下面的分任务的;当我们进行如下的设置之后,再切换主表的时候,这个共有窗口是不是就显示出来了?紧接着,我们开始设置,这个任务栏的事件;此主题相关图片如下:4.png这个时候,我们点击任务栏按钮,会出现TopicLinkClick事件,我们可以根据模板文件进行修改此主题相关图片如下:5.pngSelect Case e.Page.Name Case 会员管理 Select Case

42、 e.Link.Name Case 会员登记 MainTable = Tables(会员表) MessageBox.show(请点击鼠标右键新增一条会员信息!) Case 会员列表 MainTable = Tables(会员表_查询表) MessageBox.Show(请查看会员列表信息!) 上面显示黄色底纹的部分,也就是我们需要修改的部分;意思就是,当我们页面的名称为“会员登记”的时候,主表切换到“会员表”,即maintable = table(“会员表”);其他的类似设计按照这样的方法,我们就可以完成基本简单的页面导航了。完成的效果如下图:此主题相关图片如下:演示.gif现在是不是通过简单

43、的导航取代了狐表本身的表的标签功能?希望你也可以做到。五章完善各表的事件以及设置简单的查询表其实系统做到这里,基本的框架是出来了,但是还有很多问题,不知道大家有没有发现。我们一张张的表进行改进和完善。第一张表:会员表我希望完成更高级的功能有:1,希望输入会员的时候,一旦选择会员等级,就立即自动调用折扣2,对会员信息进行修改的时候,只要等级发生变化,那么折扣也应该发生变化3,原来基于会员表的信息,不再进行计算,即新的折扣只对新的消费信息起作用;老的还是保持不变;4,手机号码列应该为11位,按照格式输入,如果不是固定格式,那么就不让他输入5,推荐人字段,应该为公司员工,系统默认为公司客户,按照需要

44、进行选择各列的功能,我能想到的就这些了额,不知道您还有没有其他的想法呢?我们先来解决这些问题。问题1,2,根据输入的等级,引用折扣,修改的时候,自动引用折扣这个问题涉及两个知识点,这个折扣在哪里引用?(重新创建一张等级表);从这个等级表中引用数据(跨表引用);创建新的等级表,这个就不再讲了。主要说一下,跨表引用的问题。跨表引用,有两个基本的实现方式,第一,设置关联,直接用parent(表名)引用关联的数据,第二,不用设置关联,直接用find查找对应的条件,然后显示数据;代码如下Ife.DataCol.Name =会员等级Then如果更改的是会员等级列Ife.DataRow.IsNull(会员等

45、级)Then会员等级是否为空 e.DataRow(折扣) =Nothing如果为空,则折扣清零ElseDimdrAsDataRow dr =DataTables(等级设置).Find(会员等级 = & e.DataRow(会员等级) &)IfdrIsNotNothingThen e.DataRow(折扣) = dr(折扣)EndIfEndIfEndIf这个代码接近于自然语言了,很容易理解。因为是数据发生变化的时候,要发生的事件,因此,这段代码写在会员表的 datacolchanged中。问题3,旧的信息按照原来的折扣,新的信息,按照新的折扣;其实当我们解决完问题1,2的时候,这个功能已经实现,

46、除非你需要在更改某个会员的等级;那我们有必要了解一下,如果某些场合,需要让这些数据全部更新的话,怎么处理呢?在等级设置表中如下datacolchanged设置Ife.DataCol.Name =折扣DimFilterAsString=会员等级 = & e.DataRow(会员等级) &DimdrsAsList(OfDataRow) = DataTables(会员表).Select(Filter) ForEachdrAsDataRowIndrsdr(折扣) = e.DataRow(折扣) NextEndIf也就是说,在等级设置表中,如果折扣列发生变化,那么就在会员表中找到所有的与该等级对应的行,

47、遍历所有找到的行,然后将新的折扣替换。这句话,说的有些拗口,大家模拟理解一下。问题4,关于手机号码的问题,涉及掩码。这个在列属性中设置一下,如图此主题相关图片如下:5.png问题5,主要涉及下拉列表的问题,还是在列属性中设置,数据来源选择 数据表即可。这样,会员表的差不多就完善了,一张具备基本功能的数据表已经完成。接下来会介绍其他各章数据表的完善。.第五章第二部分:分析会员充值表还有没有需要完善的事件请大家看一下案例文件,当我们在会员表主表的关联表会员表.会员充值表增加一条数据的时候,是没有问题的。但是如果我们在会员充值表新增一条数据却出现这样的错误?看一下图片演示:此主题相关图片如下:关联错

48、误.gif到底是什么原因呢?让我们再详细分析一下发生错误的事件 datachangedSelectCasee.DataCol.NameCase支付金额,赠送金额,会员卡号 e.DataRow(备注) =Date.Today&user.Name&为&e.DataRow.GetParentRow(会员表)(会员姓名)&执行&e.DataRow(操作类型)&,&金额为&e.DataRow(充值金额) End IfEndSelect这段代码看似没有什么问题,但是为什么会出现错误呢?e.DataRow.GetParentRow(会员表)(会员姓名)是获取相对应父表的数据,而这个时候子表的 会员卡号 还没

49、有产生呢?所以会出现这样的错误,解决方法:此主题相关图片如下:1.png为了便于理解也便于日后查阅的方便,我们采用方法2.代码如下:SelectCasee.DataCol.NameCase支付金额,赠送金额,会员卡号 If e.DataRow.IsNull(支付金额) ThenIfe.DataRow.IsNull(支付金额)OrElsee.DataRow.IsNull(会员卡号)Then 这行代码是随后添加的,主要为了防止出现父表没有数据的时候,出现的错误提示e.DataRow(备注) =NothingElse MessageBox.show(e.DataRow.GetParentRow(会员表)(会员姓名) )e.DataRow(备注) =Date.Today&user.Name&为&e.DataRow.GetParentRow(会员表)(会员姓名)&执行&e.DataRow(操作类型)&,&金额为&e.DataRow(充值金额) End IfEndSelect这样就轻松解决了这个问题。接着,我们用同样的方

温馨提示

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

评论

0/150

提交评论