Ir para conteúdo
Fórum Script Brasil
  • 0

Problema com dbgrid em tempo de execução


spider man

Pergunta

Olá pessoal tudo bem?

Tenho um sistema onde existe um formconsultar com dbgrid..

ao clicar no registro selecionado no grid abre-se um novo formalterar ok

o formconsultar tem uma Dbcombobox com varios itens..

Ao consultar o 1 item ele retorna os dados..

Ao consultar outro ele retorna erro

'ClientDataSet: Cannot perform thid operation on a closed dataset'.

Segue os códigos..

procedure Tfrmconsultar.btnconsultarClick(Sender: TObject);

begin

DM.ADOQuerySql.Open;

DM.ClientDataSet.close;

DM.ADOQuerySQL.SQL.CLEAR;

DM.ADOQuerySQL.SQL.ADD('select codigo, filial, ip, nomepc, placamae, modelo, processador, placavideo, hd, placasom, memoria, placarede, sistemaop, soquete, setor from componentes_filiais where filial like :filial');

DM.ADOQuerySQL.Parameters.ParamByName('filial').Value:= combobox.text;

DM.ClientDataSet.Open;

DM.ADOQuerySql.Close;

end;

Procedure Tfrmalterar.DBEdit1Change(Sender: TObject);

begin

DM.ADOQuerySql.open;

DM.ClientDataSet.Locate('codigo', DBedit1.text, [loCaseInsensitive, loPartialKey]);

end;

Gostaria que me ajudassem neste caso.

Grato.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

seu post no outro forum

amigo fiz como disse mas continua dando o erro...

'ClientDataSet: Cannot perform thid operation on a closed dataset'.

Será que o problema não está na forma de pesquisar..

procedure Tfrmalterar.DBEdit1Change(Sender: TObject);

begin

DM.ADOQuerySql.open;

DM.ClientDataSet.Locate('codigo', DBedit1.text, [loCaseInsensitive, loPartialKey]);

end;

Se eu seleciono um registro na Dbcombobox para pesquisar o registro de uma filial eu consulto funciona. O erro dá quando mudo a filial na Dbcombobox e consulto na sequencia...

'ClientDataSet: Cannot perform thid operation on a closed dataset'

ClientDataSet: Não é possível executar a operação em um conjunto de dados fechado ".

O erro além de informar que voce esta fechando a tabela, voce não deve usar o locate dentro de um DBEdit, visto que ele já esta linkado a um registro de sua tabela

mas se realmente quer usar assim, tente:

procedure Tfrmconsultar.btnconsultarClick(Sender: TObject);
begin
   DM.ADOQuerySql.Open;
   DM.ClientDataSet.close;
   DM.ADOQuerySQL.SQL.CLEAR;
   DM.ADOQuerySQL.SQL.ADD('select codigo, filial, ip, nomepc, placamae, modelo, processador, placavideo, hd,       placasom, memoria, placarede, sistemaop, soquete, setor from componentes_filiais where filial like :filial');
   DM.ADOQuerySQL.Parameters.ParamByName('filial').Value:= combobox.text;
   DM.ClientDataSet.Open;

end;

Procedure Tfrmalterar.DBEdit1Change(Sender: TObject);
begin
   DM.ClientDataSet.First;
   DM.ClientDataSet.Locate('codigo', DBedit1.text, [loCaseInsensitive, loPartialKey]);
end;

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

ok... então vamos a forma padrão de uso do locate

primeiro veja que voce esta usando um combobox para passar um parametro para a sua query, então não existe a necessidade de um DBCombobox, a menos que o resultado desse DBCombobox vá fazer parte de alguma outra pesquisa

Prov_IB.Active := false;

CDS_Prov.Active := false;

CDS_Prov.Params[0].AsInteger := codcli;

Prov_IB.Active := true;

CDS_Prov.Active := true;

procedure Tfrmconsultar.btnconsultarClick(Sender: TObject);
begin
DM.ADOQuerySql.Active := false;
DM.ClientDataSet.Active := false;
DM.ADOQuerySQL.SQL.CLEAR;
DM.ADOQuerySQL.SQL.ADD('select codigo, filial, ip, nomepc, placamae, modelo, processador, placavideo, hd, placasom, memoria, placarede, sistemaop, soquete, setor from componentes_filiais where filial like :filial');
DM.ADOQuerySQL.Parameters.ParamByName('filial').Value:= [b]combobox.text;[/b]
DM.ADOQuerySql.Active := true;
DM.ClientDataSet.Active := true;
end;
a partir desse ponto, se a sua query trouxe os registros da seleção, voce poderá ve-los em um dbgrid a partir do registro inicial encontrado... então imagine que a seleção trouxe 100 registros, voce estaria vendo nos seus dbedits os campos do primeiro registro se dentro desses 100 registros voce quer localizar ( locate ) um outro registro, então voce faz uso do locate
DM.ClientDataSet.First;
   DM.ClientDataSet.Locate('codigo', Edit1.text, [loCaseInsensitive, loPartialKey]);

para teste coloque esse comando em um botão e faça uso de um componente Edit para digitar o codigo que voce quer encontrar

se o codigo for encontrado, automaticamente o ponteiro de registros estará posicionado nesse registro, e nos DBEdits que estão linkados a sua tabela via query será mostrado.

OBS:

DM.ADOQuerySql.Active := false;

DM.ClientDataSet.Active := false;

substitui esses comandos ( close e open ) para facilitar o seu entendimento com relação a ativação / desativação da query

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...