Level 2: Complex Structures — Final Capstone

Sub-topic 2.5: Complex Structures Architectural Capstone & System Integration

การบูรณาการระบบแบบองค์รวม: Group State Machine + Nested Subreport Isolation + Dynamic Crosstab Matrix + JRTX Design Tokens (JasperReports 7.0.3+)

บทนำเชิงสถาปัตยกรรม (Conceptual Narrative & The Composite Architecture Challenge):

ในโลกความเป็นจริงของระบบ Enterprise ระดับ Production เราแทบไม่เคยสร้างรายงานที่มีเพียงฟีเจอร์เดี่ยวๆ แยกส่วนกัน สิ่งที่สถาปนิกรายงานต้องเผชิญคือ Composite Multi-Tier Document เช่น "รายงานตรวจสอบผลการดำเนินงานและความเสี่ยงระดับองค์กร (Executive Risk & Performance Audit Dossier)" ที่ต้องมี:

1) Group Hierarchy แยกตามแผนกหรือภูมิภาค พร้อมควบคุมการขึ้นหน้าใหม่ด้วย minHeightToStartNewPage
2) Nested Subreports ฝังในระดับ Detail เพื่อดึงรายการธุรกรรมที่แยกอิสระ พร้อมส่งยอดรวมกลับมาด้วย Two-way Return Values
3) Dynamic Crosstab Matrix ฝังอยู่ใน Group Header หรือ Group Footer เพื่อสรุปสถิติแบบ Pivot Table 2 มิติ (ไตรมาส x ระดับความเสี่ยง)
4) Centralized JRTX Tokens & Conditional Formatting ควบคุมสี ฟอนต์ และการแจ้งเตือนยอดเงินผิดปกติทั่วทั้งเอกสารจากไฟล์ภายนอก

หากปราศจากความเข้าใจว่า JRVerticalFiller, CrosstabBucketingService, และ Child Subreport Engines มีลำดับการแบ่ง Memory และรอบวงจรชีวิต (Evaluation Cycles) สัมพันธ์กันอย่างไร ระบบจะพังทลายทันทีด้วยอาการ Evaluation Timing Collisions, Variable Bleeding หรือ Heap Memory Exhaustion บทเรียน Capstone นี้คือบททดสอบเพื่อหลอมรวมทุกกลไกของ Level 2 ให้เป็นหนึ่งเดียว

ผ่าแก่นแท้ทางสถาปัตยกรรมระดับบูรณาการ (Composite Architectural Pillars)

🧱 1. Composite Layout Lifecycle
การประสานงานของ Engine หลายชุดพร้อมกัน เมื่อ Master Filler รัน Group State Machine จะต้องสลับไปเรียก CrosstabBucketingService เพื่อคำนวณ Matrix ก่อน จากนั้นจึง Spawn Child JRVerticalFiller ของ Subreport โดยลำดับการวาด Band และการจัดสรรความสูงจะผูกกันเป็นทอดๆ
🔄 2. Multi-Level Accumulator Hierarchy
การไหลของตัวแปร 3 ชั้น: (1) Child Variables ใน Subreport คำนวณยอดระดับรายการ → (2) ส่งผ่าน <returnValue> มาอัปเดตลง Group Accumulator ใน Master → (3) สะสมต่อเข้า Master Grand Total ใน Summary Band โดยตัวแปรที่รับค่าต้องตั้ง calculation="System"
🛡️ 3. Nested Matrix Memory Isolation
การฝัง Crosstab หรือ Subreport ไว้ภายใน Group Band จำเป็นต้องแยก Memory Scope อย่างเข้มงวด การส่ง Sub-Collection ที่ตัดขาดผ่าน new JRBeanCollectionDataSource(...) ช่วยป้องกันไม่ให้เกิด Data Source Exhaustion เมื่อ Group ถัดไปถูกประมวลผล
🎨 4. Ubiquitous Tokenized Design System
การบังคับใช้ External Style Sheets (.jrtx) ข้ามทั้ง Master และ Subreport เพื่อให้ทั้งเอกสาร รวมถึงส่วนของ Crosstab Cells และ Alert Badges มี Visual Language เดียวกัน พร้อมสืบทอดกฎ Conditional Formatting โดยไม่มี Inline Duplication

