dbExpress ( atualizando tabela DBGrid )
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:
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!
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
Curtidas 0
Respostas
Marco Salles
07/09/2006
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....
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....
GOSTEI 0
Mahdak
07/09/2006
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:
nao sei se fiz me entender...
abraços!
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!
GOSTEI 0
Marco Salles
07/09/2006
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
[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
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
GOSTEI 0
Mahdak
07/09/2006
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
erro: SQLDataSet : cannot perform this operation on a OPEN DataSet
GOSTEI 0
Marco Salles
07/09/2006
desculpa
[b:881f7265ab]o certo é[/b:881f7265ab]
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;
GOSTEI 0
Giordano
07/09/2006
Vocês sabem porque o DBGRID fica somente leitura, com outros componentes tipo ADO eu consigo editar o DBGRID.
giordano
giordano
GOSTEI 0
Arc@njo
07/09/2006
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:
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:
Espero ter ajudado
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
GOSTEI 0
Mahdak
07/09/2006
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!
GOSTEI 0
Mahdak
07/09/2006
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;
GOSTEI 0
Arc@njo
07/09/2006
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:
GOSTEI 0
Mahdak
07/09/2006
entao ta tudo beleza... acho que vou me viciar nesse componente tambem... uhauhaa
abração!
abração!
GOSTEI 0
Mahdak
07/09/2006
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
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!
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!
GOSTEI 0
Mahdak
07/09/2006
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
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!
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;
ta na mão: http://forum.devmedia.com.br/viewtopic.php?t=58547
GOSTEI 0