commit / rollback em tres camadas usando clientdataset.
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
Curtidas 0
Respostas
Paulo
24/09/2007
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.
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.
GOSTEI 0
Comodelphi
24/09/2007
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.
GOSTEI 0
Roneto
24/09/2007
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!
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!
GOSTEI 0
Essistemas
24/09/2007
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 !
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 !
GOSTEI 0
Renatobraungil
24/09/2007
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 !!!
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 !!!
GOSTEI 0
Macario
24/09/2007
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
GOSTEI 0