欢迎使用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服务器并启动ClientSideSql在Internet上运行。你可以使用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 运行期增加计算字段
描述
在设计期右键点击delphi的DataSet控件在弹出菜单中选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
描述
使用合计可以在汇总客户数据集中的数据.
Aggregates是TAstaAggregate类型对象的集合, 每一个成员都定义了在一组客户端数据集中计算合计值的公式. 个别的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命令中.这些值必须被数据库自己赋值. 在AstaClientDataSet的AutoIncrementField属性指定自增字段允许你自己解决这个问题.当你自己指定了自增字段,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, 你需要一个grid和DataSource并在AstaClientDataSet.AfterPost事件中设置他么.
1.4.3 .4 约束 Constraints
要求
运行AstaBDEServer
描述
使用ASTA Expressions你可定义:
为每个字段定义Custom/Imported(制定输入) 约束 (field level)
这个约束将一直有效,当一个新值赋给一个字段会检查是否符合这种约束,不符合将抛出异常并放弃赋值.
为TAstaDataSet定义Custom/Imported(制定输入) 约束
这个约束是(record level) 当执行TDataSet.Post时将用此约束检查数据.不符合约束则不提交数据
为每个字段定义默认表达式
这个约束在新增字段的时候(Insert / Append)将默认值赋给字段.
为计算字段定义默认表达式
为计算字段提供计算表达式.
表达式的描述与Delphi Help中TClientDataSet.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
描述
在设置了EditMode为Cached,调用 ApplyUpdates. 用EditMode 属性编辑器设置 UpdateTablename 和Primekey 字段.