讲义课件02-中文12dbupdate_第1页
讲义课件02-中文12dbupdate_第2页
讲义课件02-中文12dbupdate_第3页
讲义课件02-中文12dbupdate_第4页
讲义课件02-中文12dbupdate_第5页
免费预览已结束,剩余18页可下载查看

付费下载

下载本文档

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

文档简介

1、迄今为止,只知道一种更新应用程序数据库的方法:通过tranions。正如所知,由tranion决定其信息的表。这些表生成之后,再编程执行表中数据的逻辑,删除和修改。这是一种对开发者完全透明的方法。同时,允许在一个tranion中定义关联数据必须遵从的业务规则,并生成程序来执行。因此,如果一个tranion中包含了在某种条件下触发的一个或多个Error规则,那么这些规则也会包含在所生成的代码中。而且一旦触发了Error规则,将会对数据库继续进行修改,直到正在处理中的数据不再满足那些规则的触发条件。而且tranions也能确保数据的完整性,这对保证数据库的一致性非常重要。但是,它却不能满足所有数据

2、更新的需求,现在需要一种非交互式的批量处理方法。可以选择的方法有两个:使用Business Components来做数据更新,它与tran或者,还可以用Procedure对象中的特定命令。ions紧密相关;下面就来看Business Components给提供的巨大灵活性,因为它在两种形式下都可以用:交互式或非交互式。接下来,先提出Business Components方法,然后再看Procedures中的更新命令。268DB更新-修改-删除交互式更新:ions: 用户通过视窗输入/修改/删除数据优点:按照业务规则执行(不会更新那些Error规则的)不会更新违背了数据完整性的(BC)非交互式更

3、新:Business Components (BC)ProceduresTranBusiness ComponentsBusiness Components概述需要为客户出具的票据autonumber规则:Default( BillDate, &today);Error( Theperiod considered must be past ) ifPeriodEndDate = BillDate;BillError( Wrongperiod ) ifBillPeriodStartDate BillPeriodEndDate;在这种情况下,不能使用tranions 。因为票据处理是一个批量任务:

4、一个月一次的出具过程,计算和对应于某个特定时期的所有票据269Business Components概述曾经了一个 GetBills Data Provider,用于处理所有票据而不:将返回一个结构化数据类型(SDT)的集合。看一下这个DP的层级结构,几乎与Bill tranion的结构完全一致270Billparm( in: &start, in: &end);Output: BillBillDate = &todayCustomerIdCollection: TrueBillPeriodStartDate = &startCollection Name: BillsBillPeriodEn

