كيف أضع شرطًا على سطور التفاصيل داخل قالب الوصلة (Creator) في لغة تمبو بحيث يتم نقل بعض السطور فقط؟

Viewed 19

أريد في قالب الوصلة (Creator Template) عمل شرط على سطور التفاصيل، بحيث لا يتم نقل السطر إذا كان الحقل details.b1 غير محدد، وينتقل فقط السطر الذي يحقق الشرط.

جربت الشرط {if(details.b1)} داخل {loop(details)} لكن النتيجة لم تعمل بشكل صحيح، مع أن كل الأمثلة التي وجدتها في التوثيق تتكلم عن الشرط على مستوى المستند وليس على مستوى سطور details.

هذا القالب الذي جربته:

{creator("ContractorContract",newwindow="true")}
{f("group")}{v("ccg")}
{f("projContract")}{v(ref1.code)}
{loop(details)}
{if(details.b1)}
{f("terms.termCode")}{V(details.ref1.code)}{r(@rownumber)}
{f("terms.standardTerm")}{V("02")}{r(@rownumber)}
{f("terms.remarks")}{V(details.text1)}{r(@rownumber)}
{f("terms.projTermCode")}{V(details.text2)}{r(@rownumber)}
{f("terms.quantity")}{V(details.number1)}{r(@rownumber)}
{f("terms.contractingUOM")}{V(details.ref2.code)}{r(@rownumber)}
{f("terms.unitCost")}{V(details.number2)}{r(@rownumber)}
{endif}
{endloop}
{endcreator}

فهل الشرط على سطور details مدعوم أصلًا في قالب الوصلة؟ وما الطريقة الصحيحة؟

1 Answers

الشرط على السطور مدعوم، والقالب الذي كتبته صحيح تقريبًا — المشكلة ليست في {if(details.b1)} وإنما في استعمال @rownumber.

سبب المشكلة:

@rownumber يعطي رقم السطر الأصلي في المستند المصدر (ترقيم مطلق). بفرض أن عندك مستندًا فيه خمسة سطور، والسطور 1 و3 و5 هي التي تحقق الشرط بينما 2 و4 لا تحققه:

  • مع السطر الأول سيحاول القالب الكتابة في السطر رقم 1 في المستند الجديد — وهذا سيعمل بشكل صحيح.
  • مع السطر الثالث سيحاول الكتابة في السطر رقم 3، لكن المستند الجديد فيه سطر واحد فقط، والنظام لا يسمح بوجود سطور فارغة في المنتصف — فتفشل الإضافة.

الحل:

استعمل ترقيمًا نسبيًا بدلًا من المطلق:

  • @@end مع أول حقل في السطر: تضيف سطرًا جديدًا (أو تستعمل آخر سطر إذا كان فارغًا).
  • @@last مع باقي حقول نفس السطر: تكتب في آخر سطر (السطر الذي أضافه @@end للتو).

بهذا الشكل تصبح أرقام السطور في المستند الجديد متتابعة مهما كانت السطور المستبعدة في المصدر.

القالب بعد التصحيح:

{creator("ContractorContract",newwindow="true")}
{f("group")}{v("ccg")}
{f("projContract")}{v(ref1.code)}
{loop(details)}
{if(details.b1)}
{f("terms.termCode")}{V(details.ref1.code)}{r(@@end)}
{f("terms.standardTerm")}{V("02")}{r(@@last)}
{f("terms.remarks")}{V(details.text1)}{r(@@last)}
{f("terms.projTermCode")}{V(details.text2)}{r(@@last)}
{f("terms.quantity")}{V(details.number1)}{r(@@last)}
{f("terms.contractingUOM")}{V(details.ref2.code)}{r(@@last)}
{f("terms.unitCost")}{V(details.number2)}{r(@@last)}
{endif}
{endloop}
{endcreator}

حل بديل — العدّاد اليدوي:

يمكن الوصول لنفس النتيجة باستعمال عدّاد يدوي: تزيد العدّاد بمقدار واحد مع كل سطر يحقق الشرط عبر {incrementcounter(c1)}، ثم تستعمل قيمته {r(@@c1)} مع كل حقول السطر:

{creator("ContractorContract",newwindow="true")}
{f("group")}{v("ccg")}
{f("projContract")}{v(ref1.code)}
{loop(details)}
{if(details.b1)}
{incrementcounter(c1)}
{f("terms.termCode")}{V(details.ref1.code)}{r(@@c1)}
{f("terms.standardTerm")}{V("02")}{r(@@c1)}
{f("terms.remarks")}{V(details.text1)}{r(@@c1)}
{f("terms.projTermCode")}{V(details.text2)}{r(@@c1)}
{f("terms.quantity")}{V(details.number1)}{r(@@c1)}
{f("terms.contractingUOM")}{V(details.ref2.code)}{r(@@c1)}
{f("terms.unitCost")}{V(details.number2)}{r(@@c1)}
{endif}
{endloop}
{endcreator}

ميزة هذه الطريقة أن كل حقول السطر تستعمل نفس الرقم @@c1، فلا تحتاج للتفرقة بين أول حقل وباقي الحقول. لكن طريقة @@end / @@last أبسط في أغلب الحالات لأنها لا تحتاج لتعريف عدّاد.

لمزيد من التفاصيل عن الوصلات (Creators) والحلقات والشروط في تمبو راجع دليل لغة تمبو في التوثيق:
Tempo Language Manual