ASTA 3 帮助向导(转)

来源:互联网 发布:剑灵最美捏脸数据图 编辑:程序博客网 时间:2024/05/16 05:24

欢迎使用ASTA 3 帮助向导. 这个文档化的向导包含:新手快速入门, 向服务器发送文件的技术(没有数据库服务器的参与)展示如何使用Providers ServerMethods. 这个版本的向导可以在网上下载。

还有很多范例可以从网站下载(http://www.astatech.com/files/examples/asta3/Asta3ExampleCode.exe). 其中有100多个范例. 我们计划将它们及其文档加入到这份帮助向导. 如果你需要一些范例我们也可以提供.

这个帮助向导已经连接到ASTA 主帮助文件.这份帮助文件可用于 Help format 或者PDF格式.

一些指南中的例子包含了它们自己的服务器,另外的作为标准的ASTA服务运行.

你可以在不同的组中查看这个指南。

 

 

 

1.4.1 新手快速入门

如果你是新手我们建议你使用已经编译好的服务器程序,这里有好多ASTA服务器程序供你使用像 Asta3ADOServer.exe, Asta3BDEServer.exe,Asta3IBobjectsServer.exe 和其他28!

在这里启动ClientSideSQL范例.有经验的N层用户我们还是建议你使用已编译好的ASTA服务器并启动ClientSideSqlInternet上运行。你可以使用TASTAProviders TAstaBusinessObjects 管理的ServerMethods轻松地把业务逻辑移动到中间层. 启动

Server Side Technique tutorials 范例可以看看在服务器端编程是多么轻松的事情.

 

1.4.1.1 不用编程实现客户端

要求

ASTA中间层服务器启动.

描述

这是我们传统的ASTA入门指南,显示了不用编码就可以轻松的实现在Internet中运行的瘦客户端.

1. 其动ASTA服务器.

2. 在窗体上拖入一个AstaClientSocket控件

3. 在窗体上拖入一个AstaClientDataSet 控件.

4. 拖入DataSource Grid,并设置他们的关系使grid可以显示数据集.

5. AstaClientDataSet.sql属性中写入一些sql语句 Select * from Customers.

6. 设置AstaClientDataSet.Active = true,这时你可以看到数据出现在grid中,服务器端可以看到客户端的请求信息了.

7. 运行程序,你已经开发出可以在internet中运行的程序了.

注释:

为了优化运行速度,你提取数据时要精简,只查询你需要的数据.永远不要出现select * from …这样的sql命名.

 

 

1.4.1.2 无编码更新数据

要求

ASTA 中间层服务器运行.

描述

ASTA 被设计成你只需要提供select查询语句,或者在客户端的 ClientSide SQL 或者在服务器的TAstaProviders Servermethods. ASTA 可以自动生成所有的update, insert delete SQL.

打开NoCodeThin Client 范例, 设置 AstaClientDataSet.EditMode 属性为

AfterPost. 做这个之前你要确定你已经设置了UpdateTableName属性和Prime Key Fields属性. Below is the Design time EditMode property Editor from the AstaClientDataSet.

注意:这个例子从服务器提取数据和修改数据都没使用事务,而我们建议写cs程序的时候对所有修改远程数据库的Post使用事务.所以你需要写一行代码去调用ApplyUpdates方法.AlmostNOCodeTransactions范例中可以找到这个例子.

1.4.1.3 几乎不写代码的事务

要求

ASTA中间层服务器运行.

描述

这个范例以No Code Thin Client No Code Updates 范例为基础.由于在cs程序中事务是一直被推荐的,所以写一个select sql 并点击TAstaClientDataSet.Editmode 属性去修改 Cached Updates 的更新模式.

当保存删除,修改,插入的结果时只需要写一条语句:

procedure TForm1.Button1Click(Sender: TObject);

begin

AstaClientDataSet1.ApplyUpdates(usmServerTransation);

end;

这里是发生的一系列过程:

1. 自动生成 insert, updates and deletes sql语句

2. 传送这些命令和数据到服务器.

3. 在服务器上开始一个事务.

4. 在修改的数据的每一行执行sql语句.

5. 发生错误就回滚并向客户端抛出异常.

6. 没有发生错误就提交.

7. 返回到客户端并清除OldValuesDataSet.

 

 

1.4.2 内存数据集

TAstaDataSets

1.4.2.1 主细表

展示怎么样在内存数据集中使用主细表结构, 在主细表的支持下设置和清空 master fields属性以此遍历数据集.

AstaClientDataSets典型的执行主细表方法是在细表中使用参数化查询.当主表的行变化时自动产生一个新的查询送到服务器端.ASTA也支持一次把所有主表记录对应的细表数据查询到客户端数据集中并用filter来执行主细关联.下面是两种方法的小例子("connected" master/detail disconnected Master/Detail.)

procedure TForm1.ButtonClick(Sender: TObject);

begin

with DetailDataSet do

if Button.tag=0 then begin

SetToDisconnectedMasterDetail('Select * from orders order by orderno','CustNo');

Button.Tag:=1;

Button.Caption:='Set to run Master Detail from Server';

end else begin

SetToConnectedMasterDetail('SELECT * From ORDERS where Custno=:CustomerNumber');

Button.Caption:='Set to run Master Detail Locally';

Button.Tag:=0;

end;

end;

 

 

1.4.2.2 索引

TAstaDataSets 支持索引所以你可以像用Delphi的标准控件TTable一样调用SetRange FindKey方法. 另外在存在的索引上调用Locate方法使执行查找速度最佳,

范例The Index Tutorial展示使用TAstaDataSet索引的方法.

如果一个索引没有与任何字段相关联他将建立bookMard的索引. 用下面方法快速增加索引

procedure AddIndexFields(TheIndexName:String;Const FieldNames:Array of String;Const

Descending:Array of Boolean);

procedure AddIndex(FieldName:String;Descending:Boolean);

下面是用代码增加索引的标准做法.

AstaDataSet1.Active := True;

Listbox1.items.Add('<not sorted>');

with AstaDataSet1 do begin

Indexes.Clear;

with Indexes.Add do begin

Name := 'Country';

Fields:='Country';

Active := True;

Listbox1.items.Add(Name);

end;

with Indexes.Add do begin

Name := 'Branch';

Fields:='branch';

Active := True;

Listbox1.items.Add(Name);

end;

with Indexes.Add do begin

Name := 'Sequence';

Fields := 'Sequence';

Options := [ioUnique];

Active := True;

Listbox1.items.Add(Name);

end;

with Indexes.Add do begin

Name := 'Transaction_Id';

Fields := 'Transaction_Id';

Active := True;

Listbox1.items.Add(Name);

end;

end;

end;

 

 

1.4.2.3 创建字段(Fields)

描述

内存数据集AstaDataSets 在设计期或运行期用FieldsDefine属性,使用任意的delphi DataType来配置他. 范例CreateFields展示如何利用FastFieldDefine调用增加字段( fields) 并在运行时增加计算字段.

使用 FastFieldsDefine在运行期动态增加字段.如果数据集刚被生成并且第一次创建字段,你就不用调用NukeAllFieldInfo方法了.否则你就要调用NukeAllFieldInfo清空所有的字段信息.

with AstaDataSet1 do

begin

close;

nukeallFieldInfo; //only needed if you are going to recreate it again

FastFieldDefine('Name', ftstring, 25);

FastFieldDefine(FormatDatetime('tt', now), ftinteger, 0);

FastFieldDefine('Date', ftdatetime, 0);

FastFieldDefine('Age', ftinteger, 0);

Open;

end

 

1.4.2.3.1 运行期增加计算字段

描述

在设计期右键点击delphiDataSet控件在弹出菜单中选fields editor可以创建一个持久化的字段. 如果你要在运行期做到这些你要使用 AstaFieldandStream.pas 中的MimicTableandMakeFieldsPersistent方法完成 .

var

CalcField: TStringField;

begin

with AstaDataSet1 do begin

close;

NukeAllFieldInfo;

with FieldDefs do

begin

Add('Test', ftString, 25, false);

Add('Name', ftstring, 25, True);

Add('Date', ftDateTime, 0, False);

Add('Age', ftinteger, 0, False);

Open;

end;

if not CalcFieldCheckBox.Checked then exit;

//this next call is like right mouse at design time and adding fields

MimicTableAndMakeFieldsPersistant(AstaDataSet1, False);

CalcField := TStringField.Create(self);

CalcField.FieldKind := fkCalculated;

CalcField.Size := 20;

CalcField.FieldName := 'CALC';

CalcField.DataSet := AstaDataSet1;

AstaDataSet1.Open;

end;

end;

 

1.4.3 客户端SQL

AstaClientdatasets 继承自TAstaDataSets,通过 TAstaClientSocket 与远程服务器通讯的内存数据集.这个范例展示怎么使用 AstaClientDataSet的方法和属性.

1.4.3.1 合计(Aggregates)

要求

运行Asta3BDEServer

描述

使用合计可以在汇总客户数据集中的数据.

AggregatesTAstaAggregate类型对象的集合, 每一个成员都定义了在一组客户端数据集中计算合计值的公式. 个别的aggregates可以汇总所有的客户端数据集或者具有相同值的一组数据 .Aggregates汇总的一小组记录是与索引关联的,并只能用在当前索引上.

下面的例子展示如何来定义 Aggregat.

procedure TForm1.FormCreate(Sender: TObject);

begin

with AstaClientDataSet1 do begin

Indexes.Clear;

with Indexes.Add do begin

Name := 'BMK';

Active := True;

end;

with Indexes.Add do begin

Name := 'Company';

Fields := 'Company';

Options := [ioDescending, ioUnique, ioNatural];

Active := True;

end;

with Indexes.Add do begin

Name := 'TaxRate';

Fields := 'TaxRate';

Active := True;

end;

with Indexes.Add do begin

Name := 'CustNo';

Fields := 'CustNo';

Options := [ioUnique];

Active := True;

end;

with Indexes.Add do begin

Name := 'State';

Fields := 'State';

Options := [];

Active := True;

end;

end;

AstaClientDataSet1.IndexName := 'State';

with AstaClientDataSet1 do begin

Aggregates.Clear;

with Aggregates.Add do begin

Name := 'GrpCnt';

AggKind := akCount;

IndexName := 'State';

Level := 1;

Active := True;

end;

end;

LoadIndexes;

ListBox1.ItemIndex := 1;

ListBox1Click(nil);

LoadAggs;

ListBox2.ItemIndex := 0;

ListBox2Click(nil);

end;

 

1.4.3.2 AutoInc Refetches

要求

运行ASTA 中间层 用ADO,BDE来连接到sql server,Aceess,Paradox.其中含有生成表的脚本可以创建自增列. Interbase 需要生成一个Insert的触发器.

描述

当你利用ASTA的功能来生成Sql,ASTA生成包含自增字段的所有字段的sql语句,但是自增字段不会出现在Update,Insert命令中.这些值必须被数据库自己赋值. AstaClientDataSetAutoIncrementField属性指定自增字段允许你自己解决这个问题.当你自己指定了自增字段,ASTA 在生成Update Insert 命令时将忽略这个字段. 这些sql包含剩余的字段,自增字段的值将在数据库制定. 如果其他的字段你不希望包含在ASTA生成的Insert Update 命令中你可以设置他们为read only.

这个例子生成的表叫做AutoInctest

 

 

1.4.3.3 缓冲区更新

要求

运行AstaBDEServer

描述

ASTA被设计成你只需要提供select sql,而不需提供inserts,updates ,deletes, ASTA 将为你生成这些SQL. 这样你只要使用ClientSide SQL, TAstaProviders,TAstaBusinessObjectsManager管理的 ServerMethods 来提交数据即可.Cached Updates是像远程ASTA提交更新的推荐方法.当你运行这个范例,并编辑几行数据你就会看到 AstaClientDataSet内部产生的 OldValuesDataSet .通过这种变化的跟踪, AstaClientDataSet 可以支持恢复记录(RevertRecord)和取消更新(CancelUpdates).

通常的cs结构程序提交数据的时候要启动一个事务,执行sql,提交或回滚事务.而在 AstaClientDataSets你只需要设置其 EditMode属性为Cached 并调用ApplyUpdates(usmServerTransation) ,ASTA 将为你生成所有的sql, 在服务器端为你启动事务管理这个服务周期.

为了适时查看AstaClientDataSet.OldValuesDataSet, 你需要一个gridDataSource并在AstaClientDataSet.AfterPost事件中设置他么.

 

1.4.3.4 约束 Constraints

要求

运行AstaBDEServer

描述

使用ASTA Expressions你可定义:

为每个字段定义Custom/Imported(制定输入) 约束 (field level)

这个约束将一直有效,当一个新值赋给一个字段会检查是否符合这种约束,不符合将抛出异常并放弃赋值.

TAstaDataSet定义Custom/Imported(制定输入) 约束

这个约束是(record level) 当执行TDataSet.Post时将用此约束检查数据.不符合约束则不提交数据

为每个字段定义默认表达式

这个约束在新增字段的时候(Insert / Append)将默认值赋给字段.

为计算字段定义默认表达式

为计算字段提供计算表达式.

表达式的描述与Delphi HelpTClientDataSet.Filter的相同.

这个范例使用了DBDEMOS:Orders . 含有:

- 一些记录级别的约束

- 一些字段级别的约束

- 字段AmountNotPaid上的计算表达式

 

 

1.4.3.5 索引

要求

运行AstaBDEServer

描述

AstaClientDataSets 支持索引和汇总,这些都是继承自TAstaDataSet.这个例子展示怎么在TAstaClientDataSet上使用索引( TAstaDataset)

 

1.4.3.6 主细表

要求

运行AstaBDEServer

描述

为了在 AstaClientDataSets 上使用 Master/detail 功能,细表数据集必须使用参数化查询功能. 在设置参数数据类型是要使用 MasterFields/MasterSource 属性编辑关联到Master数据集

在运行时一个Master行发生了变化,一个新的参数化查询就被Detail数据集发送到服务器端.ASTA也通过Detail.filter属性来支持 disconnected Master/Detail.这样你就不用再去服务器端取数据了,这样你必须要把所有Master记录对应的Detail记录全部提取到客户端.但是如果Detail记录太多就不要使用这种方法了.

1.4.3.7 PacketFetches

要求

运行Asta3ADOServer

描述

ASTA Servers 支持4种线程模式, SmartThreading是推荐使用的线程模式可以带给你需要的所有特性.有时每个用户需要一个自己的数据库连接便于他们使用自己的用户名和密码.但是这样就不能提供Session池的功能了. 当你打开一个很大的数据集修改并传送他就需要每个客户一个永久单独的连接了.ASTA SmartThreading 可以给你带来Pooling Database sessions的好处也可以允许所有的用户使用Session池中的会话进行数据库操作.这种特性需要服务器端使用特殊数据库提供的接口

Client Side

这个例子展示怎么连接到Asta3ADOServer. 如果用户名是 PersistentSession  服务器将连接客户端到他自己的数据库会话并立刻传输2个记录

procedure TForm1.FormCreate(Sender: TObject);

begin

Astaclientsocket1.userName:='PersistentSessions';

end;

当客户滚动grid的滚动条,服务器将再次向客户端传递数据流包.

这个例子还有一个按钮展示会话如何保存到池和如何持久化.

Server Side

服务器在OnAssignPersistentSession事件中检查用户名,如果匹配将单独创建一个DataModal. 这是你就可以用 TAdoConnection去连接任意数据库设置任意的连接参数.

procedure TServerDM.ServerSocketAssignPersistentSession(Sender: TObject;

TheClient: TUserRecord; UserName, Password: String;

var PersistentDataModule: TComponent; var Verified: Boolean);

begin

if comparetext(UserName,'PersistentSessions')=0 then begin

PersistentDataModule:=TAstaDataModule.Create(nil);

with TAstaDataModule(PersistentDataModule) do begin

AdoConnection.ConnectionString:=FDatabasePlugin.DatabaseConnectionString;

AdoConnection.Connected:=True;

Verified:=True;

end;

end

end;

下面的服务器日志展示了客户端的查询语句和线程传递下一包数据

Select SQL SELECT * From Customers

->63.224.240.86:2198

Thread 469 ended for dataset id 1 ->63.224.240.86:2198

Thread 484 launched for dataset id 1 ->63.224.240.86:2198

Thread 484 ended for dataset id 1 ->63.224.240.86:2198

Thread 471 launched for dataset id 2 ->63.224.240.86:2198

1.4.3.8 排序 Sortting

要求

运行AstaBDEServer

描述

AstaDatasets 支持索引 但有时你没有定义索引还要快速排序,下面的例子展示如何利用 SortDataSetbyFieldName SortDataSetbyFieldNames实现这个功能.

procedure TForm1.GridTitleClick(Column: TColumn);

begin

AstaclientDataSet1.SortDataSetByFieldName(Column.FieldName, RadioGroup1.ItemIndex=1);

(*******************

To sort multiple fields use

procedure SortDataSetByFieldNames(const FieldNames: array of string; const Descending:

array of Boolean);

(********************)

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

AstaclientDataSet1.SortDataSetByFieldNames(['ContactTitle','ContactName'],[false,True]);

end;

 

 

1.4.3.9 公文包模式 SuitCase

要求

运行AstaBDEServer

描述

ASTA 支持非连接使用或公文包模式.这个范例展示如何连接到服务器,取得数据,保存数据到文件,清空数据集,从文件中加载,编辑,连接到服务器,提交数据.

 

1.4.3.10 事务  Transactions

要求

运行AstaBDEServer

描述

在设置了EditModeCached,调用 ApplyUpdates. EditMode 属性编辑器设置 UpdateTablename Primekey 字段.