5、dDate = &endBillAmount = sum(Amount,Date = &start andDate 09/10/0810/10/08不会入!值得注意的是,这时Business Component变量结构中的成员都已被填写完毕并执行了Save方法(SDTs中没有)。这等效于终端用户在相应tranion窗体的交互式输入中给属性输入相同的值并按下Confirm键。因此,就如在tranion中一样,需要触发规则和检查数据的完整性。如果通过tranion来这个数据会怎么样呢?将会失败,因为满足了第二条Error规则 (如果today的日期早于October9,2008则满足第一条)。此外

6、,如果CUSTOMER表中不存在ID为3456的客户,那么就会破坏数据的中。到BILL数据库表完整性,这条就不能274Default( BillDate, &today);Error( Theperiod must behe past ) if BillPeriodEndDate BillDate;Error( Wrongperiod ) if BillPeriodStartDate BillPeriodEndDate;Business Components如果数据没有任何规则,即假定存在客户3456并且&today10/10/08的情况下又会怎样呢?将会在BILL表中一条!具有怎样的Bill

7、Id, BillDate 和 BillAmount的值?BillId 是自动BillDate = &today. Default规则被触发 BillAmount 为empty. 没有规则CustomerName呢?在执行这个Business Component的之前,变量&bill结构中的BillId将为empty。然而一旦执行了,由于BILL表中的BillId是自动的,将会在表中执行,且为给定号码的下一个号码。类似地,对于BillDate,由于在&bill结构中没有给它赋值,在前也为empty。一旦执行,将会触发tranion的逻辑,尤其是的Default( BillDate, &today

8、 )规则, 因此的BillDate属性的值为today的日期。而BillAmount也一样,不同的是没有分配规则为它赋值,因此的该属性的值仍然为empty。即使&bill.CustomerName有值,在这个中也不作考虑,因为CustomerName是一个推断属性,没有能更新它的规则。在tranion的结构层面定义的公式属性同样。即由于它们是tranion中的虚拟属性,在Business Component层面仍然保持虚拟。也会触发赋值。275&bill.CustomerId = 3456&bill.BillPeriodStartDate = #09-10-08# &bill.BillPeri

9、odEndDate = #10-10-08# &bill.Save()276Business Components修改-删除如果是想修改现有而不是新呢?BILL表的第100条将会被修改!(假设存在客户1258 并且BillDate=BillPeriodEndDate)至于删除No. 100票据呢?如果没有表Bill100,那么将会被删除!&bill.Load( 100 ) &bill.delete()&bill.Load( 100 )&bill.BillDate = #06-01-08#&bill.CustomerId = 1258 &bill.Save()Business Component

10、sError 控制在tranions中,errors 是交互式的 (通过Error Viewer)那么如何得知由BC修改引起的errors或messages呢?如果失败(由于一条Error规则,IR失败或数据重复)和/或Msg规则可以得到出错或警告信息:具有一个方法:&messages = &bill.GetMessages()&bill.Fail()预定义类型为&bill.Sucs()SDT.Warning Errorenum想要控制出错,需要定义一个预定义为SDT数据类型(来源于KB)的Messages (集合) 变量。当执行, 检查,载入, 删除时,会触发GeneXus自动生成messa

11、ges并载入tran Msg和Error规则。建议要经常检索这个message列表来做“出错控制”。由GeneXus 自动生成的常见的messages如下:ion中定义的Msg和Error规则中除了定义被message用于显示的参数外,还可以定义作为message标识符的参数。其目的是当把tranion当作Business Component执行时,可以获得由在数据库上的操作产生的messages列表。该列表除了message本身之外还提供了每个message的标识符(messageid)。然后可以对照messageid来编写代码:Msg|Error(, )例如可以是这样的 : 1, 2, E

12、rror1, Error2 或如“CustomerNameCannotBeEmpty”之类的描述等等。如果没有指定message标识符就会用message文本进行查询。注意: 由于messages是GeneXus自动生成的,其Id只能英文显示(无论选择何种建模语言)。277&bill.Load( 100 )&bill.BillDate = #06-01-08#&bill.CustomerId = 1258 &bill.Save()至此将完成了票据处理。首先,要了解一个事实:一个Data provider不仅能返回一个单一的或SDT集合,而且能返回一个单一的或BC集合。更重要的是只能将返回的BC

13、到数据库中。也就是说,一个Data Provider只能是在之后的数据库的操作中填写它的结构,而不能在它所载入的BC中修改或删除数据。另外,定义的变量&message是Messages.Message数据类型,在预定义Messages SDT中与之对应的项需要用BC中的GetMessages 方法返回。在BILL表中输入所有的待处理票据之后,应该把所有关联PendingFlag属性的值设置为False。的之所以这么做是因为不能对同一张做两次处理。而且这个值会用于Data Provider中BillAmount的计算。sum(Amount,Date = &start andDate = &Sta

14、rtDatewhereDate = &StartDatewhereDate = &EndDate PendingFlag = Falseendfor删除Procedures: Delete命令.删除表中的包含在一个For each中执行.删除所定位的基表。在执行到这个命令时执行(不是Endfor)查完整性。例如:删除中的所有For each一次1000 (效率更高)。这些行被hangingdefined byDateBlocking 1000DeleteEndfor在For each 命令中用Delete命令删除数据。删除命令在给定时刻删除定位的那条。所以不能“”地包含于源程序。这个删除命令必须包含于在其基表而不是扩展表中包含所要删除的那条的那个For each命令中。如果想要删除某个给定日期之前的所有,可以编写一个这样的procedure:For eachwhereDate = &start andCustomerId赋值?)。Date = &start

温馨提示

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

评论

0/150

提交评论