Muhamad Faizan Khan Ответов: 3

как вычеркнуть запасы из инвентарных таблиц


У меня есть заказ на покупку Стол и Инвентаризация продукции стол
Инвентарь содержит следующие поля

InventoryId,
ProductId,
Количество,
Идентификатор locationId,
Ставка,
QuantityInHand,
ReceivedDate


в то время как столбцы заказа на продажу-это те, которые также есть у меня в Datagridview

ProductId
Цена
Количество
Скидка
Промежуточный итог


Теперь я хочу проверить количество заказов в своем инвентаре, чтобы знать это
нужное количество или нет
я использую этот запрос, чтобы убедиться, что желаемое количество доступно или нет

Select 
sum(QuantityInHand) as TotalQuantityInHand
From tblInventory
Where ProductId = @ProductId
and DeleteStatus is not null
and QuantityInHand is not null
and QuantityInHand >= @QuantityInHand
group by ProductId


Это гарантирует мне, что количество заказа доступно, но теперь проблема заключается в том, что я хочу минимизировать количество продукта и запас из дата получения старого изобретения как я могу это сделать??
какой запрос на обновление мне требуется??

update tblInventory
set
QuantityInHand=@QuantityInHand
where InventoryId = ???? WHAT TO DO HERE


помните, ставка и изменения запасов-мя

ZurdoDev

Где ты застрял?

Muhamad Faizan Khan

хотите минимизировать количество продукта и запас со старой даты получения изобретения, как я могу это сделать??

Debabrata_Das

Привет, друг, у меня есть вопрос. Можете ли вы подтвердить, что в таблице инвентаризации продуктов может быть несколько записей одного и того же ProductId?

Muhamad Faizan Khan

да

3 Ответов

Рейтинг:
1

Debabrata_Das

Вот мое понимание проблемы:

Например, есть 10 количество в руке ProductId = 1

InventoryId | ProductId | QuantityInHand
1 | 1 | 10

Всякий раз, когда поступает новый инвентарь, в таблице PRODUCT_INVENTORY делается новая запись. Например, поступило еще 15 количеств, поэтому таблица будет выглядеть следующим образом:

InventoryId | ProductId | QuantityInHand
1 | 1 | 10
2 | 1 | 15

Теперь на складе есть количество 10 + 15 = 25. Предположим, что клиент заказал 20 наименований продукции = 1. поскольку у нас на складе больше количества, чем заказано, товары могут быть проданы.

Теперь вопрос в том, как мы должны корректировать проданные товары из таблицы.

Вариант 1 - Должны ли мы вычесть 10 из первой записи и 10 из второй записи?
ОПЕРАЦИОННАЯ
Вариант 2 - Должны ли мы вычесть 15 из второй записи и 5 из первой записи?

На самом деле запасы поддерживаются в любом ФИФО или метод ЛИФО. Метод First In First Out (FIFO) говорит о том, что вы должны очистить запас, который пришел первым. ЛИФО-это полная противоположность ФИФО.

Теперь это будет не очень простой SQL, который может обновить запас в руке в соответствии с выбранным вами методом (например, FIFO/LIFO).


Если вы можете подтвердить, что мое понимание проблемы правильно, то я могу попробовать.

- ДД


Muhamad Faizan Khan

да, Совершенно верно, Мистер Дебабрата; превосходно. мне нужен метод ФИФО. пожалуйста, предоставьте любое решение. м жду

Debabrata_Das

Приятно это слышать. Ну, логика не может быть реализована с помощью одного оператора SQL. Я бы предложил начать писать сохраненный PROC. Если вы застряли где-нибудь, мы здесь, чтобы помочь вам.

Кстати, поскольку вам понравился мой пост, могу ли я попросить вас предоставить свой рейтинг :p

- ДД

Muhamad Faizan Khan

рейтинг сделан

Debabrata_Das

Спасибо :)

Пожалуйста, проверьте решение 2, где я написал сохраненный Proc. Надеюсь, это будет полезно.

Debabrata_Das

Мухаммад, не могли бы вы принять это решение как ответ?

Рейтинг:
1

Debabrata_Das

Привет друг, вы можете попробовать этот сохраненный PROC, написанный на SQl Server:


CREATE PROCEDURE UpdateStock 
	-- Add the parameters for the stored procedure here
	@ProductID int, 
	@OrderQuantity int
AS
BEGIN
	SET NOCOUNT ON;
	
	-- Fetch total stock in hand
	DECLARE @TotalStock INT
	SET @TotalStock = (Select SUM(Quantity) from PRODUCT_INVENTORY where ProductID = @ProductID)
	
	-- Check if the available stock is less than ordered quantity
	IF @TotalStock < @OrderQuantity
	BEGIN
		PRINT 'Stock not available'
		RETURN -1
	END
	
	DECLARE @InventoryID INT
	DECLARE @QuantityInHand INT
	-- Declare a CURSOR to hold ID, Quantity
	DECLARE @GetInventoryID CURSOR
 
	SET @GetInventoryID = CURSOR FOR
	SELECT ID, Quantity
	FROM PRODUCT_INVENTORY
	WHERE ProductID = @ProductID
	ORDER BY ReceivedDate
 
	-- Open the CURSOR
	OPEN @GetInventoryID

	-- Fetch record from the CURSOR
	FETCH NEXT
	FROM @GetInventoryID INTO @InventoryID, @QuantityInHand

	-- Loop if record found in CURSOR
	WHILE @@FETCH_STATUS = 0
	BEGIN
		-- Check if Order quantity becomes 0
		IF @OrderQuantity = 0
		BEGIN
			PRINT 'Updated Successfully'
			RETURN 1
		END
		-- If Order Qty is less than or equal to Quantity In Hand
		IF @OrderQuantity <= @QuantityInHand 
		BEGIN
			UPDATE PRODUCT_INVENTORY
			SET Quantity = Quantity - @OrderQuantity
			WHERE ID = @InventoryID
			
			SET @OrderQuantity = 0
		END
		-- If Order Qty is greater than Quantity In Hand
		ELSE
		BEGIN
			UPDATE PRODUCT_INVENTORY
			SET Quantity = 0
			WHERE ID = @InventoryID

			SET @OrderQuantity = @OrderQuantity - @QuantityInHand
		END
		
		FETCH NEXT
		FROM @GetInventoryID INTO @InventoryID, @QuantityInHand
	END
		
	-- Close and  Deallocate CURSOR
	CLOSE @GetInventoryID
	DEALLOCATE @GetInventoryID
	
END


Примечание: приведенный выше пример предназначен только для демонстрационных целей. Перед использованием в любой реальной программе убедитесь, что вы правильно реализуете обработку исключений, транзакцию.


Member 13923767

где я должен написать этот proc , в базе данных или на c#?

Debabrata_Das

Это хранимая процедура, которая должна быть записана в БД. Надеюсь, это поможет.

Рейтинг:
0

Member 12922552

Если R. State = adStateOpen, то R. Close
R. откройте "select * from Item where code='" & Form39.Text3.Text & "'", v, adOpenStatic, adLockOptimistic

R!qty = R. поля("кол-во").Значение - Val(Text41.Text)
R. UpdateBatch adAffectAllChapters
Р. Закрыть
MsgBox ("ваши данные успешно сохранены")


Dave Kreskowiak

Вы должны были воскресить этот вопрос после того, как на него ответили два с половиной года назад? Больше так не делай.