none
Fazer between entre duas variáveis, mas sem ter colunaa. Apenas possuindo um case RRS feed

  • Pergunta

  • alter procedure dbo.[Consultas - TITULOS - Prorrogacoes] @Grupo int
      ,@emp int
      ,@dataini datetime
      ,@datafim datetime
      ,@cliente varchar(50)
      ,@historico varchar(50)
      ,@transp varchar(50)
      ,@situacaoini datetime
      ,@situacaofinal datetime
    as
    begin
      --diego 27/09/13
      with tempEmpresas
      as (
        select codigo
        from dbo.vParEmp
        where Codigo = @Emp

        union

        select codigo
        from dbo.vParEmp
        where @Emp = 0
        )
        ,tempClientes
      as (
        select codigo_cliente
          ,Razao_social
        from dbo.clientes
        where razao_social like @cliente
        )
        ,tempHistoricoProrrogacoes
      as (
        select codigo
          ,Descricao
        from dbo.HistoricoProrrogacoes
        where descricao like @historico
        )
        ,tempTransp
      as (
        select codigo_transp
          ,Razao_social
        from dbo.transp
        where razao_social like @transp
        )
      select t.Empresa
        ,t.Numero_Titulo
        ,t.Ser
        ,t.Seq
        ,t.Codigo_tipo_doc
        ,p.Vencimento
        ,p.Prorrogacao
        ,c.Razao_social as Cliente
        ,datediff(dd, p.vencimento, p.prorrogacao) as Dias
        ,t.Valor_titulo as Valor
        ,(t.Valor_titulo * (datediff(dd, p.vencimento, p.prorrogacao) * e.Financeiro)) / 100 as Juros
        ,tr.Razao_social as Transportadora
        ,h.Descricao as Historico
        ,p.Complemento
        ,case 
          when isnull(t.vencimento_original, getdate()) >= t.data_vencimento
            then ''
          else 'Prorrogado de ' + Convert(varchar(10), t.Vencimento_Original, 103)
          end as Situacao
      from dbo.titulosprorrogacoes p
      inner join dbo.titulos t on t.id = p.idtitulo
      --inner join dbo.dbo.vParEmp ve on ve.codigo = t.empresa and ve.codigo = case when @emp = 0 then ve.codigo else @emp end
      --inner join dbo.clientes c on c.codigo_cliente = t.codigo_cliente
      inner join tempEmpresas ve on ve.codigo = t.empresa
      inner join tempClientes c on c.codigo_cliente = t.codigo_cliente
      inner join dbo.vNFS n on n.id = t.idnfs
      inner join dbo.transp tr on tr.codigo_transp = n.codigo_transp
      --inner join dbo.HistoricoProrrogacoes h on h.codigo = p.historico
      inner join tempHistoricoProrrogacoes h on h.codigo = p.historico
      inner join dbo.paremp e on e.codigo = t.empresa
      --where h.descricao like @historico
      --and c.razao_social like @cliente
      --and tr.razao_social like @transp
      where t.Data_emissao between @dataini
          and @datafim
        and GrupoEmpresa = (
          case 
            when @Grupo = 0
              then GrupoEmpresa
            else @Grupo
            end
          )

    AQUI É O CÓDIGO NECESSÁRIO>>>>>>>>>>>>>>>>>>

        or( @situacaoini = case 
          when isnull(vencimento_original, getdate()) >= data_vencimento
            then ''
          else Vencimento_Original
          end
        and @situacaofinal = case 
          when isnull(vencimento_original, getdate()) >= data_vencimento
            then ''
          else Vencimento_Original
          end)

    PRECISO COLOCAR UM BETWEEN PRA SELECIONAR ENTRE A @SITUACAOINI E A @SITUACAOFINAL SENDO QUE AQUELE CASE SEJA A CLAUSULA  <<<<<<<<<<<<<<<<<<<<<<<<
    end
      /*
    param Grupo, Grupo Empresa, exec(select * from dbo.vParEmpGrupoCombo)
    param emp, Empresa, exec(select Codigo, Reduzido from vParempCombo)
    param dataini, Data Inicial, date
    param datafim, Data Final, date
    param Historico, Historico, string
    param Transp, Transportadora, string
    param Cliente, Cliente, string
    param situacaoini, Situacao Inicial, date
    param situacaofinal, Situacao Final, date

    mask Valor, #,##0.00
    mask Juros, #,##0.00
    soma Juros, #,##0.00
    soma Valor, #,##0.00
    */

            
    quinta-feira, 2 de abril de 2020 12:03

Respostas

  • Bom dia,

    Bruno, não sei se entendi corretamente mas segue uma sugestão para testes:

     or case when isnull(vencimento_original, getdate()) < data_vencimento
            then isnull(vencimento_original, getdate())
        end between @situacaoini and @situacaofinal 

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex quinta-feira, 2 de abril de 2020 12:48
    • Marcado como Resposta Bruno Diehl quinta-feira, 2 de abril de 2020 12:55
    • Não Marcado como Resposta Bruno Diehl sexta-feira, 3 de abril de 2020 11:37
    • Marcado como Resposta Bruno Diehl sexta-feira, 3 de abril de 2020 14:48
    quinta-feira, 2 de abril de 2020 12:47

Todas as Respostas

  • Bruno,

    Mas como você deseja que uma determinada condição aplicada a uma varíavel seja refletida como um elemento de filtro de dados no seu Select sem fazer uma posteriormente de uma coluna.

    Você pode utilizar tranquilamente as variáveis na sua Stored Procedure, aplicar os Cases e demais condições como elementos de retorno para armazenar o valor definido de acordo com a condição para variável, em adicional usar a mesma como elemento de filtro de dados, mas de alguma forma a variável será utilizada por ou para alguma análise no seu select.

    Eu entendi que a coluna situação teoricamente não existe de forma física, mas você esta trabalhando com CTEs, e terá total possibilidade de gerar esta coluna em tempo de execução, sendo assim, você poderia fazer uso do Case para esta variável antes de declarar as CTEs, estabelecer as regras e condições e no momento do processamento do bloco Select que vai chamar a CTE usar justamente a ou as variavéis em conjunto com o Select.

    O que você acha?


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

    quinta-feira, 2 de abril de 2020 12:43
  • Bom dia,

    Bruno, não sei se entendi corretamente mas segue uma sugestão para testes:

     or case when isnull(vencimento_original, getdate()) < data_vencimento
            then isnull(vencimento_original, getdate())
        end between @situacaoini and @situacaofinal 

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex quinta-feira, 2 de abril de 2020 12:48
    • Marcado como Resposta Bruno Diehl quinta-feira, 2 de abril de 2020 12:55
    • Não Marcado como Resposta Bruno Diehl sexta-feira, 3 de abril de 2020 11:37
    • Marcado como Resposta Bruno Diehl sexta-feira, 3 de abril de 2020 14:48
    quinta-feira, 2 de abril de 2020 12:47