Skip to content
English

الحقول المحسوبة وتلوين الصفوف

أحياناً تكون المعلومة التي يحتاجها المستخدم غير موجودة في السجل المفتوح أمامه. البائع الذي يكتب فاتورة يريد أن يعرف كم ما زال على هذا العميل؛ وأمين المخزن الذي يختار صنفاً يريد أن يعرف كم بقي منه في المخزن؛ وموظف التحصيل يريد أن يعرف متى اشترى هذا العميل آخر مرة. لا شيء من ذلك مخزّن في المستند الجاري تحريره — بل في مكان آخر من قاعدة البيانات، والمستخدم اليوم مضطر إلى ترك الشاشة وفتح تقرير ثم العودة.

الجدولان في هذه الصفحة يسدّان هذه الفجوة. الأول يربط استعلاماً بالشاشة فتظهر الإجابة كأنها حقل إضافي أو عمود عادي. والثاني يجعل استعلاماً يحدد لون خلفية صف في جدول، فتبرز السجلات المشكِلة من نظرة واحدة دون أن يقرأ أحد رقماً واحداً.

الجدولان يطبقهما الخادم، فيسري التعديل بمجرد حفظ السجل — بلا تسجيل خروج ولا إعادة تشغيل.

استعلامات الحقول المحسوبة (calculated Fields Queries)

كل كيان في النظام يحمل عشرين خانة محسوبة احتياطية بالأسماء sqlField1 حتى sqlField20. وهي لا تخزّن شيئاً. كل خانة يملؤها استعلام يعمل لحظة قراءة السجل، وتُهمل القيمة مرة أخرى عند إغلاق الشاشة. وهذا بالضبط ما يجعلها مفيدة: الرقم محدَّث دائماً، ولا يحتاج أحد إلى تذكّر تحديثه.

وبمجرد أن يصير خلف الخانة استعلام، تتصرف كأي حقل آخر: يمكنك وضعها في شاشة التحرير، وعرضها كعمود في شاشة القائمة، وطباعتها في تصميم المستند.

العمودماذا يفعل
قائمة الأنواع (For Type List)قائمة مسماة قابلة لإعادة الاستخدام بأنواع الكيانات، ليغطي سطر واحد عدة شاشات دفعة واحدة.
للنوع (For Type)نوع كيان واحد يسري عليه السطر (مثلاً فاتورة مبيعات).
معرف السطور (Detail Field)اتركه فارغاً ليخص رأس السجل نفسه. واملأه بمعرف حقل جدول (مثلاً details) لتعريف الخانات لـسطور ذلك الجدول بدلاً من الرأس، فيحصل كل سطر على أعمدته المحسوبة الخاصة.
استعلام الحقل المحسوب 1 … 20 (Field 1 Query … Field 20 Query)الاستعلام الذي يقف خلف كل خانة من الخانات العشرين.

السطر بلا نوع لا يفعل شيئاً

على خلاف معظم جداول هذه الشاشة، هذه السطور ليست عامة. السطر الذي تُرك فيه النوع وقائمة الأنواع فارغين يُتجاهل تماماً. اذكر دائماً نوع الكيان، أو وجّه السطر إلى قائمة أنواع.

أين تظهر القيم

حفظ الاستعلام وحده لا يُظهر شيئاً. الاستعلام يملأ الخانة، ويبقى عليك أن تضع الخانة في شاشة. وتلك مهمة منفصلة تُنفَّذ من مُعدِّل الشاشات:

  • لعرضها في شاشة التحرير، أضف الحقل sqlField3 (أو أي خانة استخدمتها) إلى صفحة أو مجموعة — راجع تعديل شاشات التحرير.
  • لعرضها كعمود في شاشة القائمة أو في نافذة اختيار السجل، أضفها هناك — راجع شاشة القائمة ونافذة الاختيار.
  • وإذا كنت قد استخدمت معرف السطور، أضف العمود إلى الجدول نفسه لا إلى الرأس.

واغتنم الفرصة لتضع عنواناً مفهوماً. sqlField3 اسم ذو معنى لك أنت وحدك؛ أما المستخدم فيجب أن يرى «رصيد العميل».

ست عشرة خانة منها تحمل نصاً قصيراً عادياً. والخانتان 17 و18 تحملان نصاً طويلاً، فاستخدم إحداهما حين تكون الإجابة فقرة لا رقماً. والخانتان 19 و20 تحملان كود لون لا نصاً — وهو مفيد حين تريد استعلاماً يحدد لون خلية بعينها.

فارغة في السجل الجديد

الاستعلام لا يعمل إلا على سجل سبق حفظه. وفي المستند الذي بدأه المستخدم للتو تبقى الحقول المحسوبة فارغة حتى أول حفظ. وهذا طبيعي وليس خطأ في الإعداد.

كيف يُكتب الاستعلام

الاستعلام يُكتب بلغة SQL، وهي نفس اللغة المستخدمة في الكيانات الافتراضية وفي تعريفات التقارير. ولا يُستخدم منه إلا العمود الأول من الصف الأول — وكل ما عداه يُهمل. فاكتب الاستعلام بحيث يعيد قيمة واحدة بالضبط.

وكل ما تضعه بين قوسين معقوفين هو معامل يعبئه الخادم قبل تشغيل الاستعلام، بأمان، كمعامل مربوط:

المعاملبماذا يُستبدل
{code} و{valueDate} و{remarks}حقل من السجل الجاري قراءته.
{customer.id} و{warehouse.code}حقل يُوصل إليه عبر مرجع في السجل.
{id}معرّف السجل نفسه — مفيد لاستبعاد المستند الحالي من مجموع.
{$line.item} و{$line.satisfiedQty}حقل من السطر الحالي في الجدول، حين يكون في السطر معرف سطور.
{loginUserId} و{loginUserCode} و{loginBranchId} و{loginLegalEntityId} و{loginLanguage}بيانات المستخدم الذي ينظر إلى السجل.

وهذا مثال كامل يعمل فعلاً. في فاتورة المبيعات، اعرض إجمالي ما فُوتر على هذا العميل حتى الآن، مع تجاهل الفاتورة المفتوحة حالياً:

sql
select isnull(sum(s.netValue), 0)
from SalesInvoice s
where s.customer_id = {customer.id}
  and s.id <> {id}

ضع ذلك في استعلام الحقل المحسوب 3 في سطر نوعه فاتورة مبيعات ومعرف السطور فيه فارغ، ثم أضف sqlField3 إلى شاشة تحرير الفاتورة بعنوان «إجمالي المفوتر على هذا العميل». ويكفي حفظ السجل؛ فأول فاتورة يفتحها مستخدم بعد ذلك تُظهر الرقم.

لا تكتب اسم الجدول نفسه داخل استعلام السطور

حين يكون في السطر معرف سطور، يجب ألا يشير الاستعلام إلى ذلك الجدول مباشرة. فكتابة {details.item} في استعلام معرف سطوره details تُرفض عند حفظ السجل، برسالة تطلب منك استخدام $line بدلاً منها. والسطر الحالي يُشار إليه دائماً بالصيغة {$line.item} و{$line.satisfiedQty} وهكذا. أما المعاملات التي لا تبدأ بـ $line فما زالت تقرأ رأس المستند، فيمكن لاستعلام السطر أن يجمع بين الاثنين: {$line.item} للسطر و{valueDate} لتاريخ المستند.

الثمن

هذه الاستعلامات تعمل مرة لكل صف

الحقل المحسوب يُنفَّذ منفصلاً لكل سجل ولكل سطر جدول يُقرأ. في شاشة تحرير واحدة هذا عدد قليل من التنفيذات ولا يلاحظه أحد. أما في شاشة قائمة تعرض مئتي سجل فهي مئتا تنفيذ لاستعلامك قبل أن تظهر الشاشة، وفي جدول من خمسين سطراً خمسون تنفيذاً إضافياً. الاستعلام الذي يستغرق عُشر ثانية في أداة استعلام يصير شاشة قائمة تستغرق عشرين ثانية.

اجعل هذه الاستعلامات ضيقة: تجميعة واحدة، مرشَّحة على عمود مفهرس، وبلا وصلات يمكن الاستغناء عنها. اختبر الاستعلام وحده وانظر كم يستغرق قبل أن تربطه بأي شيء. النظام يضع حداً أعلى لزمن تنفيذ أحدها — راجع الأداء والبحث — لكن الاستعلام الذي يبلغ الحد يُفشل الشاشة بدلاً من أن يعود فارغاً بهدوء، فالحد شبكة أمان لا حل.

سطر واحد لكل نوع كيان

الخانات العشرون تخص نوع الكيان لا السطر. فإذا ذكر سطران فاتورة المبيعات وملأ كلاهما استعلام الحقل المحسوب 3، تصادم الاستعلامان: يُسجَّل خطأ حرج في سجل الخادم ويفوز أحدهما، بلا وسيلة للتنبؤ بأيهما. احتفظ بسطر واحد لكل نوع كيان واملأ فيه الخانات العشرين. وينطبق الأمر نفسه عبر السجلات — لا تضع خانات فاتورة المبيعات في سجل وخانات أخرى لها في سجل ثانٍ.

علامة «غير نشط» على السطر مهملة هنا

التأشير على غير نشط في سطر مفرد من هذا الجدول لا يوقف الاستعلام؛ بل يظل يعمل. ولإيقاف حقل محسوب، امسح استعلامه أو احذف السطر. أما التأشير على غير نشط في السجل كله فيعمل — إذ تتوقف فوراً كل الحقول المحسوبة وألوان الصفوف في ذلك السجل.

تلوين خلفية الصفوف (Style Overrider Details)

الأرقام في الجدول لا بد أن تُقرأ، أما اللون فلا. أمر شراء نُفِّذ نصفه، أو جدول مطالبات فيه صفان تجاوزا موعد استحقاقهما، أو جدول سطور فيه صنف نزل تحت حده الأدنى — كل ذلك يصير واضحاً في جزء من الثانية إن كان الصف ملوَّناً، وغير مرئي إن لم يكن.

هذا الجدول يربط استعلاماً بجدول، ويحدد الاستعلام لون خلفية كل صف من صفوفه.

العمودماذا يفعل
للنوع (For Type)نوع الكيان الذي تحمل شاشته الجدول (مثلاً أمر بيع).
قائمة الأنواع (Entity List)قائمة مسماة قابلة لإعادة الاستخدام بأنواع الكيانات، ليغطي سطر واحد عدة شاشات.
الحقل (Field)معرف حقل الجدول الذي تُلوَّن صفوفه، مثلاً details. إلزامي — السطر بلا حقل لا يفعل شيئاً.
استعلام لون خلفية السطر (Row Background Colour Query)الاستعلام الذي يعيد لون الصف.

الاستعلام يُكتب تماماً كاستعلام الحقل المحسوب أعلاه: نفس المعاملات، ونفس الصيغة {$line.…} للسطر الحالي، ولا يُستخدم منه إلا العمود الأول من الصف الأول. والفرق في ما يعيده — لون يُطبَّق مباشرة كخلفية للصف. والصيغة المعتادة كود ست عشري:

sql
select case
         when {$line.satisfiedQty} < {$line.quantity.baseQty.value} then '#FFDDDD'
         else ''
       end

أعِد قيمة فارغة للصفوف التي يجب أن تبقى بمظهرها الطبيعي؛ فلا يُلوَّن إلا الصف الذي يعود بلون. وأي قيمة لون يفهمها المتصفح تعمل، فـ red و#FFDDDD كلاهما مقبول، لكن التزم بالدرجات الفاتحة: فنص الصف ما زال عليه أن يُقرأ فوق اللون، والجدول الذي يحمل فيه كل صف ثانٍ لوناً قوياً أصعب في القراءة من جدول بلا ألوان أصلاً.

اختر ألواناً تنجو من التصوير بالأبيض والأسود

اللون تلميح لا سجل. فإذا كان «تجاوز الاستحقاق» موجوداً فقط في صورة صف وردي، فإنه يختفي لحظة يطبع أحدهم الشاشة بالأبيض والأسود أو ينظر إليها بعين لا تميز الألوان. اجمع بين اللون وحقل محسوب يقول الشيء نفسه بالكلمات، فتنجو المعلومة.

نفس الثمن لكل صف، ونفس التصادم

استعلام اللون يعمل مرة لكل صف تماماً كالحقل المحسوب، فكل ما قيل أعلاه عن إبقائه ضيقاً ينطبق هنا أيضاً. ولأن استعلام اللون يشارك المجموعة نفسها من الخانات، فإن سطرين يلوّنان الجدول نفسه لنوع الكيان نفسه يتصادمان بالطريقة ذاتها — يفوز أحدهما ويُسجَّل خطأ حرج. احتفظ بسطر واحد لكل نوع كيان وجدول.

أما سطر الحقول المحسوبة وسطر لون الصف لنفس الكيان ونفس الجدول فلا يتصادمان — إذ يشغلان خانات مختلفة ويعملان معاً بلا مشكلة. ومن الطبيعي تماماً أن يكون لديك جدول تحمل صفوفه ثلاثة أعمدة محسوبة ولوناً، والكل مُدار من هذه الشاشة نفسها.

تلوين الصفوف للجداول لا لشاشات القوائم

هذا الجدول يلوّن صفوف جدول داخل شاشة تحرير. وليس هو الطريق لتلوين صفوف شاشة قائمة سجلات. فإذا كان مرادك «أرِني الفواتير المتأخرة»، فالفلتر المحفوظ على شاشة القائمة أو عنصر لوحة معلومات هو الأداة الصحيحة — راجع الفلاتر السريعة ووحدة BI.

صفحات ذات صلة