บริษัทเจออะไรอยู่
ลูกค้าของเราเป็นบริษัทจัดจำหน่ายที่เก็บข้อมูลทั้งหมดไว้ใน SAP Business One ฝ่ายบัญชี ฝ่ายขาย ฝ่ายบริการลูกค้า ฝ่ายขนส่ง และฝ่ายบุคคล ต่างต้องการรายงานของตัวเองเป็นประจำ ทุกวันหรือทุกสัปดาห์ รายงานหลายตัวเดิมทำใน Power BI แล้ว export ออกมาเป็นไฟล์ให้แต่ละฝ่าย
เราทำระบบรายงานที่ดึงข้อมูลจาก SAP แล้วสร้างไฟล์เองตามเวลา ส่งไปถึงแต่ละฝ่ายในที่ที่ฝ่ายนั้นใช้อยู่แล้ว ไม่ต้องมีใครคอยกด export
ภาพรวมการทำงาน
flowchart LR
SAP[(SAP Business One)] -->|อ่านอย่างเดียว| R[ระบบรายงาน]
T[ตารางเวลาของแต่ละรายงาน] --> R
R -->|Excel / PowerPoint| SP[โฟลเดอร์ SharePoint ของแต่ละฝ่าย]
R -->|แนบไฟล์| M[อีเมลถึงผู้รับที่ตั้งไว้]
R --> TV[จอ dashboard ในสำนักงาน]
R --> AI[ผู้บริหารถามผ่าน Claude]ข้อมูลมาจาก SAP ที่เดียว แล้วไปถึงคนอ่านได้หลายทาง
ทุกรายงานทำงานแบบเดียวกัน ถึงเวลาที่ตั้งไว้ ระบบดึงข้อมูลจาก SAP สร้างไฟล์ วางลงโฟลเดอร์ของฝ่าย แล้วส่งอีเมลถ้าตั้งผู้รับไว้ ทุกรอบมีบันทึกว่ารันเมื่อไหร่ ได้ไฟล์ไหน และสำเร็จหรือไม่
sequenceDiagram
participant S as ตารางเวลา
participant R as ระบบรายงาน
participant D as SAP
participant P as SharePoint
S->>R: ถึงเวลารายงานยอดขายรายวัน
R->>D: ดึงข้อมูลตาม SQL ของรายงาน
D-->>R: ข้อมูล
Note over R: สร้างไฟล์ Excel ตามแบบของฝ่าย
R->>P: วางไฟล์ชื่อเดิมทุกรอบในโฟลเดอร์ของฝ่าย
R-->>R: บันทึกผลการรัน เก็บไฟล์ไว้ดูย้อนหลังชื่อไฟล์ตามรูปแบบเดิมทุกรอบ ฝ่ายที่ใช้ไฟล์ต่อจึงหาไฟล์เจอที่เดิมเสมอ
เจ้าของรายงานปรับเองได้ ไม่ต้องรอแก้โค้ด
หน้ารวมรายงานแสดงทุกตัวพร้อมฝ่ายเจ้าของ เวลารัน และผลรอบล่าสุด เจ้าของรายงานเปลี่ยนเวลา โฟลเดอร์ปลายทาง ชื่อไฟล์ หรือผู้รับอีเมลได้จากหน้าจอ ส่วนที่อยู่ในโค้ดมีแค่ SQL กับหน้าตาของแต่ละชีต

หน้ารวมรายงาน: ทุกตัวบอกฝ่ายเจ้าของ โฟลเดอร์ปลายทาง ผู้รับ เวลารัน และผลรอบล่าสุด รวมถึงรอบที่ล้มเหลว (ข้อมูลตัวอย่าง)

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

ตั้งรอบสิ้นเดือนแยกจากรอบรายวัน ใช้ชื่อไฟล์ โฟลเดอร์ และผู้รับของตัวเอง (ข้อมูลตัวอย่าง)
ย้ายจาก Power BI โดยหน้าตาไฟล์เหมือนเดิม
รายงานที่ย้ายมาจาก Power BI ต้องออกมาหน้าตาเหมือนไฟล์เดิมให้มากที่สุด ทั้งหัวตาราง ช่องที่รวมเซลล์ เส้นตาราง แถวยอดรวม และลำดับคอลัมน์ ผู้ใช้จะได้เปิดไฟล์แล้วทำงานต่อได้เลย ไม่ต้องปรับวิธีอ่าน เราเก็บรายการจุดที่มักพลาดตอนเทียบกับไฟล์เดิมไว้ เช่นเดือนที่เรียงแบบตัวอักษรจนยอดสะสมผิด หรือตัวเลขในไฟล์ตัวอย่างที่บวมเพราะ join ซ้ำ
รายงานบางตัวใหญ่มาก ระบบจึงเขียนไฟล์แบบทยอยลงทีละส่วน แทนการสร้างทั้งไฟล์ไว้ในหน่วยความจำ รายงานที่เคยกินหน่วยความจำเกิน 2 GB จนล้ม ก็สร้างเสร็จได้ตามปกติ
จอ dashboard ในสำนักงาน
dashboard เป้ายอดขายเปิดค้างไว้บนจอ TV ในสำนักงาน หน้าจอโหลดตัวเองใหม่ตามรอบ ถ้าระบบมีอัปเดตหรือเน็ตสะดุด จอก็กลับมาเองโดยไม่ต้องมีใครไปกด
ภาพเดียวกันนี้ส่งเป็นรูปในอีเมลได้ด้วย ระบบเปิดหน้าเดียวกับที่จอ TV แสดงแล้วถ่ายเป็นรูป ตัวเลขบนจอกับในอีเมลจึงตรงกันเสมอ

