Fórum Ajuda com consulta usando DBExpress #415153

09/04/2012

0

Boa tarde a todos, estou tentando fazer uma consulta e não estou conseguindo. Se alguém pudar ajudar fico grato.
procedure TfrmCadPadrao.RegistrosBloqueadosparauso1Click(Sender: TObject);
var
  qry: TSQLQuery;
begin
  qry.Close;
  qry.CommandText:= SELECT * FROM  + nomeTabela + WHERE ATIVO_ + sufixoTabela + = + #39 + N + #39;
  qry.Open;
end;


Esta é a forma correta? Ou estou errando em algo.
Estou usando Delphi XE, Firebird 2.1 e DBExpress (Trio de ferro....kkk)
Obs: nomeTabela e sufixoTabela passo os parâmetros no Active do Form.
  sufixoTabela:= TES;
  nomeTabela:= TESTE;
  nomeJanela:= CADASTRO TESTE;

Mesmo tirando eles para teste, não faz a consulta.
Adilson Rumao

Adilson Rumao

Responder

Posts

09/04/2012

Bruno Leandro

tenta desta forma abaixo.

procedure TfrmCadPadrao.RegistrosBloqueadosparauso1Click(Sender: TObject);
var
qry: TSQLQuery;
begin
qry := TSQLQuery.Create(nil);
qry.SQLConnection := SQLConnection1;
qry.Close;
qry.CommandText:= SELECT * FROM + nomeTabela + WHERE ATIVO_ + sufixoTabela + = + #39 + QuotedStr(N) + #39;
qry.Open;
end;
Responder

Gostei + 0

09/04/2012

Joel Rodrigues

Só explicando o código acima: como você está usando uma SQLQuery declarada em seu código, ou seja, não foi um controle adicionado ao form, você precisa INSTANCIÁ-LA antes de utilizar, ou seja:
qry := TSQLQuery.Create(Self);


Antes disso, a query não existe, deve acusar um erro de AccessViolation.
Boa sorte.
Responder

Gostei + 0

09/04/2012

Adilson Rumao

Devo estar fazendo algo a mais de errado.
Se uso com self:
procedure TfrmCadPadrao.RegistrosBloqueadosparauso1Click(Sender: TObject);
var
  qry: TSQLQuery;
begin
  qry:= TSQLQuery.Create(self);
  qry.SQLConnection:= DM.SQLConexao;
  qry.Close;
  qry.CommandText:= SELECT * FROM  + nomeTabela + WHERE ATIVO_ + sufixoTabela + = + #39 + N + #39;
  qry.Open;
  DS.DataSet.Open;
  Executar:= navegacao;
  Executar:= exibePanels;
end;


Se uso com nil:
procedure TfrmCadPadrao.RegistrosBloqueadosparauso1Click(Sender: TObject);
var
  qry: TSQLQuery;
begin
  qry:= TSQLQuery.Create(nil);
  qry.SQLConnection:= DM.SQLConexao;
  qry.Close;
  qry.CommandText:= SELECT * FROM  + nomeTabela + WHERE ATIVO_ + sufixoTabela + = + #39 + N + #39;
  qry.Open;
  DS.DataSet.Open;
  Executar:= navegacao;
  Executar:= exibePanels;
end;

Não retorna erro mas, não lista nada.
raised exception class TDBXError with message Token unknowm - line 1, 35 =

Responder

Gostei + 0

09/04/2012

Bruno Leandro

voce queria que o resultado da qry saisse em um dbgrid?
Responder

Gostei + 0

09/04/2012

Adilson Rumao

Isso mesmo, tenho no menu opções de Filtros tipo:

Produtos Ativados, Produtos Desativado, Produtos Alterador em um período etc.
Estou querendo que, ao clicar na opção abra os dados no DBGrid.
Se eu mandar abrir direto no DBGrid com DS.DataSet.Open; os dados aparecem sem problemas mas, com a consulta não.

procedure TfrmCadPadrao.btnOkClick(Sender: TObject);
begin
  if (cbxCampo.Text <> EmptyStr) and (edtValorCampo.Text <> EmptyStr) then
  begin
    if (rdgFiltros.ItemIndex = 0) then
    begin
    DS.DataSet.Filter := Upper(+ DS.DataSet.Fields[listaField[cbxCampo.ItemIndex]].FieldName +) LIKE +QuotedStr(Uppercase(edtValorCampo.Text)+%);
    DS.DataSet.Filtered:= True;
    if not DS.DataSet.Active then
    DS.DataSet.Open;
    end;

Esta consulta tbm funciona.
Responder

Gostei + 0

09/04/2012

Bruno Leandro

é que o seu qry que está sendo criado em tempo de execução, não está ligado ao seu tdatasource (ds), pra exibir os dados acredito que antes do qry.open; voce coloque o ds.dataset := qry;

.
.
ds.dataset := qry;
qry.open;

mas não entendi direito o que voce esta fazendo, talvez esse não seja o melhor jeito.
Responder

Gostei + 0

09/04/2012

Adilson Rumao

Então vamos lá:
Tenho um MainMenu com as opções:

Todos os regfistros desta tabela
Registros alterados no período
Registros incluídos no período
Registros bloqueados para uso

Para mostrar todos os registros da tabela bls, dou um DS.DataSet.Open e ele lista todos.

