Translytical task flows
Translytical Task Flow ฟีเจอร์ที่ช่วยให้คุณแก้ไขข้อมูลบน Database เรียลไทม์แบบง่ายๆ ด้วย Power BI

หลายคนที่ใช้ Power BI น่าจะเคยเผชิญกับปัญหาที่เราอัพเดทข้อมูลเรียบร้อย แล้วต้องมารีเฟรชข้อมูลอีกครั้งเพื่อให้ข้อมูลที่แก้ไขไปอัพเดทในรีพอร์ท แต่ยิ่งเรามีการแก้ไขข้อมูลบ่อยๆ อาจจะทำให้เราต้องมากดรีเฟรชแล้วเช็คตลอดเวลา แต่จะดีกว่าไหม ถ้าวันนี้เราสามารถกดอัพเดทจากหน้ารีพอร์ทได้ทันที
สมัยก่อนตอนผมทำงานเกี่ยวกับระบบ Create Read Update Delete (CRUD ) สำหรับแอพทั่วไป ผมจะต้องไปเขียน script เพื่อเชื่อมต่อกับ Database แล้วใช้ ORM ในการอัพเดทข้อมูลต่างๆ โดยที่หน้าแอพก็จะต้องมีการเพิ่มข้อมูลชุดนั้นให้ผู้ใช้งานเห็นด้วย มันจะเป็นการจัดการที่ใช้เวลาประมาณนึง ยังไม่นับการออกแบบระบบ และวิธีการ query ข้อมูลมาใช้งานอีก
บทความนี้ผมจะเล่าถึงวิธีการทำงานเกี่ยวกับการใช้ Transyltical Task Flows ในการจัดการแก้ไขข้อมูลบน Microsoft Power BI แต่อาจจะมีการใช้งาน Microsoft Fabric เล็กน้อย ถ้าพร้อมแล้วเรามาลุยกันเลย
ระบบการประมวลผลข้อมูล
ก่อนอื่นผมขอแนะนำ แนวคิดเกี่ยวกับระบบการจัดการและการประมวลผลข้อมูล ที่ Data Engineer จะออกแบบระบบให้เหมาะสมกับการใช้งานแต่ละแบบ
- OLTP ( Online Transaction Processing ) หมายถึงระบบการประมวลผลที่เหมาะสำหรับข้อมูลที่ต้องการความรวดเร็วในการประมวลผล ในการสร้าง อ่าน แก้ไข และลบข้อมูล (CRUD) กับ Transaction ที่เกิดขึ้นภายในเว็บไซต์ / แอพพลิเคชั่น ผ่านการเรียก API
โดยส่วนมาก OLTP จะนิยมใช้กับ Database ที่เป็น Relational Model หรือ RDBMS อย่างเช่น Mysql , SQL Server , Postgres Sql เนื่องจากมีความสามารถประมวลผลที่ค่อนข้างเร็ว
สาเหตุที่ OLTP มีประสิทธิภาพโดดเด่นในงานด้าน CRUD เนื่องจากคุณสมบัติของ Row-Oriented Database ที่จะมีการเขียนข้อมูลลงใน Storage ลงทีละแถว เมื่อเสร็จสิ้นแล้วจึงจะเริ่มเขียนข้อมูลในแถวถัดไป
ประสิทธิภาพในการอ่านข้อมูลของ OLTP ยิ่งข้อมูลมีความซับซ้อน หรือต้องใช้การคำนวณ ประสิทธิภาพการทำงานจะลดลงเมื่อเทียบกับอีกแบบ - OLAP (Online Analytical Processing) หมายถึง ระบบประมวลผลข้อมูลที่ใช้สำหรับการวิเคราะห์ข้อมูลที่เกิดขึ้นในอดีตจะถึง (เกือบ) ปัจจุบัน โดยจะต้องมีคุณสมบัติการจัดการที่ช่วยให้เรา Query ขนาดใหญ่ได้รวดเร็วขึ้น นิยมใช้ในงานออกแบบ Report , Dashboard เพื่อหา Insight ของข้อมูล
OLAP จะมีความสามารถในการคำนวณ มากกว่าการทำ CRUD เมื่อเทียบกับโครงสร้างของ Database ทั่วไป เราจะเรียก Database ของ OLAP ว่า Data Warehouse เช่น Google Bigquery , Snowflake
สาเหตุที่ OLAP เหมาะสมกับงานด้านการคำนวณ เนื่องจากคุณสมบัติของ Column-oriented โดยจะเขียนข้อมูลทุกคอลัมน์ให้ครบ ก่อนที่จะเริ่มคอลัมน์ถัดไป และในงานด้าน Analytics ส่วนมากเราจะไม่ได้เลือกทุกคอลัมน์มาแสดงผล หรือคำนวณค่าเฉลี่ย ทำให้ความเร็วในการดึงข้อมูลขนาดใหญ่จะมีประสิทธิภาพมากกว่า OLTP แม้ว่าจะมีการเขียนคำสั่งที่ซับซ้อนมากกว่าก็ตาม
ทั้ง 2 วิธีที่ใช้สำหรับการจัดการข้อมูล เป็นวิธีที่ให้ผลลัพธ์แตกต่างกัน แต่ในกรณีที่เราจะศึกษาในฟีเจอร์นี้ จะช่วยให้เราสามารถที่จะทำ CRUD บน Dashboard ได้ง่าย (ขอใบ้ว่า จริงๆ ทำได้มากกว่านั้นเยอะเลย)
Translytical Task Flow คืออะไร
Translytical Task Flow คือการที่เราเพิ่มชุดคำสั่งผ่าน User data function เพื่อให้ปุ่มของเราสามารถเรียกใช้งาน User data function เราเขียนขึ้นมา สามารถส่งค่ากลับไป เพิ่ม , ลบ แก้ไข ข้อมูลได้ ผ่านภาษา Python เมื่อมีการเชื่อมต่อ Database เรียบร้อยแล้ว
นอกจากการเพิ่ม ลบ แก้ไข ข้อมูลแล้ว เรายังสามารถให้ Translytical Task Flow ส่งข้อมูลออกไปยัง Platform ที่เราต้องการ โดยใช้ความรู้จากการเขียน Python ได้อีกด้วย คุณสามารถดูตัวอย่างการใช้งานได้ผ่าน ที่นี่

