| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Sex Mar 11, 2011 4:28 pm Assunto: Ordenar e alterar dados DBGrid [RESOLVIDO] |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Mar 11, 2011 8:36 pm Assunto: |
|
|
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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Ter Mar 15, 2011 2:42 pm Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Ter Mar 15, 2011 3:23 pm Assunto: |
|
|
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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Qui Mar 31, 2011 11:37 am Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Mar 31, 2011 12:08 pm Assunto: |
|
|
| 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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Qui Mar 31, 2011 2:02 pm Assunto: |
|
|
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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Mar 31, 2011 3:35 pm Assunto: |
|
|
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 |
|
 |
k4mui321 Novato


Registrado: Terça-Feira, 3 de Agosto de 2010 Mensagens: 86 Localização: teresina
|
Enviada: Qui Mar 31, 2011 3:57 pm Assunto: |
|
|
| 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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Sex Abr 01, 2011 7:43 am Assunto: |
|
|
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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Sex Abr 01, 2011 8:36 am Assunto: |
|
|
| 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Abr 01, 2011 10:00 am Assunto: |
|
|
| 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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Sex Abr 01, 2011 10:51 am Assunto: |
|
|
é 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 |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Abr 01, 2011 11:08 am Assunto: |
|
|
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 |
|
 |
natan.carlos Novato

Registrado: Quarta-Feira, 9 de Fevereiro de 2011 Mensagens: 83
|
Enviada: Sex Abr 01, 2011 12:57 pm Assunto: |
|
|
| blz, deu certo, obrigado. |
|
| Voltar ao Topo |
|
 |
|