"Not working" can mean alot of things.
Let's start at the top:
select @Tot=count(*) from Pl_Material_Stock_Closing_Daily where MSLId=@MSLId and E_date>@E_date
Have you verified that this is returning a count that is greater than 0? If it is not, then you will never enter the while loop.
Now lets look at the select statement:
select @Id=A.MSLId from Pl_Material_Stock_Closing_Daily A where A.MSLId=(select Min(MSLId) from Pl_Material_Stock_Closing_Daily where MSLId=@MSLId and MSLId>@Id)
Here, the sub-query can only return the MSLID if it is equal to the variable @MSLId and greater than the variable @Id because of the where clause. MIN() is meaningless (because of the MSLId=@MSLId), but it implies that you are intending to do something different than what you have done. An equivalent statement is:
SELECT @Id=MSLId FROM P1_Material_Stock_Daily WHERE MSLId=@MSLId AND MSLId>@ID
Can you see the circular reference between Pl_Material_Stock_Closing_Daily.MSLId, @MSLId, and @Id?
And at the bottom:
UPDATE Pl_Material_Stock_Closing_Daily set QtyS = QtyS+@QtyS where MSLId=@Id and E_date=@E_date
This UPDATE is outside the while loop so it will not be updating on each iteration as you indicated you needed it to.
You may need to give us a better idea what you are trying to accomplish and a better understanding of what "not working" means if you want to fix this code.