DA19 – 使用Params 和更新规则的主细表

来源:互联网 发布:linux system 头文件 编辑:程序博客网 时间:2024/06/04 21:57

 

DA19 – 使用Params 和更新规则的主细表
Data Abstract (简称DA)提供了很多自动处理繁琐的主细表更新操作的功能.为什么自动处理主细表更新是一个不平凡的改进呢? 困难在于处理inserts/updates/deletes的顺序.例如,主表记录必须先于子表插入,而子表记录必须先于主表删除.
两个很重要的概念:
  • 扩展的Params 支持. TDADataTableMasterMappingMode属性提供.
  • 更新规则. 由设置多表的inserts/updates/deletes处理顺序实现,从而支持复杂的master/detail/detail.
更新规则将在后面讨论,首先介绍一下MasterMappingMode 属性. 其有三个值:
  • mmDataRequest: DA4引入,为现有的映射Schema字段到数据库字段方法提供向后兼容.
  • mmParams: DA4新特性,并作为默认值.
  • mmWhere: new in 'Vinci'.
本文讨论mmParams选项,DA4中处理主细表的首选.
提示:新的mmWhere MappingMode选项是Vinci中提供的一个简单工具,关于其相信描述请见DA32: Master Detail using Where (Delphi).
我们将在窗体中显示主细表,以最快的方式说明如何组合主细表记录.在两个小节中创建一个可更新的主细表项目.
创建一个主细表项目
打开Delphi并在IDE主菜单选择New | Other -> 'RemObjects Data Abstract' 页然后选择Combo Server:
点击OK生成服务模版:
这里我们需要适当修改项目的存储目录.
注意:在实际的应用中,你可能会去修改上面的配置以实现特定目标,但是在这个向导中使用默认值就可以了.
点击OK打开服务向导:
点击Next继续向导步骤:
点击Next,调出创建Schema向导界面:
点击Next 创建一个连接,选择Northwind,如图:
注意:相对于选择提供的默认连接,你可能更希望创建自己的数据库连接.
如果这样,选择'Add the following custom connection', 为其设置一个合适的连接名字并提供一个连接字符串.可以手动录入,也可点击'Define Connection'来可视化生成连接字符串,连接向导询问需要使用的驱动.例如,如果你选择了ADO,向导然后显示这个特定驱动的选项.
点击Next然后选择Order Details Order 数据表. 确保选中了Foreign Key选项:
点击Next然后选择使Schema Modeler打开的选项:
点击Finish关闭向导,弹出Schema Modeler.点击Relationships按钮显示已经建立的主细表关系:
提示:自动生成关系依赖于数据库可用的外键信息和通过向导或拖拽方式生成的相关数据集.当然,你可以在任何时候手动添加关系.
在左上部面板中点击Order Details将显示表的属性.现在切换到Statements标签并设置Statement TypestSQL:
点击工具栏中的SQL Editor按钮调用SQL编辑器:
上面截图为手动添加Where子句后点击Run as DataSet按钮的效果.
我们需要限制子表记录的获取以匹配当前的主表记录,这是通过上面手动键入的Where子句实现的.
注意: SQL中包含参数时就会显示在Parameter编辑器中. 可以通过数据查询来测试设置. 可按需要设置参数的属性.
点击OK关闭SQL编辑器. 切换到Params标签,点击Recreate Params按钮:
将会看到自动创建的parOrderID参数.修改其Data Type 属性为 datInteger 然后点击Save按钮:
关闭Schema Modeler返回向导:
点击Next:
点击Next选择需要创建的数据表:
点击Create按钮你将看到服务端项目向导的最后一页:
现在启动服务:
进入到客户端项目,在项目管理器中激活NewProjectClient项目并打开fClientDataModule:
右击tbl_OrderDetails启动主细表向导:
选择DataSourceMappingMode:
注意: 'Using automatic WHERE'将在DA32 文档中描述.
点击Next按钮选择描述主细表关系的字段:
点击Next:
我们已经看到在服务端设置用于限制获取细表记录的parOrderID参数. 添加如上的映射关系后点击Next.
tblOrders只需要改变其两个参数:
  • 设置ActiveTrue.这将同时激活tblOrderDetails (因为tblOrders.MasterOptions.moCascadeOpenClose设置为True).
  • 设置StoreActiveTrue. 除非这样设置否则将需要在运行时打开这个数据集.这个属性允许你选择在设计时显示数据而且在运行时自动打开数据集.
