Jump to content
Fórum Script Brasil
  • 0

Problema com dbgrid em tempo de execução


spider man

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.5k
×
×
  • Create New...