Jump to content
Fórum Script Brasil
  • 0

duvida com Refresh em Clientdataset


vms

Question

olá pessoal,

tenho um banco de dados feito em firebird e uso os seguites componentes para manipular

SQLTable1, DataSetProvider1, ClientDataSet1, DataSource1.

Estou gravando da seguite forma

ClientDataSet1.ApplyUpdates(-1);
ClientDataSet1.Refresh;

O problema é que quando mando salvar, a tabela vai para o primeiro registro e eu preciso que permaneça no mesmo registro. Eu preciso usar o refresh para poder gerar o ID automatico (pela trigger).

Tentei usar um Locate, mas a unica referencia seria o ID mas ele so é criado depois do Refresh.

alguém tem alguma sugestão?

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0
O problema é que quando mando salvar, a tabela vai para o primeiro registro e eu preciso que permaneça no mesmo registro. Eu preciso usar o refresh para poder gerar o ID automatico (pela trigger).

Tentei usar um Locate, mas a unica referencia seria o ID mas ele so é criado depois do Refresh.

É, esta é (digamos assim) uma desvantagem de gerar o Id pela trigger - voce não tem como saber diretamente qual foi o valor gerado.

Voce poderia usar uma combinação de alguns campos (que voce acabou de cadastrar) para identificá-lo.

Se não me engano, há alguns anos, enquanto eu monitorava as atividades em um banco de dados (utilizando o SQL Monitor que acompanha o D7), era este o procedimento que os drivers do BDE utilizavam para encontrar o registro após sua inserção (na verdade, ele usava na cláusula where todos os campos ainda no cache).

Ou talvez voce possa querer testar esta alternativa (nunca testei): Auto Incremento: Firebird

Link to comment
Share on other sites

  • 0

fiz uma rotina que deu certo.

antes do refresh verifica se o ID tem valor, se tiver então é uma alteração e posso usar o locate se não é uma inserção e uso o last.

funcionou certinho, mas se alguém tem alguma dica melhor eu agradeço.

obrigado pela atenção Micheus, mas eu achei a dica daquele tópico muito trabalhoso.

Link to comment
Share on other sites

  • 0

Olá Vms

essa é facil hehe...

os componentes que vem de TTalbe e TDataSet tem uma propriedade chamada "RecNo", ela retorna a linha em que a Query ou Tabela está no momento...

e por se tratar de uma propriedade, você pode tanto ler o valor, quanto informar também ^^

crie uma variavel do tipo integer, por exemplo:

var

iLine : Integer;

begin

agora vamos salvar na variavel a linha em que a Query se encontra no momento...

iLine := MinhaQuery.RecNo;

pronto agora posso dar refresh, fechar e abrir novamente, seja lá o que for não importa....

em seguida preciso retornar a linha onde eu estava antes do comando refresh

MinhaQuery.RecNo := iLine;

end xD;

espero que ajude, qualquer dúvida estamos aqui =)

Link to comment
Share on other sites

  • 0
os componentes que vem de TTalbe e TDataSet tem uma propriedade chamada "RecNo", ela retorna a linha em que a Query ou Tabela está no momento...

Samara, o colega vms não deseja saber em qual registro esle "se encontra".

Em tabelas como Parados existe um tipo de campo(field) chamado de AutoInc. São campos que a cada novo registro recebem um novo número, sequencial, e que nunca se repetirá. Estes campos são gerenciados pelo driver do paradox, de modo que quando você grava o registro (post) o seu dataset estará paradinho no registro recém salvo e voce poderá obter o valor que este campo recebeu do "banco" (paradox não é exatamente um bando de dados - na minha opinião). Nesta condição, se voce colocar este dataset em um DBGrid (mostrando este tal campo) e usar o seu código, voce observará que são coisas diferentes.

RecNo representa o número do registro sequindo a ordem em que ele se encontra no dataset. Assim, se voce mudar o índice (tabela) ou ordenação (query), voce provavelmente notará que um registro com RecNo = 10 é diferente para cada ordenação.

O que o colega vms quer é obter do banco de dados (Firebird), o valor daquele campo "autoinc", que no firebird é obtido através da definição de um Generator e sua utilização através de uma trigger (exemplo). Este valor está no domínio do banco de dados e não é retornado quando o post/applayupdates é utilizado.

Uma alternativa a isto é não utilizar o generator e sim gerar o código ("manualmente" usando um select max(campo)+1) dentro do programa no momento imediatamente antes da gravação no banco. O problema com isto é que para tabelas com muitos acessos, pode ocorrer de mais que um usuário obter o mesmo número (código sequencial) e na hora de comitar os dados o banco rejeite aqueles que ficariam duplicados. Quando usamos o generate, o próprio banco usa seus mecanimos para retornar apenas um código de cada vez, sem qualquer possibilidade de duplicação.

Espero ter ajudado a exclarecer a diferença entre os itens citados.

Edited by Micheus
Link to comment
Share on other sites

  • 0

seria uma "gambiarra" kkkk mas ele poderia fazer um select no generator sem elevar a sequencia

Select gen_id(generator, 0) as Sequencia from rdb$database

ou ainda para saber o próximo que será gerado

Select gen_id(g_generator, 0)+1 as Sequencia from rdb$database

de qualquer forma acho que é a pior das ideias /=

Link to comment
Share on other sites

  • 0

Com certeza uma "gambiarra". A pior opção que podemos fazer é utilizar as tabelas de sistema do banco (rdb$...), pois deixamos a aplicação amarrada a determinado banco de dados e porque nunca podemos ter certeza de que o "dono" do banco não mudará a estrutura interna de dados do mesmo.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...