จอเป้ายอดขาย: เทียบกับปีก่อนรายเดือน และเทียบกับเป้าแยกตามทีมและตลาด (ข้อมูลตัวอย่าง)
ผู้บริหารถามข้อมูลผ่าน Claude
ผู้บริหารถามคำถามเกี่ยวกับข้อมูลใน SAP ได้จากแอป Claude บนเครื่องตัวเอง เช่นยอดขายเดือนนี้ของแต่ละทีม เราทำ MCP server ที่ติดตั้งเป็นส่วนเสริมใน Claude Desktop ได้ไม่กี่คลิก
flowchart LR
A[Claude Desktop<br/>บนเครื่องผู้บริหาร] --> B[ส่วนเสริม MCP]
B -->|token| C[ระบบรายงาน]
C -->|SQL อ่านอย่างเดียว| D[(SAP)]ใช้ได้เฉพาะในเครือข่ายของบริษัท ข้อมูลไม่ได้เปิดออกนอกบริษัท
- อ่านอย่างเดียวสองชั้น: ระบบรับเฉพาะคำสั่งที่อ่านข้อมูล และ user ที่ใช้ต่อ SAP ก็ไม่มีสิทธิ์แก้ไขอยู่แล้ว
- ไม่ตอบมั่ว: ถ้าเครื่องอยู่นอกเครือข่ายบริษัท คำถามจะได้ข้อความว่าเชื่อมต่อไม่ได้ ไม่มีคำตอบที่ AI เดาเอาเอง
หน้าเขียน SQL สำหรับนักวิเคราะห์
ทีมที่เขียน SQL ได้ มีหน้าเขียนคำสั่งบน editor แบบเดียวกับ VS Code เปิดดูโครงสร้างตาราง และบันทึกคำสั่งที่ใช้บ่อยไว้เป็นคลังให้ทีมใช้ร่วมกัน

หน้าเขียน SQL: คลังคำสั่งแยกโฟลเดอร์ตามฝ่ายอยู่ด้านซ้าย ผลลัพธ์ export เป็น Excel ได้ (ข้อมูลตัวอย่าง)
ใช้กับระบบของคุณได้ยังไง
ถ้าข้อมูลอยู่ใน ERP หรือฐานข้อมูลที่อ่านได้ และแต่ละฝ่ายยังรอไฟล์รายงานจากคนกด export ก็ทำแบบเดียวกันได้ ลองเริ่มจากคำถามเหล่านี้
- รายงานไหนที่ทำซ้ำทุกวันหรือทุกสัปดาห์ และใครเป็นคนอ่าน
- แต่ละฝ่ายเปิดไฟล์จากที่ไหน โฟลเดอร์กลาง อีเมล หรือจอในสำนักงาน
- ถ้ารายงานรอบหนึ่งไม่ออก ใครควรรู้ และจะรู้ได้ยังไง
- ข้อมูลไหนที่ผู้บริหารถามบ่อย จนน่าจะให้ถามเองได้
ผลลัพธ์
ตอนนี้ระบบดูแลรายงานกว่า 60 ตัว ให้ทุกฝ่ายในบริษัท แต่ละฝ่ายได้ไฟล์ในโฟลเดอร์เดิมตามเวลาโดยไม่ต้องมีใครกด export เจ้าของรายงานปรับเวลาและผู้รับได้เอง และผู้บริหารถามข้อมูลที่อยากรู้ได้โดยไม่ต้องรอรายงานรอบถัดไป
ระบบเขียนด้วย Laravel 12 ใช้ Livewire กับ Flux ทำหน้าจอ รายงานรันบน Horizon สร้างไฟล์ด้วย Laravel Excel กับ OpenSpout วางไฟล์และส่งอีเมลผ่าน Microsoft Graph และอ่าน SAP HANA ผ่าน SQL proxy ที่เราแยกเป็นแพ็กเกจ laravel-sap-proxy