สิ่งที่ต้องเตรียม
สำหรับการสร้าง Translytical Task flow จำเป็นจะต้องมีส่วนสำคัญ 3 ส่วน
1. เราจำเป็นจะต้องใช้ Microsoft Fabric (สามารถทดลองใช้ได้ 60 วัน)
2. สามารถเปิดใช้งาน User data function (Preview) ได้ ผ่านการตั้งค่าใน Power BI admin portal ภายใต้หัวข้อ Tenant Setting
3. เปิดใช้งาน Translytical task flow ผ่านการตั้งค่า ภายใต้หัวข้อ (Preview Features)
*ข้อ 3 ต้องอัพเดทเวอร์ชั่นของ Power BI ให้อยู่ในเวอร์ชั่นล่าสุดก่อนครับ
วิธีใช้งาน Translytical Task Flow
การมาของ Translytical Task Flow จะช่วยลดงานที่ต้องแก้ไขข้อมูล แล้วมารีเฟรชข้อมูลซ้ำ ได้ดี โดยเฉพาะถ้าคนที่ทำงานแก้ไข กับรีเฟรชข้อมูลเป็นคนละคนกัน ฟีเจอร์นี้จะช่วยทำให้เหลือคนทำงานเพียงแค่คนเดียวเท่านั้น
สำหรับงานที่ผมคิดว่าน่าจะได้ใช้ประโยคจาก Translytical Task Flow แบบเต็ม ๆ คืองานที่ผู้ใช้งานทั่วไป สามารถที่จะแก้ไขข้อมูลโดยไม่กระทบธุรกิจโดยตรง แต่อาจจะเป็นการปรับค่า เพื่อเปลี่ยนแปลงมุมการดูข้อมูล และแก้ไขข้อมูลแบบ no-code
สามารถดูวิธีการทำงานของ Translytical Task Flow แบบเบื้องต้นตามลิ้งค์ด้านล่างนี้

