ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

ClientDataSet conexões e gravação de dados na tabela

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
charlo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 13 de Julho de 2006
Mensagens: 178

MensagemEnviada: Sex Ago 04, 2006 8:08 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Olá gente, boa noite

Estou com uma pequena dúvida. Como estou migrando de Tablke para Query então estou tendo um pouco de dificuldade e se alguém puder me ajudar eu agradeço.

Vou ser breve. Eu tenho um projeto exemplo de como usar o ClientDataSet.

Coloquei 1 ClientDataSet, 1 Query, 1 DataSetProvider e 1 DataSource

1 DBGrid, 3 DBEdit e 1 DBNavigator.

Fiz uma tabela no Paradox7, estou usando o Delphi 7.

Conectei os componentes perfeitamente seguindo os passos abaixo: Por favor verifiquem se está correto.

1. No componente DataSetProvider:
DataSet := Query1;

2. No componente ClientDataSet1:
ProviderName := DataSetProvider1;

3. No componente DataSource1:
DataSet := ClientDataSet1;

4. No componente DBGrid1:
DataSource := DataSource1;

Pronto os componentes estão ligados agora, o próximo passo é igualar os parâmetros da Query1 com o ClientDataSet1, para isso pressione o botão direito do mouse sobre o componente ClienteDataSet1 e escolha a opção \"Fetch Params\", isso vai trazer (caso tenha) os parâmetros da Query1 para o componente ClientDataSet.

Após isso vc deve passar a usar todos os controles que vc fazia com o Query1 para o ClientDataSet1, por exemplo: .Active := True, .OpenDataBase, .Close etc etc etc

Bem, a notícia boa é que consigo adicionar dados em tempo de execução, mas quando fecho o aplicativo e volto a abrir não tem nenhum registro no DBGrid. Acredito e tenho certeza que o que eu tinha inserido ficou apenas na memória e depois foi apagado.

Só gostaria mesmo de saber como colocar na tabela e também como ficam os comandos para os botões, como por exemplo novo, inserir, editar, deletar etc.

Seria por exemplo?:
- ClientDataSet1.Append
- ClientDataSet1.Insert
- ClientDataSetr1.Edit

Seria isso acima ou eu tenho que continuar utilizando Query1 ao invés de ClientDataSet1 nesse exemplo de aplicativo que eu postei?

Obrigado pela ajuda amigos.

Charlo.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Sex Ago 04, 2006 8:44 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Amigo, o caso é o seguinte, o ClientDataSet (vou chamar de CDS), faz com que os dados sejam mantidos apenas em memória. Você precisa aplicar os dados para que os mesmos vão para o banco de dados. Para ver como funciona, faça um teste, clique no seu CDS, e no evento AfterPost, e AfterDelete, coloque:

CDS.ApplyUpdates( 0 );

A função ApplyUpdates, faz com que os dados da memória, caso existam, sejam adicionados no banco. Se prestar atenção, eu passo como parâmetro o valor 0. Ele indica a quantidade máxima de erros que podem ocorrer durante a \"aplicação\" dos dados no banco. Ele pode reber os valores -1, 0 ou valores maiores que zero. Para valores iguais ou maiores a 0, indica a quantidade máxima de erros. Para o valor -1, indica que é para gravar tudo o que puder.

Essa função também retorna um valor inteiro, que indica a quantidade de erros retornados. Isto porque, as mensagens de erro de aplicação dos dados, não são mostrados *.

* Podem ser mostrados, caso você vá no evento OnReconcileError, e adicione a linha:

raise exception.create( E.Message );


Uma Observação:

Quando digo \"Quantidade de Erros\", não é relativo a quantidade de erros de um mesmo registro, mas sim quantidade de registros com erro. Por exemplo, se você adicionou 3 registros, e o de número 2 tem 1 erro, e como parâmetro do ApplyUpdates você passou o número 2 (máximo de 2 erros), isso não indica que o registro 2 será gravado. Mas sim, que o registro 1 e 3 serão gravados, e o 2 ficará pendente até ser consertado. Mas se você mandar aplicar (ApplyUpdates) com parâmetro igual a 0 e esse mesmo registro 2 tiver com erros, nada será aplicado no banco, até que a correção do registro 2 seja efetuada.

Isso, a priore parece um tanto quanto complicado, mas garante a integridade dos dados, além de manter transações curtas com o BD (caso use um SGBD). Além do mais, com os dados em memória é muito mais rápido trabalhar com eles, do que ficar requisitando os mesmos do BD a todo instante.

