Hướng dẫn nhanh (Quickstart)
Một điều lưu ý trước khi đọc và sử dụng:
ReportFrame nên được setup tương ứng với những gì mình muốn hiển thị trên màn hình
ReportFrame cần ít nhất hai đối tượng sau:
Một bảng tạm trong CSDL chứa nội dung của báo cáo và một bảng lọc trước (có thể dùng default là glm_gl_books) để đối chiếu lấy dữ liệu. Bảng tạm trong CSDL sẽ dùng các cột dựa trên bảng lọc trước.
$report = ReportFrame('<tên-bảng-tạm>');
$data = $report->execute('<tên-bảng-lọc-trước>');
Setup bảng tạm
- Bảng tạm phải chứa ít nhất các cột sau:
| Cột | Mục đích | Kiểu dữ liệu | Phải có | Chú thích |
| RowCondition | Đây sẽ đóng vai trò làm điều kiện hàng trong báo cáo, gộp các formula trong IjFormula trước đó vào thành một |
JSON | YES | |
| ItemID | Dùng để phân biệt các hàng với nhau | VARCHAR/CHAR | YES | Default dùng để sắp xếp, cũng như phân biệt các đối tượng với nhau |
| ParentID | Dùng cho các báo cáo dạng cây | VARCHAR/CHAR | NO | Default cho SumTree / $cascade, bởi SumTree dùng cột này để tính tổng, nếu báo cáo không dùng SumTree hay truyền điều kiện thì có thể tắt nó đi |
| Static | Để xác định xem nó có phải hàng động không | TINYINT | YES |
Các cột khác sẽ dùng cho nội dung của báo cáo, riêng các cột giá trị số (I1, I2, ..., v.v...) có quy tắc và hỗ trợ của riêng nó
Một số các cột khác thường cho thêm vào bao gồm
| Cột | Mục đích | Kiểu dữ liệu | Phải có | Chú thích |
| Norder | Phụ sắp thứ tự | VARCHAR/CHAR | NO | |
| FontWeight | Dùng để điều chỉnh đậm/nhạt | TINYINT | NO | Hay dùng nhất |
| Italic | Dùng để điều chỉnh chữ nghiêng | TINYINT | NO | |
| STT | Dùng để đánh thứ tự trong các báo cáo có đánh thứ tự | VARCHAR/CHAR | NO | Không nên dùng thay ItemID cho sắp xếp, trừ khi báo cáo có thể sắp xếp sẵn bằng STT |
| CanPrint | Dùng để bật/tắt các hàng | TINYINT | NO |
Nếu có cột này, default ReportFrame sẽ lấy tất cả các hàng có CanPrint = 1 (use case: muốn tạo những dòng ảo để sum lên hàng cha) |
Ví dụ dùng S90:
(*) MariaDB dùng LONGTEXT cho JSON type
Sau đó, setup bảng tạm như sau (dùng mẫu S90)
Quy ước cho gán Static: ta gán Static = 1 khi và chỉ khi hàng đó không dùng giá trị từ bảng lọc trước
Giải thích:
- Hàng 1, hàng 2 là các hàng tĩnh, tức là các hàng không lấy dữ liệu từ bảng lọc trước, do đó, ta gán Static = 1 cho các hàng này
- Hàng 3, hàng 4 cũng là hàng tĩnh nhưng lấy dữ liệu từ bảng lọc trước, do đó ta vẫn cần gán Static = 0
- RowCondition được thiết kế tương tự như điều kiện lọc gửi qua Mongoose, chuyển thành dòng WHERE trong truy vấn: như ví dụ trên, dòng 3 và dòng 4 sẽ được thể hiện bằng:
WHERE AccountNo REGEXP "^(00822|00812|0091|0092|006|007).*" AND AutoMechanism = 3
- Dòng 3 và dòng 4, cột I1 đều lấy theo công thức SUM(PSNO) trong đó PSNO được thể hiện bằng công thức:
PSNO = LCAmount * (2 - PostType)
- Hợp lại 2 cái trên ta sẽ có câu query sau được sinh tự động bởi ReportFrame (có thể bật xem bằng cách đặt "LogQuery" => 1 như ví dụ setup ReportFrame ở dưới, đã xuống dòng trước cho dễ nhìn):
SELECT NULL AS STT,'b.2' AS ItemID,
'b' AS ParentID,'- Dự toán NSNN không được giao tự chủ' AS ItemName,
SUM(LCAMount * (2 - PostType)) AS I1,
0 AS FontWeight,
0 AS Italic,
1 AS CanPrint,
0 AS Static,
0 AS depth
FROM filtered_data
WHERE `AccountNo` REGEXP '^(00821|00811|0091|0092|006|007).*' AND `AutoMechanism` = 3
- Để lấy tổng, ta dùng SumTree, ví dụ như như ở hàng 2, cột I1 đang để SumTree. Bởi hàng 1 đang để là cha của hàng 3 và hàng 4, I1 của hàng 2 sẽ là tổng của hàng 2 và hàng 3.
(Note: SumTree tự động tính tổng từ cháu lên cha, rồi theo thứ tự từ trên xuống dưới)
Setup ReportFrame trong code
Ít nhất ReportFrame cần tên bảng tạm như kể trên, ngoài ra ReportFrame có thể cài thêm:
- Các cài đặt phụ bên cạnh cho báo cáo (xem chi tiết ở ReportFrame API)
- Các tham số truyền vào (thường từ bộ lọc)
- Các middleware dùng để thực thi custom code của bạn trong quá trình chạy ReportFrame
ReportFrame(
tableName, //tên bảng phụ, yêu cầu phải có
?options, //các cài đặt bên cạnh bảng phụ
?parameters, //các tham số truyền vào, thường từ bộ lọc, nổi bật nhất thường là FromDate/ToDate
?middlewares, //các middleware dùng để chèn code giữa các thao tác hoạt động trong ReportFrame
)
Một ví dụ setting bao gồm như sau:
$report = ReportFrame(
'report_test', //lấy bảng report_test trong CSDL
[
"LogQuery" => 1, //in các câu lệnh query thực thi bởi ReportFrame
"DoNotSumTree" => 1, //tắt tự động tính tổng trên cây báo cáo
],
[
"yyyy" => date_format('Y', $filter['FromDate']) //lấy năm từ FromDate làm tham số truyền vào
],
[
"BeforeQuery" => fn($query) => $query . " LIMIT 3" //thêm giới hạn 3 hàng trong mỗi query
]
)
Sau đó, chúng ta có thể lấy dữ liệu báo cáo:
$report->execute('glm_gl_books');
$data = $report->returnData();
//...code xử lý sau khi lấy dữ liệu xong
return json_encode(
[
"data" => $data
]
);


No Comments