Selecao DevMedia QUERO SER PRIME

Fórum commit / rollback em tres camadas usando clientdataset. #346597

24/09/2007

0

Galera vi varios assuntos sobre isso mas nao consegui achar uma forma de fazer o seguinte: ja trabalho em 3 camadas e utilizo o applyupdates para gerar meu commit, até ai tudo bem. Mas quando preciso fazer isso no client utilizando + de uma tabela que ainda nao tenha ligacao nao consigo. vou explicar melhor. tenho uma tabela chamada pagto onde ficam provisionados todos os titulos que a empresa irá pagar. tenho outra tabela chamada cheques onde guardo o cheque que irá efetuar o pagamento de alguns titulos selecionados pelo usuário. A Pergunta é a seguinte como nao consigo utilizar o DatasetField pois ainda nao existe ligação das tabelas. como posso dar um commit nela se o componente sqlconnection fica na aplicacao servidora?


Eduardo Lara

Eduardo Lara

Responder

Posts

25/09/2007

Paulo

Eduardo, não entendi bem, mas vê se é isso;

Tabela pagto => tem pagamento a ser realizado
Tabela cheque => tem cheque a ser liberado

Na minha opinião, vc precisa de uma terceira tabela para guardar os Cheques emitidos, junto com o pagamento(neste caso o ID somente). Se for isso, seria interessante vc criar um chave estrangeira na Tabela cheque, recebendo o ID da Pagto. E criar um Flag na Cheque para marcar os cheques emitidos e o mesmo na Pagto para marcar os pagamento realizados. Caso não seja isso que eu entendi, desconsidere.


Responder

Gostei + 0

01/10/2007

Comodelphi

ta meio confuso sua explicaçao, pelo que entendi vc tem dois ou mais clients vc quer fazer o applyupdates no mestre e vincular o campo chave nos clientdataset detalhe???? ou vc tem uma consulta com mais de uma tabela para um unico clientdataset???? qualquer que for o caso recomendo que vc trate o evento BeforeUpdateRecord no DataSetProvider, dessa forma teria mais controla sobre a transaçao. Posta mais informaçoes pra poder saber como te ajudar melhor. E qual o DB vc ta usando? abcs.


Responder

Gostei + 0

01/10/2007

Roneto

Acho q Entendi a explicação do Eduardo Lara e estou com o mesmo problema:
Tenho um sistema com o Banco de Dados SQL-SERVER onde a maioria de minhas tabelas estão com a Chave-Primária - Autoincremento (IDENTDY).

Quando vou trabalhar com operações do tipo Mestre-Detalhe, tipo o famoso PEDIDO(mestre) e ITENS_DO_PEDIDO(detalhe) preciso gravar o ID da Tab.Pedido na Tab.Itens_Pedido (faço isso na ´unha´, sem usar MasterSource/MasterField)

Quando executo o POST no ClientDataSet-Mestre eu não consigo obter no novo valor do campo PK para que em seguida eu tenha condições de gravar os registros com o valor do ID_Pedidos no ClientDataSet-Detalhes.
E toda essa operação tem que estar em uma única transação.

Mesmo executando um ApplyUpdates no ClientDataSet.Mestre o valor do campo Prim.Key não é atualizado.

Sou inciante em DBExpress e ´travei´ aqui.
Agradeço a Ajuda!


Responder

Gostei + 0

03/10/2007

Essistemas

Abra o seu servidor, vai View no menu do Delphi Type Lybrary New Metodo e cria ele assim

function Tdm.met_Transacao(const par_Qual: WideString): WideString;
begin
If( par_Qual=´INICIAR´ ) Then
Begin
If( Not sqlConn.InTransaction ) Then
Begin
TD.TransactionID:=1;
TD.IsolationLevel:=xilREADCOMMITTED;
sqlConn.StartTransaction(TD);
Result:=´Transação iniciada!´;
end;
end;
//----------------------------
If( par_Qual=´COMMIT´ ) Then
Begin
sqlConn.Commit(TD);
Result:=´Registro(s) commitados com sucesso!´;
end;

//----------------------------
If( par_Qual=´ROLLBACK´ ) Then
Begin
sqlConn.Rollback(TD);
Result:=´Registro(s) cancelados com sucesso!´;
end;
end;

Na sua aplicação vc chama assim

dmC.CBPdv.AppServer.met_Transacao(´INICIAR´);
dmC.CBPdv.AppServer.met_Transacao(´COMMIT´);
dmC.CbPdv.AppServer.met_Transacao(´ROLLBACK´) ;
CbPdv é um TConectionBrooker, mais pode sem SocketConection.
Boa sorte !


Responder

Gostei + 0

11/10/2007

Renatobraungil

Olá Amigos !!!
Estou com a mesma dúvida sobre controle de transação. Baseado no exemplo citado pergunto:
1- todas as transações vão ter o mesmo ID ??? (isso não vai gerar conflito de transação ???)
2- Onde eu crio o meu TD (TTransacionDesc) ?? no exemplo o TD está apenas sendo usado, onde (em que momento) ele foi criado.

Obrigado e sucesso a Todos !!!


Responder

Gostei + 0

11/10/2007

Macario

Acho q Entendi a explicação do Eduardo Lara e estou com o mesmo problema: Tenho um sistema com o Banco de Dados SQL-SERVER onde a maioria de minhas tabelas estão com a Chave-Primária - Autoincremento (IDENTDY). Quando vou trabalhar com operações do tipo Mestre-Detalhe, tipo o famoso PEDIDO(mestre) e ITENS_DO_PEDIDO(detalhe) preciso gravar o ID da Tab.Pedido na Tab.Itens_Pedido (faço isso na ´unha´, sem usar MasterSource/MasterField) Quando executo o POST no ClientDataSet-Mestre eu não consigo obter no novo valor do campo PK para que em seguida eu tenha condições de gravar os registros com o valor do ID_Pedidos no ClientDataSet-Detalhes. E toda essa operação tem que estar em uma única transação. Mesmo executando um ApplyUpdates no ClientDataSet.Mestre o valor do campo Prim.Key não é atualizado. Sou inciante em DBExpress e ´travei´ aqui. Agradeço a Ajuda!


Olá.

Para você obter o novo codigo gerado pelo campo identity apos o ApplyUpdates

voce executa um select:

select @@identity as NOVOCODIGO

Isso lhe retornara o codigo do campo

entao voce atualiza o campo na tabela de itens de pedido.

espero ter ajudado


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar