as

🧩 Syntax:
USE [RedPen]
GO

/****** Object:  StoredProcedure [TF40].[sp_process_marks]    Script Date: 06/19/2023 13:45:08 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [TF40].[sp_process_marks]
(@ex2ppMapid int, @outflag int OUTPUT)
WITH 
EXECUTE AS CALLER
AS
begin
declare @error table (ckey varchar (1),error varchar(500));

--truncate values
truncate table process.tbl_tmp_mark_sch
	--update anser archive
	delete from data.ANSWER_KEY where ex2pp_mapid=@ex2ppMapid
insert into data.ANSWER_KEY
select c.EX2PP_MAPID ,QNUMBER,'A' as part,isnull(A,0) as answer from [TF40].T1_CLENSED c where c.EX2PP_MAPID=@ex2ppMapid and c.INDEX_NUMBER='**********'
union
select c.EX2PP_MAPID ,QNUMBER,'B' as part,isnull(B,0) as answer from [TF40].T1_CLENSED c where c.EX2PP_MAPID=@ex2ppMapid and c.INDEX_NUMBER='**********'
union
select c.EX2PP_MAPID ,QNUMBER,'C' as part,isnull(C,0)as answer from [TF40].T1_CLENSED c where c.EX2PP_MAPID=@ex2ppMapid and c.INDEX_NUMBER='**********'
union
select c.EX2PP_MAPID ,QNUMBER,'D' as part,isnull(D,0)as answer from [TF40].T1_CLENSED c where c.EX2PP_MAPID=@ex2ppMapid and c.INDEX_NUMBER='**********'
union
select c.EX2PP_MAPID ,QNUMBER,'E' as part,isnull(E,0)as answer from [TF40].T1_CLENSED c where c.EX2PP_MAPID=@ex2ppMapid and c.INDEX_NUMBER='**********'
-------------

	--insert values to memory table
	insert into process.tbl_tmp_mark_sch
	select m.Qnum,m.Correct_M,m.Incorrect_M,m.Both_M,m.Missing_M,m.Minimum_M
	from RedPen.T2002_MRKSCH m where m.Ex2mpid=@ex2ppMapid;
	
--KEY ANSWERES
DECLARE @KA varchar(1);
DECLARE @KB varchar(1);
DECLARE @KC varchar(1);
DECLARE @KD varchar(1);
DECLARE @KE varchar(1);

--marks
declare @CORRECT NUMERIC(4,2);
declare  @iCORRECT NUMERIC(4,2);
declare @MISSING NUMERIC(4,2);
declare @BOTH NUMERIC(4,2);
declare @MINIMUM NUMERIC(4,2);
--STUD ANSWERED
DECLARE @SA varchar(1);
DECLARE @SB varchar(1);
DECLARE @SC varchar(1);
DECLARE @SD varchar(1);
DECLARE @SE varchar(1);

DECLARE @SINDEX VARCHAR(50);
DECLARE @SMARK numeric(4,2);
declare @total_question int;
declare @cnt int;
declare @runner int;
--ASSIGN DEFAULTS
 SET @KA=NULL ;
 SET @KB =@KA;
 SET @KC =@KA;
 SET @KD =@KA;
 SET @KE =@KA;
 
--GET NOQ COUNT FROM PAPER
select @total_question= p.Total_Questions from RedPen.T1001_EXM2PPR p where p.Ex2mapid=@ex2ppMapid
--check all questions are answered
select @cnt= COUNT(*) from TF40.T1_CLENSED a where a.INDEX_NUMBER='**********'
if @cnt<>@total_question
begin
insert into @error values ('H','All questions are not answered in answer sheet');
end

--check null questions in answersheet
 SELECT @cnt= COUNT( QNUMBER) FROM TF40.T1_CLENSED  WHERE
 (A IS NULL OR B IS NULL OR C IS NULL OR D IS NULL OR E IS NULL ) 
 AND INDEX_NUMBER='**********'  and QNUMBER <=40
 
if @cnt>0
begin
insert into @error values ('H','Following questions are not answered correctly in answer sheet');
insert into @error
SELECT 'D', QNUMBER FROM TF40.T1_CLENSED  WHERE
 (A IS NULL OR B IS NULL OR C IS NULL OR D IS NULL OR E IS NULL ) 
 AND INDEX_NUMBER='**********' and QNUMBER <=40
 end
-- check either one answered chceck 

--check missing questions in answersheet
SELECT @cnt= COUNT( QNUMBER) FROM TF40.T1_CLENSED
 WHERE (A ='M' OR B ='M' OR C ='M' OR D ='M' OR E ='M' )
 AND INDEX_NUMBER='**********' 
if @cnt>0
begin
insert into @error values ('H','Following questions are not answered neither one in answer sheet');
insert into @error
SELECT 'D', QNUMBER FROM TF40.T1_CLENSED
 WHERE (A ='M' OR B ='M' OR C ='M' OR D ='M' OR E ='M' )
 AND INDEX_NUMBER='**********' 
end
 
 --more than one answered
 
 SELECT @cnt= COUNT( QNUMBER) FROM TF40.T1_CLENSED
 WHERE (A ='B' OR B ='B' OR C ='B' OR D ='B' OR E ='B' )
 AND INDEX_NUMBER='**********' 
if @cnt>0
begin
insert into @error values ('H','Following questions are Both answered in answer sheet');
insert into @error
SELECT 'D', QNUMBER FROM TF40.T1_CLENSED
 WHERE (A ='B' OR B ='B' OR C ='B' OR D ='B' OR E ='B' )
 AND INDEX_NUMBER='**********' 
end
 
  
 
--check is there any error
select @cnt= COUNT(*) from @error
if @cnt>0
begin
set @outflag=0;
select * from @error;
return;
end

-- process marks
delete  from data.RESULTS_STORE where EX2PP_MAPID=@ex2ppMapid
set @runner=1;
while @runner<=@total_question
begin
--get correct answer
select @KA=A,@KB=B,@KC=C,@KD=D,@KE=E FROM TF40.T1_CLENSED
 WHERE INDEX_NUMBER='**********' AND QNUMBER=@RUNNER;
--get correct marks
select @CORRECT= m.Correct_M,
@iCORRECT= m.Incorrect_M,
@BOTH= m.Both_M,
@MISSING= m.Missing_M,
@MINIMUM= m.Minimum_M from process.tbl_tmp_mark_sch m
where Qnum=@runner




DECLARE CUR_MARKs  CURSOR FOR
select c.INDEX_NUMBER,c.A,c.B,c.C,c.D,c.E  from TF40.T1_CLENSED c where
c.QNUMBER=@runner
OPEN CUR_MARKs
FETCH NEXT FROM CUR_MARKs INTO @SINDEX ,@SA,@SB,@SC,@SD,@SE
while @@FETCH_STATUS=0
begin

if @runner>=41
begin
set @SMARK=0;

if CONVERT(int,ISNULL(@SA,0))+CONVERT(int,ISNULL(@Sb,0))+CONVERT(int,ISNULL(@Sc,0))+CONVERT(int,ISNULL(@Sd,0))+CONVERT(int,ISNULL(@Se,0))<1
BEGIN
set @SMARK=@SMARK+@MISSING
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID]
           ,[INDEX_NUMBER]
           ,[QNUMBER]
           ,[PART]
           ,[ANS_STATUS]
           ,[MARKS])
     VALUES
           (@ex2ppMapid
           ,@SINDEX
           ,@runner
           ,null
           ,'M'
           ,@MISSING)



GOTO nEXTq
END
if CONVERT(int,ISNULL(@SA,0))+CONVERT(int,ISNULL(@Sb,0))+CONVERT(int,ISNULL(@Sc,0))+CONVERT(int,ISNULL(@Sd,0))+CONVERT(int,ISNULL(@Se,0))>1
BEGIN
set @SMARK=@SMARK+@BOTH
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID]
           ,[INDEX_NUMBER]
           ,[QNUMBER]
           ,[PART]
           ,[ANS_STATUS]
           ,[MARKS])
     VALUES
           (@ex2ppMapid
           ,@SINDEX
           ,@runner
           ,null
           ,'B'
           ,@BOTH)

GOTO nEXTq
END
IF @KA='1'
SET @KA='A'
IF @KB='1'
SET @KA='B'
IF @KC='1'
SET @KA='C'
IF @KD='1'
SET @KA='D'
IF @KE='1'
SET @KA='E'




IF @SA='1'
SET @SA='A'
IF @SB='1'
SET @SA='B'
IF @SC='1'
SET @SA='C'
IF @SD='1'
SET @SA='D'
IF @SE='1'
SET @SA='E'



IF @KA=@SA
begin
SET @SMARK=@SMARK+@CORRECT
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID]
           ,[INDEX_NUMBER]
           ,[QNUMBER]
           ,[PART]
           ,[ANS_STATUS]
           ,[MARKS])
     VALUES
           (@ex2ppMapid
           ,@SINDEX
           ,@runner
           ,null
           ,'C'
           ,@CORRECT)
end
ELSE

begin
SET @SMARK=@SMARK+@iCORRECT
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID]
           ,[INDEX_NUMBER]
           ,[QNUMBER]
           ,[PART]
           ,[ANS_STATUS]
           ,[MARKS])
     VALUES
           (@ex2ppMapid
           ,@SINDEX
           ,@runner
           ,null
           ,'I'
           ,@iCORRECT)
end



if @SMARK < @MINIMUM
set @SMARK=@MINIMUM;
--update marks
UPDATE TF40.T1_CLENSED
   SET  [MARKS] = @SMARK
      ,[FLAG] = 'M'
 WHERE [INDEX_NUMBER]=@SINDEX
 and [QNUMBER] = @runner
 and [EX2PP_MAPID] = @ex2ppMapid

end
else
begin
set @SMARK=0;
--A
IF @SA='M'
begin
SET @SMARK=@SMARK+@MISSING;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'A','M',@MISSING)
end
ELSE IF @SA='B'
begin
SET @SMARK=@SMARK+@BOTH;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'A','B',@BOTH)
end
ELSE IF @SA=@KA
begin
SET @SMARK=@SMARK+@CORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'A','C',@CORRECT)
end
ELSE IF @SA <> @KA
begin
SET @SMARK=@SMARK+@iCORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'A','I',@iCORRECT)
end
--B
IF @SB='M'
begin
SET @SMARK=@SMARK+@MISSING;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'B','M',@MISSING)
end
ELSE IF @SB='B'
begin
SET @SMARK=@SMARK+@BOTH;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'B','B',@BOTH)
end
ELSE IF @SB=@KB
begin
SET @SMARK=@SMARK+@CORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'B','C',@CORRECT)
end
ELSE IF @SB <> @KB
begin
SET @SMARK=@SMARK+@iCORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'B','I',@iCORRECT)
end
--C
IF @SC='M'
begin
SET @SMARK=@SMARK+@MISSING;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'C','M',@MISSING)
end
ELSE IF @SC='B'
begin
SET @SMARK=@SMARK+@BOTH;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'C','B',@BOTH)
end
ELSE IF @SC=@KC
begin
SET @SMARK=@SMARK+@CORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'C','C',@CORRECT)
end
ELSE IF @SC <> @KC
begin
SET @SMARK=@SMARK+@iCORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'C','I',@iCORRECT)
end
--D
IF @SD='M'
begin
SET @SMARK=@SMARK+@MISSING;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'D','M',@MISSING)
end
ELSE IF @SD='B'
begin
SET @SMARK=@SMARK+@BOTH;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'D','B',@BOTH)
end
ELSE IF @SD=@KD
begin
SET @SMARK=@SMARK+@CORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'D','C',@CORRECT)
end
ELSE IF @SD <> @KD
begin
SET @SMARK=@SMARK+@iCORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'D','I',@iCORRECT)
end
--E
IF @SE='M'
begin
SET @SMARK=@SMARK+@MISSING;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'E','M',@MISSING)
end
ELSE IF @SE='B'
begin
SET @SMARK=@SMARK+@BOTH;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'E','B',@BOTH)
end
ELSE IF @SE=@KE
begin
SET @SMARK=@SMARK+@CORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'E','C',@CORRECT)
end
ELSE IF @SE <> @KE
begin
SET @SMARK=@SMARK+@iCORRECT;
INSERT INTO [RedPen].[data].[RESULTS_STORE] ([EX2PP_MAPID],[INDEX_NUMBER],[QNUMBER],[PART],[ANS_STATUS],[MARKS])VALUES (@ex2ppMapid,@SINDEX,@runner,'E','I',@iCORRECT)
end

if @SMARK < @MINIMUM
set @SMARK=@MINIMUM;
--update marks
UPDATE TF40.T1_CLENSED
   SET  [MARKS] = @SMARK
      ,[FLAG] = 'M'
 WHERE [INDEX_NUMBER]=@SINDEX
 and [QNUMBER] = @runner
 and [EX2PP_MAPID] = @ex2ppMapid
end

nEXTq:
--insert into @error values ('H','record updated ' +CONVERT(varchar(10), @SMARK) );
FETCH NEXT FROM CUR_MARKs INTO @SINDEX ,@SA,@SB,@SC,@SD,@SE
end
close CUR_MARKs
deallocate CUR_MARKs
set @runner=@runner+1
end
set @outflag=1;
select * from @error
end





GO