الجداول
ملاحظة
Microsoft Power Fx هو الاسم الجديد للغة الصيغة لتطبيقات اللوحة. هذه المقالات عبارة عن عمل قيد التقدم حيث نقوم باستخراج اللغة من تطبيقات اللوحة ودمجها مع منتجات Microsoft Power Platform الأخرى وجعلها متوفرة كمصدر مفتوح. ابدأ بـ نظرة عامة على Microsoft Power Fx لمقدمة عن اللغة.
في Microsoft Power Fx، يمكنك كتابة صيغة تصل إلى المعلومات في Microsoft Excel، وSharePoint، وSQL Server، والعديد من المصادر الأخرى التي تخزن البيانات في السجلات والجداول. للعمل بشكل أكثر فعالية مع هذا النوع من البيانات، راجع المفاهيم التي تتبع هذه الهياكل.
- يحتوي السجل على فئة واحدة أو أكثر من المعلومات حول شخص أو مكان أو شيء ما. على سبيل المثال، قد يحتوي سجل على الاسم وعنوان البريد الإلكتروني ورقم الهاتف الخاص بعميل واحد. تشير الأدوات الأخرى إلى سجل على أنه "صف" أو "عنصر".
- يحتوي الجدول على سجل واحد أو أكثر يتضمن فئات المعلومات نفسها. على سبيل المثال، قد يحتوي جدول على الأسماء وعناوين البريد الإلكتروني ورقم الهاتف الخاص بعدد 50 عميل.
يمكنك إنشاء مجموعة متنوعة من الصيغ التي تأخذ اسم جدول كوسيطة، مثل صيغة في Excel تأخذ مرجع خلية واحد أو أكثر كوسيطات. تقوم بعض الصيغ في Power Fx بإرجاع جدول يعكس الوسائط الأخرى التي تحددها. على سبيل المثال، قد تقوم بإنشاء صيغة:
- لتحديث سجل في جدول عن طريق تحديد ذلك الجدول كواحد من الوسيطات المتعددة لوظيفة التصحيح
- لإضافة أعدة وإزالتها وتسميتها في جدول عن طريق تحديد ذلك الجدول كوسيطة للوظيفة AddColumns أو DropColumns أو RenameColumns. لا يقوم أي من تلك الدالات بتعديل الجدول الأصلي. وبدلاً من ذلك، تقوم الدالة بإرجاع جدول آخر استنادًا إلى الوسيطات الأخرى التي تحددها.
يحتوي كل سجل على فئة معلومات واحدة على الأقل لشخص أو مكان أو شيء ما. يوضح المثال أعلاه سجل لكل منتج (شوكولاتة و خبز و ماء) وعمود لكل فئة من المعلومات (السعر و الكمية المتاحة و الكمية عند الطلب).
في الصيغة، يمكنك الرجوع إلى سجل بمفرده، خارج سياق الجدول، باستخدام أقواس متعرجة. على سبيل المثال، لا يقترن هذا السجل { الاسم: "فراولة"، السعر: 7.99 } مع الجدول. لاحظ ان أسماء ذلك الحقل، مثل الاسم و السعر في ذلك المثال، لا تكون محاطة بعلامات اقتباس مزدوجة.
يعتبر الحقل جزءًا فرديًا من المعلومات في أحد السجلات. يمكنك تمثيل هذا النوع من الحقول كقيمة في عمود لسجل محدد.
كما هو الحال مع عنصر التحكم، يمكنك الإشارة إلى حقل من سجل باستخدام عامل التشغيل. على السجل. على سبيل المثال، يرجع First(Products).Name إلى الحقل الاسم في السجل الأول في الجدول منتجات.
يمكن أن يحتوي الحقل على سجل أو جدول آخر، كمثال لما تعرضه الوظيفة GroupBy. يمكنك تضمين أكبر عدد من مستويات السجلات والجداول حسب ما تريد.
يشير العمود إلى الحقل نفسه لسجل واحد أو أكثر في جدول. في المثال السابق، يحتوي كل منتج على حقل السعر ويكون ذلك السعر في العمود نفسه لكافة المنتجات. يحتوي الجدول أعلاه على أربعة أعمدة تظهر أفقيًا عبر الجزء العلوي:
- اسم
- ثمن
- الكمية في متناول اليد
- الكمية عند الطلب
يعكس اسم العمود الحقول الموجودة في ذلك العمود.
تكون كافة القيم الموجودة في عمود من نوع البيانات نفسه. في المثال السابق، دائمًا ما يحتوي العمود "الكمية المتاحة" دائمًا على رقم ولا يمكن أن يحتوي على سلسلة، مثل "12 وحدة" لسجل. وقد تكون قيمة أي حقل فارغة أيضًا.
من المحتمل أن تكون قد أشارت إلى الأعمدة على إنها "حقول" في الأدوات الأخرى.
يتضمن الجدول سجلاً واحدًا أو أكثر، وكل منها يحتوي على العديد من الحقول التي تحتوي على أسماء متسقة عبر السجلات.
يحتوي أي جدول مخزن في مصدر البيانات أو مجموعة على اسم، والذي تستخدمه للإشارة إلى الجدول وتمريره إلى الدالات التي تأخذ جداول كوسيطات. كذلك، يمكن أن تكون الجداول نتيجة الدالة أو الصيغة.
كما هو موضح في المثال التالي، يمكنك التعبير عن جدول في صيغة باستخدام الوظيفة الجدول باستخدام مجموعة من السجلات، التي تعبر عن أقواس متعرجة:
Table( { Value: "Strawberry" }, { Value: "Vanilla" } )
يمكنك أيضًا تعريف جدول بعمود واحد بأقواس مربعة. طريقه مكافئة لكتابة السابق:
[ "Strawberry", "Vanilla" ]
في Excel وPower Fx، إنك تستخدم صيغ لمعالجة الأرقام وسلاسل النص بالطرق المشابهة:
- في Excel، اكتب قيمة، مثل 42، في الخلية A1، ثم اكتب صيغة، مثل A1+2، في خلية أخرى لعرض قيمة 44.
- في Power Apps، قم بتعيين الخاصية افتراضي لـ Slider1 إلى 42ثم قم بتعيين الخاصية النص للتسمية إلى Slider1.Value + 2 لعرض القيمة 44.
وفي كلتا الحالتين، تتغير القيمة المحسوبة تلقائيًا إذا قمت بتغيير قيم الوسيطات (على سبيل المثال، الرقم في الخلية A1 أو القيمة Slider1).
بشكل متشابه، يمكنك استخدام الصيغ للوصول إلى البيانات الموجودة في الجداول والسجلات ومعالجتها. يمكنك استخدام أسماء الجداول كوسيطات في بعض الصيغ، مثل Min(Catalog، السعر) لعرض أقل قيمة في العمود السعر في الجدول الكتالوج. توفر الصيغ الأخرى جداول كاملة كقيم إرجاع، مثل RenameColumns(Catalog, "Price", "Cost")، التي ترجع كافة السجلات من الجدول الكتالوج ولكن تغير اسم العمود من السعر إلى التكلفة.
وكما هو الحال مع الأرقام، تتم إعادة حساب الصيغ التي تتضمن جداول وسجلات تلقائيًا مثل الجدول الأساسي أو تغييرات السجل. إذا تم تخفيض تكلفة منتج في الجدول كتالوج أقل من الحد الأدنى السابق، فستتغير قيمة الإرجاع الخاصة بالصيغة الحد الأدنى تلقائيًا لمطابقتها.
فكر في الوظيفة الأقل. إذا كان المتغير ترحيب يحتوي على سلسلة النص "Hello, World"، تقوم الصيغة Lower( welcome ) بإرجاع "hello, world". لا تقم هذه الصيغة، بأية طريقة، بتغيير القيمة في المتغير. Lower هي دالة خالصة من حيث أنها تعالج المدخلات وتنتج المخرجات فقط. هذا كل شيء، وليس لها أية تأثيرات جانبية. إن كل الوظائف الموجودة في Excel ومعظم الوظائف في Power Fx وظائف خالصة، والتي تسمح بإعادة حساب المصنف أو التطبيق تلقائيًا.
تقدم Power Fx مجموعة من الوظائف التي تعمل على الجداول بالطريقة نفسها. تعتبر هذه الدالات الجداول كإدخال وتصفية وفرز وتحويل وتقليص وتلخيص جداول البيانات بالكامل. وفي الحقيقة، كذلك، يمكن أن تأخذ الوظيفة أدنى والعديد من الوظائف الأخرى، التي تأخذ قيمة واحدة بشكل نموذجي، جدول عمود واحد كإدخال.
تتخذ العديد من الوظائف جدولا من عمود واحد كمدخلات لها. إذا كان الجدول بالكامل يحتوي على عمود واحد فقط، فيمكنك تحديده حسب الاسم. إذا كان الجدول يحتوي على أعمدة متعددة، فإنه يمكنك تحديد تلك الأعمدة باستخدام بناء الجملة Table.Column. على سبيل المثال، يقوم Products.Name بإرجاع جدول العمود الواحد لقيم الاسم من الجدول المنتجات.
يمكنك إعادة تشكيل جدول ومع ذلك، فإنك تريد باستخدام الوظيفة AddColumns أو RenameColumns أو ShowColumns أو DropColumns. مرة أخرى، تقوم هذه الوظائف بتغيير الإخراج فقط، وليس المصدر الخاص بها.
يتم تصميم الوظائف الأخرى خصيصًا لتعديل البيانات والتأثيرات الجانبية. ونظرًا لأن هذه الدالات ليست خالصة، فإنه يجب عليك إنشائها بعناية، ولا يمكنهم المشاركة في إعادة حساب القيم تلقائيًا في التطبيق. يمكنك استخدام هذه الوظائف فقط باستخدام صيغ السلوك.
تعمل بعض الوظائف من خلال تقييم صيغة عبر كافة سجلات الجدول بشكل فردي. يتم استخدام نتيجة الصيغة بعدة طرق:
- توفر AddColumns - الصيغة قيمة الحقل المضاف.
- المتوسط ، الحد الأقصى ، الحد الأدنى ، المجموع ، StdevP ، VarP - الصيغة يوفر القيمة للتجميع.
- عامل التصفية ، البحث - تحدد الصيغة ما إذا كان يجب تضمين السجل في الإخراج.
- تحدد صيغة Concat - السلاسل المراد تسلسلها معا.
- متميز - ترجع الصيغة قيمة تستخدم لتحديد السجلات المكررة.
- ForAll - يمكن ل Formula إرجاع أي قيمة ، مع احتمال حدوث آثار جانبية.
- فرز - توفر الصيغة القيمة لفرز السجلات عليها.
- مع - يمكن أن ترجع الصيغة أي قيمة ، مع احتمال حدوث آثار جانبية.
داخل هذه الصيغ، يمكنك الرجوع إلى حقول السجل التي تمت معالجتها. تعمل كل هذه الدالات على إنشاء "نطاق السجل" الذي يتم فيه تقييم الصيغة، حيث تتوفر حقول السجل كمعرفات المستوى الأعلى. يمكنك أيضًا الإشارة إلى خصائص عنصر التحكم والقيم أخرى من خلال التطبيق الخاص بك.
على سبيل المثال، خذ جدولا بالمنتجات موضوعة في متغير عام:
Set( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
لتحديد ما إذا كان أي من هذه المنتجات تم طلبها أكثر من المتوفر أم لا:
Filter( Products, 'Quantity Requested' > 'Quantity Available' )
إن الوسيطة الأولى المراد تصفيتها هي جدول السجلات التي سيتم تشغيلها، والوسيطة الثانية هي صيغة. ينشئ عامل التصفية نطاق سجل لتقييم هذه الصيغة التي تتوفر فيها حقول كل سجل، وفي هذه الحالة المنتج والكمية المطلوبة والكمية المتوفرة. وتحدد نتيجة المقارنة ما إذا كان يجب تضمين كل سجل في نتيجة الدالة:
إضافة إلى هذا المثال، يمكننا حساب كمية كل منتج تريد طلبه:
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)
وهنا نقوم بإضافة عمود محسوب إلى النتيجة. يحتوي AddColumns على نطاق السجل الخاص به والذي يستخدمه لحساب الفرق بين ما تم طلبه وما هو متاح.
وأخيرًا، يمكنك تقليل جدول النتيجة إلى الأعمدة التي نرغب فيها فقط:
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
لاحظ أنه في السابق، استخدمنا علامات اقتباس مزدوجة (") في بعض المواضع وعلامات اقتباس مفردة (') في مواضع أخرى. علامات الاقتباس المفردة مطلوبة عند الإشارة إلى قيمة كائن، مثل حقل أو جدول، حيث يحتوي اسم الكائن على مسافة. يتم استخدام علامات الاقتباس المزدوجة عندما لا ترجع إلى قيمة كائن ولكن التحدث عنها بدلاً من ذلك، خاصة في الحالات التي يكون فيها الكائن غير موجود بالفعل، كما في الحالة AddColumns.
تتجاوز أسماء الحقول المضافة مع نطاق السجل الأسماء نفسها من أي مكان آخر في التطبيق. وعند حدوث ذلك، لا يزال يمكنك الوصول إلى القيم من خارج نطاق السجل باستخدام عامل تشغيل @ إزالة الغموض:
- للوصول إلى القيم من نطاقات السجلات المتداخلة، استخدم عامل التشغيل @ مع اسم الجدول الذي يتم تشغيله عند استخدام هذا النمط:
الجدول [@ اسم الحقل] - للوصول إلى القيم العمومية، مثل مصادر البيانات والمجموعات ومتغيرات السياق، استخدم النمط [@ObjectName] (دون تعيين جدول).
إذا كان الجدول الذي يتم التشغيل بناء عليه عبارة عن تعبير، مثل Filter(Table، ... )، عندئذٍ يتعذر استخدام عامل تشغيل إزالة الغموض. يمكن فقط لنطاق السجل الأعمق الوصول إلى الحقول من تعبير الجدول هذا، وذلك بعدم استخدام عامل تشغيل إزالة الغموض.
على سبيل المثال، تصور وجود مجموعة X:
يمكنك إنشاء هذه المجموعة باستخدام ClearCollect( X, [1, 2] ).
أضف مجموعة أخرى Y:
يمكنك إنشاء هذه المجموعة باستخدام ClearCollect( Y, ["A", "B"] ).
بالإضافة إلى ذلك، قم بتعريف متغير سياق يسمى القيمة باستخدام هذه الصيغة: UpdateContext( {Value: "!"} )
لنقم بوضعها جميعًا معًا. في هذا السياق، تكون الصيغة التالية:
Ungroup(
ForAll( X,
ForAll( Y,
Y[@Value] & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
ينتج هذا الجدول:
ما الذي يحدث هنا؟ تقوم الوظيفة ForAll بتحديد نطاق سجل لـ X، مما يسمح بالوصول إلى الحقل القيمة لكل سجل أثناء معالجتها. ويمكن الوصول إليه ببساطة باستخدام الكلمة القيمة أو باستخدام X[@Value].
تحدد الوظيفة ForAll نطاق سجل آخر لـ Y. لأن هذا الجدول يحتوي كذلك على حقل القيمة محدد، باستخدام القيمة هنا التي تشير إلى الحقل في سجل Yولم يعد السجل من X. هنا، للوصول إلى الحقل القيمة الخاص بـ X، ويجب علينا استخدام الإصدار الأطول بعامل تشغيل إزالة الغموض
وحيث أن Y هو نطاق السجل الأعمق، فإن الوصول إلى الحقول لهذا الجدول لا يتطلب إزالة الغموض، مما يسمح لنا باستخدام هذه الصيغة بالنتيجة نفسها:
Ungroup(
ForAll( X,
ForAll( Y,
Value & Text( X[@Value] ) & [@Value]
)
),
"Value"
)
تتجاوز جميع نطاقات السجل ForAll النطاق العمومي. لا يتوفر متغير سياق القيمة الذي حددناه حسب الاسم دون عامل تشغيل إزالة الغموض. للوصول إلى هذه القيمة، استخدم [@Value].
يؤدي فك التجميع إلى تسوية النتيجة لأن دالات ForAll المتداخلة تؤدي إلى جدول نتائج متداخل.
للعمل على عمود واحد من جدول، استخدم الدالة ShowColumns كما هو موضح في هذا المثال:
ShowColumns( Products, "Product" )
تنتج هذه الصيغة جدول العمود الواحد هذا:
للحصول على بديل أقصر، حدد Table.Column، الذي يستخرج جدول العمود الواحد فقط في عمود من الجدول. على سبيل المثال، تنتج هذه الصيغة النتيجة نفسها عند استخدام ShowColumns.
Products.Product
إنك تقوم بتخصيص السجلات باستخدام أقواس متعرجة تحتوي على قيم الحقول التي تمت تسميتها. على سبيل المثال، يمكنك تخصيص السجل الأول في الجدول في بداية هذا الموضوع باستخدام هذه الصيغة:
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }
يمكنك أيضًا دمج الصيغ داخل صيغ أخرى، كما يوضح هذا المثال:
{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }
يمكنك تضمين السجلات عن طريق تضمين الأقواس المتعرجة، كما يوضح هذا المثال:
{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }
قم بإحاطة كل اسم عمود يحتوي على حرف خاص، مثل مسافة أو نقطتان، في علامتي اقتباس مفردة. لاستخدام عرض أسعار مفرد داخل اسم عمود، انقر فوقه نقرًا مزدوجًا.
لاحظ أن القيمة الموجودة في العمود السعر لا تتضمن رمز العملة، مثل علامة الدولار. يتم تطبيق هذا التنسيق عند عرض القيمة.
يمكنك إنشاء جدول باستخدام الوظيفة الجدول ومجموعة السجلات. يمكنك تخصيص الجدول في بداية هذا الموضوع باستخدام هذه الصيغة:
Table(
{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 }
)
يمكنك أيضًا تضمين الجداول:
Table(
{ Name: "Chocolate",
'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
{ Quarter: "Q2", OnHand: 18, OnOrder: 0 } )
}
)
يمكنك إنشاء جداول بعمود واحد عن طريق تحديد قيم في أقواس مربعة. يحتوي الجدول الناتج على عمود واحد، باسم قيمة.
على سبيل المثال، [ 1, 2, 3, 4 ]
يكافئ Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )
ويقوم بإرجاع هذا الجدول: