Firedac, FDquery não retorna SQL inner join.
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:
O SQL:
-- tabelas : Atendidos & Produtos
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.
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
Curtidas 0
Respostas
Claudio Andrade
05/02/2021
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?
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;
GOSTEI 0
Marcelo Oliveira
05/02/2021
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?
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.
GOSTEI 0
Marcelo Oliveira
05/02/2021
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?
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.
GOSTEI 0