PlusMagi's Blog By Pitt Phunsanit Backend,Database jQuery.Calx2: ใช้สูตร Excel ใน เว็บ

jQuery.Calx2: ใช้สูตร Excel ใน เว็บ

ในโลกของการพัฒนาเว็บไซต์สมัยใหม่ การแสดงผลข้อมูลที่มาจากการคำนวณซับซ้อน (เช่น สูตรทางการเงิน หรือการคำนวณภาษี) เป็นสิ่งที่หลีกเลี่ยงไม่ได้ อย่างไรก็ตาม เมื่อเราพึ่งพา JavaScript Client-Side มากเกินไป อาจเกิดปัญหาด้านความปลอดภัย ความสม่ำเสมอของข้อมูล และยากต่อการบำรุงรักษาเมื่อสูตรมีการเปลี่ยนแปลง

ในฐานะ System Architect เราทราบดีว่าการคำนวณที่สำคัญและเป็นหัวใจหลักทางธุรกิจ (Business Logic) ควรถูกจัดการ ณ จุดศูนย์กลางที่เชื่อถือได้ นั่นคือ Database Back-end การนำแนวคิดของการใช้ ‘สูตร Excel’ มาประมวลผลบน PostgreSQL จึงเป็นการยกระดับความน่าเชื่อถือของระบบอย่างมาก

💡 ทำไมต้องคำนวณด้วย PostgreSQL แทน JavaScript?

แม้ว่าไลบรารีอย่าง jQuery.Calx จะช่วยให้เราสามารถแสดงสูตร Excel ในหน้าเว็บได้ง่าย แต่การประมวลผลที่ฝั่ง Client-Side มีข้อจำกัดสำคัญ:

  • ความปลอดภัย: สูตรคำนวณอาจถูกดักจับหรือแก้ไขโดยผู้ใช้งานปลายทางได้
  • ความสม่ำเสมอ: การทำงานขึ้นอยู่กับ Browser และเวอร์ชันของ JavaScript ซึ่งอาจไม่เสถียร
  • ประสิทธิภาพ: สำหรับชุดข้อมูลขนาดใหญ่ การประมวลผลใน SQL Server-Side จะเร็วกว่าและมีประสิทธิภาพกว่ามาก

PostgreSQL ไม่ได้จำกัดแค่การเก็บข้อมูล แต่ยังเป็นเครื่องมือที่ทรงพลังในการคำนวณเชิงตรรกะ (Logical Calculation) โดยเฉพาะเมื่อใช้คุณสมบัติขั้นสูง เช่น Common Table Expressions (CTE), JSONB, และฟังก์ชันทางคณิตศาสตร์

⚙️ การจำลองสูตร Excel ด้วย PostgreSQL Advanced Features

แทนที่จะแปลงสูตรเป็น JavaScript ที่ซับซ้อน เราสามารถสร้างโครงสร้างข้อมูลที่เลียนแบบตาราง Spreadsheet และใช้ SQL เพื่อกำหนดความสัมพันธ์และการคำนวณได้โดยตรง นี่คือตัวอย่างการคำนวณ ‘Prorated Premium’ ซึ่งต้องอาศัยหลายปัจจัย (Start Date, End Date, Annual Rate) เหมือนกับการทำงานใน Excel

เราจะใช้ WITH clause และฟังก์ชันวันที่ของ PostgreSQL เพื่อจำลองขั้นตอนการคำนวณที่ซับซ้อน:

ตัวอย่างโค้ด: การคำนวณเบี้ยประกันแบบแปรผัน (Prorated Premium)

SQL

SQL

WITH input_data AS (
    -- จำลองข้อมูลแถวเดียวที่ต้องการคำนวณ (เหมือนการใส่ค่าในเซลล์)
    SELECT 
        'Tianyi'::text AS name,
        'Deng'::text AS last_name,
        '15-May-2017'::date AS start_date,
        '14-May-2018'::date AS end_date,
        1022.00::numeric AS annual_premium
),
calculation_steps AS (
    SELECT 
        name, last_name, start_date, end_date, annual_premium,
        -- 1. คำนวณจำนวนวัน (Duration Days) = วันที่สิ้นสุด - วันที่เริ่มต้น + 1
        (end_date - start_date + interval '1 day')::integer AS duration_days,
        annual_premium * 0.9 AS discounted_premium -- จำลองการลดราคา 10%
    FROM input_data
)
-- ขั้นตอนสุดท้าย: คำนวณเบี้ยประกันที่ต้องคืน (Prorated Premium)
SELECT 
    name, last_name,
    duration_days,
    discounted_premium,
    (discounted_premium / 365.0) * duration_days::numeric AS prorated_premium
FROM calculation_steps;

คำอธิบายโค้ด:

  • WITH input_data AS (...): ใช้ CTE เพื่อกำหนดชุดข้อมูลเริ่มต้น (Input Cells)
  • calculation_steps: ทำการคำนวณค่ากลาง เช่น จำนวนวัน และเบี้ยประกันที่ลดแล้ว ซึ่งเป็นขั้นตอนย่อยของสูตร Excel
  • SELECT ... FROM calculation_steps: เป็นการรันสูตรสุดท้าย โดยใช้ผลลัพธ์จาก CTE ก่อนหน้ามาคำนวณหา prorated_premium สุดท้าย

✅ บทสรุป: ความเหนือกว่าของ Server-Side Logic

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

การใช้ PostgreSQL ในลักษณะนี้จึงไม่ใช่แค่การเขียน Query แต่คือการออกแบบ Calculation Engine ที่ปลอดภัย มีประสิทธิภาพ และง่ายต่อการตรวจสอบ (Auditability) สำหรับระบบที่ต้องการความแม่นยำสูงอย่างงานด้านการเงินหรือประกันภัย

Exit mobile version