Member 13423880 Ответов: 1

Как я увеличиваю каждую строку по условию в SQL с#


У меня есть значение 100 из текстового поля, и я хочу увеличить это значение в столбце stock_out, но только до тех пор, пока столбец stock_out не будет равен столбцу stock_in, если значение первой строки равно 40, то первая строка stock_out должна быть увеличена на 10 от 100, чем оставшееся значение от 100(90) должно быть увеличено в строке ниже него, а затем строка ниже него до тех пор, пока это необходимо (до 100 равно 0). Элементы упорядочиваются по Item_Name и Bill No asc.
Bill No   Item_Name   Stock_in  Stock_out  stock_in_hand
1          chicken       50        40           10
2          chicken       40         0           40
3          fish          100       30           70
4          fish          20        20            0
5          chicken       60        10           50
6          chicken       100       20           80

Результат должен быть получен.
Bill No   Item_Name   Stock_in  Stock_out  stock_in_hand
1          chicken       50        50           0
2          chicken       40        40           0
5          chicken       60        60           0
6          chicken       100       20          80
3          fish          100       30          70
4          fish          20        20           0

Вот код, который я смог сделать до сих пор, но он требует много работы, и у меня нет опыта в cte или любом сложном кодировании c#. Я использую SQL Server 2014 и c#.

P. S Я знаю о sql-инъекции и изменю свои sql - запросы на параметризованные запросы.
Любая помощь будет очень признательна.

Что я уже пробовал:

SQL-запрос кода C#
select * 
from stock_recieve 
where Item_Name like'" + comboBoxitem.Text + "' 
where Stock_out < Stock_in 
order by [Bill No] asc;

update stock_recieve 
     set Stock_out = Stock_out+" + qty + "
where Stock_out < Stock_in;

j snooze

Now your query will need to have a bit more logic incase the exact amount you are trying to distribute is not equal to the exact running total. But the following sample I used in a temp table will basically bring back results with the last column being a running total of how much stock you need to fill that bill number. You would be able to select just the rows that you need to update and with some c# looping calculate how much each row gets. To get the idea of what this query does, remove the where clause and run it to see that the "numberneeded" is a running total of how much is needed to make the stockout = stockin. (I just did a temp table with a similar name and similar column names, modify to your specifications).

Выбрать *
Из (выбрать billno,товар,stockin,отсутствие запасов,stockinhand,сумма(stockin-отсутствие запасов) над (заказ по номенклатуре,billno) как numberneeded
от #stock_recieve) a
Где numberneeded <= 100

1 Ответов

Рейтинг:
2

mudgilsks

--Please Try This, replace your table and column name if not matching
DECLARE @Counter as int=1
	Declare @Stock as int=100

declare @StockRecieved as table(Sr int, BillNo int)
insert into @StockRecieved
SELECT ROW_NUMBER() over(order by [Item_Name], [Bill No]) Sr,[Bill No]     
  FROM [dbo].[stock_recieve] 

	WHILE(@Stock>0)
		BEGIN
		declare @DiffInOut int
		declare @StockToBeUpdated int
		declare @BILLNo int
select @BILLNo= BillNo from @StockRecieved where Sr=@Counter
select  @DiffInOut=[Stock_in]-[Stock_out] FROM [dbo].[stock_recieve] where [Bill No]=@BILLNo

		if (@Stock>=@DiffInOut)
			BEGIN
				SET @StockToBeUpdated=@DiffInOut
				SET @Stock=@Stock-@DiffInOut
			END
		ELSE
			BEGIN
			 SET @StockToBeUpdated=@Stock
			 SET @Stock=0
			END

		UPDATE [stock_recieve] set [Stock_out]=[Stock_out]+@StockToBeUpdated where [Bill No]=@BILLNo
		
		SET @Counter=@Counter+1;
		END

--To confirm
		SELECT *   FROM [dbo].[stock_recieve] order by [Item_Name], [Bill No]