Friday, March 23, 2012

Is there a better way to handle this IF..ELSE IF?

Do I have other option beside using IF..ELSE IF? TIF

-- GET INFORMATION OF THE JOB
DECLARE @.JOBID AS Char(10)
DECLARE @.VRUSERVICEHRS AS Decimal(18,2)
DECLARE @.VRUSERVICEMIN AS Decimal(18,2)
DECLARE @.BILLEDFLAT AS Decimal(18,2)
DECLARE @.BILLREGRATE AS Decimal(18,2)
DECLARE @.MIN_HRS AS Decimal(18,2)

DECLARE @.COUNT_GREATER_MIN TinyInt
DECLARE @.COUNT_LESS_MIN TinyInt

SET @.VRUSERVICEMIN = 46
SET @.BILLEDFLAT = 0
-- PROCESS ONLY RECORDS WHERE THERE IS NO FLAT FEE
IF @.BILLEDFLAT = 0
BEGIN
IF @.VRUSERVICEMIN BETWEEN 0 AND 15
BEGIN
SET @.VRUSERVICEMIN = .25
END
ELSE IF @.VRUSERVICEMIN = 15
BEGIN
SET @.VRUSERVICEMIN = .25
END
ELSE IF @.VRUSERVICEMIN BETWEEN 15 AND 30
BEGIN
SET @.VRUSERVICEMIN = .5
END
ELSE IF @.VRUSERVICEMIN = 30
BEGIN
SET @.VRUSERVICEMIN = .5
END
ELSE IF @.VRUSERVICEMIN BETWEEN 30 AND 45
BEGIN
SET @.VRUSERVICEMIN = .75
END
ELSE IF @.VRUSERVICEMIN = 45
BEGIN
SET @.VRUSERVICEMIN = .75
END
ELSE IF @.VRUSERVICEMIN > 45
BEGIN
SET @.VRUSERVICEMIN = 1
END
END

PRINT @.VRUSERVICEMINtry a case statement
it is sequential logic instead of conditional (if else)|||I tried it with this one but I am getting an error as follows:
"Incorrect syntax near the keyword 'BETWEEN'."

SET @.VRUSERVICEMIN =
CASE @.VRUSERVICEMIN
WHEN BETWEEN 0 AND 15 THEN .25
END|||I'd use:SET @.VRUSERVICEMIN = CASE
WHEN @.VRUSERVICEMIN BETWEEN 0 AND 15 THEN .25
WHEN @.VRUSERVICEMIN BETWEEN 16 AND 30 THEN 0.5
WHEN @.VRUSERVICEMIN BETWEEN 31 AND 45 THEN .75
WHEN @.VRUSERVICEMIN BETWEEN 46 AND 60 THEN 1.0
END-PatP|||...except that @.VRUSERVICEMIN is defined as decimal (18,2), so you need:

SET @.VRUSERVICEMIN = CASE
WHEN @.VRUSERVICEMIN BETWEEN 0 AND 15 THEN .25
WHEN @.VRUSERVICEMIN BETWEEN 15 AND 30 THEN 0.5
WHEN @.VRUSERVICEMIN BETWEEN 30 AND 45 THEN .75
WHEN @.VRUSERVICEMIN BETWEEN 45 AND 60 THEN 1.0
END

which is logically equivalent to:

SET @.VRUSERVICEMIN = CASE
WHEN @.VRUSERVICEMIN >= 0 AND @.VRUSERVICEMIN <= 15 THEN .25
WHEN @.VRUSERVICEMIN > 15 AND @.VRUSERVICEMIN <= 30 THEN 0.5
WHEN @.VRUSERVICEMIN > 30 AND @.VRUSERVICEMIN <= 45 THEN .75
WHEN @.VRUSERVICEMIN > 45 AND @.VRUSERVICEMIN <= 60 THEN 1.0
END|||all you guys are missing the fact that

SET @.VRUSERVICEMIN = 46

so why bother with any range tests? :cool:

decimal(18,2)? whoa, that can't be right for a "minutes" variable

and what's up with @.COUNT_GREATER_MIN and @.COUNT_LESS_MIN being TinyInt?

is this stored proc actually going to do counts with a cursor?|||I set the values like SET @.VRUSERVICEMIN = 46 for testing purposes. That is why I have PRINT @.VRUSERVICEMIN at the end of my code because I'm checking the logic of the coding if it is spitting out the right value of the @.VRUSERVICEMIN when an entry is placed.

The code is not a completed and that's is why you may not see a lot of logic behind it. It's on a testing phase and will eventually be a SPROC getting values from a VB front end.

Thanks all.

No comments:

Post a Comment