none
Procedure com parâmetro no excel RRS feed

  • Pergunta

  • Boa tarde!

    Criei uma procedure com alguns parâmetros para poder criar um relatório e exibir o resultado no Excel. No where eu coloquei duas condições de data. Se a data declarada não existir, ele deverá considerar o parâmetro como nulo. 

    Ao executar a consulta direto no banco o resultado, ele retorna o resultado correto. Mas no Excel, qnd não está com algum dos intervalos de data declarada, ele apresenta a seguinte mensagem: "Formato de data inválido"

    Eu preciso q mesmo sem um dos intervalos de data, ele exiba o resultado. Quando coloco os dois intervalos de data, o resultado é apresentado.

    A Procedure é essa: 

    ALTER PROCEDURE [dbo].[sp_RecebidasTeste]
    @DtVenc1 datetime = NULL,
    @DtVenc2 datetime = NULL,
    @DtRec1 datetime = NULL,
    @DtRec2 datetime = NULL,
    @Status Varchar (max) = ''
    AS
    BEGIN
    SELECT (R.DtVenc)Venc, (B.DtRec)Rec,
    CASE
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 0 then '0000'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 29 then '0001 A 0029'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 60 then '0030 A 0060'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 90 then '0061 A 0090'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 120 then '0091 A 0120'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 150 then '0121 A 0150'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 180 then '0151 A 0180'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 360 then '0181 A 0360'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 450 then '0361 A 0450'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 540 then '0451 A 0540'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 630 then '0541 A 0090'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 720 then '0631 A 0720'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 810 then '0721 A 0810'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 990 then '0811 A 0990'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 1350 then '0991 A 1350'
    ELSE '1351 A 9999'
    END AS FaixaAtraso, IsNull(P.DescPortador, 'SEM PORTADOR') AS DescPortador,  EMP.DescEmpresa, R.STATUS, SUM(SC.VlARec)VlrARec, SUM(SC.VlRec)VlrRec,
    SUM((SC.VlRec + SC.VlDesc) - SC.VlARec) AS Diferenca,
    SUM(SC.VlJuros) AS Juros, SUM(SC.VlDesc) AS Desconto, DATEDIFF(dd,R.DtVenc,B.DtRec)Dias
    FROM CtRec R  
    INNER JOIN SubCtRecContabil SC WITH(NOLOCK) ON (SC.NrContrRec = R.NrContrRec)  
    INNER JOIN Estabele E WITH(NOLOCK) ON (SC.CdEstab = E.CdEstab)
    LEFT JOIN Empresas EMP WITH(NOLOCK) ON (E.CdEmpresa = EMP.CdEmpresa)
    LEFT JOIN BxRec B WITH(NOLOCK) ON (B.NrContrRec = R.NrContrRec)  
    LEFT JOIN CtCorrent CT WITH(NOLOCK) ON (R.CdCtCorr = CT.CdCtCorr)  
    LEFT JOIN Bancos BC WITH(NOLOCK) ON (CT.CdBanco = BC.CdBanco)  
    LEFT JOIN TpPortad P WITH(NOLOCK) ON (R.TpPortador = P.TpPortador)  
    WHERE R.PagRec = 'R' AND ((R.DtVenc BETWEEN @DtVenc1 AND @DtVenc2) OR (@DtVenc1 IS NULL AND @DtVenc2 IS NULL)) AND
    ((B.DtRec BETWEEN @DtRec1 AND @DtRec2) OR (@DtRec1 IS NULL AND @DtRec2 IS NULL)) AND ((R.STATUS = @Status) OR @Status = '')
    GROUP BY R.DtVenc, B.DtRec, DATEDIFF(dd,R.DtVenc,B.DtRec),DATEDIFF(dd,R.DtVenc,B.DtRec), IsNull(P.DescPortador, 'SEM PORTADOR'), EMP.DescEmpresa, R.STATUS
    END

    Desde já agradeço.

    quarta-feira, 18 de abril de 2018 17:52

Respostas

  • Pode ter faltado algum parênteses:

    veja assim:

    ALTER PROCEDURE [dbo].[sp_RecebidasTeste]
    @DtVenc1 datetime = NULL,
    @DtVenc2 datetime = NULL,
    @DtRec1 datetime = NULL,
    @DtRec2 datetime = NULL,
    @Status Varchar (max) = ''
    AS
    BEGIN
    SELECT (R.DtVenc)Venc, (B.DtRec)Rec,
    CASE
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 0 then '0000'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 29 then '0001 A 0029'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 60 then '0030 A 0060'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 90 then '0061 A 0090'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 120 then '0091 A 0120'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 150 then '0121 A 0150'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 180 then '0151 A 0180'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 360 then '0181 A 0360'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 450 then '0361 A 0450'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 540 then '0451 A 0540'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 630 then '0541 A 0090'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 720 then '0631 A 0720'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 810 then '0721 A 0810'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 990 then '0811 A 0990'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 1350 then '0991 A 1350'
    ELSE '1351 A 9999'
    END AS FaixaAtraso, IsNull(P.DescPortador, 'SEM PORTADOR') AS DescPortador,  EMP.DescEmpresa, R.STATUS, SUM(SC.VlARec)VlrARec, SUM(SC.VlRec)VlrRec,
    SUM((SC.VlRec + SC.VlDesc) - SC.VlARec) AS Diferenca,
    SUM(SC.VlJuros) AS Juros, SUM(SC.VlDesc) AS Desconto, DATEDIFF(dd,R.DtVenc,B.DtRec)Dias
    FROM CtRec R  
    INNER JOIN SubCtRecContabil SC WITH(NOLOCK) ON (SC.NrContrRec = R.NrContrRec)  
    INNER JOIN Estabele E WITH(NOLOCK) ON (SC.CdEstab = E.CdEstab)
    LEFT JOIN Empresas EMP WITH(NOLOCK) ON (E.CdEmpresa = EMP.CdEmpresa)
    LEFT JOIN BxRec B WITH(NOLOCK) ON (B.NrContrRec = R.NrContrRec)  
    LEFT JOIN CtCorrent CT WITH(NOLOCK) ON (R.CdCtCorr = CT.CdCtCorr)  
    LEFT JOIN Bancos BC WITH(NOLOCK) ON (CT.CdBanco = BC.CdBanco)  
    LEFT JOIN TpPortad P WITH(NOLOCK) ON (R.TpPortador = P.TpPortador)  
    WHERE R.PagRec = 'R' AND ((R.DtVenc BETWEEN isnull(@DtVenc1,'1900-01-01') AND isnull(@DtVenc2,'2100-01-01')) OR (@DtVenc1 IS NULL AND @DtVenc2 IS NULL)) AND
    ((B.DtRec BETWEEN @DtRec1 AND @DtRec2) OR (@DtRec1 IS NULL AND @DtRec2 IS NULL)) AND ((R.STATUS = @Status) OR @Status = '')
    GROUP BY R.DtVenc, B.DtRec, DATEDIFF(dd,R.DtVenc,B.DtRec),DATEDIFF(dd,R.DtVenc,B.DtRec), IsNull(P.DescPortador, 'SEM PORTADOR'), EMP.DescEmpresa, R.STATUS
    END


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    quarta-feira, 18 de abril de 2018 19:50
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 27 de abril de 2018 18:08
    Moderador

