Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
lmroot

(Resolvido) Openquery No Delphi

Question

Bom dia pessoal, eu estou desenvolvendo um relatório que consulta uma BD remota, nessa pesquisa eu junto os dados da BD local + remota, e para isso estou usando OpenQuery, no query analyzer o consulta funciona perfeitamente, um detalhe eu tenho que passar uns parametros nessa pesquisa (data de inicio e data final). Como que eu posso fazer isso dentro do delphi pois usando o "SQL.add('Select...')" dá erro quando chega na linha que tem os parametros. Segue abaixo um trecho da consulta.

SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = 'P' FROM CORPOPED

JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO

WHERE CABPED.EMISSAO >= '2007-10-30'

AND CABPED.EMISSAO <= '2007-10-30'

GROUP BY CODBASE, CODSIMILAR

UNION ALL

SELECT * FROM OPENQUERY(REMOTO, 'SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS,

ORIGEM = ''R'' FROM CORPOPED

JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO

WHERE CABPED.EMISSAO >= ''2007-10-30''

AND CABPED.EMISSAO <= ''2007-10-30''

GROUP BY CODBASE, CODSIMILAR

Valeu pessoal.

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0
SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = 'P' FROM CORPOPED

JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO

WHERE CABPED.EMISSAO >= '2007-10-30'

AND CABPED.EMISSAO <= '2007-10-30'

GROUP BY CODBASE, CODSIMILAR

UNION ALL

SELECT * FROM OPENQUERY(REMOTO, 'SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS,

ORIGEM = ''R'' FROM CORPOPED

JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO

WHERE CABPED.EMISSAO >= ''2007-10-30''

AND CABPED.EMISSAO <= ''2007-10-30''

GROUP BY CODBASE, CODSIMILAR

Supondo que os campos são do tipo date

SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = 'P' FROM CORPOPED
JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO
WHERE CABPED.EMISSAO >= '10/30/2007'
AND CABPED.EMISSAO <= '10/30/2007'
GROUP BY CODBASE, CODSIMILAR

UNION ALL
SELECT * FROM OPENQUERY(REMOTO, 'SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS,
ORIGEM = 'R' FROM CORPOPED
JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO
WHERE CABPED.EMISSAO >= '10/30/2007'
AND CABPED.EMISSAO <= '10/30/2007'
GROUP BY CODBASE, CODSIMILAR

Share this post


Link to post
Share on other sites
  • 0
Como que eu posso fazer isso dentro do delphi pois usando o "SQL.add('Select...')" dá erro quando chega na linha que tem os parametros. Segue abaixo um trecho da consulta.

SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = 'P' FROM CORPOPED

JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO

WHERE CABPED.EMISSAO >= '2007-10-30'

AND CABPED.EMISSAO <= '2007-10-30'

GROUP BY CODBASE, CODSIMILAR

UNION ALL

SELECT * FROM OPENQUERY(REMOTO, 'SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS,

ORIGEM = ''R'' FROM CORPOPED

JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO

WHERE CABPED.EMISSAO >= ''2007-10-30''

AND CABPED.EMISSAO <= ''2007-10-30''

GROUP BY CODBASE, CODSIMILAR

lmroot, acho que o problema vem destas "atribuições":

ORIGEM = 'P' e ORIGEM = ''R''

se você quer que exista uma coluna Origem com os valores P e R, troque por algo como:

... AS VENDAS, 'P' AS ORIGEM FROM CORPOPED ...

e ao colocar na linha SQL.Add, devido a existência da aspas simples, digite ela duplamente:

SQL.Add('SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = ''P'' FROM CORPOPED')

observe que são duas aspas simples (' - uma após a outra), não é uma áspas dupla (" - única)

Share this post


Link to post
Share on other sites
  • 0

Pessoal segue abaixo o código inteiro.

procedure TForm1.Button1Click(Sender: TObject);
begin

   With Query1 Do Begin
      SQL.Clear;
      SQL.Add('SELECT CODBASE, CODSIMILAR,');
      SQL.Add('(SELECT DETTECNICO1 FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS DESCRICAO, ISNULL(SUM(VENP),0) AS VENP,');
      SQL.Add('(SELECT ESTCOMPROMETIDO FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS PENP,');
      SQL.Add('(SELECT ESTOQUE FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS ESTP,');
      SQL.Add('(SELECT ESTOQUE FROM [REMOTO].UNIMIL.DBO.PRODUTOS WHERE CODPRODUTO = CODBASE) AS ESTR,');
      SQL.Add('(SELECT ESTCOMPROMETIDO FROM [REMOTO].UNIMIL.DBO.PRODUTOS WHERE CODPRODUTO = CODBASE) AS PENR,');
      SQL.Add('ISNULL(SUM(VENR),0) AS VENR');
      SQL.Add('FROM (');
      SQL.Add('SELECT CODBASE, CODSIMILAR,');
      SQL.Add('(SELECT DETTECNICO1 FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS DESCRICAO,');

      SQL.Add('VENP = CASE ORIGEM');
      SQL.Add('WHEN ''P'' THEN ISNULL(VENDAS,0)');
      SQL.Add('END,');

      SQL.Add('VENR = CASE ORIGEM');
      SQL.Add('WHEN ''R'' THEN ISNULL(VENDAS,0)');
      SQL.Add('END');

      SQL.Add('FROM (');
      SQL.Add('SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = ''P'' FROM CORPOPED');
      SQL.Add('JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO');
      SQL.Add('WHERE CABPED.EMISSAO >= ' + FormatDateTime('mm/dd/yyyy', StrToDate(mkData1.Text)));
      SQL.Add('AND CABPED.EMISSAO <= ' + FormatDateTime('mm/dd/yyyy', StrToDate(mkData2.Text)));
      SQL.Add('GROUP BY CODBASE, CODSIMILAR');

      SQL.Add('UNION ALL');
      SQL.Add('SELECT * FROM OPENQUERY(REMOTO, ''SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS,');
      SQL.Add('ORIGEM = ''R'' FROM CORPOPED');
      SQL.Add('JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO');
      SQL.Add('WHERE CABPED.EMISSAO >= ' + FormatDateTime('mm/dd/yyyy', StrToDate(mkData1.Text)));
      SQL.Add('AND CABPED.EMISSAO <= ' + FormatDateTime('mm/dd/yyyy', StrToDate(mkData2.Text)));
      SQL.Add('GROUP BY CODBASE, CODSIMILAR');

      SQL.Add(''')');
      SQL.Add(') AS R');
      SQL.Add(') AS F');

      SQL.Add('GROUP BY CODBASE, CODSIMILAR');
      SQL.Add('ORDER BY CODBASE');

      Open;
   End;

end;

Edited by Micheus
Adicionado o delimitador de código [code] [/code]. Lembre-se de utilizá-lo para melhor visualização

Share this post


Link to post
Share on other sites
  • 0
Pessoal segue abaixo o código inteiro.

lmroot, seja claro em seus posts!

Esse código, qual o objetivo: é o código que agora está funcionando ou que ainda tem problema? <_<

Apenas adiantando, se seu banco for MySQL, se formatar a data deste modo a consulta não funciona:

FormatDateTime('mm/dd/yyyy')

ela deverá estar formatada:

FormatDateTime('yyyy-mm-dd');

Share this post


Link to post
Share on other sites
  • 0

Bom dia pessoal, depois de muito apanhar resolvi o problema, segue abaixo o código da Query, funcionando redondinha.

Valeu pessoal.

procedure TFConsEstPend.btPesquisaClick(Sender: TObject);
Var TransfData : String;
begin
   With FDATA.CORPOPED Do Begin
      SQL.Clear;
      SQL.Add('SELECT CODBASE, CODSIMILAR,' );
      SQL.Add('(SELECT DETTECNICO1 FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS DESCRICAO, ISNULL(SUM(VENP),0) AS VENP,');
      SQL.Add('(SELECT ESTCOMPROMETIDO FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS PENP,');
      SQL.Add('(SELECT ESTOQUE FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS ESTP,');
      SQL.Add('(SELECT ESTOQUE FROM [REMOTO].UNIMIL.DBO.PRODUTOS WHERE CODPRODUTO = CODBASE) AS ESTR,');
      SQL.Add('(SELECT ESTCOMPROMETIDO FROM [REMOTO].UNIMIL.DBO.PRODUTOS WHERE CODPRODUTO = CODBASE) AS PENR,');
      SQL.Add('ISNULL(SUM(VENR),0) AS VENR');
      SQL.Add('FROM (');
      SQL.Add('SELECT CODBASE, CODSIMILAR,');
      SQL.Add('(SELECT DETTECNICO1 FROM PRODUTOS WHERE CODPRODUTO = CODBASE) AS DESCRICAO,');
      SQL.Add('    VENP = CASE ORIGEM');
      SQL.Add('    WHEN ''P'' THEN ISNULL(VENDAS,0)');
      SQL.Add('    END,');
      SQL.Add('    VENR = CASE ORIGEM');
      SQL.Add('    WHEN ''R'' THEN ISNULL(VENDAS,0)');
      SQL.Add('    END ');
      SQL.Add('FROM ( ');
      SQL.Add('SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ORIGEM = ''P'' FROM CORPOPED');
      SQL.Add('LEFT JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO ');
      TransfData := FormatDateTime('YYYY/MM/DD', StrToDate (mkData1.Text));
      SQL.Add('WHERE CABPED.EMISSAO >= ' + '''' + TransfData + '''' );
      TransfData := FormatDateTime('YYYY/MM/DD', StrToDate (mkData2.Text));
      SQL.Add('AND CABPED.EMISSAO <= ' + '''' + TransfData + '''' );
      SQL.Add('GROUP BY CODBASE, CODSIMILAR ');
      SQL.Add('UNION ALL ');
      SQL.Add('SELECT * FROM OPENQUERY(REMOTO, ''SELECT CODBASE, CODSIMILAR, ISNULL(SUM(QTDE),0) AS VENDAS, ');
      SQL.Add('ORIGEM = ''''R'''' FROM CORPOPED  ');
      SQL.Add('LEFT JOIN CABPED ON CABPED.NUMPEDIDO = CORPOPED.NUMPEDIDO  ');
      TransfData := FormatDateTime('YYYY/MM/DD', StrToDate (mkData1.Text));
      SQL.Add('WHERE CABPED.EMISSAO >= ''' + QuotedStr ( TransfData ) + ''' ' );
      TransfData := FormatDateTime('YYYY/MM/DD', StrToDate (mkData2.Text));
      SQL.Add('AND CABPED.EMISSAO <= ''' + QuotedStr ( TransfData ) + ''' ' );
      SQL.Add('GROUP BY CODBASE, CODSIMILAR');
      SQL.Add(''') ');
      SQL.Add(') AS R ' );
      SQL.Add(') AS F ');
      SQL.Add('GROUP BY CODBASE, CODSIMILAR ');
      SQL.Add('ORDER BY CODBASE ');
      Open;
   End;
end;

Edited by Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)

Share this post


Link to post
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.

Sign in to follow this  



  • Forum Statistics

    • Total Topics
      148112
    • Total Posts
      643388
×
×
  • Create New...