เรามารู้จักการใช้งานกันเลยดีกว่า สิ่งที่ผมจะเล่าต่อไปนี้อาจจะใช้เวลาในการดำเนินการสักพัก อยากให้ทุกคนลองอ่านให้เข้าใจก่อน แล้วค่อยลงมือทำนะครับ บทความนี้ไม่หายไปไหนแน่นอน
1. Preparing Database
เตรียมฐานข้อมูลที่จะใช้งานให้อยู่ในรูปแบบตาราง ให้เรากดเข้าไปที่ Workspace ของ Power BI แล้วกด New Item เพื่อเพิ่ม Database ที่เราต้องการ ในกรณีนี้ผมเลือกจะใช้ SQL database (Preview) สำหรับการแสดงตัวอย่างในครั้งนี้

สำหรับขั้นตอนนี้ ให้เราใส่ชื่อ Database ให้เรียบร้อย

หลังจากใส่ชื่อเรียบร้อย ระบบก็จะทำการสร้าง SQL Database ว่าง ๆ ให้เรา
2. Create User Data Function Container
สร้าง Container : user data function สำหรับการทำงาน
เราสามารถสร้าง Container ได้ด้วยการกด +New Item ใน Power BI Workspace


3. Database Connection
เชื่อมต่อฐานข้อมูล เมื่อเราสร้าง function container แล้ว จะมีเมนู Manage Connections ให้เราเลือก หลังจากนั้นให้เราเลือก +Add data Connection (ใช้ Database จากขั้นตอนที่ 1)
เมื่อเลือกเสร็จเรียบร้อยแล้ว ก็จะมีหน้าต่างของ Connection DB ให้เราเลือกตั้งค่าให้เรียบร้อย

กรณีนี้ผมจะทำการโหลด Example Data เข้าไป โดยจะมีข้อมูล SaleLT เข้ามาเป็น Schema ของ Object SQL Server ถ้าข้อมูลที่โหลดสำเร็จ ภาพจะเป็นแบบตัวอย่างด้านล่าง

เมื่อเราได้ตัวอย่างข้อมูลแล้ว ทีนี้ให้เราสร้าง Table Employee ขึ้นมาด้วยใช้คำสั่ง SQL และกำหนดให้มีคอลัมน์ทั้งหมด 3 คอลัมน์ ได้แก่
1. รหัสพนักงาน (EmpID) เป็นแบบตัวเลขจำนวนเต็ม และจำต้องมีค่าไม่ซ้ำกัน
2.ชื่อพนักงาน(EmpName) เป็นแบบตัวอักษร ความยาวไม่เกิน 50 ตัวอักษร
3.เลขแผนก (DepID) เป็นตัวเลขจำนวนเต็ม
CREATE TABLE dbo.Employee (
EmpID INT PRIMARY KEY,
EmpName nvarchar(50),
DepID INT
);
ให้เรากดที่คำสั่ง New Query แล้วนำสคริปต์ SQL ไปวาง หลังจากนั้นให้กดปุ่ม Run

ทีนี้เรากดไปที่ Database แล้วกด dbo -> Tables -> Employee เราจะพบว่าตารางของเราถูกสร้างขึ้นมาเรียบร้อยแล้ว แม้ว่าจะเป็นตารางเปล่าก็เถอะ

ให้เรากลับไปที่ User data function เพื่อเลือกเชื่อมต่อฐานข้อมูล เมื่อเชื่อมต่อฐานข้อมูลเสร็จเรียบร้อย ก็จะได้ภาพตามนี้ครับ

4. Create User Data Function
สร้างฟังก์ชั่นสำหรับใช้งาน โดยเราสามารถใช้คำสั่ง + New function จุดนี้ถ้าเราใช้ python ชำนาญเราสามารถปรับแต่งความสามารถของ function ได้ตามต้องการเลย แต่อาจจะต้องจัดการกับ Library ด้วยตนเองครับ กรณีผมอาจจะยกตัวอย่างคำสั่งที่ Microsoft เตรียมไว้ให้ครับเผื่อใครลองเล่นจะได้ทำตามได้


ตัวอย่างการเขียนเพิ่มข้อมูล ผมก็ปุ่ม Edit แล้วกด Insert Sample เราจะได้โค้ดตัวอย่างมาครับ
ขออธิบายโค้ดด้านล่างนี้สักนิด คำสั่งนี้จะรับตัวแปรทั้งหมด 3 ค่า ได้แก่ เลขพนักงาน , ชื่อพนักงาน และเลขแผนกของพนักงาน โดยจะไปตรวจสอบกับฐานข้อมูลก่อน ว่ามีตารางชื่อ Employee หรือไม่ ถ้าไม่มีจะทำการสร้างตารางใหม่ แต่ถ้ามีตารางนั้นอยู่จริง ก็จะแทรกแถวลงไปในตารางแทน
import fabric.functions as fn
udf = fn.UserDataFunctions()
# Select 'Manage connections' and add a connection to a Fabric SQL Database
# Replace the alias "<alias for sql database>" with your connection alias.
@udf.connection(argName="sqlDB",alias="SQLSERVER")
@udf.function()
def write_one_to_sql_db(sqlDB: fn.FabricSqlConnection, employeeId: int, employeeName: str, deptId: int) -> str:
'''
Description: Insert one employee record into SQL database, creating table if needed.
Args:
sqlDB (fn.FabricSqlConnection): Fabric SQL database connection.
employeeId (int): Employee ID (primary key).
employeeName (str): Employee name.
deptId (int): Department ID.
Returns:
str: Confirmation message about table creation and data insertion.
'''
# Replace with the data you want to insert
data = (employeeId, employeeName, deptId)
# Establish a connection to the SQL database
connection = sqlDB.connect()
cursor = connection.cursor()
# Create the table if it doesn't exist
create_table_query = '''
IF OBJECT_ID(N'dbo.Employee', N'U') IS NULL
CREATE TABLE dbo.Employee (
EmpID INT PRIMARY KEY,
EmpName nvarchar(50),
DepID INT
);
'''
cursor.execute(create_table_query)
# Insert data into the table
insert_query = "INSERT INTO Employee (EmpID, EmpName, DepID) VALUES (?, ?, ?);"
cursor.execute(insert_query, data)
# Commit the transaction
connection.commit()
# Close the connection
cursor.close()
connection.close()
return "Employee table was created (if necessary) and data was added to this table"
เพิ่มชื่อพนักงาน

หน้าต่าง Debug ด้านขวาจะช่วยให้เราสามารถทดสอบใส่ข้อมูลไปในฟังก์ชั่นที่เราเขียนเพื่อจัดการกับข้อมูลในฐานข้อมูลครับ (*ควรทดสอบก่อนใช้งานจริงทุกครั้ง) ถ้าเราสังเกตดีๆ ตรง Parameter ที่เราใส่จะมี Data Type อยู่ด้วยครับ อันนี้ก็จะเป็นส่วนที่ช่วยให้เราทดสอบได้ง่ายขึ้น

ผมลองดึงข้อมูลออกมาผ่านการใช้ SQL query ตามข้อมูลที่เราได้เพิ่มเข้าไปก่อนหน้านี้ ปรากฎว่าข้อมูลเข้ามาแล้ว ผมขอแจ้งไว้นิดนึงว่าบางทีข้อมูลของเราอาจจะไม่ได้อัพเดทแบบเรียลไทม์ สำหรับ Database บางรูปแบบ อาจจะต้องรอนิดนึงครับ
5. สร้าง Lakehouse
เนื่องจากตอนนี้ microsoft ยังไม่ได้ให้เราไปปรับแก้ไฟล์แล้วอัพเดทได้โดยตรง เราจึงต้องอาศัยความสามารถของ Lakehouse เพื่อให้ Power BI ตรวจสอบข้อมูล เมื่อ Lakehouse มีข้อมูลเปลี่ยนแปลง ทำให้เราอัพเดทได้ทันทีที่ submit ข้อมูล


