USE [namedtabase]; GO SET NOCOUNT ON; SET XACT_ABORT ON; IF OBJECT_ID('tempdb..#BadRows') IS NOT NULL DROP TABLE #BadRows; ------------------------------------------------------------ -- انتخاب دقیق ۲۶ فاکتور ایراددار ------------------------------------------------------------ SELECT s.ID, s.fldSanad, f.fldShomareFactorForoosh AS FactorNo, s.fldBedehkar INTO #BadRows FROM dbo.tblSodooreSanad AS s INNER JOIN dbo.tblForoosh AS f ON f.fldShomareSanad = s.fldSanad WHERE f.fldShomareFactorForoosh IN ( 13691,13692,13693,13694,13695,13696,13697, 13717,13718,13719,13720, 13725, 13727,13728,13729,13730,13731,13732,13733, 13734,13735,13736, 13738,13739,13740, 13744 ) AND s.fldType = N'foroosh' AND ISNULL(s.fldBedehkar, 0) > 0 AND ISNULL(s.fldBestankar, 0) = 0 AND ( ISNULL(NULLIF(LTRIM(RTRIM(s.fldCodeKol)), N''), N'0') = N'0' OR ISNULL(NULLIF(LTRIM(RTRIM(s.fldMoinKamel)), N''), N'0') = N'0' ); ------------------------------------------------------------ -- کنترل قبل از اصلاح ------------------------------------------------------------ DECLARE @RowCount int; DECLARE @TotalAmount decimal(18,2); SELECT @RowCount = COUNT(*), @TotalAmount = ISNULL(SUM(fldBedehkar), 0) FROM #BadRows; IF @RowCount <> 26 OR @TotalAmount <> 805075200 BEGIN SELECT * FROM #BadRows ORDER BY FactorNo; RAISERROR( N'تعداد یا مبلغ اسناد با اطلاعات کنترل‌شده برابر نیست؛ هیچ تغییری انجام نشد.', 16, 1 ); RETURN; END; IF NOT EXISTS ( SELECT 1 FROM dbo.tblKolMoin WHERE fldCodeHesab = N'11001' AND ISNULL(fldUnActive, 0) = 0 ) BEGIN RAISERROR(N'حساب صندوق 11001 وجود ندارد یا غیرفعال است.', 16, 1); RETURN; END; IF OBJECT_ID( N'dbo.Backup_BadForooshAccount_20260916', N'U' ) IS NOT NULL BEGIN RAISERROR( N'جدول پشتیبان از قبل وجود دارد؛ برای جلوگیری از بازنویسی عملیات متوقف شد.', 16, 1 ); RETURN; END; ------------------------------------------------------------ -- پشتیبان‌گیری و اصلاح ------------------------------------------------------------ BEGIN TRY BEGIN TRANSACTION; SELECT s.*, b.FactorNo AS BackupFactorNo, GETDATE() AS BackupDate INTO dbo.Backup_BadForooshAccount_20260916 FROM dbo.tblSodooreSanad AS s INNER JOIN #BadRows AS b ON b.ID = s.ID; UPDATE s SET s.fldCodeKol = N'110', s.fldCodeMoin = N'01', s.fldMoinKamel = N'11001', s.fldSharh = CASE WHEN NULLIF( LTRIM(RTRIM(ISNULL(s.fldSharh, N''))), N'' ) IS NULL THEN N'بابت فاکتور شماره ' + CONVERT(nvarchar(30), b.FactorNo) ELSE s.fldSharh END, s.fldDateUpdate = GETDATE() FROM dbo.tblSodooreSanad AS s INNER JOIN #BadRows AS b ON b.ID = s.ID; IF @@ROWCOUNT <> 26 RAISERROR(N'تعداد ردیف‌های اصلاح‌شده ۲۶ نبود.', 16, 1); IF EXISTS ( SELECT 1 FROM dbo.tblSodooreSanad AS s INNER JOIN #BadRows AS b ON b.ID = s.ID WHERE s.fldCodeKol <> N'110' OR s.fldCodeMoin <> N'01' OR s.fldMoinKamel <> N'11001' ) RAISERROR(N'کنترل نهایی اصلاح حساب‌ها ناموفق بود.', 16, 1); COMMIT TRANSACTION; PRINT N'اصلاح ۲۶ سند با موفقیت انجام شد.'; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; DECLARE @ErrorMessage nvarchar(4000); SET @ErrorMessage = ERROR_MESSAGE(); RAISERROR(@ErrorMessage, 16, 1); RETURN; END CATCH; ------------------------------------------------------------ -- نمایش نتیجه سند ۸۹۱۵ ------------------------------------------------------------ SELECT ID, fldSanad, fldCodeKol, fldCodeMoin, fldMoinKamel, fldBedehkar, fldBestankar, fldSharh FROM dbo.tblSodooreSanad WHERE fldSanad = 8915 ORDER BY ID; ------------------------------------------------------------ -- نتیجه باید صفر باشد ------------------------------------------------------------ SELECT COUNT(*) AS RemainingBadRows FROM dbo.tblSodooreSanad WHERE fldType = N'foroosh' AND ISNULL(fldBedehkar, 0) > 0 AND ISNULL(fldBestankar, 0) = 0 AND ( ISNULL(NULLIF(LTRIM(RTRIM(fldCodeKol)), N''), N'0') = N'0' OR ISNULL(NULLIF(LTRIM(RTRIM(fldMoinKamel)), N''), N'0') = N'0' );