Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

ПОМОГИТЕ, как в MIDAS сохранить несколько TClientDataSet-ов в одной транзакции? 


AlexM   (2001-12-20 16:01) [0]

Хелп!!! Технология MIDAS. Нужно реализовать сохранение обновлений нескольких TClientDataSet-ов клиента в одной транзакции. Как эту проблему решить?



Romkin   (2001-12-20 17:16) [1]

TDatabase.StartTransaction...
Просто передать в метод сервера оба пакета, там открыть транзакцию и провоести оба через провайдеры,
Или вывести методы Database в методы сервера, и работать с транзакцией на клиенте - если транзакция открыта не провайдером, он ее закрывать не будет



AlexM   (2001-12-21 06:46) [2]

2Romkin
подскажите чайнику, как "передать в метод сервера оба пакета"?



Romkin   (2001-12-21 10:38) [3]

у ClientDataSet есть свойство Delta, это и есть пакет изменений, а у провайдера есть метод ApplyUpdates.
Ничего не мешает и простому вызову AS_ApplyUpdates из самого RDM
Следовательно, передаешь на сервер две Delta как OleVariant, вызываешь ApplyUpdates у провайдеров, и передаешь обратно результата ErrCount и результирующий пакет для вызова CDS.REconsile
Подробнее - хелп по этим методам, и посмотри реализацию ApplyUpdates у TClientDataSet



AlexM   (2001-12-21 12:33) [4]

2Romkin
как передать - понял - спасибо
но как на сервере организовать два AS_ApplyUpdates в одной транзакции?
этот AS_ApplyUpdates пишет прямо в базу если у DataSetProvider свойство ResolveToDataSet=true даже если сночала вставить SetTransaction,
а если ResolveToDataSet=false то данные вообще теряются?!



Romkin   (2001-12-21 13:36) [5]

1. Database.StartTransaction
2. ApplyUpdates
3. Database.Commit|Rollback
А режим Resolve просто определяет, вставлять ли в TTable|TQuery и использовать их методы, либо просто генерить SQL



Сергей Иванов   (2001-12-21 14:12) [6]

//где-то в начале
var
TransactionContextEx :ITransactionContextEx;

function TParusServer.UpdateDocs(const Dest, Source, DocType, Context,
DispNum, SubD, SubK: WideString; Date_Of: TDateTime; Datu: Integer;
Sum_of: Double): Integer;
var RegN :integer;
begin
//создаем контекст транз
TransactionContextEx := CreateTransactionContextEx;
OleCheck(TransactionContextEx.CreateInstance(CLASS_ParusServer, IParusServer, ParusServer));
try
//что-нибудь делаем
if not IBase.TestConnected then IBase.Open;
Trans.Active := true;

with JornalQuery do begin
if Active then Close;
Params.ParamValues["RECNO"] := ID;
Prepare; Open; //First;
end; {with JornalQuery}
if not OpBase.Active then OpBase.Active := true;
OpBase.Locate("OpNum", VnOpNum, []);
if not OpSpec.Active then OpSpec.Active := true;

...

...
//сохранаяем. например, ApplyUpdates(0) и пр.
TransactionContextEx.Commit;
except
result := -1;
TransactionContextEx.Abort;
end;
end;



AlexM   (2001-12-22 09:18) [7]

2Romkin - большое спасибо за ответы - но у меня пока не "выходит каменный цветок"
Database.StartTransaction
try
ApplyUpdates
если здесь происходит ошибка, то Rollback не помогает вернуть данные, ApplyUpdates похоже какимто образом commit уже вызвал!!!!????
Database.Commit
except
Rollback
end
я использую Direct Oracle Access 3.4.5
так что вместо TDatabase у меня TOracleSession
а вместо TDataSet - TOracleDataSet
AS_ApplyUpdates пишет данные в TOracleDataSet????




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.013 c
6-90336           Yuri Btr              2001-11-07 11:20  2002.01.28  
TWebBrowser


1-90317           Val                   2002-01-11 17:28  2002.01.28  
видимость в секции private


3-90189           AlexeyV               2001-12-21 01:51  2002.01.28  
Events on ADO & MSSQL 2000


14-90382          Dimius                2001-12-02 18:01  2002.01.28  
Delphi6


7-90386           vik                   2001-10-06 14:47  2002.01.28  
Как отформатировать HDD