แชร์ผ่าน


ฟังก์ชัน ForAll

ใช้กับ: แอปพื้นที่ทำงาน โฟลว์เดสก์ท็อป แอปแบบจำลอง Power Platform CLI

คำนวณค่าและดำเนินการสำหรับ เรกคอร์ด ทั้งหมดใน ตาราง

คำอธิบาย

ฟังก์ชัน ForAll จะประเมินสูตรสำหรับเรกคอร์ดทั้งหมดในตาราง สูตรสามารถคำนวณค่าและ/หรือทำการดำเนินการ เช่น การปรับเปลี่ยนข้อมูล หรือการทำงานกับการเชื่อมต่อ ใช้ ฟังก์ชัน With เพื่อประเมินสูตรสำหรับเรกคอร์ดเดียว

ใช้ ฟังก์ชัน Sequence กับฟังก์ชัน ForAll เพื่อทำซ้ำตามการนับ

ฟิลด์ของเรกคอร์ดที่กำลังประมวลผลอยู่สามารถใช้งานได้ภายในสูตร ใช้ ตัวดำเนินการ ThisRecord หรือเพียงแค่อ้างอิงชื่อของฟิลด์เหมือนที่คุณทำกับค่าอื่น ตัวดำเนินการ Asยังสามารถใช้เพื่อตั้งชื่อเรกคอร์ดที่กำลังประมวลผล ซึ่งสามารถช่วยให้สูตรของคุณง่ายต่อการเข้าใจมากขึ้น และทำให้สามารถเข้าถึงเรกคอร์ดที่ซ้อนกันได้ สำหรับข้อมูลเพิ่มเติม ดูตัวอย่างด้านล่างและ การทำงานกับขอบเขตเรกคอร์ด

ค่าที่ส่งกลับ

จะส่งกลับผลลัพธ์ของการประเมินแต่ละสูตรในตาราง ตามลำดับเดียวกับตารางข้อมูลขาเข้า

ถ้าผลลัพธ์ของสูตรเป็นค่าเดียว ตารางผลลัพธ์จะเป็นตารางคอลัมน์เดียว ถ้าผลลัพธ์ของสูตรเป็นตาราง ตารางผลลัพธ์จะมีเรกคอร์ดที่มีคอลัมน์เดียวกับเรกคอร์ดผลลัพธ์

ถ้าผลลัพธ์ของสูตรเป็นค่า ว่างเปล่า จะไม่มีเรกคอร์ดอยู่ในตารางผลลัพธ์สำหรับเรกคอร์ดขาเข้านั้น ในกรณีนี้ จะมีเรกคอร์ดในตารางผลลัพธ์น้อยกว่าตารางต้นฉบับ

ทำการดำเนินการ

สูตรสามารถมีฟังก์ชันที่ทำการดำเนินการ เช่น การปรับเปลี่ยนเรกคอร์ดของแหล่งข้อมูล ด้วยฟังก์ชัน Patch และ Collect สูตรยังสามารถเรียกวิธีการเชื่อมต่อได้ สามารถทำการดำเนินการหลายอย่างได้ต่อหนึ่งเรกคอร์ด โดยการใช้ ตัวดำเนินการ ; คุณไม่สามารถปรับเปลี่ยนตารางที่เป็นชื่อเรื่องของฟังก์ชัน ForAll ได้

เมื่อเขียนสูตรของคุณ ให้จำไว้ว่าสามารถดำเนินการเรกคอร์ดตามลำดับใดก็ได้ เมื่อเป็นไปได้ พร้อมๆ กัน เรกคอร์ดแรกของตารางอาจได้รับการดำเนินการหลังจากเรกคอร์ดสุดท้าย

ใช้ความระมัดระวังเพื่อหลีกเลี่ยงการเรียงลำดับที่ขึ้นต่อกัน ด้วยเหตุนี้ คุณจึงไม่สามารถใช้ฟังก์ชัน UpdateContextClear และ ClearCollect กับฟังก์ชัน ForAll ได้ เนื่องจากอาจถูกใช้ในการระงับตัวแปรที่ทำให้ผลลัพธ์นี้เปลี่ยนแปลงได้ง่าย คุณสามารถใช้ Collect ได้ แต่จะไม่สามารถระบุลำดับการเพิ่มเรกคอร์ดได้

หลายๆ ฟังก์ชันที่ปรับเปลี่ยนแหล่งข้อมูล รวมถึง CollectRemove และ Update จะส่งกลับแหล่งข้อมูลที่เปลี่ยนแปลงเป็นค่าที่ส่งกลับ ค่าที่ส่งกลับเหล่านี้มีจำนวนมากและใช้แหล่งข้อมูลอย่างมาก ถ้าถูกส่งกลับสำหรับทุกเรกคอร์ดของตาราง ForAll นอกจากนี้ คุณยังอาจพบว่าค่าที่ส่งกลับไม่ได้เป็นค่าที่คุณคาดหวังไว้ เนื่องจาก ForAll สามารถดำเนินการพร้อมกันและอาจแยกผลข้างเคียงของฟังก์ชันเหล่านี้จากการรับผลลัพธ์ ถ้าค่าที่ส่งกลับจาก ForAll ไม่ได้ถูกใช้งาน ซึ่งมักจะเกิดขึ้นกับฟังก์ชันการปรับเปลี่ยนข้อมูล ค่าที่ส่งกลับจะไม่ถูกสร้างขึ้นและไม่ต้องกังวลถึงแหล่งข้อมูลหรือการเรียงลำดับ แต่ถ้าคุณกำลังใช้ผลลัพธ์ของ ForAll และหนึ่งในฟังก์ชันที่ส่งกลับแหล่งข้อมูล ให้คำนึงเกี่ยวกับวิธีการจัดโครงสร้างผลลัพธ์และลองใช้กับชุดข้อมูลขนาดเล็กก่อน

ทางเลือก

หลายๆ ฟังก์ชันใน Power Apps สามารถดำเนินการได้มากกว่าหนึ่งค่าพร้อมกัน ด้วยการใช้ตารางคอลัมน์เดียว ตัวอย่างเช่น ฟังก์ชัน Len สามารถดำเนินการตารางของค่าข้อความ ส่งกลับตารางความยาว ด้วยวิธีเดียวกับ ForAll คุณจึงไม่จำเป็นต้องใช้ ForAll ในหลายกรณี สามารถทำงานได้อย่างมีประสิทธิภาพมากขึ้น และอ่านได้ง่ายยิ่งขึ้น

ข้อควรพิจารณาอื่นๆ คือ ForAll ไม่สามารถรับมอบสิทธิ์ได้ ขณะที่ฟังก์ชันอื่นๆ เช่น Filter สามารถทำได้

การมอบหมาย

เมื่อใช้กับแหล่งข้อมูล ฟังก์ชันนี้ไม่สามารถมอบสิทธิ์ เฉพาะแหล่งข้อมูลส่วนแรกเท่านั้นที่จะมีการเรียกข้อมูลแล้วมีการนำฟังก์ชันไปใช้ ผลลัพธ์อาจไม่แสดงข้อมูลการดำเนินการทั้งหมด คำเตือนอาจปรากฏในเวลาที่มีการสร้างเพื่อเตือนคุณเกี่ยวกับการจำกัดนี้และแนะนำให้สลับไปยังรายการอื่นที่สามารถมอบสิทธิ์ได้ หากสามารถทำได้ สำหรับข้อมูลเพิ่มเติม ดูที่ ภาพรวมของการมอบสิทธิ์

ไวยากรณ์

ForAll( Table, Formula )

  • Table - จำเป็น ตารางที่จะดำเนินการ
  • สูตร – จำเป็น สูตรที่จะประเมินสำหรับเรกคอร์ดทั้งหมดของ ตาราง

ตัวอย่าง

การคำนวณ

ตัวอย่างต่อไปนี้ใช้ แหล่งข้อมูลSquares:

ตัวอย่างของสี่เหลี่ยม

เมื่อต้องการสร้างแหล่งข้อมูลนี้เป็นคอลเลกชัน ให้ตั้งค่าคุณสมบัติ OnSelect ของตัวควบคุม ปุ่ม ในสูตรนี้ เปิดโหมดแสดงตัวอย่าง แล้วเลือกปุ่ม:

ClearCollect( Squares, [ "1", "4", "9" ] )

สูตร คำอธิบาย ผลลัพธ์
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
สำหรับทุกเรกคอร์ดของตารางขาเข้า จะคำนวณรากที่สองของคอลัมน์ ค่า คุณยังสามารถใช้ฟังก์ชัน Sqrt กับตารางคอลัมน์เดียวได้ ซึ่งทำให้สามารถทำตามตัวอย่างนี้ได้โดยไม่ต้องใช้ ForAll ตัวอย่างของ Sqrt
ForAll( Squares, Power( Value, 3 ) ) สำหรับทุกเรกคอร์ดของตารางขาเข้า จะเพิ่มคอลัมน์ ค่า เป็นจำนวนยกกำลังสาม ฟังก์ชัน Power ไม่สนับสนุนตารางคอลัมน์เดียว ดังนั้น ต้องใช้ ForAll ในกรณีนี้ ตัวอย่าง Power

การใช้การเชื่อมต่อ

ตัวอย่างต่อไปนี้ใช้ แหล่งข้อมูลExpressions:

ตัวอย่างของนิพจน์

เมื่อต้องการสร้างแหล่งข้อมูลนี้เป็นคอลเลกชัน ให้ตั้งค่าคุณสมบัติ OnSelect ของตัวควบคุม ปุ่ม ในสูตรนี้ เปิดโหมดแสดงตัวอย่าง แล้วเลือกปุ่ม:

ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

ตัวอย่างนี้ยังใช้การเชื่อมต่อ Microsoft Translator เมื่อต้องการเพิ่มการเชื่อมต่อนี้ไปยังแอปของคุณ ให้ดูบทความเกี่ยวกับวิธี จัดการการเชื่อมต่อ

สูตร คำอธิบาย ผลลัพธ์
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) สำหรับทุกเรกคอร์ดในตาราง Expressions จะแปลเนื้อหาของคอลัมน์ ค่า เป็นภาษาสเปน (ตัวย่อ "es") ตัวอย่างที่มีค่า
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) สำหรับทุกเ่รกคอร์ดในตาราง Expressions จะแปลเนื้อหาของคอลัมน์ ค่า เป็นภาษาฝรั่งเศส (ตัวย่อ "fr") ตัวอย่างที่มีค่า

การคัดลอกตาราง

ในบางครั้ง คุณต้องกรองข้อมูล รูปร่าง เรียงลำดับ และจัดการ Power Apps มีฟังก์ชันมากมายสำหรับการทำเช่นนี้ เช่น FilterAddColumns และ Sort Power Apps จะระบุแต่ละตารางเป็นค่า ทำให้ทำงานกับสูตรและใช้งานได้อย่างง่ายดาย

และบางครั้งคุณต้องการทำสำเนาของผลลัพธ์นี้เพื่อใช้ในภายหลัง หรือคุณต้องการย้ายข้อมูลจากแหล่งข้อมูลหนึ่งไปยังอีกรายการหนึ่ง Power Apps มีฟังก์ชัน Collect สำหรับคัดลอกข้อมูล

แต่ก่อนที่คุณจะทำสำเนา ให้คิดอย่างรอบคอบว่าจำเป็นหรือไม่ สามารถจัดการหลายๆ สถานการณ์ได้โดยการกรองและการจัดรูปร่าง แหล่งข้อมูลที่เกี่ยวข้องตามความต้องการด้วยสูตร ข้อเสียบางอย่างของการทำสำเนา ได้แก่:

  • สำเนาสองฉบับที่มีข้อมูลเดียวกันอาจทำให้หนึ่งฉบับมีข้อมูลไม่ตรงกัน
  • การทำสำเนาอาจใช้หน่วยความจำของคอมพิวเตอร์ แบนด์วิดท์ และ/หรือเวลาอย่างมาก
  • สำหรับแหล่งข้อมูลส่วนใหญ่ การทำสำเนาไม่สามารถรับมอบสิทธิ์ได้ ซึ่งจำกัดปริมาณข้อมูลที่สามารถย้ายได้

ตัวอย่างต่อไปนี้ใช้ แหล่งข้อมูลผลิตภัณฑ์:

ตัวอย่างแหล่งข้อมูลผลิตภัณฑ์

เมื่อต้องการสร้างแหล่งข้อมูลนี้เป็นคอลเลกชัน ให้ตั้งค่าคุณสมบัติ OnSelect ของตัวควบคุม ปุ่ม ในสูตรนี้ เปิดโหมดแสดงตัวอย่าง แล้วเลือกปุ่ม:

ClearCollect( 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 }
    )
)

เป้าหมายของเราคือการทำงานกับตารางที่คัดลอกมาที่มีเฉพาะรายการที่มีปริมาณที่ขอมากกว่าปริมาณที่พร้อมใช้งาน และตารางที่เราต้องการสร้างคำสั่งซื้อ:

ตัวอย่างตารางอนุพันธ์

เราสามารถดำเนินการงานนี้ได้ด้วยสองวิธี โดยทั้งสองวิธีจะให้ผลลัพธ์เดียวกัน และมีข้อดีและข้อเสียต่างกัน

การจัดรูปทรงตารางตามความต้องการ

ไม่ต้องทำสำเนา! เราสามารถใช้สูตรต่อไปนี้ที่ใดก็ตามที่เราต้องการ:

// Table shaping on demand, no need for a copy of the result
ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

ขอบเขตเรกคอร์ด จะถูกสร้างขึ้นด้วยฟังก์ชัน Filter และ AddColumns เพื่อทำการเปรียบเทียบและการลบตามลำดับ ด้วยฟิลด์ 'ปริมาณที่ขอ' และ 'ปริมาณที่พร้อมใช้งาน' สำหรับแต่ละเรกคอร์ด

ในตัวอย่างนี้ ฟังก์ชัน Filter สามารถรับมอบสิทธิ์ได้ ซึ่งเป็นสิ่งสำคัญ เนื่องจากสามารถค้นหาผลิตภัณฑ์ทั้งหมดที่ตรงกับเกณฑ์ แม้ว่าจะเป็นเพียงไม่กี่เรกคอร์ดจากหลายล้านเรกคอร์ดในตาราง ในขณะนี้ ShowColumns และ AddColumns ไม่สามารถรับมอบสิทธิ์ได้ ดังนั้น จำนวนผลิตภัณฑ์จริงที่จำเป็นต้องสั่งซื้ออาจถูกจำกัด ถ้าคุณทราบว่าขนาดของผลลัพธ์นี้มีขนาดเล็กเสมอ สามารถใช้วิธีนี้ได้

และเนื่องจากเราไม่ได้ทำสำเนา จึงไม่มีสำเนาอื่นๆ ของข้อมูลที่ต้องจัดการหรือล้าสมัย

ForAll ตามความต้องการ

วิธีอื่นๆ คือการใช้ฟังก์ชัน ForAll ในการแทนที่ฟังก์ชันจัดรูปร่างตาราง:

ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        {
            Product: Product,
            'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
        }
    )
)

สูตรนี้อาจทำให้ผู้ใช้บางส่วนอ่านและเขียนได้ง่ายยิ่งขึ้น

ไม่มีส่วนของ ForAll ที่สามารถรับมอบสิทธิ์ได้ เฉพาะส่วนแรกของตาราง ผลิตภัณฑ์ จะถูกประเมิน ซึ่งอาจเกิดปัญหาขึ้นได้ถ้าตารางนี้มีขนาดใหญ่ เนื่องจาก Filter อาจได้รับมอบสิทธิ์ในตัวอย่างก่อนหน้า จึงสามารถทำงานได้ดียิ่งขึ้นกับชุดข้อมูลขนาดใหญ่

รวบรวมผลลัพธ์

ในบางสถานการณ์ อาจต้องใช้สำเนาข้อมูล คุณอาจต้องย้ายข้อมูลจากแหล่งข้อมูลหนึ่งไปยังอีกแหล่งข้อมูลหนึ่ง ในตัวอย่างนี้ คำสั่งซื้อจะถูกสร้างขึ้นในตาราง NewOrder บนระบบของผู้จัดจำหน่าย สำหรับการโต้ตอบความเร็วสูงกับผู้ใช้ คุณอาจต้องแคชสำเนาตารางในเครื่อง เพื่อให้ไม่มีเวลาแฝงของเซิร์ฟเวอร์

เราใช้การจัดรูปร่างตารางแบบเดียวกับสองตัวอย่างก่อนหน้า แต่เราจะเก็บผลลัพธ์ไว้ในคอลเลกชัน:

ClearCollect( NewOrder,
    ShowColumns(
        AddColumns(
            Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
            "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
        ),
        "Product",
        "Quantity To Order"
    )
)
ClearCollect( NewOrder,
    ForAll( Products,
        If( 'Quantity Requested' > 'Quantity Available',
            {
                Product: Product,
                'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
            }
        )
    )
)

ClearCollect และ รวบรวม ไม่สามารถรับมอบสิทธิ์ได้ ทำให้ปริมาณข้อมูลที่สามารถย้ายได้ด้วยวิธีนี้ถูกจำกัด

รวบรวมภายใน ForAll

สุดท้าย เราสามารถดำเนินการ รวบรวม ได้โดยตรงภายใน ForAll:

Clear( NewOrder );
ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        Collect( NewOrder,
            {
                Product: Product,
                'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
            }
        )
    )
)

เน้นย้ำอีกครั้งว่าฟังก์ชัน ForAll ไม่สามารถรับมอบสิทธิ์ได้ในขณะนี้ ถ้าตาราง ผลิตภัณฑ์ มีขนาดใหญ่ ForAll จะดูที่เรกคอร์ดชุดแรกเท่านั้น และเราอาจพลาดผลิตภัณฑ์บางอย่างที่จำเป็นต้องสั่งซื้อ แต่สำหรับตารางที่เราทราบว่าจะมีขนาดเล็กเสมอ สามารถใช้วิธีนี้ได้

โปรดทราบว่าเราจะไม่จัดเก็บผลลัพธ์ของ ForAll จะเรียกใช้ฟังก์ชัน Collect จากภายใน และจะส่งกลับแหล่งข้อมูล NewOrder สำหรับทุกเรกคอร์ด ซึ่งอาจเพิ่มข้อมูลจำนวนมาก ถ้าเราจะจัดเก็บ

แมปตารางในส่วนประกอบ

ดูที่ แมปตาราง