GARANTIR DESCONTO

Fórum dbExpress ( atualizando tabela DBGrid ) #328858

07/09/2006

0

caros colegas, com os componentes da paleta IBX, mas precisamente com os componentes IBDataset+ DataSource + DBGrid, para atualizar minha tabela no DBGrid em tempo de execussão para o usuário eu fazia por exemplo:

IBDataset.SelectSql.add(´SELECT * FROM tabela ORDER BY DATA´);


a questão é que agora no turbo delphi, estou usando dbExpress, pela falta dos componentes IBX, entao ja fiz minha primeira conexao com sucesso, consigo visualizar em tempo de execussão os dados da tabela no DBGrid, etc....

como fasso essa atualização que fazia antes com IBX em dbExpress clicando em um botão??? nao sei se estou certo, mas creio que o componente que se igualará ao IBDataset para realizar essas rotinas seria o ClientDataSet, estou certo?

Componentes que estou usando na conexão:

- SQLConnection
- SQLDataset
- DataSource
- DataSetProvider
- ClientDataSet

Banco de dados: Firebird 1.5.3

Abraços!


Mahdak

Mahdak

Responder

Posts

07/09/2006

Marco Salles

primeiro voce deve ligar os componentes da maneira correta

voce fez isto ???

para atualizar algum dado , o clientdataset permite a edição.. Basta alterar o que voce quer na Grid e faer

ClietDataset.applyupdates(0); por exemplo....


Responder

Gostei + 0

07/09/2006

Mahdak

marcos, as ligações com os componentes estao feitas sim, o problema é que meu grid é somente leitura, eu edito tudo nos Edits que tem no formulario...
o que eu gostaria mesmo é de saber em qual componente eu vou trabalhar os comandos SQL de forma ao meu DBGrid atualizar os dados em tempo de execussão, como eu fazia com o IBX, e como trabalhar...

exemplo:

procedure TPrincipal.Btn_CancelarClick(Sender: TObject);
begin
    Componente.Cancel;
    
    // Atualiza tabela + DBGRID
    Componente.Close;
    Componente.SQL := ´SELECT * FROM tabela order by DATA´;
    Componente.Open;

end;



nao sei se fiz me entender...

abraços!


Responder

Gostei + 0

07/09/2006

Marco Salles

o certo é voce usar o clientDataset para isto , apesar que em aplicaçoes desktop tem o mesmo efeito voce usar o SQLDataset .. Mas em aplicaçoes multicamadas é bem mais fácil usar o cliebtDataSet

para isto voce deve usar a propreidade ComandText do ClientDataSet

ClientDataSet1.CommandText:=´coloque aqui sua isnstrução´;
ClientDataSet1.Close;
ClientDataSet1.Open;


[b:05983dee4f]voce deve alterar a propriedade poAlowComandText para True do DataSetProvider1... Isto de altera em Options no Objecto Inspector[/b:05983dee4f]

tente ai...

so um detalhe... quem trabalha com clientDataSet , vicia.. é o melhor componente que a borland Ja fez , sem sombra de duvida


Responder

Gostei + 0

07/09/2006

Mahdak

entao... fiz justamente isso que vc indicou, por indicação de um outro amigo e o erro foi o seguinte:

erro: SQLDataSet : cannot perform this operation on a OPEN DataSet


Responder

Gostei + 0

07/09/2006

Marco Salles

desculpa

ClientDataSet1.CommandText:=´coloque aqui sua isnstrução´; 
ClientDataSet1.Close; 
ClientDataSet1.Open;


[b:881f7265ab]o certo é[/b:881f7265ab]

ClientDataSet1.Close; 
ClientDataSet1.CommandText:=´coloque aqui sua isnstrução´; 
ClientDataSet1.Open;



Responder

Gostei + 0

07/09/2006

Giordano

Vocês sabem porque o DBGRID fica somente leitura, com outros componentes tipo ADO eu consigo editar o DBGRID.

giordano


Responder

Gostei + 0

08/09/2006

Arc@njo

mahdak

Uma outra sugestão que poderia ser utilizada é a seguinte, pelo que entendi vc quer atualizar os dados apresentados no DBGrid por ordem de data, se sua necessidade for simplesmente alterar a ordem dos dados apresentados pode ser usado o seguinte:

procedure TPrincipal.Btn_CancelarClick(Sender: TObject); 
begin 
  ClientDataSet1.IndexFieldName:=´DATA´;
  ClientDataSet1.First;
End;


