Fórum Melhor maneira de fazer a mesma coisa - Interbase 6 Delphi 6 #278628
23/04/2005
0
Ola pessoal...
Aprendi programar com Interbase abrindo ´TODAS´ as tabelas no OnCreate do DataModule, logo descobri que devia abri-las somente no OnCreate do formulário. Mas elas cresceram e em rede isso ficou completamente inviável. Para ´salvar´ meus registros eu utilizo:
MinhaTabela.Edit;
MinhaTabela.Post;
MinhaTabela.Refresh;
Funciona muito bem [b]quando as tabelas estão abertas[/b] estou querendo mudar para:
MinhaTabela.Transaction := Dm1.IBDatabase1.InternalTransaction;
MinhaTabela.Close;
MinhaTabela.SelectSQL.Clear;
MinhaTabela.SelectSQL.Add(´INSERT INTO TABELA ´);
MinhaTabela.SelectSQL.Add(´(CODIGO, NOME)´);
MinhaTabela.SelectSQL.Add(´ VALUES ´);
MinhaTabela.SelectSQL.Add´(:ACODIGO, :ANOME)´);
If not Dm1.IBDatabase1.InternalTransaction.InTransaction then
Dm1.IBDatabase1.InternalTransaction.StartTransaction;
Prepare;
MinhaTabela.ParambyName(´ANOME´).AsString := ´JOSE DA SILVA´;
MinhaTabela.ExecQuery;
try
Dm1.IBDatabase1.InternalTransaction.Commit;
except
ShowMessage(´Ocorreu um erro ao gravar a tabela´);
Dm1.IBDatabase1.InternalTransaction.Rollback;
end;
MinhaTabela.Close;
Só que a segunda opção não dispara a trigger do generator, preciso programar em rede estou meio perdido.
O que fazer?
Qual a melhor opção.
Douglas-Altonia
Aprendi programar com Interbase abrindo ´TODAS´ as tabelas no OnCreate do DataModule, logo descobri que devia abri-las somente no OnCreate do formulário. Mas elas cresceram e em rede isso ficou completamente inviável. Para ´salvar´ meus registros eu utilizo:
MinhaTabela.Edit;
MinhaTabela.Post;
MinhaTabela.Refresh;
Funciona muito bem [b]quando as tabelas estão abertas[/b] estou querendo mudar para:
MinhaTabela.Transaction := Dm1.IBDatabase1.InternalTransaction;
MinhaTabela.Close;
MinhaTabela.SelectSQL.Clear;
MinhaTabela.SelectSQL.Add(´INSERT INTO TABELA ´);
MinhaTabela.SelectSQL.Add(´(CODIGO, NOME)´);
MinhaTabela.SelectSQL.Add(´ VALUES ´);
MinhaTabela.SelectSQL.Add´(:ACODIGO, :ANOME)´);
If not Dm1.IBDatabase1.InternalTransaction.InTransaction then
Dm1.IBDatabase1.InternalTransaction.StartTransaction;
Prepare;
MinhaTabela.ParambyName(´ANOME´).AsString := ´JOSE DA SILVA´;
MinhaTabela.ExecQuery;
try
Dm1.IBDatabase1.InternalTransaction.Commit;
except
ShowMessage(´Ocorreu um erro ao gravar a tabela´);
Dm1.IBDatabase1.InternalTransaction.Rollback;
end;
MinhaTabela.Close;
Só que a segunda opção não dispara a trigger do generator, preciso programar em rede estou meio perdido.
O que fazer?
Qual a melhor opção.
Douglas-Altonia
Douglasaltonia
Curtir tópico
+ 0
Responder
Posts
23/04/2005
Sanses
invés de tabelas, utilize query. é mais enxuto e mais fácil, além de ser mais seguro em rede.
nunca utilizei tabelas do ib, mas na query, para atualizações que não retornam um dataset, usa-se execsql.
Verifique tb se sua trigger não está programada para disparar no evento errado, pois no seu codigo primeiro, é uma edit(atualização) e no segundo uma inserção....
Talvez seja por isso que não dispara sua trigger....
nunca utilizei tabelas do ib, mas na query, para atualizações que não retornam um dataset, usa-se execsql.
Verifique tb se sua trigger não está programada para disparar no evento errado, pois no seu codigo primeiro, é uma edit(atualização) e no segundo uma inserção....
Talvez seja por isso que não dispara sua trigger....
Responder
Gostei + 0
23/04/2005
Isabelct
Pelas propriedades do componente ´MinhaTabela´, suponho que ele seja um TIBDataSet, certo? Considerando que seja, vou te explicar um pouquinho o funcionamento do IBDataSet, ok? Digamos que você solicitou que fosse incluido um novo registro (IBDataSet.Insert). Daí você preenche os DBEdits com os dados que forem convenientes, e no momento que solicitar a gravação (IBDataSet.Post), o que o componente faz (internamente) é pegar os valores que estão nos DBEdits e atribuí-los como parâmetros na instrução definida na propriedade InsertSQL (instrução igual a esta que você sugeriu utilizar - INSERT INTO TABELA (CAMPO1) VALUES (:CAMPO1)). Ou seja, o componente já faz isso por você, implicitamente.
Quanto ao controle transacional que você quer utilizar, sugiro que seja feito assim:
O comando IBDataSet.Transaction.StartTransaction não precisa ser explicitado, pois ele é acionado automaticamente quando você solicita a inclusão de um registro (IBDataSet.Insert).
Você pode então configurar o generator desta tabela, e a alimentação do campo Chave Primária será feita automaticamente.
E lembre-se que, ao programar para cliente-servidor, deve-se ter bastante cuidado com a quantidade de registros que serão retornados nas consultas. Para isso, sempre utilize cláusulas Where na sua consulta, limitando a quantidade de dados (campos como Data ou Iniciais do nome são bons candidatos a limitadores).
Quanto ao controle transacional que você quer utilizar, sugiro que seja feito assim:
{evento click do botão de gravar}
try
IBDataSet.Post;
IBDataSet.Transaction.Commit;
except
ShowMessage (´Ocorreu um erro na gravação dos dados´);
IBDataSet.Transaction.Rollback;
end;O comando IBDataSet.Transaction.StartTransaction não precisa ser explicitado, pois ele é acionado automaticamente quando você solicita a inclusão de um registro (IBDataSet.Insert).
Você pode então configurar o generator desta tabela, e a alimentação do campo Chave Primária será feita automaticamente.
E lembre-se que, ao programar para cliente-servidor, deve-se ter bastante cuidado com a quantidade de registros que serão retornados nas consultas. Para isso, sempre utilize cláusulas Where na sua consulta, limitando a quantidade de dados (campos como Data ou Iniciais do nome são bons candidatos a limitadores).
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)