我们完成了设置主细表数据集.现在要使用它们. 打开fClientForm并调用 File | Uses Unit 引用fClientModule.向窗体中拖放两个dbgrids 和两个dbnavigator并将之与两个DataSource关联. 你将可以看到数据显示.
编译并运行客户端:
本向导的第一部分结束.虽然这里看似有很多繁琐的工作要做,但并不是这样的,由于本文非常细致,不用运行Delphi就可以看到所有的步骤.事实上,只在SQL Where子句中写了一行代码.你可以在Interim目录中找到这个原程序(见本文底部的连接link to the code).
使主细表可更新
这里假设你完成了本向导的第一部分或下载了原代码 (见本文底部的连接) 并编译运行了Interim目录中的客户端及服务端项目).
切换到服务端项目 (NewProject.exe)打开Schema (NewService_Impl). 首先我们要做的就是设置更新规则.更新主细表数据集很复杂,要借助于DA3中实现的功能. 这个问题涉及到更新顺序: 主表记录必须先于细表插入,而删除过程与之相反-细表记录必须先于其主表记录删除.
点击Update Rules按钮然后点击Create/Update Rules for all Datasets:
两个规则都不选择Delete选项并将之相应的命名为Orders_Update Order_Details_Update:
现在点击Add Rule按钮处理删除的问题.
增加一个规则,设置其名为Order_Details_Delete, 设置其 DatasetName Order Details并不钩选Insert Update选项.
增加另一个规则: Orders_Delete, DatasetName设置为Orders并不钩选Insert Update选项.
规则的顺序决定了处理的顺序. 在如下截图中使用向上/向下按钮排列规则:
还需要在Schema Modeler中作最后的修改. Orders数据集包含autoInc字段,我们需要设置一个属性以便于在细表数据集中可使用新的antoInc. 点击Orders.OrderId字段.钩选Server Auto-Refresh 属性后点击Save按钮:
关闭Schema Modeler. 服务端所有的修改都已经完成了,编译并运行服务端.
切换到客户端并打开fClientDataModule.
设置tbl_OrderDetails的两个属性:
  • 设置DetailOptions.dtDisableLogOfCascadeDeletesFalse
  • 设置DetailOptions.dtDisableLogOfCascadeUpdatesFalse
注意: 上面的两个联级设置很有必要因为Northwind强制检查引用完整性但是没有自动实现联级更新. 这个设置依赖于具体使用的后台数据库.
打开fClientForm, 拖放一个按钮并命名为bApply. 处理事件如下:
procedure TClientForm.bApplyClick(Sender: TObject);
begin
 ClientDataModule.tbl_Orders.ApplyUpdates;
end;
处于学习的目的,你将在压缩文件中的最后一个目录中找到项目的源码 (见本文底部的连接).
编译并运行客户端:
点击Apply Updates 按钮将向服务端发送变更数据,客户端的autoInc(-1)将自动变为服务端的值.几次测试后显示客户端可以在一个服务调用中处理任意的主细表insert/update/delete操作组合.
在本项目中你将发现一个小小的不足,当你重新打开项目组时都会提示一个服务端未运行的错误,从而导致客户端无法显示数据.因此,提供了改进的源代码(见本文底部连接)tbl_Orders.Active设置为False并在FormShow事件中加入如下代码:
procedure TClientForm.FormShow(Sender: TObject);
begin
 ClientDataModule.tbl_Orders.Open;
end;
总结
本文展示了如何在Data Abstract中使用MappingMode 选项的mmParams值不写代码去更新主细表数据集(事实上有一行Pascal代码和一个SQL Where子句).
请注意,这并不是Vinci的首选- DA32文档中查看新的'mmWhere' 选项描述.
本文对于Vinci并不是完全陈旧的,其中也包含了使用mmWhere时的自动处理操作. 特别重要的是Schema Modeler中的更新规则. 其为复杂的在一个发送到服务端的更新Delta中的主细细关联提供了指定详细处理顺序的功能.从而不需要再写代码去处理这些复杂的关系了! (手动代码范例见DA10文档).
原创粉丝点击