Использование Microsoft Transaction Server

Далее отредактируем библиотеку типов данного серверного объекта, создав методы GetPays. AddPay, DelPay для доставки данных клиентскому приложению, добавления и удаления записей, а также метод DoTrans, реализующий распределенную транзакцию (удаление записи о выбранном товаре из таблицы STOCKTABLE в базе данных IBLOCAL и добавление по одной записи в таблицу заказов на доставку delivery.db в базе данных DBDEMOS и в таблицу счетов за заказы ord.dbf в базе данных paydb, рис. 23). clip0121 Рис. 23. Библиотека типов серверного объекта, управляющего распределенными транзакциями Реализация этих методов имеет следующий вид:

unit pay1;
//MTS server for managing distributed transactions
//By N.Elmanova
//04.12.1998
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComServ, ComObj, VCLCom, StdVcl, BdeProv, BdeMts, DataBkr, DBClient,
 MtsRdm, Mtx, paysrv_TLB, dels_TLB, st_TLB, DBTables, Provider, Db;
type
 Tpays = class(TMtsDataModule, Ipays)
  paytable: TTable;
  PayProvider: TProvider;
  Database3: TDatabase;
  Query6: TQuery;
  Session3: TSession;
  Query5: TQuery;
 private
 FStockDM1: IStockDM1;
 FDelDM: IDelDM;
  { Private declarations }
 public
  { Public declarations }
 protected
  function GetPays: OleVariant; safecall;
  procedure AddPay(Pnum: Integer; Pval: Double; const Address: WideString);
  safecall;
  procedure DelPay(Pnum: Integer); safecall;
  procedure DoTrans(Num: Integer; Val: Double; const Addr,
  Gname: WideString); safecall;
 end;
var
 pays: Tpays;
implementation
{$R *.DFM}
function Tpays.GetPays: OleVariant;
begin
  Result:=PayProvider.Data;
  SetComplete;
end;
procedure Tpays.AddPay(Pnum: Integer; Pval: Double;
 const Address: WideString);
begin
try
  paytable.open;
  paytable.append;
  paytable.fieldbyname('OrdNum').Value:=PNum;
  paytable.fieldbyname('Payment').Value:=Pval;
  paytable.fieldbyname('Address').Value:=Address;
  paytable.post;
  paytable.close;
  SetComplete;
except
  SetAbort;
end;
end;
procedure Tpays.DelPay(Pnum: Integer);
begin
try
 Database3.Open;
 paytable.Open;
 paytable.SetRangeStart;
 paytable.FieldByName('ordnum').AsInteger:=Pnum;
 paytable.SetRangeEnd;
 paytable.FieldByName('ordnum').AsInteger:=Pnum;
 paytable.ApplyRange;
 paytable.Delete;
 paytable.Close;
 Database3.Close;
 SetComplete;
except
 SetAbort;
raise;
end;
end;
procedure Tpays.DoTrans(Num: Integer; Val: Double; const Addr,
 Gname: WideString);
begin
try
 OleCheck(ObjectContext.CreateInstance(CLASS_StockDM1, IStockDM1, FStockDM1));
 OleCheck(ObjectContext.CreateInstance(CLASS_DelDM, IDelDM, FDelDM));
 FStockDM1.DeleteGoods(Num);
 FDelDM.AddDelivery(Num,Gname,Addr);
 AddPay(Num,Val,Addr);
except
 DisableCommit;
raise;
end;
 EnableCommit;
end;
initialization
 TComponentFactory.Create(ComServer, Tpays,
  Class_pays, ciMultiInstance, tmApartment);
end.

Прокомментируем приведенный выше код для метода DoTrans. Этот код реализует распределенную транзакцию, вызывая методы двух порожденных ей серверных объектов и выполняя собственные манипуляции с таблицей счетов. При вызове метода DoTrans клиентским приложением все три серверных объекта функционируют согласованно.

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...