Một báo cáo (MOUT) hay một bảng nhập (MOIT) đều là cùng một khung sinh ra bằng khai báo, không code. Tách bạch hai nửa: nửa khung (cột nào, thứ tự, định dạng, cột nào cộng tổng) là config thuần; nửa số liệu là một hàm DOT có tên đã được duyệt. Ghép khung + hàm = bảng. Đổi bộ lọc, đổi kỳ → cùng khung, số liệu mới.
Khai: cột key · nhãn · type (text/số/tiền/ngày/%/chip) · canh lề · agg (none/sum/avg/count/min/max). Điều kiện duy nhất để DOT dựng được: mọi cột phải có trong field_registry với kiểu hiển thị đã duyệt — dùng chung từ vựng field với MOIT.
Mỗi tổng hợp = một hàm đã duyệt: fn_doanh_thu_theo_khach… Hàm trả về { columns, rows, totals }. Dòng tổng nằm trong output của DOT (SUM chạy ở SQL trên toàn tập đã lọc), khung chỉ vẽ lại — không tự cộng. Đúng kế toán, khớp Điều 28 (Nuxt = render shell).
Bạn nêu cột & thứ tự; bật/tắt Σ ở bất cứ cột số nào. STT tự đếm. Thử bật/tắt cột, gạt Σ, lật trang — để ý dòng tổng không đổi theo trang (tổng toàn tập, không phải tổng trang đang xem).
Hàng × cột cố định, mỗi ô nhập số. Cùng một khung: STT, tổng theo cột (dưới cùng) và tổng theo hàng (cột phải) — recompute tức thì khi gõ. Đây là MOIT 2 chiều: ví dụ nhập kế hoạch sản lượng tháng.
Khác List ở một điểm cốt tử: cột không liệt kê mà sinh từ một chiều dữ liệu (ở đây: 4 quý). Bạn chọn chiều-hàng + chiều-cột + metric; bao nhiêu giá trị thì bấy nhiêu cột. Tổng hàng, tổng cột, và tổng chung. Nền đã có ở Luật Pivot / Điều 26 — đưa vào đây để thấy cả 3 hình dạng cùng một engine.
Khối dựng sẵn đã gõ kiểu & duyệt → không viết công thức, không chỉnh định dạng, không quét vùng SUM (hết bug "kéo thiếu 1 dòng"). Tổng đúng theo thiết kế vì khai ở cột, chạy ở SQL. Khung tái dùng: nhân bản báo cáo, đổi bộ lọc kỳ → xong. Mở lại = số liệu mới (live), không phải bản chụp tĩnh.
Cùng một khai báo; chỉ mode đổi cách sinh cột. stt và totals_row là primitive bật/tắt.