spider man Postado Setembro 5, 2012 Denunciar Share Postado Setembro 5, 2012 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 oko 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);beginDM.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);beginDM.ADOQuerySql.open;DM.ClientDataSet.Locate('codigo', DBedit1.text, [loCaseInsensitive, loPartialKey]);end;Gostaria que me ajudassem neste caso.Grato. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 6, 2012 Denunciar Share Postado Setembro 6, 2012 seu post no outro forumamigo 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);beginDM.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 tabelamas 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 spider man Postado Setembro 7, 2012 Autor Denunciar Share Postado Setembro 7, 2012 amigo não funcionou...qual a alternativa para o comando locate neste caso?Sabendo-se que todos os dbedits estão linkados com a tabela componentes_filiais? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 8, 2012 Denunciar Share Postado Setembro 8, 2012 ok... então vamos a forma padrão de uso do locateprimeiro 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 encontrarse 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 queryabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
spider man
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
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.