A propriedade IndexFieldName do ClientDataSet pode receber qualquer campo existente na lista de campos do ClientDataSet (exceção para os campos virtuais, calculados, loockups, etc), atraves dela vc podera ordenar sua tabela por seus campos sem a necessidade de executar outro acesso ao banco de dados, evitando assim o trafego na rede, pois o ClientDataSet trabalha com a tabela na memoria e todo seu acesso é na memoria, ate ser feita a atualização no banco, atraves da rotina ApplyUpdates, ou cancelada as atualizacoes por CancelUpdates.

Como disse Marco Salles:
so um detalhe... quem trabalha com clientDataSet , vicia.. é o melhor componente que a borland Ja fez , sem sombra de duvida


Espero ter ajudado


Responder

Gostei + 0

08/09/2006

Mahdak

Vocês sabem porque o DBGRID fica somente leitura, com outros componentes tipo ADO eu consigo editar o DBGRID. giordano


seta na opção ready only do componente para true se vc quer editar os dados direto nele

Aproveitando o tópico....

Alguem sabe me dizer onde está, nos componentes dbExpress a propriedade equivalente ao ´GeneratorField´ do componente IBData Set da paleta interbase... ?????


abração!


Responder

Gostei + 0

08/09/2006

Mahdak

beleza, consegui com o select GEN ID, porem gostaria de saber se pelo fato do meu Gen_Id ja me trazer o proximo código, o insert que eu dou após nao vá causar problemas?

SQLDataSet2.Close;
SQLDataSet2.CommandText := ´Select GEN_ID(gen_agenda_id,1) as PROX from RDB$DATABASE´;
SQLDataSet2.Open;

Edit_Codigo.text := IntToStr(SQLDataSet2PROX.AsInteger);

ClientDataSet1.Open;
ClientDataSet1.Insert;

// comandos para salvar no banco....

ClientDataSet1.post
ClientDataSet1.applyupdates;



Responder

Gostei + 0

08/09/2006

Arc@njo

Como dito anteriormente o ClientDataSet trabalha com a tabela na memoria, tornando as alterações definitivas apenas quando for chamado o metodo ApplyUpdates (sou viciado em ClientDataSet :lol: ), o fato de voce ter usado o Select para buscar o proximo Gen_ID não trara complicações a sua aplicação :P , desde é claro que voce não tenha uma trigger na tabela que faça a inserção automatica do Gen_ID na sua chave em cada inserção e que voce faça a atribuição do valor obtido no GEN_ID para o seu campo chave de tabela do ClientDataSet. :twisted:


Responder

Gostei + 0

08/09/2006

Mahdak

entao ta tudo beleza... acho que vou me viciar nesse componente tambem... uhauhaa


abração!


Responder

Gostei + 0

08/09/2006

Mahdak

ahahaha, outra coisa que eu havia esquecido...

com os componentes da paleta IBX eu trabalhava as transações nas tabelas colocando por exemplo, um código parecido com o que segue abaixo nos eventos AfterDelete e AfterPost do IBDataset

Tr_Cidade = IBTransaction

if Not Tr_Cidade.InTransaction then
    Tr_Cidade.StartTransaction;
    Try
      if Tr_Cidade.InTransaction then
      Tr_Cidade.CommitRetaining
      Except
          if Tr_Cidade.InTransaction then
          Tr_Cidade.RollbackRetaining;
      end;



tem como realizar essas transações com dbExpress??? se sim, como e em qual componente? por que tentei da maneira acima aqui e nao funcionou com os componentes da minha conexao aqui...

abração!


Responder

Gostei + 0

08/09/2006

Mahdak

ahahaha, outra coisa que eu havia esquecido... com os componentes da paleta IBX eu trabalhava as transações nas tabelas colocando por exemplo, um código parecido com o que segue abaixo nos eventos AfterDelete e AfterPost do IBDataset Tr_Cidade = IBTransaction
if Not Tr_Cidade.InTransaction then
    Tr_Cidade.StartTransaction;
    Try
      if Tr_Cidade.InTransaction then
      Tr_Cidade.CommitRetaining
      Except
          if Tr_Cidade.InTransaction then
          Tr_Cidade.RollbackRetaining;
      end;
tem como realizar essas transações com dbExpress??? se sim, como e em qual componente? por que tentei da maneira acima aqui e nao funcionou com os componentes da minha conexao aqui... abração!



ta na mão: http://forum.devmedia.com.br/viewtopic.php?t=58547


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar