أسئلة عامة عن GUI Post Actions
كيفية إعادة حساب السعر تلقائيًا عند اختيار الشحنة؟
في فاتورة المبيعات، عند اختيار شحنة لأحد الأصناف، أحتاج إلى أن يقوم النظام بتحديث السعر تلقائيًا إذا كان هناك سعر مخصص لهذه الشحنة في قائمة الأسعار أو إذا كانت الشحنة مشمولة في عرض يتضمن خصمًا. لاحظ أن النظام بالفعل يعيد احتساب السعر بشكل صحيح عند تعديل الكمية، ولكن هذا يتطلب تغيير الكمية يدويًا بعد اختيار الشحنة.
الحل: لتحقيق ذلك، يمكن إعداد GUI Post Action مرتبط بحقل الشحنة (lotId) يقوم بتفعيل GUI Post Action الخاص بحقل الكمية (primeQty.value). هذا الربط يضمن أن النظام سيعيد حساب السعر مباشرة بعد اختيار الشحنة دون الحاجة إلى تعديل يدوي للكمية.
JSON للاستيراد المباشر
{
"lines": [
{
"forType": "SalesInvoice",
"fieldID": "details.specificDimensions.lotId",
"expression": "code=code",
"callPostActorOfField": "details.quantity.quantity.primeQty.value"
}
]
}كيف أحسب عمودًا في الجدول من أعمدة أخرى في نفس السطر؟
يكتب المستخدم كمية في n1 وسعرًا في n2 على سطر سند قيد، والمطلوب أن يظهر في n3 حاصل n1 × n2 فورًا — قبل حفظ المستند، وعلى السطر الذي يحرره هو دون بقية السطور.
الحل: سطر GUI Post Action لكل حقل يُفترض أن يُشغّل الحساب. ضع في معرّف الحقل (Field Id) الحقل الذي يكتب فيه المستخدم (lines.n1)، واكتب المعادلة في Expression مع تسمية الهدف ببادئة الجدول نفسه:
lines.n3=sql(select isnull(try_cast({lines.n1} as decimal(20,6)), 0)
* isnull(try_cast({lines.n2} as decimal(20,6)), 0))ثلاثة أشياء تُنجح هذه المعادلة أو تُفشلها:
- سمِّ الهدف ببادئة الجدول (
lines.n3أوdetails.n3) لا باسم الحقل وحده. و$line.n3يعمل أيضًا — فداخل إجراء بعد الإدخال على حقل في جدول يعني$lineالسطر الذي يحرره المستخدم — لكن بادئة الجدول هي الصيغة التي تعمل كذلك في كل أنواع خرائط الحقول الأخرى. راجع خرائط الحقول — اختيار السطر. - احمِ كل مُعامل قد يكون فارغًا. الخانة التي لم يملأها المستخدم بعد تصل إلى قاعدة البيانات كـ
NULL، وSQL Server يعامل الـNULLغير المحدَّد النوع كنص: بدون غلافisnull(try_cast(…))يفشل الإجراء برسالةOperand data type nvarchar is invalid for multiply operatorأول مرة تكون فيها إحدى الخانتين فارغة — وهو حال السطر أثناء كتابته في أغلب الوقت. - كرِّر السطر لكل مُشغِّل. الإجراء لا يعمل إلا للحقل المذكور في معرّف الحقل، فالحساب الذي يجب أن يتبع كلا الطرفين يحتاج سطرًا لـ
lines.n1وآخر لـlines.n2.
حقول السياق تملأ نفسها
أعمدة Context Field 1…30 تحدد ما يجب أن ترسله الشاشة إلى الخادم حتى تُحسب المعادلة. لا تملؤها بيدك — فهي تُستنتج من المعادلة ومعرّف الحقل فور كتابتهما، فإن بدت خاطئة فصحّح المعادلة ودعها تُكتب من جديد.
JSON للاستيراد المباشر
{
"lines": [
{
"forType": "JournalEntry",
"fieldID": "lines.n1",
"expression": "lines.n3=sql(select isnull(try_cast({lines.n1} as decimal(20,6)), 0) * isnull(try_cast({lines.n2} as decimal(20,6)), 0))"
},
{
"forType": "JournalEntry",
"fieldID": "lines.n2",
"expression": "lines.n3=sql(select isnull(try_cast({lines.n1} as decimal(20,6)), 0) * isnull(try_cast({lines.n2} as decimal(20,6)), 0))"
}
]
}ما فائدة عمود Fields To Update؟
بعد تنفيذ المعادلة تُبلَّغ الشاشة بالحقول التي تعيد قراءتها من النتيجة. وإن تُرك Fields To Update فارغًا حُسب نيابة عنك: كل حقل على يسار علامة = في المعادلة يُحدَّث، وهو المطلوب في أغلب الحالات.
املأه حين تغيّر المعادلة حقلًا ليس على يسار = — قيمة تُضبط بطريق غير مباشر عبر switchTarget، أو runCommand يعيد حساب المستند، أو حقل يعتمد عليه حساب حقل آخر. فكل ما لا يُذكر هنا يبقى على الشاشة بقيمته القديمة حتى يُحفظ السجل ويُفتح من جديد، وإن كان الخادم قد غيّره فعلًا.
اكتب الحقول كما تسميها المعادلة تمامًا، مفصولة بفواصل أو بأسطر:
lines.n3, lines.n4