أولاً: فلترة الأصناف ذات الرصيد فقط في سند الصرف المخزني
يحتوي الكيان InvItem على سطور باسم quantities مرتبطة بجدول ItemDimensionsQty. يمكنك استخدام هذه العلاقة لفلترة الأصناف التي لها رصيد عبر إعداد فلترة افتراضية للحقل details.item.item في سند الصرف:
{
"forType": "StockIssue",
"automaticUsage": true,
"lines": [
{
"fieldId": "details.item.item",
"dynamicFilter": "quantities.data.net,GreaterThan,0,AND;"
}
]
}
ثانياً: فلترة الأصناف التي لا يوجد منها رصيد في سند التوريد المخزني
نظراً لأن الصنف قد لا يحتوي دائماً على بيانات مباشرة في quantities إذا لم يوجد رصيد، فمن الأفضل تحديث حقل مخصص (مثلاً n5) في كيان InvItem يعكس الكمية الكلية المتاحة، ثم استخدامه في الفلترة.
1. إنشاء مهمة مجدولة لتحديث الحقل n5 بقيمة الرصيد المتاح
{
"scheduleType": "Action",
"className": "com.namasoft.infor.domainbase.util.actions.EAExecuteUpdateQuery",
"title1": "Update Query",
"parameter1": "update i set n5 = coalesce(qty.net,0) from InvItem i\nouter apply (\nselect sum(q.net) net from ItemDimensionsQty q where q.item_id = i.id\n) qty",
"title2": "Evict Cache After Execution(true,false)",
"parameter2": "true",
"actionDescription": "Execute update query specified in first parameter"
}
2. فلترة حقل الصنف في سند التوريد بناءً على القيمة الجديدة
{
"forType": "StockReceipt",
"automaticUsage": true,
"lines": [
{
"fieldId": "details.item.item",
"dynamicFilter": "quantities.data.net,LessThanOrEqual,0,AND;"
}
]
}
ملاحظات:
- يمكنك أيضاً استبدال
quantities.data.net بـ n5 مباشرة إذا أردت ربط الفلترة بالحقل المحسوب، ولكن استخدام quantities.data.net يظل أكثر دقة حيث أن n5 يعتمد على تشغيل المهمة.
- اختر جدول تشغيل المهمة المجدولة بعناية بحيث تحافظ على دقة الحقل
n5 ولا تشكل في الوقت نفسه ضغطاً على موارد الخادم وقاعدة البيانات.
تحسين تنفيذ التحديث التلقائي للحقل n5 باستخدام مسار كيان
بدلاً من الاعتماد فقط على مهمة مجدولة مستقلة، يمكنك استخدام مسار كيان (Entity Flow) لتحديث الحقل n5 مباشرة بعد أي حركة مخزنية (صرف، توريد، تحويل)، وذلك لتحقيق تحديث فوري وفعّال مع تقليل الضغط على النظام.
الخطوات المقترحة:
- إنشاء مسار كيان جديد يتم تشغيله بعد التأثير الفعلي على قاعدة البيانات (بعد الحفظ النهائي).
- تحديد الجداول المستهدفة في قائمة أنواع:
StockIssue (صرف مخزني)
StockReceipt (توريد مخزني)
StockTransfer (تحويل مخزني)
- إضافة إجراء من النوع "تشغيل أمر تحديث SQL" بنفس كود المهمة المجدولة.
- تفعيل الخيارات التالية في مسار الكيان:
يعمل بعد حفظ المستند نهائياً والتأثير على قاعدة البيانات
انتظار انتهاء معالجة الكميات
وهذه الإعدادات تضمن أن التحديث يتم فقط بعد نجاح المعالجة المخزنية، مما يمنع حدوث تعارض أو تحديث سابق لأوانه.
الفائدة من هذا الأسلوب:
- تحديث آني لـ
n5 دون الحاجة لجدولة زمنية.
- تقليل الضغط على النظام الناتج عن تكرار التنفيذ.
- المحافظة على دقة الرصيد في كافة الشاشات التي تعتمد على
n5.
مسار الكيان جاهز للاستيراد:
{
"entityTypeList": "StockIssueReceiptTransfer",
"runAfterCommitDocAndEffectOnDB": true,
"waitForQuantityProcessing": true,
"details": [
{
"className": "com.namasoft.infor.domainbase.util.actions.EAExecuteUpdateQuery",
"parameter1": "update i set n5 = coalesce(qty.net,0) from InvItem i\nouter apply (\nselect sum(q.net) net from ItemDimensionsQty q where q.item_id = i.id\n) qty",
"parameter2": "true",
"targetAction": "PostCommit"
},
{
"className": "com.namasoft.infor.domainbase.util.actions.EAExecuteUpdateQuery",
"parameter1": "update i set n5 = coalesce(qty.net,0) from InvItem i\nouter apply (\nselect sum(q.net) net from ItemDimensionsQty q where q.item_id = i.id\n) qty",
"parameter2": "true",
"targetAction": "PostDelete"
}
]
}
ويمكنك الاحتفاظ بالمهمة المجدولة كخطة احتياطية تعمل مرة يومياً مثلاً لضمان المزامنة الكاملة، خاصةً في حالات التعديلات اليدوية أو عمليات الاستيراد الكبيرة.