Todas as Respostas

  • Boa tarde.

    Tente usar a clausula where assim:

    WHERE R.PagRec = 'R' AND ((R.DtVenc BETWEEN isnull(@DtVenc1,'1900-01-01') AND isnull(@DtVenc2,'2100-01-01') OR (@DtVenc1 IS NULL AND @DtVenc2 IS NULL)) AND
    ((B.DtRec BETWEEN @DtRec1 AND @DtRec2) OR (@DtRec1 IS NULL AND @DtRec2 IS NULL)) AND ((R.STATUS = @Status) OR @Status = '')

    Abs


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    quarta-feira, 18 de abril de 2018 18:00
  • Boa tarde Vinicius!

    Quando eu alterei o WHERE, apresentou um erro no GROUP BY

    "Mensagem 156, Nível 15, Estado 1, Procedimento sp_RecebidasTeste, Linha 40
    Incorrect syntax near the keyword 'GROUP'."

    Tentei ajustar usando a função ISNULL no WHERE e não consegui tbm.


    quarta-feira, 18 de abril de 2018 19:03
  • Pode ter faltado algum parênteses:

    veja assim:

    ALTER PROCEDURE [dbo].[sp_RecebidasTeste]
    @DtVenc1 datetime = NULL,
    @DtVenc2 datetime = NULL,
    @DtRec1 datetime = NULL,
    @DtRec2 datetime = NULL,
    @Status Varchar (max) = ''
    AS
    BEGIN
    SELECT (R.DtVenc)Venc, (B.DtRec)Rec,
    CASE
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 0 then '0000'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 29 then '0001 A 0029'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 60 then '0030 A 0060'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 90 then '0061 A 0090'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 120 then '0091 A 0120'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 150 then '0121 A 0150'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 180 then '0151 A 0180'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 360 then '0181 A 0360'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 450 then '0361 A 0450'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 540 then '0451 A 0540'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 630 then '0541 A 0090'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 720 then '0631 A 0720'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 810 then '0721 A 0810'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 990 then '0811 A 0990'
    WHEN DATEDIFF(dd,R.DtVenc,B.DtRec) <= 1350 then '0991 A 1350'
    ELSE '1351 A 9999'
    END AS FaixaAtraso, IsNull(P.DescPortador, 'SEM PORTADOR') AS DescPortador,  EMP.DescEmpresa, R.STATUS, SUM(SC.VlARec)VlrARec, SUM(SC.VlRec)VlrRec,
    SUM((SC.VlRec + SC.VlDesc) - SC.VlARec) AS Diferenca,
    SUM(SC.VlJuros) AS Juros, SUM(SC.VlDesc) AS Desconto, DATEDIFF(dd,R.DtVenc,B.DtRec)Dias
    FROM CtRec R  
    INNER JOIN SubCtRecContabil SC WITH(NOLOCK) ON (SC.NrContrRec = R.NrContrRec)  
    INNER JOIN Estabele E WITH(NOLOCK) ON (SC.CdEstab = E.CdEstab)
    LEFT JOIN Empresas EMP WITH(NOLOCK) ON (E.CdEmpresa = EMP.CdEmpresa)
    LEFT JOIN BxRec B WITH(NOLOCK) ON (B.NrContrRec = R.NrContrRec)  
    LEFT JOIN CtCorrent CT WITH(NOLOCK) ON (R.CdCtCorr = CT.CdCtCorr)  
    LEFT JOIN Bancos BC WITH(NOLOCK) ON (CT.CdBanco = BC.CdBanco)  
    LEFT JOIN TpPortad P WITH(NOLOCK) ON (R.TpPortador = P.TpPortador)  
    WHERE R.PagRec = 'R' AND ((R.DtVenc BETWEEN isnull(@DtVenc1,'1900-01-01') AND isnull(@DtVenc2,'2100-01-01')) OR (@DtVenc1 IS NULL AND @DtVenc2 IS NULL)) AND
    ((B.DtRec BETWEEN @DtRec1 AND @DtRec2) OR (@DtRec1 IS NULL AND @DtRec2 IS NULL)) AND ((R.STATUS = @Status) OR @Status = '')
    GROUP BY R.DtVenc, B.DtRec, DATEDIFF(dd,R.DtVenc,B.DtRec),DATEDIFF(dd,R.DtVenc,B.DtRec), IsNull(P.DescPortador, 'SEM PORTADOR'), EMP.DescEmpresa, R.STATUS
    END


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)

    quarta-feira, 18 de abril de 2018 19:50
  • agora rodou!

    Mas mesmo assim no Excel continua com a mensagem. Creio que o problema deve estar nos parâmetros fornecidos. Eu usei o Microsoft Query pra trazer os dados pro Excel, tratei o SQL no ODBC para poder colocar os parâmetros nas células, pq esse relatório ficará com usuário, e não queria deixar a edição em "Propriedades da conexão". Creio que o problema esteja ai ... 

    

    quarta-feira, 18 de abril de 2018 20:31
  • Então caro colega,

    Neste caso, o problema esta justamente na maneira que os dados estão sendo passados como parâmetros, para que o Excel possa interpretar.

    Você realmente tem que processar isso diretamente no Excel?

    Já pensou em talvez através de uma aplicação customizada gerar o arquivo no formato Excel já devidamente configurado e depois somente abrir o mesmo.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 20 de abril de 2018 16:45
  • Bom dia Pedro!

    Vou sugerir isso, já que os parâmetros informados via excel acaba dando ocasionando esse problema!

    Obrigado!

    segunda-feira, 23 de abril de 2018 14:39
  • Clayton,

    Isso, desta forma você vai conseguir minimizar as possibilidades de problemas.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 26 de abril de 2018 12:18
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 27 de abril de 2018 18:08
    Moderador