none
Validação Campo Data RRS feed

  • Pergunta

  • Olá,

    Preciso que minha procedure assegure que o usuário irá digitar uma data, sendo dataincial, datafinal, caso ele não informe dará a mensagem. Fiz desta forma, mas não está trazendo a mensagem de erro:

    create procedure Relatorio

        @DataInicial DATETIME=NULL,
        @DataFinal DATETIME=NULL,
        @fkSolicitado Int

    As Begin

        IF DATEDIFF (D,@DataInicial,@DataFinal) =Null
        begin
            RAISERROR('Informa uma data válida',16,1)
            RETURN
        End

        
        IF DATEDIFF (D,@DataInicial,@DataFinal) >30
        begin
            RAISERROR('Data Fora do Intervalo, Acima De 30 Dias',16,1)
            RETURN
        End

        ;with cte_laco1 as(
    select pkTask,Descricao, HorarioAbertura,fkSolicitado,fkStatus,
    func1.item as 'Marca'
    from Tasks cross apply [dbo].[funcaoSplit](descricao,'|')func1 where func1.id=1),
    cte_laco2 as (select lac1.*, func2.item as 'Modelo'
    from cte_laco1 lac1 cross apply [dbo].[funcaoSplit](descricao,'|') func2 where func2.id=2),
    cte_laco3 as (select lac2.*, func3.item as 'Placa'
    from cte_laco2 lac2 cross apply [dbo].[funcaoSplit](descricao,'|') func3 where func3.id=3),
    cte_laco4 as (select lac3.*, func4.item as 'Endereco'
    from cte_laco3 lac3 cross apply [dbo].[funcaoSplit](descricao,'|')func4 where func4.id=4),
    cte_laco5 as (select lac4.*, func5.item as 'Numero'
    from cte_laco4 lac4 cross apply [dbo].[funcaoSplit](descricao,'|')func5 where func5.id=5)

    select
    left(convert(varchar(8),cte.pkTask)+SPACE(10),10)
    +'06689'
    +cte.Placa
    +'55412'
    +left(cte.Endereco+cte.Numero+SPACE(70),70)
    +SPACE(100)    
    +replace(convert(varchar(10),HorarioAbertura,103),'/','')    
    +replace(convert(varchar(5),HorarioAbertura,108),':','')+SPACE(15)
    +'000'+SPACE(4)
    +'5000'+SPACE(27)
    +'0000000000'+SPACE(4)
    +'010000'
    +left(convert(varchar(6),Car.Code)+SPACE(6),6)
    +SPACE(2)
    +'00'
    +SPACE(129)

    as Resultado
    from cte_laco5 cte inner join Car
        on cte.Marca=Car.Make AND
        cte.Modelo=Car.Model
    Where fkSolicitado=@fkSolicitado AND
           HorarioAbertura >= @DataInicial AND HorarioAbertura <= @DataFinal AND
            fkStatus IN (2,11)
            Order By HorarioAbertura
    End

    quinta-feira, 6 de setembro de 2012 15:08

Respostas

  • Bom dia Camila, acredito que só trocando o = null por isnull resolvera o seu problema:

        IF DATEDIFF (D,@DataInicial,@DataFinal) IS Null
        begin
            RAISERROR('Informa uma data válida',16,1)
            RETURN
        End

    para tratamentos de null o certo seria is null e não = null.


    Alexandre Matayosi.

    quinta-feira, 6 de setembro de 2012 15:14

Todas as Respostas

  • Bom dia Camila, acredito que só trocando o = null por isnull resolvera o seu problema:

        IF DATEDIFF (D,@DataInicial,@DataFinal) IS Null
        begin
            RAISERROR('Informa uma data válida',16,1)
            RETURN
        End

    para tratamentos de null o certo seria is null e não = null.


    Alexandre Matayosi.

    quinta-feira, 6 de setembro de 2012 15:14
  • Camila, não entendi algumas coisas:

    1) Por que você verifica se a diferença é "nula"? Para proteger caso um dos parâmetros seja passado como nulo? Mas se eles não podem ser nulos, por que você permite que isso aconteça na declaração da procedure? (DATETIME=NULL)

    2) Se o parâmetro é DateTime, que data inválida o usuário poderia passar??

    3) Em relação à validação dos 30 dias, seu código está certo. O que acontece? Nenhuma mensagem é apresentada?


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 6 de setembro de 2012 17:25
    Moderador
  • Alexandre era isso mesmo, Obrigada
    quinta-feira, 6 de setembro de 2012 23:05
  •     Que bom que ajudou, qualquer duvida só postar...por favor só marque o que respondi como resposta.

        Obrigado !


    Alexandre Matayosi.

    quinta-feira, 6 de setembro de 2012 23:08
  • Roberson, Respondendo:

    1) na verdade eu queria fazer o seguinte, se ele não informar data, recebe a informação, entendi sua colocação, a mensagem seria outra, "Informe uma data".

    O erro só estava neste trecho  IF DATEDIFF (D,@DataInicial,@DataFinal) =Null

    Obrigada

    quinta-feira, 6 de setembro de 2012 23:09
  • Tudo bem, Camila. Isso só não é comum.

    "Se ele não informar data"...

    Se o usuário não pode deixar de passar o parâmetro de data, pois esta informação é fundamental para chegar ao objetivo, não tem porque o próprio parâmetro aceitar nulo.

    Ou seja, do jeito que está a procedure permite data nula mas logo de cara você bloqueia data nula dentro da procedure.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    sexta-feira, 7 de setembro de 2012 00:11
    Moderador