ظهور رسالة "Arithmetic overflow error converting numeric to data type numeric" عند إصدار قائمة مالية؟

Viewed 9

عند محاولة إصدار قائمة مالية (قائمة الدخل النظامية) تظهر رسالة الخطأ التالية ويتوقف الإصدار:

Could not perform database operation, reason: Arithmetic overflow error converting numeric to data type numeric

رسالة الخطأ عند إصدار قائمة الدخل النظامية

تحدث المشكلة أثناء إصدار القائمة بعد تحديد ملف الإعدادات والفترة، ولا يتم حفظ نتيجة الإصدار. ما سبب هذه الرسالة وكيف يمكن حلها؟

1 Answers

هذه الرسالة تأتي من قاعدة البيانات (SQL Server) وليست خطأً في الإعدادات. معناها أن أحد القيم الرقمية الناتجة عن الإصدار أكبر من السعة المسموح بها للعمود الذي سيُخزَّن فيه.

الحقول الرقمية في جدول سطور قائمة الدخل (FSIssueFileLine) معرَّفة بدقة decimal(20,10)، أي 10 خانات بعد الفاصلة العشرية ولا يتبقى سوى 10 خانات للجزء الصحيح. وعندما يكون إجمالي الأرصدة أو القيم كبيراً (ملايين أو مليارات) يتجاوز هذا الحد فتظهر رسالة الـ Arithmetic overflow.

الحل هو توسعة دقّة هذه الأعمدة إلى decimal(30,10) (نفس عدد الخانات العشرية مع زيادة سعة الجزء الصحيح، فلا يحدث أي فقد للبيانات). يُنفَّذ السكربت التالي على قاعدة البيانات مرة واحدة، وهو آمن ويمكن إعادة تشغيله لأنه يستهدف فقط الأعمدة التي ما زالت decimal(20,10):

DECLARE @sql nvarchar(max) = N'';

SELECT @sql += N'ALTER TABLE [FSIssueFileLine] ALTER COLUMN [' + c.name + N'] decimal(30,10) '
             + CASE WHEN c.is_nullable = 0 THEN N'NOT NULL' ELSE N'NULL' END + N';' + CHAR(10)
FROM sys.columns c
JOIN sys.types  t ON c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID(N'FSIssueFileLine')
  AND t.name = 'decimal'
  AND c.precision = 20
  AND c.scale = 10;

PRINT @sql;        -- لمراجعة الأوامر قبل التنفيذ
EXEC sp_executesql @sql;

السطر PRINT @sql يعرض أوامر التعديل أولاً لمراجعتها، ثم يقوم EXEC sp_executesql @sql بتنفيذها. بعد تشغيل السكربت أعد محاولة إصدار القائمة المالية ولن تظهر الرسالة مرة أخرى.

ملاحظة: خذ نسخة احتياطية من قاعدة البيانات قبل تنفيذ أي تعديل على الـ schema، ونفّذ السكربت خارج أوقات العمل إن أمكن.