หลังจากนั้นให้เรากด new shortcuts เพื่อสร้าง Lakehouse ที่เชื่อมต่อไปยัง SQL Database ที่เราสร้างขึ้นมา

เมื่อเราเลือก Microsoft Onelake แล้วให้เราเลือกข้อมูลที่เราต้องการ โดยเลือกเป็น SQL SERVER ตัวที่เก็บตาราง Employee ไว้นั่นแหละครับ เราต้องทำการเชื่อมข้อมูลไปเก็บบน Lakehouse

หลังจากนั้นให้เราเลือก ตารางที่เราสร้างไว้เพื่อทำเป็น Shortcut

เมื่อเลือกเสร็จเรียบร้อย ให้เรากด Create แล้วรอเวลาสักครู่

หลังจากนี้เราจะได้ข้อมูลมาอยู่บน Lakehouse และข้อมูลจะอยู่ในรูปแบบของไฟล์ Parquet แทนที่จะเป็นข้อมูลแบบ Table และสามารถแสดงผลแบบ Table ได้ด้วยการเปลี่ยนจาก File view เป็น Table View

จากนั้นให้เรากด New semantic model เพื่อใช้ Employee Table เป็น Data Source สำหรับ POWER BI

เลือกเฉพาะข้อมูลที่เราต้องการ และตั้งชื่อให้กับ Semantic model ผมตั้งชื่อว่า Employee_DATA เพื่อจะได้แยกออกนะครับ ตอนนี้มีตารางชื่อซ้ำกันเยอะแล้ว จะได้ไม่สับสน

เราจะใช้ข้อมูล Employee_DATA เป็น direct query ที่ใช้งานบน Power BI

เงื่อนไขใน Power BI ถ้ามีการตรวจสอบว่า data ใน Onelake มีการเปลี่ยนแปลง ข้อมูลจะถูกอัพเดทเมื่อมีการใช้ function แก้ไขข้อมูลสำเร็จครับ
6. สร้าง Report ใน Power BI Desktop
ให้เราเปิด Power BI ขึ้นมาแล้วเลือก Blank Report ครับ โดยเราจะเริ่มต้นจากการดึงข้อมูล SQL Server บน Workspace ที่เราได้สร้างไปในขั้นต่อก่อนหน้านี้

เลือกข้อมูลจาก OneLake Catelog ที่เราสร้างไว้ใน Semantic Model ตอนแรก กรณีนี้ใครที่มีหลายๆ Database อาจจะต้องจัดการข้อมูลแยกตาม Workspace และการใช้งานให้เรียบร้อยด้วยนะครับ จะได้ไม่มีปัญหาเรื่องการนำเข้าข้อมูลที่ไม่ถูกต้อง

ให้เราเลือกเฉพาะ Table Employee ที่เรามีการทดลองกันเมื่อสักครู่ขึ้นมา หลังจากนั้นข้อมูลจะเข้ามาอยู่ใน Data โดยจะใช้ชื่อตาม Table ที่เราเลือกมาครับ

สร้าง Table ที่มีข้อมูลทุกแถวออกมาเพื่อแสดงผล จุดนี้จะต้องระวังเรื่อง Aggregation นิดนึง เนื่องจากตัวเลขพนักงาน และเลขแผนก ในชีวิตจริงเราจะไม่สามารถเอามันมาบวก ลบ คูณ หรือหารกันแล้วได้ตัวเลขที่นำมาใช้ได้ เราต้องปรับค่าเป็น don't summarize ถึงจะแสดงข้อมูลได้ถูกต้อง
7. ปรับแต่งปุ่ม Action Button
วิธีการใส่ Paramater เราจะใช้การสร้าง Text Slicer ขึ้นมาแล้วตั้ง Title ของ Widget นั้นเป็นชื่อที่เราต้องการ ซึ่งชื่อเหล่านี้เราจะนำไปส่งเป็น Parameter ใน User Data Function ครับ

- รหัสพนักงาน (Employee ID)
- ชื่อพนักงาน (Employee Name)
- เลขแผนก (Department ID)

หลังจากนั้นให้เราสร้าง Blank Button ขึ้นมา แล้วให้เราเลือก Action เป็น Data Function โดยเราจะเลือก Workspace , Function set และ data function ตามที่เราสร้างไว้ นอกจากนี้ให้เราเลือก Toggle on สำหรับค่า Refresh the report after a successful outcome คือเมื่อเรามีการทำ function สำเร็จ POWER BI จะ Refresh data source อีกครั้งเพื่อแสดงค่าใหม่ขึ้นมาใน Table ครับ
ทีนี้เราก็สามารถที่จะเลือก Required Parameter ตามชื่อ Title ที่ตั้งค่าไว้ใน Text Slicer ได้เลย และผมแนะนำให้ตั้งค่า auto clear ไว้ ครับ กรณีที่เรามีการ Submit ข้อมูล ค่าที่เราใส่ไปล่าสุดจะถูกล้างออก และเหลือช่องว่างสำหรับการใส่ค่าใหม่ครับ

เมื่อใส่ข้อมูลในช่อง Text Slicer เรียบร้อยแล้ว ให้กดปุ่มเพื่อ Submit ข้อมูลสำหรับการไปใช้กับ Function ที่กำหนดไว้ ระยะเวลาจะช้าจะนานขึ้นอยู่กับว่าเราเขียนสคริปต์และการเชื่อมต่อ Database ของเรามีทรัพยากรอย่างไรครับ
เมื่อข้อมูลถูกอัพเดทเรียบร้อย เราจะพบว่ามี Popup แสดงผลว่าข้อมูลเราถูกอัพเดทเรียบร้อยแล้วนะ และ Table ที่เราสร้างไว้ มีข้อมูลที่ถูกเพิ่มมาเรียบร้อยแล้ว

หลังจากขั้นตอนที่กล่าวมาทั้งหมด เราจะได้ Report ที่สามารถกดปุ่ม Interaction แล้วไปดำเนินการรันคำสั่งเรียบร้อย เราสามารถเขียนข้อความตอบกลับกรณีที่การดำเนินการล้มเหลว (failed) หรือ เสร็จสิ้น (Success) ได้ผ่านการเขียน Try / Except ด้วยภาษา Python
ข้อควรระวัง
สิ่งสำคัญที่สุดเมื่อเราสามารถให้ผู้ที่ใช้งาน Power BI Report สามารถกดเพื่อปรับเปลี่ยนค่าได้ เราจะต้องระวังว่าข้อมูลเหล่านั้นจะไม่ส่งผลกระทบต่อข้อมูลจริงในเชิงธุรกิจที่อยู่ใน Database
โดยเราสามารถใช้วิธีที่ Replica database แล้วสร้าง Table สำหรับงานชุดนี้โดยเฉพาะ เพื่อไม่ให้ข้อมูลที่สำคัญถูกแก้ไขโดยไม่ตั้งใจ
ถ้าหากเป็นข้อมูลที่ไม่ได้มีความสำคัญมาก แต่อาจจะเป็นส่วนที่ใช้ในการคำนวณ Metrics พิเศษสำหรับธุรกิจที่อาจจะมีการเปลี่ยนแปลง จะมีความเหมาะสมกับงานแบบนี้มากกว่า
ข้อจำกัด
ช่วง เดือน กรกฎาคม 2025 ฟีเจอร์นี้ยังคงอยู่ในฟีเจอร์ทดลอง (Preview Feature) จึงมีเงื่อนไขบางอย่างที่สามารถใช้งานได้
- เฉพาะ Slicer (Button , list and text) จะมีความสามารถในการรับข้อมูล (Input Parameter) เพื่อใช้ในการดำเนินการ User data function ที่เราเขียนไว้
- ไม่สามารถใช้กับรูปแบบของ PBIR , PBIP ได้
- ไม่สามารถจะใช้งานแบบ Embedded บนเว็บไซต์อื่น ๆ ได้ นอกจาก app.powerbi.com