Link to home
Start Free TrialLog in
Avatar of jrb47
jrb47Flag for United States of America

asked on

how to read and manipulate more than one line of data in a tvp

I have a sp that i am trying to get to read in more than one line of data and check a constraint
The math is working only on the last tuple -
how would i get this to work for each tuple with the deposit type of 'saving'

PROC [dbo].[InvestmentPlans]
(@invest as bestScenario READONLY )
AS
DECLARE @CustId Char(4) -- customer ID
DECLARE @R FLOAT  -- rate of interst
DECLARE @N INT  -- number of years 
DECLARE @P FLOAT  --Prinicipal amount
DECLARE @NP Float --New Principal amount
DECLARE @F Float -- Final Amount 
DECLARE @Cplan FLOAT  -- Current plan final amount 
DECLARE @Nplan FLOAT  -- proposed plan  final amount 
Declare @deptype char(6) -- deposit type
DECLARE @D Float --difference between current plan and new plan

SELECT @CustId = CustID, @deptype = DepositType,@N = NumberOfYears,@R = Rate
FROM @invest

-- calculate compound interest for saving customers::plan 1 

Begin
	SELECT @P = PrincipalAmount FROM @invest
	SET @NP =  @P * (Power (@N,(1 + @R)))
	SET @Nplan= SUM(@NP)
	SELECT @Cplan = SUM(FinalAmount)FROM @invest
	SET @D = (((@Nplan - @Cplan)/@Cplan)*100)
	PRINT @CustID
	PRINT @p
	PRINT @NP
	PRINT @Nplan
	PRINT @Cplan
	PRINT @deptype
	PRINT @N
	PRINT @R

--check to see if proposed plan @Nplan is > current @Cplan  
IF @D < 10
BEGIN
   	PRINT 'Plan 1 suitable' 
	PRINT @D
END
ELSE IF @D > 10
BEGIN
		PRINT 'Plan 1 is not suitable,the difference is'
		PRINT @D
		PRINT '%' 

END
		
SELECT *
FROM @invest

END

Open in new window

Avatar of Raja Jegan R
Raja Jegan R
Flag of India image

Can you post some sample records and the desired output result set so that it would be helpful to understand your requirement better..
Avatar of jrb47

ASKER

 Okay, I have all of the data passing correctly - i think!
the image is the sample data i am working with

the SP is to compare two investment scenarios based on this
 
Plan-1: Giving compound interests to all savings account holders.  
Plan-2:  Increase all savings account interest rates by 2%.  
Plan-3:  Increase all fixed account interest rates by 2%.  
Plan-4: Giving 5% bonus per year for all fixed account holders.  

Here is the code - at this point I am more concerned about my math (again I think) as I have been looking at this so long my eyes are crossing!



USE [Unit11]
GO

