Usuário com melhor resposta
Validação Campo Data

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
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
Endpara tratamentos de null o certo seria is null e não = null.
Alexandre Matayosi.
- Sugerido como Resposta Alexandre Matayosi quinta-feira, 6 de setembro de 2012 15:14
- Marcado como Resposta Roberson Ferreira _Moderator sexta-feira, 7 de setembro de 2012 00:07
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
Endpara tratamentos de null o certo seria is null e não = null.
Alexandre Matayosi.
- Sugerido como Resposta Alexandre Matayosi quinta-feira, 6 de setembro de 2012 15:14
- Marcado como Resposta Roberson Ferreira _Moderator sexta-feira, 7 de setembro de 2012 00:07
-
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.brSe 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.- Marcado como Resposta Camila_cd quinta-feira, 6 de setembro de 2012 23:09
- Não Marcado como Resposta Roberson Ferreira _Moderator sexta-feira, 7 de setembro de 2012 00:07
-
-
-
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
-
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.brSe 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.