Firedac, FDquery não retorna SQL inner join.

05/02/2021

0

FireDac, FDQuery não retorna resultado

Ao realizar a consulta pelo procedimento "SQLinFDMemTable", o retorno da consulta é de 0 registros,
entretanto, se eu colar o SQL no FDquery, ele retorna os registros para mim.
<pre>
Cenário atual:
DataModule
FDConnection (devidamente configurado e conectado)
FDQuery (SQL funciona e retorna registros)
</pre>

No módulo de dados, tenho este procedimento:

    // Use para fazer uma consulta e preencher uma memtable
    procedure TDm.SQLinFDMemTable (pFDMemTable: TFDMemTable; pSQL: string);
    var
       vQry: TFDQuery;
    begin
       try
          vQry: = TFDQuery.Create (nil);
          vQry.Connection: = FDConnection1;
          vQry.SQL.Text: = RemoveEnter (pSQL);
          vQry.open;
          vQry.FetchAll;
          vQry.RecordCount; // return me 0
    
          pFDMemTable.Data: = vQry.Data;
          pFDMemTable.FetchAll;
       finally
          FreeAndNil (vQry);
       end;
    end;


O SQL:
-- tabelas : Atendidos & Produtos
select
    b.cpdbr,
    count(b.qtdbr) total,
    p.titpd,
    p.codsenior,
    p.codoli
from BRIND_TEMP b
    inner join PROD p on (cpdbr = codpd)
where
    b.flag is not null
    and b.dcad between '2021-01-11' and '2021-01-18'
    and b.detbr = '2021-01-19 13:29:27'
    and not (b.CPDBR in (' L01 ', ' S / OF ', ' DIZ ', 'ORAC', 'BSA'))
group by b.cpdbr, p.titpd, p.codsenior
order by b.cpdbr


O retorno para esse SQL na base ou no FDQuery (Design) o retorno é:

CPDBR... TOTAL........... TITPD ........CODSENIOR...........CODOLI
JF...... 2608 ...........Brinde X : JF .......... 10026 ........... JF
NT181... 83 ...........Brinde X : NT181 .......... 7091 ........... NT181
NT182... 7 ...........Brinde X : NT182 .......... 7153 ........... NT182
RV253... 111 ...........Brinde X : RV253 .......... 7041 ........... RV253
RV254... 113 ...........Brinde X : RV254 .......... 7047 ........... RV254
RV255... 145 ...........Brinde X : RV255 .......... 7048 ........... RV255
RV256... 110 ...........Brinde X : RV256 .......... 7079 ........... RV256
RV257... 81 ...........Brinde X : RV257 .......... 7092 ........... RV257
RV258... 2 ...........Brinde X : RV258 .......... 7154 ........... RV258

Mas no procedimento retorna 0, já testei em outro form a mesma procedure com SQL mais complexo com 2 inner e funciona.
Marcelo Oliveira

Marcelo Oliveira

Responder

Posts

05/02/2021

Claudio Andrade

A explicação ta um pouco confusa, mas veja se funciona com esse ajuste que eu fiz.
Me tire uma dúvida, porque não usar somente o FDQuery?


procedure TDm.SQLinFDMemTable (pFDMemTable: TFDMemTable; pSQL: string);
var
   vQry: TFDQuery;
begin
   try
      vQry: = TFDQuery.Create(nil);
      vQry.Connection: = FDConnection1;
      vQry.Open(pSQL);
       
      pFDMemTable.CopyDataSet(vQry);

   finally
      FreeAndNil (vQry);
   end;
end;
Responder

05/02/2021

Marcelo Oliveira

A explicação ta um pouco confusa, mas veja se funciona com esse ajuste que eu fiz.
Me tire uma dúvida, porque não usar somente o FDQuery?


procedure TDm.SQLinFDMemTable (pFDMemTable: TFDMemTable; pSQL: string);
var
   vQry: TFDQuery;
begin
   try
      vQry: = TFDQuery.Create(nil);
      vQry.Connection: = FDConnection1;
      vQry.Open(pSQL);
       
      pFDMemTable.CopyDataSet(vQry);

   finally
      FreeAndNil (vQry);
   end;
end;


Opa, obrigado.
usando o open(pSQL), achei que funcionava como um sql local quando já existe registros dentro da query.

revendo o código desde o inicio, descobri o erro, eu estou reescrevendo um sistema legado com 3 formulários, e em cada formulário existia um Connection, Query, DataSource e um deles havia 2 Connections para bancos "gemeos", então unifiquei em um datamodulo, e quando abro o form seto o BD necessário, porem um não tem alguns dados, e justamente nesse formulário, eu estava apontando para a base com a tabela vazia. que setei no inicio da reescrita do projeto. Então o problema era o apontamento para o BD errado, que nem sei porque estava no projeto antigo já que não é usado em lugar nenhum.

tenso.

Obrigado pela ajuda.
Responder

05/02/2021

Marcelo Oliveira

A explicação ta um pouco confusa, mas veja se funciona com esse ajuste que eu fiz.
Me tire uma dúvida, porque não usar somente o FDQuery?


procedure TDm.SQLinFDMemTable (pFDMemTable: TFDMemTable; pSQL: string);
var
   vQry: TFDQuery;
begin
   try
      vQry: = TFDQuery.Create(nil);
      vQry.Connection: = FDConnection1;
      vQry.Open(pSQL);
       
      pFDMemTable.CopyDataSet(vQry);

   finally
      FreeAndNil (vQry);
   end;
end;


Opa, obrigado.
usando o open(pSQL), achei que funcionava como um sql local quando já existe registros dentro da query.

revendo o código desde o inicio, descobri o erro, eu estou reescrevendo um sistema legado com 3 formulários, e em cada formulário existia um Connection, Query, DataSource e um deles havia 2 Connections para bancos "gemeos", então unifiquei em um datamodulo, e quando abro o form seto o BD necessário, porem um não tem alguns dados, e justamente nesse formulário, eu estava apontando para a base com a tabela vazia. que setei no inicio da reescrita do projeto. Então o problema era o apontamento para o BD errado, que nem sei porque estava no projeto antigo já que não é usado em lugar nenhum.

tenso.

Obrigado pela ajuda.


você perguntou porque não usar o FDQuery:
O projeto antigo possuía vários componentes de Dados em cada formulário(3) e com isso a manutenção era um pouco complicada.
então centralizei em um data module que possui 1 connection, e obtêm os parâmetros por um "config"
para cada form eu poderia setar a conexão desejada lendo o config indo para um BD ou outro BD (pois achava que o projeto usava 2 BDs, mas um estava lá e não era usado).
no datamodule eu tenho function e procedures para consulta, execução e popula o memtable, pois alguns dados preciso manipular e alterar.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar