Skip to content
English

أسئلة عامة عن GUI Post Actions

كيفية إعادة حساب السعر تلقائيًا عند اختيار الشحنة؟

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

الحل: لتحقيق ذلك، يمكن إعداد GUI Post Action مرتبط بحقل الشحنة (lotId) يقوم بتفعيل GUI Post Action الخاص بحقل الكمية (primeQty.value). هذا الربط يضمن أن النظام سيعيد حساب السعر مباشرة بعد اختيار الشحنة دون الحاجة إلى تعديل يدوي للكمية.

JSON للاستيراد المباشر
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 مع تسمية الهدف ببادئة الجدول نفسه:

ini
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 للاستيراد المباشر
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 يعيد حساب المستند، أو حقل يعتمد عليه حساب حقل آخر. فكل ما لا يُذكر هنا يبقى على الشاشة بقيمته القديمة حتى يُحفظ السجل ويُفتح من جديد، وإن كان الخادم قد غيّره فعلًا.

اكتب الحقول كما تسميها المعادلة تمامًا، مفصولة بفواصل أو بأسطر:

ini
lines.n3, lines.n4