/****** Object:  StoredProcedure [dbo].[InvestmentPlans]    Script Date: 04/01/2010 18:58:57 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROC [dbo].[InvestmentPlans]
(@invest as bestScenario READONLY )
AS
DECLARE @CustId Char(4) -- customer ID
DECLARE @R FLOAT  -- rate of interst
DECLARE @N INT  -- number of years 
DECLARE @P FLOAT  --Prinicipal amount
DECLARE @NP Float --New Principal amount
DECLARE @F Float -- Final Amount 
DECLARE @Cplan FLOAT  -- Current plan final amount 
DECLARE @Nplan1 FLOAT  -- proposed plan1  final amount
DECLARE @Nplan2 FLOAT -- proposed plan2 final amount
DECLARE @Nplan3 FLOAT -- proposed plan3 final amount
DECLARE @Nplan4 FLOAT -- proposed plan4 final amount
Declare @deptype char(6) -- deposit type
DECLARE @D1 Float --difference between current plan1 and new plan1
DECLARE @D2 Float --difference between current plan2 and new plan2
DECLARE @D3 Float --difference between current plan3 and new plan3
DECLARE @D4 Float --difference between current plan4 and new plan4

-- Declare cursor 
Declare custCursor CURSOR 
local Scroll Keyset Optimistic


FOR SELECT CustID, DepositType,NumberOfYears,Rate,PrincipalAmount
FROM @invest
SET @Nplan1 = 0
SET @Nplan2 = 0
SET @Nplan3 = 0
SET @Nplan4 = 0
SELECT @Cplan = SUM(FinalAmount)FROM @invest

OPEN custCursor

FETCH Next FROM custCursor INTO @custid,@deptype, @N, @R,@P

While @@FETCH_STATUS =0 

BEGIN

-- calculate compound interest for saving customers::plan 1 
BEGIN
	--SELECT @Cplan = SUM(FinalAmount)FROM @invest
	IF @deptype = 'saving'
	SET @NP =  @P * (Power (@N,(1 + @R)))
	ELSE IF @deptype = 'fixed'
	SET @NP = @P
	SET @Nplan1= @Nplan1 +@NP
	SET @D1 = ((@Nplan1-@Cplan)/@Cplan)*100
END

-- check for saving customers for plan 2
BEGIN
	IF @deptype = 'saving'
	SET @NP = @P + (@P * @N * (@R +.02))
	ELSE IF @deptype = 'fixed'
	SET @NP = @P 
	SET @Nplan2= @Nplan2 +@NP
	SET @D2 = (((@Nplan2 - @Cplan)/@Cplan)*100)
END	

-- Increase R by 2 %  for fixed for  plan 3 
BEGIN
	IF @deptype = 'fixed'
	SET @NP = @P * @N * (@R +2)
	ELSE IF @deptype = 'saving'
	SET @NP = @NP
	SET @Nplan3= @Nplan3 +@P
	SET @D3 = (((@Nplan3 - @Cplan)/@Cplan)*100)
END   	

-- Calculate fixed plans with 5% bonus for plan 4
BEGIN
	IF @deptype = 'fixed'
	SET @NP= @P * (Power (@N,(1 + @R))) + (.05 *(( @P * (Power(@N,(1 + @R))))* @N))
	ELSE IF @deptype = 'saving'
	SET @NP = @P
	SET @Nplan4 = @Nplan4 +@NP
	SET @D4 = (((@Nplan4 - @Cplan)/@Cplan)*100)
END 

FETCH Next FROM custCursor INTO @custid,@deptype, @N, @R,@P	
END

CLOSE custCursor
DEALLOCATE custCursor


BEGIN
PRINT @Cplan
PRINT @Nplan1
PRINT @D1

IF @D1 < 10
BEGIN
	PRINT 'Plan 1 is suitable' 
END

ELSE IF @D1 > 10
BEGIN
	PRINT 'Plan 1 is not suitable,the difference is'
	PRINT @D1
	PRINT '%'
END
END

 --compare proposed vs  current for > 10% rule  for  plan 2
BEGIN
	PRINT '_________________________________________________________'
	PRINT @Cplan
	PRINT @Nplan2
	PRINT @D2
	
IF @D2 < 10
BEGIN
   	PRINT 'Plan 2 suitable' 
END 
ELSE IF @D2 > 10 
BEGIN
	PRINT 'Plan 2 is not suitable,the difference is'
	PRINT @D2
	PRINT '%' 
END
END	

 -- compare proposed vs  plan for  plan 3 
BEGIN
	PRINT '_________________________________________________________'
	PRINT @Cplan
	PRINT @Nplan3
	PRINT @D3
	
IF @D3 < 10
BEGIN
   	PRINT 'Plan 3 suitable' 
END
ELSE IF @D3 > 10
BEGIN
		PRINT 'Plan 3 is not suitable,the difference is'
		PRINT @D3
		PRINT '%' 
END	

-- compare proposed vs  current for >10%  for  plan 4
BEGIN
	PRINT '_________________________________________________________'
	PRINT @Cplan
	PRINT @Nplan4
	PRINT @D4
	
IF @D4 < 10
BEGIN
   	PRINT 'Plan 4 suitable' 
END
ELSE IF @D4 > 10
BEGIN
		PRINT 'Plan 4 is not suitable,the difference is'
		PRINT @D4
		PRINT '%' 
 END
 END

SELECT *
FROM @invest
END

GO

Open in new window

sampledatatable.PNG
ASKER CERTIFIED SOLUTION
Avatar of Raja Jegan R
Raja Jegan R
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of jrb47

ASKER

The data is read into a TVP, I am not sure the code to accomplish this across a column and the rates will vary for each person......The program works as it is.....I am just sure there has to be another way. I was told this could be done without using cursors but can not figure it out.

>> I was told this could be done without using cursors but can not figure it out.

Regret for the delay as it is a weekend..
And hope you sorted it out..