 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
charlo Aprendiz

Registrado: Quinta-Feira, 13 de Julho de 2006 Mensagens: 178
|
Enviada: Sex Ago 04, 2006 8:08 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Sex Ago 04, 2006 8:44 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 _________________ 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 |
|
 |
charlo Aprendiz

Registrado: Quinta-Feira, 13 de Julho de 2006 Mensagens: 178
|
Enviada: Sex Ago 04, 2006 9:57 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
charlo Aprendiz

Registrado: Quinta-Feira, 13 de Julho de 2006 Mensagens: 178
|
Enviada: Sáb Ago 05, 2006 3:36 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Sáb Ago 05, 2006 3:55 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
charlo Aprendiz

Registrado: Quinta-Feira, 13 de Julho de 2006 Mensagens: 178
|
Enviada: Sáb Ago 05, 2006 4:10 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Sáb Ago 05, 2006 4:16 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
charlo Aprendiz

Registrado: Quinta-Feira, 13 de Julho de 2006 Mensagens: 178
|
Enviada: Sáb Ago 05, 2006 4:37 pm Assunto: ClientDataSet conexões e gravação de dados na tabela |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|