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


Douglasaltonia

Douglasaltonia

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....


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:

{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

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

Aceitar