说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Delphi:MIDAS中动态强制约束编程

HTML文档下载 WORD文档下载 PDF文档下载
Delphi:MIDAS中动态强制约束编程

一个用来区分 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]);

finally

DataSet.Active := SaveActive;

end; { try...finally }

end; { if }

end;

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