لماذا تظهر رسالة "لم يمكن تنفيذ العملية" عند فتح سند مصاريف اعتماد أصل، مع خطأ "conversion from nvarchar to NCLOB is unsupported"؟

Viewed 1

عند فتح سند مصاريف اعتماد أصل (FA Custody Expense / سندات الأصول الثابتة المرتبطة) تظهر للمستخدم رسالة عامة:

لم يمكن تنفيذ العملية

وعند مراجعة ملف اللوج (server log) أجد التفاصيل التالية:

Could not extract column [19] from JDBC ResultSet [The conversion from nvarchar to NCLOB is unsupported.]

الخطأ يبدو متعلقًا بعدم تطابق نوع العمود في قاعدة البيانات مع النوع الذي يتوقعه Hibernate في الكود (الكود يتوقع NCLOB لحقول الملاحظات الطويلة بينما العمود الفعلي في قاعدة البيانات هو NVARCHAR(255)).

أين هو مكان المشكلة؟ وكيف يمكن إصلاحها على قاعدة البيانات بحيث تعمل سندات اعتماد الأصول وما يرتبط بها من جداول الجدولة والاستلام والعهد دون أن أضطر إلى ترقية الإصدار؟

1 Answers

السبب

عدم تطابق نوع العمود في قاعدة البيانات مع النوع الذي يتوقعه Hibernate. النسخة الحديثة من النظام عرّفت حقول remarks و remark في عدد من جداول الأصول الثابتة (Fixed Assets) كـ NCLOB (يُخزَّن في SQL Server كـ NVARCHAR(MAX))، لكن في قواعد البيانات الأقدم لا تزال هذه الأعمدة من نوع NVARCHAR(255) ولم تتم ترقيتها — فيرفض المحرّك تحويل القيمة وتظهر الرسالة:

The conversion from nvarchar to NCLOB is unsupported.

الحل

نفّذ سكربت تعديل أنواع الأعمدة التالي على قاعدة البيانات. هذا يُحوّل الأعمدة المطلوبة إلى NVARCHAR(MAX) (وهو ما يقابل NCLOB في SQL Server):

ALTER TABLE FACustodyScheduledPayLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAPurchaseScheduledPayLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAPurchaseOrderScheduledPayLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAPurchaseOfferScheduledPay ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAInitialReceiptScheduledPayLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAOpeningDocumentScheduleLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAInitialReceiptLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAPurchaseOfferLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAPurchaseOrderLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAPurchOrderReqLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FALcExpenseLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FALCScheduledPayLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAReceiptDocLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FAScheduleTemplateLine ALTER COLUMN remarks NVARCHAR(MAX);
ALTER TABLE FATakingActualLine ALTER COLUMN remarks NVARCHAR(MAX);

ALTER TABLE CustodyCustodianLine ALTER COLUMN remark NVARCHAR(MAX);
ALTER TABLE FACustodyDeliveryLine ALTER COLUMN remark NVARCHAR(MAX);
ALTER TABLE FACustodyDeliveryEmpLine ALTER COLUMN remark NVARCHAR(MAX);
ALTER TABLE FACustodyTransferFromLine ALTER COLUMN remark NVARCHAR(MAX);
ALTER TABLE FACustodyTransferToLine ALTER COLUMN remark NVARCHAR(MAX);
ALTER TABLE FACustodianLine ALTER COLUMN remark NVARCHAR(MAX);

ملاحظات

  • نفّذ السكربت من حساب له صلاحية ALTER على هذه الجداول، ويُفضّل أخذ نسخة احتياطية قبل التنفيذ.
  • بعض الجداول قد لا تكون موجودة في كل التركيبات — لا تتعطّل بسبب رسالة "object does not exist"، شغّل كل جملة ALTER على حدة وتجاهل الجداول المفقودة.
  • بعد تنفيذ السكربت أعد تشغيل الخادم لإفراغ أي حالة محفوظة في الـ session/cache، ثم أعد فتح سند مصاريف اعتماد الأصل وستعمل بشكل طبيعي.