Fórum Rotina Transação ADO #399309
16/04/2011
0
Olá, tenho a seguinte dúvida quanto a utilização do ADO em uma transação:
Exemplo 1:
DataModule.ADOConnection1.BeginTrans;
try
DataModule.ADOQueryCLIENTE.Close;
DataModule.ADOQueryCLIENTE.SQL.Clear;
DataModule.ADOQueryCLIENTE.SQL.Add('insert into CLIENTE (NOME) values (:nomcli)');
DataModule.ADOQueryCLIENTE.Parameters.ParamByName('p3').Value := cliEditNome.Text;
DataModule.ADOQueryCLIENTE.ExecSQL; DataModule.ADOConnection.CommitTrans; except
DataModule.ADOConnection.RollbackTrans;
end;
DÚVIDA: ApplyUpdate() e Refresh() podem ser executados nesta situação ? Como ? Quando for inserir em duas ou mais tabelas, tipo: Dados NF e Itens NF. Como verificar se nao teve problema ao inserir Dados NF antes dos Itens ? Exemplo 2: DataModule.ADOConnection1.BeginTrans;
try
DataModule.ClientDataSetCLIENTE.Insert;
DataModule.ClientDataSetCLIENTE.FieldByName('NOME').AsString := cliEditNome.Text; DataModule.ClientDataSetCLIENTE.Post;
DataModule.ClientDataSetCLIENTE.ApplyUpdates(0);
DataModule.ClientDataSetCLIENTE.Refresh;
DataModule.ADOConnection.CommitTrans; except
DataModule.ADOConnection.RollbackTrans;
end;
DÚVIDA: A ordem dos comandos esta certa ? Alguma implementação ?? Seria a melhor opcao para se trabalhar ? Se é que é possivel. Desde já agradeço,
try
DataModule.ADOQueryCLIENTE.Close;
DataModule.ADOQueryCLIENTE.SQL.Clear;
DataModule.ADOQueryCLIENTE.SQL.Add('insert into CLIENTE (NOME) values (:nomcli)');
DataModule.ADOQueryCLIENTE.Parameters.ParamByName('p3').Value := cliEditNome.Text;
DataModule.ADOQueryCLIENTE.ExecSQL; DataModule.ADOConnection.CommitTrans; except
DataModule.ADOConnection.RollbackTrans;
end;
DÚVIDA: ApplyUpdate() e Refresh() podem ser executados nesta situação ? Como ? Quando for inserir em duas ou mais tabelas, tipo: Dados NF e Itens NF. Como verificar se nao teve problema ao inserir Dados NF antes dos Itens ? Exemplo 2: DataModule.ADOConnection1.BeginTrans;
try
DataModule.ClientDataSetCLIENTE.Insert;
DataModule.ClientDataSetCLIENTE.FieldByName('NOME').AsString := cliEditNome.Text; DataModule.ClientDataSetCLIENTE.Post;
DataModule.ClientDataSetCLIENTE.ApplyUpdates(0);
DataModule.ClientDataSetCLIENTE.Refresh;
DataModule.ADOConnection.CommitTrans; except
DataModule.ADOConnection.RollbackTrans;
end;
DÚVIDA: A ordem dos comandos esta certa ? Alguma implementação ?? Seria a melhor opcao para se trabalhar ? Se é que é possivel. Desde já agradeço,
Eremita
Curtir tópico
+ 0
Responder
Posts
27/04/2011
André Silveira
DÚVIDA: ApplyUpdate() e Refresh() podem ser executados nesta situação ?
Sim para ambos.
Utiliza o ApplyUpdates para efetuar a gravação, após comitar a transação, utiliza o refresh para carregar os dados.
Quanto a mais de uma tabela, ao se dar o applyupdates em um tabela pai, ele já grava os dados das tabelas filhas automaticamente, ou seja coloca tudo em uma transação só.
DataModule.ClientDataSetCLIENTE.Insert;
DataModule.ClientDataSetCLIENTE.FieldByName('NOME').AsString := cliEditNome.Text; DataModule.ClientDataSetCLIENTE.Post;
DataModule.ClientDataSetCLIENTE2.Insert;
DataModule.ClientDataSetCLIENTE2.FieldByName('NOMEFANTASIA').AsString := cliEditNome.Text; DataModule.ClientDataSetCLIENTE2.Post;
DataModule.ClientDataSetCLIENTE.ApplyUpdates(0);
DataModule.ClientDataSetCLIENTE.Refresh;
ClientDataSetCliente2 é filho de ClientDataSetCliente.
Quanto a ser a melhor opção, não seria necessário abrir uma transação quando se vai usar o applyupdates, pois ele mesmo já cria uma transação, caso não tenha nenhuma ativa.
Sim para ambos.
Utiliza o ApplyUpdates para efetuar a gravação, após comitar a transação, utiliza o refresh para carregar os dados.
Quanto a mais de uma tabela, ao se dar o applyupdates em um tabela pai, ele já grava os dados das tabelas filhas automaticamente, ou seja coloca tudo em uma transação só.
DataModule.ClientDataSetCLIENTE.Insert;
DataModule.ClientDataSetCLIENTE.FieldByName('NOME').AsString := cliEditNome.Text; DataModule.ClientDataSetCLIENTE.Post;
DataModule.ClientDataSetCLIENTE2.Insert;
DataModule.ClientDataSetCLIENTE2.FieldByName('NOMEFANTASIA').AsString := cliEditNome.Text; DataModule.ClientDataSetCLIENTE2.Post;
DataModule.ClientDataSetCLIENTE.ApplyUpdates(0);
DataModule.ClientDataSetCLIENTE.Refresh;
ClientDataSetCliente2 é filho de ClientDataSetCliente.
Quanto a ser a melhor opção, não seria necessário abrir uma transação quando se vai usar o applyupdates, pois ele mesmo já cria uma transação, caso não tenha nenhuma ativa.
Responder
Gostei + 0
18/04/2013
José
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)