Array
(
)

DBGrid não atualiza

Spiritwwwalker
   - 15 dez 2005

Peço a colaboração de todos para um problema que tornou-se um entrave para o desenvolvimento de minha aplicação.
Num formulário, tenho um DBGrid com 5 colunas cujos dados são originários de um ADOQuery, cuja string SQL seleciona todos os campos de uma tabela do MS Access 97 com mais de 5 000 registros e, para tanto, estabeleci uma conexão com um componente ADOConnection. O conjunto funciona perfeitamente, exibindo todos os registros de maneira correta. Ocorre que quando incluo um novo registro, ou excluo um existente (também através de consultas SQL), o DBGrid não atualiza os dados, exceto quando o formulário é fechado e novamente aberto. Esclareço que antes de postar a presente dúvida, consultei este fórum, encontrando alguns questionamentos semelhantes, entre eles a sugestão de fechar e abrir a consulta, realizar um refresh, etc., porém não obtive sucesso. Reconheço que trata-se de uma dúvida banal que pode até irritar os mais experientes, mas a verdade é que estou encontrando certa dificuldade em converter minha aplicação em VBA (Visual Basic for Applications) para o Delphi. Desde já, agradeço a atenção dispensada.


Edilcimar
   - 15 dez 2005

se a seqüência
query.close;
query.open;
dbgrid.refresh;
não funcionar, tente colocar após isto
dbgrid.visible := false;
dbgrid.visible := true;


Spiritwwwalker
   - 16 dez 2005

Prezado Edilcimar:

Segui suas orientações e o problema foi resolvido de maneira parcial: quando eu executava o comando para acrescentar um novo registro, por exemplo, ´Item1´, o DBGrid não era atualizado de imediato, mas somente quando eu incluía um outro registro (chamaremos de ´Item2´), ocasião em que o ´Item1´ surgia na listagem e, estranhamente, o ´Item2´ não, o qual só apareceria se eventualmente fosse acrescentado um ´Item3´, e assim sucessivamente.
Após muitas experimentações, descobri que era necessário fechar a consulta antes de executa-la, desativa-la momentaneamente e, logo em seguida, ativa-la novamente. Ficaria algo assim (no meu caso, os códigos abaixo foram associados ao evento OnClick de um botão de comando):

ADOQuery.Close;
ADOQuery.ExecSQL;
ADOQuery.Active := False;
ADOQuery.Active := True;

De qualquer modo, agradeço imensamente o interesse demonstrado, pois não fosse seu auxílio, não chegaria a uma solução tão rápida. No VBA, por exemplo, os dados exibidos pelo objeto (como uma caixa de listagem ou uma de combinação) seriam atualizados com o seguinte comando:

Objeto.Requery