إنتقل إلى المحتوى الرئيسي

اجعل الزر يفعل شيئاً

الهدف​

امنح زراً على شريط أوامر نموذج أو عرض شيئاً يفعله عند الضغط عليه.

المتطلبات​

  • نموذج أو عرض مفتوح في مصممه، وعليه إجراء واحد على الأقل في شريط Actions.

الخطوات​

  1. افتح النموذج في مصمم النماذج، أو العرض في مصمم العروض.

  2. اختر زرّك من شريط Actions.

  3. من عند الضغط اختر ما يفعله:

    الخيارما يحتاجهما يحدث
    فتح عرضجدول (الفراغ يعني هذا الجدول) وأحد عروضهتُفتح القائمة على ذلك العرض
    سجل جديدجدول (الفراغ يعني هذا الجدول)يُفتح نموذج سجل فارغ
    فتح لوحة معلوماتلوحة معلوماتتُفتح اللوحة
    فتح شاشةشاشة مرسومةتُفتح الشاشة
    تشغيل تقريرتقريريُفتح التقرير كشاشة مستقلة — مقصوراً على السجل المفتوح إن وُجد
    فتح عنوان ويبعنوان http:// أو https:// يمكن أن يسمّي حقول السجليُفتح في تبويب جديد
    تشغيل نص برمجيلا شيء هنا — انظر أدناهيعمل نصّك بلغة BS
  4. اختر الوجهة من القائمة. يفتح كل حقل من تلك الحقول قائمة قابلة للبحث بما تملكه بيئتك فعلاً: الاسم المعروض في السطر الأول والاسم المنطقي تحته. اكتب للتصفية — كلا السطرين يُطابَقان، فـ par_inv تجد «الفواتير» وكذلك كتابة فات.

  5. احفظ النموذج أو العرض.

اترك الجدول فارغاً كلما قصدت «هذا الجدول». الأمر الذي لا يسمّي جدولاً يعمل على أي جدول يوضع عليه، فيمكن نسخ الزر نفسه إلى نموذج آخر دون إعادة توجيهه. وهذا ما تعنيه عبارة هذا الجدول على الحقل الفارغ، والعلامة ✕ بجانب جدول مختار تعيده إليها.

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

التقرير يعرف جدوله بنفسه، فلا جدول لاختياره بجانبه.

يمكن لعنوان الويب أن يحمل قيم السجل​

ضع الاسم المنطقي لحقل بين قوسين معقوفين ليستخدم العنوان قيمة ذلك الحقل من السجل المفتوح:

https://teams.microsoft.com/l/call/0/0?users=4:{pw_phone_number}
https://www.openstreetmap.org/search?query={address1_city}

تُرمَّز القيمة لعنوان URL تلقائياً، فيصل رقم مثل +44 20 7946 0000 كاملاً. ويجب أن يبدأ العنوان بـ http:// أو https:// مكتوباً صراحةً: يمكن للحقل أن يملأ جزءاً من العنوان، لكن ليس مخطَّطه (scheme) أبداً.

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

الخيارات الخمسة الأولى تنقل المستخدم — وتترك طريقاً للعودة​

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

ولذلك تحمل الشاشة التي يفتحها الأمر زرّ ← يعود بك إلى حيث جئت. وبتمرير المؤشر عليه يسمّي ذلك المكان — «العودة إلى الحسابات»، أو «العودة إلى الفواتير · شركة نموذجية» حين ضُغط الزر على سجل.

ويجلس حيث يجلس تنقّل تلك الشاشة أصلاً، فيكون دائماً في الركن نفسه:

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

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

وإذا كان في النموذج الذي تغادره تعديلات غير محفوظة سُئلت قبل أن تذهب — وهو السؤال نفسه الذي يطرحه كل مخرج آخر من النموذج.

التقرير الذي يعمل من سجل يطبع ذلك السجل؛ والذي يعمل من قائمة يشمل الجدول كله. لا ينتقل معه بحث القائمة ولا تصفيتها، لأن التقرير يُعنون باسمه هو، والتصفية ليست مما يحمله عنوان. ولتقرير عن مجموعة أضيق، أعطِ التصفية للتقرير نفسه.

متى تكتب نصاً بدلاً من ذلك​

اختر تشغيل نص برمجي فيظهر زر Edit code. الجأ إليه حين يعتمد ما يفعله الزر على شيء لا يعرفه إلا المتصفح: ما كتبه المستخدم، أو الصفوف التي أشّر عليها.

يمكن للنص أن يستدعي:

الاستدعاءما يفعله
getValue(field)القيمة الحالية لحقل على النموذج المفتوح
setValue(field, value)يعيّن حقلاً على النموذج المفتوح (ولا يحفظ)
recordId()معرّف السجل المفتوح، أو ""
selectedCount() / selectedId(index)كم صفاً مؤشَّراً، وأحدها
openRecord(table, id)يفتح سجلاً؛ المعرّف الفارغ يفتح سجلاً جديداً
newRecord(table, { field: value })يفتح سجلاً جديداً مُعبّأة فيه تلك الحقول مسبقاً. لا يُحفظ شيء حتى يضغط المستخدم حفظ
openView(table, view) / openDashboard(name) / openScreen(name) / runReport(name)الحركات نفسها التي يوفّرها الاختيار
openUrl(url)يفتح عنوان http/https في تبويب جديد؛ ويُملأ فيه {field} كما أعلاه
notify(message)يقول شيئاً للمستخدم
refresh()يعيد تحميل ما على الشاشة
save()يضغط حفظ النموذج بعد ما عيّنه النص البرمجي. على النموذج فقط
if (selectedCount() == 0) {
notify("Tick a ticket first.");
} else {
openRecord("par_ticket", selectedId(0));
}

يضع المحرر خطاً تحت الأخطاء أثناء الكتابة ويكمل تلك الدوال — وهو المحرر نفسه الذي تُكتب فيه قاعدة العمل.

هكذا يفتح زر اتصال في المبيعات Teams ومكالمةً هاتفية عن العميل بضغطة واحدة:

openUrl("https://teams.microsoft.com/l/call/0/0?users=4:{telephone1}");
newRecord("pw_activity", {
pw_type: 110000002,
pw_regarding: "contact:" + recordId(),
pw_phone_number: getValue("telephone1")
});

يُملأ البحث الذي يمكن أن يشير إلى عدة جداول بالشكل table:id، كما هو pw_regarding هنا.

ما لا يستطيع الأمر فعله​

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

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

setValue("pw_delivery", 110000001);
save();

ولكل شاشة حدودها، والأمر الذي يطلب أكثر منها يُخبَر بذلك بدل أن يبدو ناجحاً:

  • القائمة لا سجل مفتوح فيها، فلا يفعل setValue شيئاً؛
  • التبويب المرتبط داخل نموذج لا عنوان له، فلا يستطيع التنقل؛
  • النموذج لا يعيد تحميل نفسه عند refresh()، لأنه يحمل تعديلات لم يطلب أحد فقدانها.

كل عنصر في الزر المنسدل يفعل شيئه​

أضف زراً split فتستطيع عناصر قائمته حمل سلوكها الخاص — أحدها يفتح عنوان ويب والآخر ينشئ سجلاً. والعنصر الذي تتركه كما هو يرث سلوك الزر الأصلي.

في قائمة المزيد (…) يكون الزر المنسدل مجموعة: اسمه، وعناصره مدرجة تحته. ولا يكون الاسم نفسه عنصرًا إلا إذا كان للزر عمل خاص به؛ وإلا فهو مجرد عنوان للمجموعة.

وعلى الشريط الأمر نفسه: حين لا يكون للزر المنقسم سلوك خاص به، يفتح الضغط على اسمه قائمته، تمامًا كما يفعل سهمه.

استكشاف الأخطاء​

  • «… لا يفعل شيئاً بعد: لا إجراء له ولا نص برمجي.» — لم يُمنح الزر سلوكاً. اختر واحداً من عند الضغط.
  • «… لم يحدّد ما الذي يفتحه.» — السلوك محدَّد لكن حقله فارغ، أو العنوان ليس http/https. عنوان javascript: مرفوض في كل طبقة، بما في ذلك عند الاستيراد.
  • «… يحتاج إلى …، وهو فارغ في هذا السجل.» — عنوان الويب يسمّي حقلاً لا قيمة فيه. املأ الحقل، أو اضغط الزر على سجل فيه قيمة.
  • «… تعذّر تشغيله: …» — أخفق النص. الرسالة من المفسّر نفسه، والشاشة تواصل العمل.
  • «… طلب شيئاً لا تستطيع هذه الشاشة فعله.» — انظر الحدود أعلاه.
  • فُتح التقرير لكنه يعرض كل السجلات. شُغّل من قائمة، أو من سجل لم يُحفظ قط — فلا سجل يُقصر عليه. افتح السجل أولاً.
  • زر Edit code غير موجود. — الزر يحمل سلوكاً بالفعل. اختر تشغيل نص برمجي ليعود المحرر؛ فسلوكان على زر واحد يعني ضياع أحدهما بصمت.

سيناريوهات ذات صلة​