Ajuda - Busca - Membros - Calendário
Versão Completa: (Resolvido) Openquery No Delphi
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
lmroot
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.
Jhonas
QUOTE
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

CODE
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



Micheus
QUOTE(lmroot @ 31/10/2007 - 08:58) *
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)
lmroot
Pessoal segue abaixo o código inteiro.
CODE
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;
Micheus
QUOTE(lmroot @ 31/10/2007 - 13:58) *
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? dry.gif

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');
lmroot
Desculpa Micheus, esse código não está funcionando, a base que eu uso é sql server 2000.
lmroot
Bom dia pessoal, depois de muito apanhar resolvi o problema, segue abaixo o código da Query, funcionando redondinha.

Valeu pessoal.

CODE
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;
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.