Acho que me impolguei e escrevi demais Razz
_________________
Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
charlo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 13 de Julho de 2006
Mensagens: 178

MensagemEnviada: Sex Ago 04, 2006 9:57 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Pô amigo, te agradeço muito pela ajuda, você está de Parabéns.

E pra falar a verdade você se empolgou muito bem hehehehehe, continue assim

Deu certo, tá perfeito agora, obrigado também pelo esclarecimento.

Abraços,

Charlo
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
charlo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 13 de Julho de 2006
Mensagens: 178

MensagemEnviada: Sáb Ago 05, 2006 3:36 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Agora eu só preciso mesmo ordenar de Z a A, já consegui de A a Z, mas tem como colocar os 2 ao mesmo tempo usando CLientDataSet? Gostaria que ao clicar em uma coluna ele ordenasse de A a Z e depois se eu clicar novamente na mesma coluna ele ordenasse de Z a A.

E uma pequena ajuda também para atualizar os dados do DBGrid, eu faço uma consulta com SQL e ele me retorna a pesquisa perfeitamente, mas depois fica só exibindo essa consulta, não mostra mas todos os registros que eu tenho, ou seja, fica assim para sempre, acredito que tenha que ver alguma coisa como dar um Refresh na tabela, ou no ClientDataSet.

Alguém pode me ajudar?

Obrigado mais uma vez.

Charlo
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Sáb Ago 05, 2006 3:55 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Para ordenação A..Z

ClientDataSet1.IndexDefs.Add(\'Indice1\',\'NomeDoCampo\',[]);


Para ordenação Z..A

ClientDataSet1.IndexDefs.Add(\'Indice1\',\'NomeDoCampo\',[ixDescending]);

Mas é claro que você tem que excluir um índice antes de criar outro.

ClientDataSet1.IndexDefs.Delete(0);

Ou alterar as propriedades.
_________________
Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
charlo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 13 de Julho de 2006
Mensagens: 178

MensagemEnviada: Sáb Ago 05, 2006 4:10 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Olá Thomaz, obrigado pela atenção.

Não querendo exigir muito, mas você poderia me dar mais detalhes como fazer, onde eu tenho que colocar cada comando , porque além de eu não ter entendido bem eu acabo de migrar todo o meus sistema que era em Table para Query com ClientDataSet, daí tenho um pouco de dificuldade.

Por exemplo eu coloquei todos esses seus comandos no evento OnTitleClick do DbGrid e deu erro: Duplicate IndexName \'Indice1\'.

Poderia me dar mais detalhes, te agradeço.

Abraços,

Charlo
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Sáb Ago 05, 2006 4:16 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

Olá amigo...
É o seguinte, no evento OnTItleClick, coloque:

if ClientDataSet1.IndexDefs.IndexOf(\'Indice1\') < 0 then
ClientDataSet1.IndexDefs.Add(\'Indice1\',\'NomeDoCampo\',[])
else begin
if ClientDataSet1.IndexDefs[0].Options = [ixDescending] then
ClientDataSet1.IndexDefs[0].Options := []
else
ClientDataSet1.IndexDefs[0].Options = [ixDescending];
end;


Isso deve resolver. Mas se der algum problema é só avisar.

[Editado em 5/8/2006 por thomazs]
_________________
Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
charlo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 13 de Julho de 2006
Mensagens: 178

MensagemEnviada: Sáb Ago 05, 2006 4:37 pm    Assunto: ClientDataSet conexões e gravação de dados na tabela Responder com Citação

A idéia está muito boa, não chegou a dar erro, mas não acontece nada, clico nos títulos e não acontece nada.

Eu coloquei assim: OBS.: Tenho um campo \"Nome\" e outro chamado Cidade. Daí coloquei assim:

if ClientDataSet1.IndexDefs.IndexOf(\'Indice1\') < 0 then
ClientDataSet1.IndexDefs.Add(\'Indice1\',\'Nome\',[])
else begin
if ClientDataSet1.IndexDefs[0].Options = [ixDescending] then
ClientDataSet1.IndexDefs[0].Options := []
else
ClientDataSet1.IndexDefs[0].Options := [ixDescending];

if ClientDataSet1.IndexDefs.IndexOf(\'Indice1\') < 0 then
ClientDataSet1.IndexDefs.Add(\'Indice1\',\'Cidade\',[])
else begin
if ClientDataSet1.IndexDefs[0].Options = [ixDescending] then
ClientDataSet1.IndexDefs[0].Options := []
else
ClientDataSet1.IndexDefs[0].Options := [ixDescending];

E não aconteceu nada.

Charlo
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB