ORDER BY เสมอ ไม่เช่นนั้น Header/Footer จะแตกกระจายresetType="Group" และระบุ resetGroup ให้ตรง ป้องกัน Variable BleedingminHeightToStartNewPage และล็อคแถวด้วย keepTogether="true"
JRVerticalFiller ลูกแยกขาดจากกันในหน่วยความจำJRBeanCollectionDataSource แทน<returnValue> โดยตัวแปรในแม่ต้องตั้ง calculation="System" ป้องกันบวกเบิ้ล
columnBreakOffset
.jrtx โหลดผ่าน Classpath ปลอดภัยบน DockerparentStyle และถูก Override ด้วย Inline Attributes<conditionalStyle> คู่กับ mode="Opaque" และเปรียบเทียบ BigDecimal ด้วย .compareTo()
| Sub-topic | องค์ประกอบหลัก (JRXML Elements) | จุดตายบน Production (Hazard) | ทางแก้เชิงสถาปัตยกรรม (Architecture Defense) |
|---|---|---|---|
| 2.1 Grouping | <group>, <groupHeader>, <groupFooter> |
ข้อมูลสลับ → Group Break ซ้ำซาก ยอด Subtotal เพี้ยน | Strict ORDER BY ใน SQL + กำหนด resetType="Group" |
| 2.2 Subreports | <element kind="subreport">, <returnValue> |
ส่ง Data Source แม่เข้าลูก → Cursor Exhaustion แถวถัดไปว่าง | ส่ง Sub-collection แยกขาดด้วย JRBeanCollectionDataSource |
| 2.3 Crosstabs | <element kind="crosstab">, <bucket>, <measure> |
คอลัมน์งอกล้นกระดาษ A4 → เนื้อหาถูกครอปหาย | ตั้ง columnBreakOffset ควบคุมระยะการตัดหน้าแนวนอน |
| 2.4 Styles | <template>, <style>, <conditionalStyle> |
ฮาร์ดโค้ด Path C:\... → พังทันทีบน Linux/Docker |
อ้างอิงไฟล์ .jrtx ผ่าน Classpath เท่านั้น |
| 2.5 Capstone | Composite Schema (ผสานครบ 4 ศาสตร์) | Memory Avalanche + ยอดเงินเบิ้ล 2 เท่า (Double Counting) | ใช้ Virtualizer + Master Accumulator ตั้ง calculation="System" |
เขียน JRXML 7.0.x ให้ตรงตามเป้าหมายของแต่ละข้อ ภายใต้ Allowed/Disallowed Constraints:
ทดสอบความเข้าใจลึกระดับ JVM, Filler Engine และ Execution Lifecycle ครบทุกบทของ Level 2 (ข้อ 1 ถึง 35):