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 

Ordenar e alterar dados DBGrid [RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Sex Mar 11, 2011 4:28 pm    Assunto: Ordenar e alterar dados DBGrid [RESOLVIDO] Responder com Citação

Olá
Tenho um DBGrid que está ligado a um DataSource e este ligado a um Query, para ordenar ao clicar no titulo da coluna estou usando o seguinte código:

procedure TForm1.DBG_exportTitleClick(Column: TColumn);
var
campo:string;
begin
campo:=column.fieldname; // CAMPO RECEBE O NOME DA COLUNA CLICADA,
application.processmessages; // para considerar algo que aconteça no dbgrid durante a entrada nesta procedure
DM.Q_Export.sql.clear; // LIMPA A QUERY
DM.Q_Export.sql.add('select * from TB_export order by '+campo); // ESCREVE O SELECT COM O ORDER BY
if not DM.Q_Export.Prepared then
DM.Q_Export.Prepare;
DM.Q_Export.Open; // ABRE A QUERY COM A ORDEM ESCOLHIDA.
end;


O problema é que não consigo alterar dados da tabela pelo DBGrid, para conseguir alterar tenho que ligar o DataSource direto na Tabela, mas ai não consigo ordenar o Grid.

Alguem pode me ajudar nisso??? gostaria de fazer as duas funções.


Editado pela última vez por natan.carlos em Sex Abr 01, 2011 12:58 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Mar 11, 2011 8:36 pm    Assunto: Responder com Citação

Uma opção seria utilizar um ClientDataSet.

Não sei os componentes de acesso que você usa, mas a principio seria preciso ligar os componentes desta forma:

... > Query > DataSetProvider > ClientDataSet > DataSource

Para carregar os dados no ClientDataSet configure a Query normalmente, mas execute Open e Close no ClientDataSet em vez de executar na Query.

Para incluir, alterar e excluir os dados utilize o ClientDataSet da mesma forma que um Table, acrescentando o método TClientDataSet.ApplyUpdates(0) para enviar as modificações para o BD, o método TClientDataSet.CancelUpdates para cancelar todas as modificações, e o evento TClientDataSet.OnReconcileError para capturar os erros ao atualizar o BD.

Para ordenar os dados você pode utilizar o código postado, ou atribuir o nome dos Fields a propriedade TClientDataSet.IndexFieldNames, sendo que neste caso não é preciso modificar a Query.

Espero que seja útil.

__________________
Assinatura: Imóveis a venda em Suzano
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Ter Mar 15, 2011 2:42 pm    Assunto: Responder com Citação

imex escreveu:
Uma opção seria utilizar um ClientDataSet.

Não sei os componentes de acesso que você usa, mas a principio seria preciso ligar os componentes desta forma:

... > Query > DataSetProvider > ClientDataSet > DataSource

Para carregar os dados no ClientDataSet configure a Query normalmente, mas execute Open e Close no ClientDataSet em vez de executar na Query.

Para incluir, alterar e excluir os dados utilize o ClientDataSet da mesma forma que um Table, acrescentando o método TClientDataSet.ApplyUpdates(0) para enviar as modificações para o BD, o método TClientDataSet.CancelUpdates para cancelar todas as modificações, e o evento TClientDataSet.OnReconcileError para capturar os erros ao atualizar o BD.

Para ordenar os dados você pode utilizar o código postado, ou atribuir o nome dos Fields a propriedade TClientDataSet.IndexFieldNames, sendo que neste caso não é preciso modificar a Query.

Espero que seja útil.

__________________
Assinatura: Imóveis a venda em Suzano





Olá, vc pode me ajudar a fazer a ligação entre esses componentes, não entendi como é feito.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Mar 15, 2011 3:23 pm    Assunto: Responder com Citação

Vou colocar um exemplo de ligação dos componentes com DbExpress:

Código:
SqlConnection
  - Name = SqlConnection1

SqlQuery
  - Name = SqlQuery1
  - SqlConnection = SqlConnection1

DataSetProvider
  - Name = DataSetProvider1
  - DataSet = SqlQuery1

ClientDataSet
  - Name = ClientDataSet1
  - ProviderName = DataSetProvider1

DataSource
  - Name = DataSource1
  - DataSet = ClientDataSet1

DBGrid
  - Name = DBGrid1
  - DataSource = DataSource1


obs: se você não utiliza DbExpress provavelmente vai ficar parecido com o exemplo acima, substituindo o SqlConnection e o SqlQuery pelos equivalentes

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Qui Mar 31, 2011 11:37 am    Assunto: Responder com Citação

não utilizei o SQLConection, deixei o query sem ligação, funciona, está ordenando e alterando, mas apenas no Cliente data set, as alterações do CDS não são repassadas para a tabela.

Sabe como posso fazer isso?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mar 31, 2011 12:08 pm    Assunto: Responder com Citação

Citação:
Para incluir, alterar e excluir os dados utilize o ClientDataSet da mesma forma que um Table, acrescentando o método TClientDataSet.ApplyUpdates(0) para enviar as modificações para o BD, o método TClientDataSet.CancelUpdates para cancelar todas as modificações, e o evento TClientDataSet.OnReconcileError para capturar os erros ao atualizar o BD.


Não entendi muito bem quando você disse que deixou a query sem ligação.

Como você está carregando os dados no ClientDataSet?

Se o ClientDataSet estiver ligado de forma semelhante a que citei anteriormente, talvez esteja faltando executar o método TClientDataSet.ApplyUpdates.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Qui Mar 31, 2011 2:02 pm    Assunto: Responder com Citação

o meu esquema está assim

Query
- Name = Query1
- DataSource =

DataSetProvider
- Name = DataSetProvider1
- DataSet = Query1

ClientDataSet
- Name = ClientDataSet1
- ProviderName = DataSetProvider1

DataSource
- Name = DataSource1
- DataSet = ClientDataSet1

DBGrid
- Name = DBGrid1
- DataSource = DataSource1


o problema é que não está puxando os dados da tabela.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mar 31, 2011 3:35 pm    Assunto: Responder com Citação

Qual banco de dados e o componente de conexão que você esta utilizando? DBExpress, ADO, IBO ou outro?

O componente Query1 não está ligado ao componente de conexão?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
k4mui321
Novato
Novato


Registrado: Terça-Feira, 3 de Agosto de 2010
Mensagens: 86
Localização: teresina

MensagemEnviada: Qui Mar 31, 2011 3:57 pm    Assunto: Responder com Citação

Citação:
procedure TFconsprod1.DBGrid2TitleClick(Column: TColumn);
Var
i: Integer;
campo, sql : string;
begin
dm1.IBQCs_Produtos.Close;
sql := dm1.IBQCs_Produtos.SQL.Text;
i := pos(' by ',sql);
if (i > 0) and (not (pos(' DESC',sql) > 0)) then
campo := copy(sql,i+4,length(trim(sql)))
else
campo := '';




for i:= 0 to DBGrid2.Columns.Count-1 do
DBGrid2.Columns[i].Title.Font.Color := clBlack;

dm1.Ibqcs_produtos.Sql.Clear;
dm1.Ibqcs_produtos.SQL.Add('SELECT * FROM Produto3 WHERE NOME_PROD like :nome OR '+
'COD_PROD like :codigo OR COD_ORIG like :original order by ' + column.FieldName);
if pos(AnsiUpperCase(column.FieldName),AnsiUpperCase(campo)) > 0 then
dm1.Ibqcs_produtos.SQL.text := dm1.Ibqcs_produtos.SQL.text + ' DESC';
if length(edit1.text) > 0 then
begin
dm1.Ibqcs_produtos.params[0].value := '%' + edit1.text + '%';
dm1.Ibqcs_produtos.params[1].value := '%' + Edit1.text + '%';
dm1.Ibqcs_produtos.params[2].value := '%' + Edit1.text + '%';
end
else
begin
dm1.Ibqcs_produtos.params[0].value := '%';
dm1.Ibqcs_produtos.params[1].value := '%';
dm1.Ibqcs_produtos.params[2].value := '%';
end;
if not dm1.Ibqcs_produtos.Prepared then
begin
dm1.Ibqcs_produtos.Prepare;
dm1.Ibqcs_produtos.Open;
end;

Column.Title.Font.Color:=clred;
end;


Esse codigo q uso pra fazer isso..espero q ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Sex Abr 01, 2011 7:43 am    Assunto: Responder com Citação

Estou utilizando o DBExpress. Que dispositivo de conecção pode substituir o SQLConection?

Vou testar essa linha de comando, caso de certo posto aqui.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Sex Abr 01, 2011 8:36 am    Assunto: Responder com Citação

k4mui321 escreveu:
Citação:
procedure TFconsprod1.DBGrid2TitleClick(Column: TColumn);
Var
i: Integer;
campo, sql : string;
begin
dm1.IBQCs_Produtos.Close;
sql := dm1.IBQCs_Produtos.SQL.Text;
i := pos(' by ',sql);
if (i > 0) and (not (pos(' DESC',sql) > 0)) then
campo := copy(sql,i+4,length(trim(sql)))
else
campo := '';




for i:= 0 to DBGrid2.Columns.Count-1 do
DBGrid2.Columns[i].Title.Font.Color := clBlack;

dm1.Ibqcs_produtos.Sql.Clear;
dm1.Ibqcs_produtos.SQL.Add('SELECT * FROM Produto3 WHERE NOME_PROD like :nome OR '+
'COD_PROD like :codigo OR COD_ORIG like :original order by ' + column.FieldName);
if pos(AnsiUpperCase(column.FieldName),AnsiUpperCase(campo)) > 0 then
dm1.Ibqcs_produtos.SQL.text := dm1.Ibqcs_produtos.SQL.text + ' DESC';
if length(edit1.text) > 0 then
begin
dm1.Ibqcs_produtos.params[0].value := '%' + edit1.text + '%';
dm1.Ibqcs_produtos.params[1].value := '%' + Edit1.text + '%';
dm1.Ibqcs_produtos.params[2].value := '%' + Edit1.text + '%';
end
else
begin
dm1.Ibqcs_produtos.params[0].value := '%';
dm1.Ibqcs_produtos.params[1].value := '%';
dm1.Ibqcs_produtos.params[2].value := '%';
end;
if not dm1.Ibqcs_produtos.Prepared then
begin
dm1.Ibqcs_produtos.Prepare;
dm1.Ibqcs_produtos.Open;
end;

Column.Title.Font.Color:=clred;
end;


Esse codigo q uso pra fazer isso..espero q ajude




Olá k4mui321,

não consegui compreender seu SQL, poderia me explicar como funciona???
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Abr 01, 2011 10:00 am    Assunto: Responder com Citação

Citação:
Estou utilizando o DBExpress. Que dispositivo de conecção pode substituir o SQLConection?


Não há problema nenhum em utilizar o DBExpress.


Citação:
o problema é que não está puxando os dados da tabela.


Se não está puxando os dados da tabela e os componentes estão com suas propriedades "padrão", acho que o problema pode estar na ligação dos componentes como já foi comentado, ou na Query que pode ter alguma clausula (where principalmente) limitando os resultados, ou também pode estar faltando passar algum parâmetro para ela.

Estou considerando também que o programa está executando normalmente sem mensagens de erro. Se estiver apresentando alguma mensagem poste para ajudarmos melhor.

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Sex Abr 01, 2011 10:51 am    Assunto: Responder com Citação

é isso mesmo, estou utilizando order by na query, utilizo para ordenar o dbgrid quando clica no titulo da coluna para ordernar por ela, assim sempre que ordena a coluna, não consigo alterar a celula.

Usando o client data set, consigo fazer os dois (ordenar e alterar), porém a alteração feita não é atualizada na tabela. será que preciso fazer uma linha de comando pegando o campo alterado e dar um update na tabela??? e como faço isso???
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Abr 01, 2011 11:08 am    Assunto: Responder com Citação

Não é preciso executar um Update para atualizar os dados no BD, pois os componentes fazem isso automaticamente executando o TClientDataSet.ApplyUpdates.

Para testar experimente acrescentar os códigos abaixo.

No evento AfterPost (e direcione o AfterDelete para a mesma procedure) do ClientDataSet:

Código:
procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
begin
ClientDataSet1.ApplyUpdates(0);
end;


No evento OnReconcileError do ClientDataSet (acrescente a unit RecError a clausula uses do seu form):

Código:
procedure TForm1.ClientDataSet1ReconcileError(
  DataSet: TCustomClientDataSet; E: EReconcileError;
  UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
Action := HandleReconcileError(DataSet, UpdateKind, E);
end;


Com este código as alterações deverão ser enviadas ao BD após o Post ou Delete no ClientDataSet.

Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natan.carlos
Novato
Novato


Registrado: Quarta-Feira, 9 de Fevereiro de 2011
Mensagens: 83

MensagemEnviada: Sex Abr 01, 2011 12:57 pm    Assunto: Responder com Citação

blz, deu certo, obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Yahoo Messenger MSN Messenger
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