أسئلة شائعة حول فلترة الحقول
كيف يمكن فلترة مرجع 1 في جرد البنود ليعرض نفس الأصناف الموجودة في التفاصيل؟
- السؤال:
أنا أستخدم مرجع 1 في جرد البنود لجلب الأصناف، وأريد أن يظهر فقط نفس الأصناف التي تم اختيارها في التفاصيل. الكود الذي كتبته هو:
{loop(details)}
termsLines.ref1,Equal,{details.item.item.code},OR;
{endloop}
- الإجابة:
الواضح أنك تريد فلترة حقل termsLines.ref1
بحيث يعرض فقط الأصناف التي تم اختيارها في details.item.item
.
لكن يوجد خطأ في الكود المستخدم:
- عند كتابة شرط الفلترة، يجب أن تكتب اسم الحقل داخل شاشة الصنف (وهي الشاشة التي يتم الفلترة فيها)، وليس اسم الحقل داخل المستند الذي تستعمله.
- استخدام
termsLines.ref1
داخل الشرط غير صحيح، لأن هذا الحقل يُستخدم فقط لتحديد أين سيتم تطبيق الفلتر، وليس داخل شرط الفلترة نفسه.
- التصحيح:
استخدم الحقول كما هي موجودة في شاشة الصنف، كالتالي:
إذا أردت الفلترة حسب الكود:
{loop(details)}
code,Equal,{details.item.item.code},OR;
{endloop}
وإذا أردت الفلترة بشكل أدق باستخدام رقم المعرف:
{loop(details)}
id,Equal,{details.item.item.id},OR;
{endloop}
Tips
تأكد من أنك تستخدم اسم الحقل الصحيح الموجود في شاشة الكيان الذي يتم الفلترة عليه، وليس اسم الحقل في المستند المصدر.
ما هي أفضل طريقة عند البحث في سند التوريد أو الصرف لإظهار الأصناف بناءً على توفر الرصيد؟
- في سند الصرف المخزني: عرض الأصناف التي يوجد منها رصيد فقط.
- في سند التوريد المخزني: عرض الأصناف التي لا يوجد منها رصيد فقط.
أولاً: فلترة الأصناف ذات الرصيد فقط في سند الصرف المخزني
يحتوي الكيان InvItem
على سطور باسم quantities
مرتبطة بجدول ItemDimensionsQty
. يمكنك استخدام هذه العلاقة لفلترة الأصناف التي لها رصيد كما يلي:
JSON for direct import
{
"forType": "StockIssue",
"automaticUsage": true,
"lines": [
{
"fieldId": "details.item.item",
"dynamicFilter": "quantities.data.net,GreaterThan,0,AND;"
}
]
}
ثانياً: فلترة الأصناف التي لا يوجد منها رصيد في سند التوريد المخزني
نظراً لأن الصنف قد لا يحتوي دائماً على بيانات مباشرة في quantities
إذا لم يوجد رصيد، فمن الأفضل تحديث حقل مخصص (مثلاً n5
) في كيان InvItem
يعكس الكمية الكلية المتاحة، ثم استخدامه في الفلترة.
1. إنشاء مهمة مجدولة لتحديث الحقل n5
بقيمة الرصيد المتاح:
JSON for direct import
{
"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. بعد ذلك، فلترة حقل الصنف في سند التوريد بناءً على القيمة الجديدة في الحقل n5
:
JSON for direct import
{
"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
.
وإليك المسار جاهز للاستيراد:
JSON for direct import
{
"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"
}
]
}
💬 ويمكنك الاحتفاظ بالمهمة المجدولة كخطة احتياطية تعمل مرة يوميًا مثلاً لضمان المزامنة الكاملة، خاصةً في حالات التعديلات اليدوية أو عمليات الاستيراد الكبيرة.