no data módulo tenho ClienteDataSet, DataSetProvider, SqlDataSet

Inclusão, alteração, exclusão, tudo funciona.
Só nesta parte que parei e não estou conseguindo fazer funcionar.
procedure TfrmCadPadrao.RegistrosBloqueadosparauso1Click(Sender: TObject);
var
  qry: TSQLQuery;
begin
  qry:= TSQLQuery.Create(nil);
  qry.SQLConnection:= DM.SQLConexao;
  qry.Close;
  qry.CommandText:= SELECT * FROM  + nomeTabela +  WHERE ATIVO_ + sufixoTabela + = + #39 + N + #39;
  DS.DataSet:= qry;
  qry.Open;
  //DS.DataSet.Open;
  Executar:= navegacao;
  Executar:= exibePanels;
end;

Lembrando que tenho as variáveis globais nomeTabela e sufixoTabela declaradas.
Não sei se pode ser erro no SELECT, estou estando aqui.
Responder

Gostei + 0

09/04/2012

Bruno Leandro

antes do qry.Open tenta colocar showmessage(qry.CommandText); para ver se o codigo sql esta correto, talvez tenha alguma informação sem espaço
Responder

Gostei + 0

09/04/2012

Adilson Rumao

Está retornando a consulta SQL, testei ela no IBExpert e funciona normalmente.

select * from teste where ativo_tes=N


Responder

Gostei + 0

09/04/2012

Adilson Rumao

Está retornando a consulta SQL, testei ela no IBExpert e funciona normalmente.

select * from teste where ativo_tes=N

Corrgindo:
select * from teste where ativo_tes=N

Responder

Gostei + 0

09/04/2012

Adilson Rumao

Está retornando a consulta SQL, testei ela no IBExpert e funciona normalmente.

select * from teste where ativo_tes=N

Corrgindo:
select * from teste where ativo_tes=N

Tem aspas simples entre o N
Responder

Gostei + 0

10/04/2012

Adilson Rumao

Boa tarde a todos, usando desta forma está filtrando mas, está interferindo nas outras consultas. Não está limpando a sentença SQL depois que faço uma consulta assim:

  TClientDataSet(DS.DataSet).Close;
  TClientDataSet(DS.DataSet).CommandText:= SELECT * FROM  + nomeTabela +  WHERE ATIVO_ + sufixoTabela +  =  + #39 + N + #39;
  TClientDataSet(DS.DataSet).Execute;
  TClientDataSet(DS.DataSet).Open;


Ele sempre fica pegando esta sentença SQl. Acredito que esta ainda não seja a forma correta.
Responder

Gostei + 0

10/04/2012

Bruno Leandro

voce poderia deixar o sql padrão ex: select * from tabela e quando escolher as opções

Todos os regfistros desta tabela
Registros alterados no período
Registros incluídos no período
Registros bloqueados para uso

utilizar o Filter

ds.dataset.filtered := false;
ds.dataset.filter := ativo = N;
ds.dataset.filtered := true;
Responder

Gostei + 0

10/04/2012

Adilson Rumao

Valeu pela força Bruno. Consegui resolver da seguinte forma:
Criei uma TExecutar = (sentencaSQL);
{Executa Sentença SQL}
  sentencaSQL:
  begin
    TClientDataSet(DS.DataSet).Close;
    TClientDataSet(DS.DataSet).Filtered:= False;
    TClientDataSet(DS.DataSet).CommandText:= strSQL;
    TClientDataSet(DS.DataSet).Execute;
    TClientDataSet(DS.DataSet).Open;
    TClientDataSet(DS.DataSet).Filtered:= True;
    TClientDataSet(DS.DataSet).First;

    if(DS.DataSet.RecordCount = 0) then
    begin
      mensagem:= Não foi encontrado nenhum registro que  + #13
      + satisfaça a sua pesquisa. ;
      Application.MessageBox(PChar(mensagem),Informação,MB_OK+MB_ICONQUESTION);
    end;
  end;


E nas consultas estou usando assim:
procedure TfrmCadPadrao.RegistrosBloqueadosparauso1Click(Sender: TObject);
begin
  strSQL:= SELECT * FROM  + nomeTabela;
  strSQL:= strSQL +  WHERE ATIVO_ + sufixoTabela + = + #39 + N + #39;
  Executar:= sentencaSQL;
  Executar:= exibePanels;
  Executar:= navegacao;
end;

procedure TfrmCadPadrao.TodososRegistrosdestaTabela1Click(Sender: TObject);
var
confExibe: Integer;
begin
  Beep;
  confExibe:= Application.MessageBox(Você optou por exibir todos os registros. + #13
  + Tenha em mente que, isso demanda muito processamento. + #13
  + Deseja continuar mesmo assim?, Atenção,
                                     MB_YESNO+MB_DEFBUTTON2+MB_ICONQUESTION);
  if confExibe = IDYES then
  begin
  strSQL:= SELECT * FROM  + nomeTabela;
  Executar:= sentencaSQL;
  Executar:= exibePanels;
  Executar:= navegacao;
  end
  else
  begin
  DS.DataSet.Close;
  Executar:= navegacao;
  end;
end;


Talvez não seja a melhor forma de se fazer mas, está funcionando de momento. Vou continuar com os testes aqui.
O uso do Filtered também não sei se está correto. Vou testando, e valeu pela força.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar