一个用来区分 MIDAS 与其他分布式解决方案的特征就是,MIDAS 支持动态数据约束(constraints)功能。这些动态约束可以控制由 AppServer 到瘦客户端的分布式数据的外观、业务确认规则、是否显示等等功能。作者(John Kaster)认为这是分布式数据库需具备的一个非常重要的特征。 


MIDAS 数据包(Data Packets)概述 

  先介绍一下MIDAS 数据包(Data Packets)格式的详细特征,MIDAS 数据包(Data Packets)是一个独立于语言和中立传输(transport-neutral)的二进制流格式数据,他包括元数据(metadata), 约束(constraints), 数据(data), 和deltas。 

  元数据是用来描述按照 APPSERVER 来分布的数据集。 MIDAS 2,3 支持嵌套数据集,因此单个数据包能够包含一个乃至于多个数据集的信息。约束是用来校验和显示数据集中的每个栏位的相关业务规则。Data 是数据集的实际数据栏位和记录数。Deltas 记录客户端的数据修改的 Log ,且是属于自动维护和传送到 AppServer中的。 


MIDAS 数据栏位约束 


  数据栏位约束是在 AppServer 与客户程序之间传播,可以快速修改业务规则,非常简便的发布新的客户程序,基于服务器端的业务规则,可以自动强制应用于客户程序,从而增强了分布式应用的生存周期以及系统的可维护性。 

  如果没有充分的理由,应在客户端强迫执行基于服务器端的业务规则,这样将会提供应用系统的可靠性和数据的准确性,因为有问题的数据包会立即被客户程序检测到,所以应该培养正确的使用数据值和减少无效数据的网络回路的习惯。简单一点说,数据约束能让你快速构建分布式系统,及时响应相关修改要求和提高系统的可靠性 

  MIDAS 2、3 数据包能够自动的由 AppServer 到客户端传递以下数据栏位属性: 

Constraint Property Description 

---------------------------------------------------------------------------------------------- 

ConstraintErrorMessage Message to display if data for the field if not valid. 

Example: CustNo cannot be blank 

CustomConstraint Constraints to place on the validation of the field. Expressions 

can be used for this constraint. 

Example: CustNo IS NOT NULL 

DisplayFormat Controls formatting of the field for display 

DisplayLabel Used as the data field’s default column heading. 

Example: Customer # 

EditMask Used for customizing data entry for the field. 

Example: 0000 

MaxValue The maximum value of a numeric field 

MinValue The minimum value of a numeric field 

Visible A boolean value indicating whether the field should be visible in 

a grid by default 

实现约束编辑服务器(Constraint Editor Server) 


  只要客户连接到 MIDAS Server ,相关RDM(remote data module)就会自动创建并提供给客户来访问Server约束编辑服务器(ConstraintSvr.exe)在第一次使用这些RDM时会去获取 provider 的列表和包含在这些provider 中栏位约束。ConstraintSvr 也同样为编辑每个provider中的栏位约束提供一个用户接口和为每个应用实例保存更改结果。 

  在更改结果保存后(在系统运行期),客户程序只需要简单的重新连接的 AppServer,获取一个新的数据包,此包中包含新的业务约束。 

变量角色(A Cast of Variants) 

  开始建立一个能够提供运行期编辑数据约束的应用程序,只需要做一点点代码定制。Screen 对象有一个属性可以列出一个应用程序中的所有数据模块(data modules),同样我们能通过检查此属性来建立包含在数据模块中的Provider 的列表。此 Provider 名列表是通过一个变量类型从数据模块中输出,同样也需要通过适当的Delphi 类型来接收数据模块的 Provider 命名。代码如下: 


{ Copyright (c) 1999 - 2000 by John Kaster, Dan Miser and Louis Kleiman } 

procedure GetProviderList( ProviderList : TStrings ); 

var 

ProviderNames : OLEVariant; 

I : Integer; 

DataSet : TDataSet; 

GenObject : TComponent; 

begin 

if (Screen.DataModuleCount = 0) then 

Raise Exception.Create( ’No data modules are active.’ ); 

ProviderList.Clear; 

{ Get the list of all providers for the first data module. 

All instances of the data module are probably the same. } 

ProviderNames := IConstraints(TConstraints(Screen.DataModules[0])). 

AS_GetProviderNames; 

for I := VarArrayLowBound(ProviderNames, 1) to 

VarArrayHighBound(ProviderNames, 1) do 

begin 

{ Retrieve the component matching the provider name } 

GenObject := Screen.DataModules[0].FindComponent(ProviderNames[I]); 

if (GenObject is TDataSetProvider) then 

DataSet := TDataSetProvider(Screen.DataModules[0]. 

FindComponent(ProviderNames[I])).DataSet 

else if (GenObject is TDBDataSet) then 

DataSet := TDataSet(Screen.DataModules[0]. 

FindComponent(ProviderNames[I])) 

else 

DataSet := nil; 

{ Add it to the list of providers, attaching the Dataset if assigned } 

ProviderList.AddObject(ProviderNames[I], DataSet); 

end; { for } 

end; { GetProviderList() } 


接收约束内容 


现在从RDM的实例获取 provider 列表,其他的都是一些传统的 Delphi 代码。通过一个列表框元件来显示Provider ,通过另一个列表框元件来显示每个提供者的栏位约束值。 Provider列表框元件命名为lbProviders。代码如下: 


procedure TFormConstraintsEditor.lbProvidersClick(Sender: TObject); 

var 

DataSet : TDataSet; 

I : Integer; 

SaveActive : Boolean; 

begin 

lbFields.Clear; 

DataSet := TDataSet(lbProviders.Items.Objects[lbProviders.ItemIndex]); 

if Assigned(DataSet) then 

begin 

SaveActive := DataSet.Active; 

DataSet.Open; 

try 

for I := 0 to DataSet.FieldCount - 1 do 

lbFields.Items.AddObject(DataSet.Fields[I].FieldName, 

DataSet.Fields[I]);