การ run ตัว Flow ที่ trigger จาก Flow หลักใน Power Automates (Child Flow & Parent Flow)
Content difficulty — Technical
วันที่จะมาว่ากันด้วยแนวทางการแก้จำนวน Action ของ Power Automate (หรือ Azure Logic Apps) ครับซึ่งในแต่ละ flow จะมี limit ตัว Action ให้สร้างได้แค่ที่ 500 ตัวครับ ถ้าเกินกว่านั้นก็จะไม่สามารถสร้างเพิ่มได้
คราวนี้ถ้า requirement ของเรามีความ complex มากจริงๆ เช่นการทำ sequential approval ว่าคนแรก approve เสร็จมาคนสองต่อ ตัว action ก็อาจจะเกินได้ (ในกรณีเราทำการ loop หลายๆครั้งด้วย) แล้วก็ยังมี limit ในส่วนของการทำ approval ซ้อน approval อีกใน condition ซ้อนๆกัน (Nested condition) ก็จะมี limit อยู่ที่ 8 ชั้น เพราะฉะนั้นถ้ามีคนที่เก้าก็อาจจะเพิ่มมาไม่ได้
สำหรับ limitation ทั้งหมดของ Power Automate ดูได้ที่ https://docs.microsoft.com/en-us/power-automate/limits-and-config
ซึ่งก็เป็นที่มาของการทำ Child flow เอามาแก้โจทย์ให้ trigger จาก flow หลักไป flow อื่นได้ ทำให้เราสามารถลดความซับซ้อนใน flow หลักด้วย เนื่องจากจำนวน action ที่เยอะเกินถ้าเราใช้ Child flow แล้วเราก็อาจจะลด action ใน flow หลัก แล้วยกไป flow อื่นๆได้ ผลคือเกิด performance ที่ดีขึ้นหรือ บริหารจัดการ debug ได้ง่ายและแก้ 500 actions limit
Requirements
การสร้าง Child Flow เราจะใช้ Action ของการไปสั่ง trigger ตัว Child Flow ใน Power Automate แต่การที่เราจะใช้ได้จะต้อง group ตัว flow ทั้งตัวหลัก (Parent Flow) และตัวที่มา run ต่อ (Child Flow) ไปในสิ่งที่เรียกว่า Solutions ซะก่อน ซึ่ง concepts ของ Solutions บน Power Platforms จะซับซ้อนซักหน่อย แต่ main idea คือเราสามารถ group ตัว services ซึ่งอาจจะประกอบด้วย Apps ของ Power Apps, Flows, Connectors หรือ schema ของ Dataverse ใน Environment เราตั้งเป็น Solutions รวมถึงการที่เราสามารถตั้ง Versioning ของ Solutions เพื่อสามารถ deploy ไปยัง Environment อื่นๆทั้งในและนอก Office 365 tenant ได้เหมาะสำหรับในกรณีการทำ DevOps ของ Power Platform เพราะไม่งั้นเราต้อง Export/Import ตัว flow หรือ Apps ที่มี dependency กันแบบ manual
สมมุติว่าผมต้องการทำ Flow สองอันมีชื่อว่า
1 Parent Flow test (Form attachment) ที่มาจากตอนที่แล้วซึ่งเป็น Microsoft Form request ที่ให้ user มากรอกเพื่อขอ claim เงิน ซึ่งสามารถแนบหลักฐานไปใน Form ได้และมีการทำ Approval
ตอนที่แล้วสามารถดูได้ที่ https://link.medium.com/Gj77YLoOyeb
2 child flow test ตัวที่จะมา run ต่อจาก flow ตัวแรก
เรามาสร้าง Solution ก่อนในหน้าของ https://flow.microsoft.com/
ซึ่งในตัวอย่างนี้ จะสร้าง Solutions บน Default Environment ที่มี user permissionในการสร้าง
ใส่ชื่อของ Solutions และสร้าง Publisher ของเราใหม่ด้วยชื่อ Display Name และ Prefix
Prefix จะคล้ายๆชื่อ schema ที่ใช้บน Dataverse (คล้ายๆพวก dbo. ของ SQL) ซึ่งในตัวอย่างนี้ไม่ได้เน้นก็ขอให้ใส่ไปก่อน อย่างอื่นเป็น Default
สร้าง Child Flow
ให้เราสร้าง Child flow ขึ้นมาภายใน Solution
โดย trigger จะเป็น Manually trigger a flow แล้วก็จะมี parameter ที่รอรับจาก Parent flow ซึ่งเราก็ต้องมาคิดโจทย์เราว่า เราต้องการค่า parameter อะไรมาใส่เป็น input เพื่อ run ตัว Child flow
เช่นในกรณีนี้
สมมุติว่ามีโจทย์คือ มีตัว Parent คือ approver คนแรก ถ้าทำการ approve ให้ส่งไป Child flow ในนั้นเป็น approver คนที่สอง
การที่ Child flow จะ run เพื่อไปหา approver คนที่สอง กรณีนี้คนที่สองก็คงอยากจะเห็น Content ใน Form ของที่ user กรอกมาเหมือนคนแรก เช่นว่าเขาขอ Request วันไหน เป็นใคร หรือ แนบไฟล์อะไรมา
ซึ่งการที่เราจะดึง content จาก Form นั้นมาได้ เราก็ต้องหาว่าเป็น From ID ที่เท่าไหร่ในระบบ กรณีนี้ค่าของ Form ID ใน Action ของ Power Automate จะเรียกว่า Response Id (คือทุกครั้งที่คนไปตอบ Microsoft Form แต่ละครั้งมันก็จะเก็บคำตอบคนกรอกและนับ Response Id ของแต่ละคนไว้เพื่ออ้างอิง) เพราะฉะนั้น parameter แรกคือ Response Id (ซึ่งเป็นประเภท Integer ไม่ใช่ String) ส่วน parameter อันสองอาจจะเก็บชื่อคน หรือ comment ของ คน approve คนแรกหรืออื่นๆก็แล้วแต่สะดวก
นอกจาก Manually trigger a flow แล้วใช้ trigger เช่น จากปุ่ม Power Apps หรือ When an HTTP request is received ก็ trigger Child flow ได้เช่นกัน
หลังจากนั้นก็สร้าง Action ตามที่ต้องการใน Child Flow เช่นผมเอา Respond Id ของ Microsoft Form มาเพื่อเอา content ของคนที่กรอก Form ว่า กรอกไรไป แนบไฟล์อะไรบ้าง ในกรณีเอาไฟล์แนบก็ไป Get file content ตามปกติเพื่อส่งเมล์ไปให้ approver คนที่สอง ซึ่งรายละเอียดการสร้าง Flow ก็จะเหมือนกับตอนที่แล้ว
เมื่อเราเสร็จแล้วสุดท้ายของ Child Flow ให้เราเพิ่มไป 1 Action คือ Respond to a PowerApp or flow ในกรณีนี้ก็ลอก parameter แบบอันต้นให้เป็น Output
ให้ save flow แล้วออกมาที่หน้าของการ manage flow จากนั้นไปแก้ในส่วนของ run only ใน Connector ออกให้หมด
สร้าง Parent Flow
เราสามารถสร้าง Flow ใหม่แบบตอนที่สร้าง Child Flow ได้เลยหรือเราจะ import จากที่เราเคยสร้าง ซึ่งจากหน้า Solution เราสามารถ import ตัว cloud flow ของเราที่มีอยู่แล้วนอก Solutions เข้ามาใน Solutions นี้ได้ (ยกเว้น Flow ที่มี trigger ประเภท Instant flow)
จากนั้นเราก็สร้าง Flow โดยการ add trigger และ action ตามปกติ หรือถ้า import มาก็ไป edit flow โดยใน step สุดท้าย (หรือหลังจาก step ที่เราต้องการจะไป trigger ตัว Child flow) เราจะ add action ชื่อ Run a Child Flow เข้ามาในกรณีนี้จะสั่งให้ run ตัว Child flow มาเมื่อ approver คนแรกทำการ approve
ถ้า Flow ไม่ได้อยู่ใน Solutions เราจะหา action นี้ไม่เจอ
เมื่อเราเลือก action แล้วก็เลือกชื่อของ Child Flow จากนั้นตัว parameter ที่ required ก็จะโผล่ขึ้นมาเราก็ใส่ dynamic content ตามเราต้องการที่จะส่งไป Child Flow จากนั้นก็ Save แล้วลอง run
ถ้า Child flow run แล้ว Failed อาจจะทำให้ Parent Flow มี Status เป็น failed ไปด้วย
ถ้า Save แล้วขึ้น error แล้วเราคิดว่าเราได้ทำในส่วนของ Run only user และ Respond to a PowerApp or flow ไปแล้วอันนี้อาจจะเป็น bug ของ Power Automate ซึ่งมีปัญหากับการ import flow ที่เรามีอยู่แล้วจากนอก Solutions
ทางแก้คือเราต้องสร้าง Parent Flow เองใหม่จากในหน้า Solutions