Step 1: Deep Dive (Full-Engine Convergence & Execution Timing)

แผนภาพแสดงลำดับการเชื่อมต่อระหว่าง Group State Machine, Subreport Child Engine, Crosstab Pivot Engine และ JRTX Style Resolution:

Enterprise Composite Architecture Flowchart
รูปที่ 1: สถาปัตยกรรมบูรณาการ Multi-Tier: Grouping + Isolated Subreports + Dynamic Crosstab + JRTX

ลำดับการทำงานในหน่วยความจำ JVM (Composite Execution Order):

  1. Bootstrap & Style Ingestion: Master Engine โหลด .jrtx และลงทะเบียน Design Tokens ลงใน Context Registry
  2. Group Break Evaluation: เมื่อ Field ของ Group เปลี่ยนแปลง Engine จะทริกเกอร์ Group Header
  3. Nested Crosstab Execution: หากมี Crosstab ใน Group Band ระบบจะรัน 2-Pass Bucketing เพื่อ Render ตาราง Pivot เฉพาะกลุ่มนั้น
  4. Detail Subreport Dispatch: เมื่อเข้าสู่ Detail Band ระบบจะ Spawn Child Filler เพื่อรัน Subreport แล้วดัก Return Value มาสะสมใน Group Variable
  5. Group Footer Trigger & Variable Reset: วาด Group Footer แสดงผลรวมกลุ่ม จากนั้น Reset ตัวแปรประจำกลุ่มเป็น 0 ตาม resetType="Group"
  6. Master Summary Convergence: ในหน้าสุดท้าย รวบยอด Grand Total ที่สะสมจากทุก Group ออกแสดงผล

เมทริกซ์ความเสี่ยงและจุดพังทลายบน Production (Production Hazard Matrix):

จุดเชื่อมโยงความเสี่ยงร้ายแรง (Hazard)กลไกป้องกัน (Architectural Defense)
Crosstab ใน Groupหน่วยความจำบวมตามจำนวนกลุ่มกรองข้อมูลล่วงหน้าจาก SQL / ใช้ Virtualizer
Return Value ใน Groupตัวเลขสะสมไหลข้ามกลุ่ม (Bleeding)ตั้งตัวแปร Master เป็น resetType="Group"
Subreport ใน DetailConnection Pool Exhaustionส่ง Sub-Collection Java DataSource แทน JDBC
Style ข้าม Subreportฟอนต์และสีเพี้ยนระหว่างแม่ลูกประกาศ <template> เดียวกันในไฟล์ลูก
จุดตายบน Production (The Composite Memory Avalanche):
เมื่อนำทั้ง Grouping, Subreports และ Crosstab มารวมกันในเทมเพลตเดียว อัตราการใช้ Heap Memory จะไม่ได้เพิ่มขึ้นแบบ Linear แต่เพิ่มขึ้นแบบ Exponential หากมี 100 Groups แต่ละ Group มี Crosstab 1 ตัว และใน Detail มี Subreport 50 แถว ระบบจะสร้าง Engine และ Buffer ย่อยนับพันชุด! หากไม่กำหนด JVM Heap ให้เหมาะสม หรือไม่ใช้ Virtualizer ระบบจะล่มด้วย java.lang.OutOfMemoryError: Java heap space ทันที

Step 2: Architecture Implementation (Composite Unified Schema 7.0.x)

ตัวอย่างโครงสร้าง JRXML 7.0.x ที่ผสาน Grouping, Crosstab, Subreport Return Values และ JRTX Templates เข้าด้วยกัน:

Grouped Ledger with Dynamic Matrix Integration
รูปที่ 2: Real-world Final Production Output ของรายงานเชิงซ้อนระดับ Enterprise (Executive Dossier)
<!-- Composite Enterprise Template (7.0.x Standard) -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
              name="CompositeEnterpriseDossier" pageWidth="595" pageHeight="842"
              columnWidth="555" leftMargin="20" rightMargin="20"
              topMargin="20" bottomMargin="20">

    <!-- 1. Shared Design Tokens -->
    <template><![CDATA["styles/enterprise_tokens.jrtx"]]></template>

    <!-- 2. Multi-tier Accumulators -->
    <variable name="GROUP_TOTAL" calculation="System" class="java.math.BigDecimal" resetType="Group" resetGroup="DeptGroup">
        <initialValueExpression><![CDATA[BigDecimal.ZERO]]></initialValueExpression>
    </variable>

    <group name="DeptGroup" minHeightToStartNewPage="200">
        <expression><![CDATA[$F{department}]]></expression>
        <groupHeader>
            <band height="120">
                <!-- 3. Dynamic Matrix Inside Group -->
                <element kind="crosstab" x="0" y="30" width="555" height="80">
                    <rowGroup name="Tier" width="100">
                        <bucket class="java.lang.String"><expression><![CDATA[$F{tier}]]></expression></bucket>
                    </rowGroup>
                    <columnGroup name="Quarter" height="20">
                        <bucket class="java.lang.String"><expression><![CDATA[$F{quarter}]]></expression></bucket>
                    </columnGroup>
                    <measure name="MetricSum" class="java.math.BigDecimal" calculation="Sum">
                        <expression><![CDATA[$F{metricValue}]]></expression>
                    </measure>
                </element>
            </band>
        </groupHeader>
        <groupFooter>
            <band height="30">
                <element kind="textField" style="HeaderStyle" x="355" y="5" width="200" height="20">
                    <expression><![CDATA[$V{GROUP_TOTAL}]]></expression>
                </element>
            </band>
        </groupFooter>
    </group>
</jasperReport>

Hands-on Engineering Lab 2.5.1: Grouped Ledger with Dynamic Matrix Integration

🛠️ Lab 2.5.1: Group-Level Matrix Injection & Style Tokenization

ข้อกำหนดทางเทคนิค (Full-Coverage 100%):
1. ประกาศนำเข้า Style Template ผ่านแท็ก <template> ชี้ไปยัง "styles/enterprise_tokens.jrtx"
2. กำหนดกลุ่ม <group name="DivisionGroup" minHeightToStartNewPage="180"> ป้องกันปัญหา Orphan Header
3. ฝัง <element kind="crosstab"> ภายใน Group Header เพื่อสรุปยอดแบบ Matrix รายแผนก
4. ใช้แท็กสมัยใหม่ <element kind="textField"> ตามมาตรฐาน 7.0.x Unified Element Model

Hands-on Engineering Lab 2.5.2: Multi-Subreport Aggregator with Conditional Alert Pipeline

🛠️ Lab 2.5.2: Two-Way Return Convergence & Dynamic Highlighting

ข้อกำหนดทางเทคนิค (Full-Coverage 100%):
1. ประกาศตัวแปร MASTER_AUDIT_TOTAL ชนิด BigDecimal โดยตั้ง calculation="System"
2. กำหนด <element kind="subreport"> ใน Detail Band ส่งข้อมูลผ่าน JRBeanCollectionDataSource
3. เชื่อมต่อ <returnValue fromVariable="CHILD_SUM" toVariable="MASTER_AUDIT_TOTAL" calculation="Sum"/>
4. กำหนด <style name="AlertStyle"> พร้อม <conditionalStyle> เปลี่ยนสีเป็นสีแดงเมื่อยอดเงินติดลบ

Step 3: Interactive Checkpoint Quiz (Level 2 Capstone Integration)

แบบทดสอบ 15 ข้อเชิงลึกระดับ Master วัดความเข้าใจเรื่องสถาปัตยกรรมองค์รวมของ Level 2:

⚡ Real-time Score Tracker (Level 2.5 Capstone)
คะแนน: 0 / 15 (ตอบแล้ว: 0 / 15)