Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Openquery No Delphi


lmroot

Pergunta

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.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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)

Link para o comentário
Compartilhar em outros 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;

Editado por Micheus
Adicionado o delimitador de código [code] [/code]. Lembre-se de utilizá-lo para melhor visualização
Link para o comentário
Compartilhar em outros 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');

Link para o comentário
Compartilhar em outros 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;

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...