-- Fiyat Girişi (Prc.PurchaseRfqComparison) satır kaydı. Batch kaydı her satırı ayrı ve eşzamanlı istekle gönderir; -- satır güncellemesi ile teklifin yeniden hesabı aynı işlemde, önce ihalenin kök teklifi kilitlenerek yapılır. Grid ihalenin -- bütün tedarikçi tekliflerinin satırlarını taşır; kilit ihale düzeyinde olduğu için bu satırlar sırayla işlenir ve satırı -- kilitleyip diğer isteğin satırını bekleyen iki istek kilitlenmez (deadlock). CREATE OR ALTER PROCEDURE [dbo].[Prc_P_PurchaseRfqComparisonSave] @Id uniqueidentifier, @UnitPrice decimal(18, 4), @DeliveryDate datetime, @IsSelected bit, @TenantId uniqueidentifier, @LastModificationTime datetime2, @LastModifierId uniqueidentifier AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @RfqId uniqueidentifier = (SELECT PurchaseRfqId FROM Prc_T_PurchaseRfqLine WHERE Id = @Id), @Group uniqueidentifier, @Status nvarchar(16); SELECT @Group = ISNULL(TenderGroupId, Id) FROM Prc_T_PurchaseRfq WHERE Id = @RfqId; BEGIN TRAN; SELECT @Group = Id FROM Prc_T_PurchaseRfq WITH (UPDLOCK, HOLDLOCK) WHERE Id = @Group; SELECT @Status = Status FROM Prc_T_PurchaseRfq WHERE Id = @RfqId; IF @Status IN ('Purchase', 'Cancelled') THROW 50142, N'Siparişe dönüştürülmüş ya da iptal edilmiş teklifin kalemi değiştirilemez.', 1; UPDATE Prc_T_PurchaseRfqLine SET UnitPrice = @UnitPrice, DeliveryDate = @DeliveryDate, IsSelected = @IsSelected, LastModificationTime = @LastModificationTime, LastModifierId = @LastModifierId WHERE Id = @Id AND (TenantId = @TenantId OR (TenantId IS NULL AND @TenantId IS NULL)); -- Fiyatı girilen teklif yanıtlanmış sayılır; geçerlilik verilmemişse sipariş son tarihine kadar geçerlidir. IF @UnitPrice > 0 UPDATE Prc_T_PurchaseRfq SET SupplierResponse = 'Quoted', QuoteDate = ISNULL(QuoteDate, GETUTCDATE()), QuoteValidUntil = ISNULL(QuoteValidUntil, CAST(OrderDeadline AS date)) WHERE Id = @RfqId AND SupplierResponse = 'Waiting'; EXEC Prc_P_PurchaseRfqRecalc @RfqId; COMMIT; END