Ir para conteúdo
Fórum Script Brasil
  • 0

duvida com Refresh em Clientdataset


vms

Pergunta

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 para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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.

Editado por Micheus
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...