Report details là dạng report dạng hóa đơn bán hàng,
Gồm các thành phần:
- Page top
- Report hearder
- Page hearder
- Details
- Page footer
- Report footer
Có thể phần details là 1 trang hay nhiều trang.
*********************
Ví dụ sử dụng nguồn dữ liệu : click tham khảo
1. Cách không sử dụng Html Var
In đơn giản
Query:
_SysDB/Data_Test (tùy vào tên query)
Query_Para
* Nếu đã lọc dữ liệu HoDonChiTiet ở query (thường là sql đã lọc sẵn)
DataMain:0
DataDetail:1
* Nếu chưa lọc dữ liệu HoDonChiTiet ở query (thường gặp dữ liệu xml)
DataMain:0
DataDetail:1
DataDetail_Where:KeyHoaDon='{recM:_SYS_KEY:recM}'
(thêm dòng cuối)
B2: Tại tab Config
Page_Width
210mm
Page_Height
297mm
Page_Contains_Height
287mm
* Giúp phân trang, thành từng trang để in, nếu để trống sẽ không có
B2: Tại tab Report
Nếu là details thì sẽ có nhiều trang, nên phần tên công ty... để tại RPT header và footer ,không để tại PAGE.
* Header , footer PAGE chỉ để table hiển thị chi tiết sản phẩm
Rpt_Hearder :(có 10 trang thì phần này sẽ nạp ra trang đầu tiên)
----
BÁO CÁO
Số hợp đồng: {recM:SoHoaDon:recM} , Nhân viên quản lý: {recM:TenKhachHang:recM}
Rpt_Footer : (có 10 trang thì phần này sẽ nạp ra trang đầu tiên)
Cảm ơn quý khách !
Tại tab Page
Page_Hearder: (có 10 trang thì luôn được nạp ở đầu trang)
Số hợp đồng: {recM:SoHoaDon:recM} , Nhân viên quản lý: {recM:TenKhachHang:recM}
{{##table_heard:E}}
Page_Footer: (có 10 trang thì luôn được nạp ở cuối trang)
{{##table_footer:R}}
Tại tab Details
Rpt_Detail : (luôn được nạp ơ mỗi trang nếu có html)
{{##table_row:R}}
2. Cách sử dụng Html Var
* In có sử dụng cấu trúc html table trong report
Chú ý nguyên lý tạo report:
Căn cứu vào Detail_Height (ví dụ chiều cao cấu hình là 10mm)
Chiều dài 1 trang A4 là 297mm, nhưng lấy phần hiển thị Page_Contains_Height (nhỏ hơn 297, thường là 280mm) , ví dụ tổng row là 30
- Report sẽ tính tổng số trang là bao nhiêu:
TongHeightRpt = dtQuery_Details.Rows.Count * Detail_Height ;
TongTrang = tongHeightRpt / height_Page;
TongTrang = Math.Ceiling(tongTrang);
Tổng chiều dài report in ra: 10(Detail_Height)*30 = 300
*** 300 sẽ > 287 nên sẽ chia làm 2 trang
B1: Tại tab Query
Query:
_SysDB/Data_Test (tùy vào tên query)
Query_Para
* Nếu đã lọc dữ liệu HoDonChiTiet ở query
DataMain:0
DataDetail:1
* Nếu chưa lọc dữ liệu HoDonChiTiet ở query
DataMain:0
DataDetail:1
DataDetail_Where:KeyHoaDon='{recM:_SYS_KEY:recM}'
(thêm dòng cuối)
Muốn thêm 1 cột STT tăng dần:
DataDetailAddColumnAutoIncre:TT
B2: Tại tab Config
Page_Width
210mm
Page_Height
297mm
Page_Contains_Height
287mm
Detail_Height
30mm
B3: Vào tab Html Var tạo
<##table_heard>
<table class="table_nvl" border="1" width="100%" cellspacing="1" align="center">
<tr style="height:{recRpt:Page_Hearder_Height:recRpt}">
<td class="col_STT" style='text-align:center;font-weight:bold;'>STT</td>
<td class="col_TEN" style='text-align:center;font-weight:bold;'>Tên</td>
<td class="col_SL" style='text-align:center;font-weight:bold;'>SL</td>
<td class="col_DG" style='text-align:center;font-weight:bold;'>ĐG</td>
<td class="col_TT" style='text-align:center;font-weight:bold;'>TT</td>
</tr>
</##table_heard>
<##table_row>
<tr style="height:{recRpt:Detail_Height:recRpt}">
<td class="col_STT">{recD:STT:recD}</td>
<td class="col_TEN">{recD:TenHang:recD}</td>
<td class="col_SL" style='text-align:right'>{recD:SL/-/{0:n0}:recD}</td>
<td class="col_DG" style='text-align:right'>{recD:DG/-/{0:n0}:recD}</td>
<td class="col_TT" style='text-align:right'>{recD:TT/-/{0:n0}:recD}</td>
</tr>
</##table_row>
<##table_footer>
</table>
</##table_footer>
Tham khảo định dạng số: https://iif.vn/iif-admin/su-dung-lenh-trong-mau-html#recData
B3: Tại tab Report
Rpt_Hearder :(có 10 trang thì phần này sẽ nạp ra trang đầu tiên)
----
BÁO CÁO
Số hợp đồng: {recM:SoHoaDon:recM} , Nhân viên quản lý: {recM:TenKhachHang:recM}
Rpt_Footer : (có 10 trang thì phần này sẽ nạp ra trang đầu tiên)
Cảm ơn quý khách !
Tại tab Page
Page_Hearder: (có 10 trang thì luôn được nạp ở đầu trang)
Số hợp đồng: {recM:SoHoaDon:recM} , Nhân viên quản lý: {recM:TenKhachHang:recM}
{{##table_heard:E}}
Page_Footer: (có 10 trang thì luôn được nạp ở cuối trang)
{{##table_footer:R}}
Tại tab Details
Rpt_Detail : (luôn được nạp ơ mỗi trang nếu có html)
{{##table_row:R}}
Chú ý: chế độ thay thế
Ví dụ: html đang có là : <b>XX<b/>
R: thay thế biến (dạng ghi đè) , sẽ xóa hết <b>XX<b/> và ghi đè mới
S: thay ở đầu, Nội dung biến <b>XX<b/>
E: thay ở cuối, <b>XX<b/> Nội dung biến
Tham khảo thêm
** >> Áp dụng thực thế việc lệnh thay thế
- Nếu 1 report, query đã xử lý where cho hóa đơn chỉ định, tức luôn có 1 hóa đơn khi in thì phần thông tin hóa đơn có thể để ở
* Report -> Report Hearder:
Số: {recM:SoHoaDon:recM} , tên: Số: {recM:TenKhachHang:recM}
* Page_Hearder
{{##table_heard:R}}
- Nếu mỗi hóa đơn ra 1 report
* Report -> Report Hearder: xóa nội dung * Page_Hearder
Số: {recM:SoHoaDon:recM} , tên: Số: {recM:TenKhachHang:recM}
{{##table_heard:E}}
3. Cách cấu hình số dòng của 1 page
Cấu hình phần Config
Page_Contains_Height: phải có giá trị để biết chiều cao 1 page là bao nhiêu
Rpt_Hearder_Height: nếu có nhiều trang thì cần cấu hình giá trị để trang đầu tiên trừ giá trị này ra.
Rpt_Footer_Height: nếu có nhiều trang thì cần cấu hình giá trị để trang cuối cùng trừ giá trị này ra.
Detail_Height: rất quan trong để tính 1 dòng của detail là bao nhiều giúp phân 1 trang có bao nhiêu dòng.
Chỉ có Page_Contains_Height mới đưa giá trị ra css quy định chiều cao, các thuộc tính còn lại chỉ để tính toán phân trang.
Cách tính để phân trang
ví dụ: dữ liệu details có 60 bảng ghi
Page_Contains_Height: 210mm
Rpt_Hearder_Height: 30mm
Rpt_Footer_Height: 20mm
Detail_Height: 10mm
tongTrang = (Tổng row details X Detail_Height ) / (Page_Contains_Height);
//Trong code Page_Contains_Height=Page_Contains_Height-50; (giảm tỷ lệ tràn page)
tongTrang = 60*10 / 210 (2,9)
tongTrang = làm tròn lên(tongTrang ) , kết quả có 3 trang.
* Để xác định 1 trang có bao nhiêu row thì tùy vào trang
Trang đầu tiên (trang 1)
height_Loop = Rpt_Hearder_Height +
{lặp từ trên xuống dưới details} cho đến khi >=Page_Contains_Height thì là trang 1
Trang đầu tiên (trang 2
height_Loop =
{lặp từ trên xuống dưới details còn lại} cho đến khi >=Page_Contains_Height thì là trang 2
Trang đầu tiên (trang 3)
height_Loop = Rpt_Footer_Height
{lặp từ trên xuống dưới details} cho đến khi >=Page_Contains_Height thì là trang 3
4. Lệnh tổng giá trị cột của Details
Nếu muốn cuối của 1 trang có phần tổng
Tại Page_Footer , thêm
{{##table_footer:R}}
R có nghĩa là Replace
Trong phần HTML Var:
<##table_footer>
<tr class="" >
<td class=""></td>
<td class="">Tổng tiền trang ##Page_Number## :</td>
<td class=""></td>
<td class=""></td>
<td style="text-align: right;" >{recDCP:SUM(ThanhTien)/-/{0:n0}:recDCP}</td>
</tr>
</table>
</##table_footer>
* recDCP: C là compute , P là Page
Nếu muốn cuối của 1 report có phần tổng
Tại Rpt_Footer , thêm
{{##table_end:R}}
R có nghĩa là Replace
Trong phần HTML Var:
<##table_end>
<table class="table_donhang" border="0" cellspacing="0" align="center">
<tr>
<th style="text-align: right;" class="col_TT canhgiua br_l br_b">TỔNG TIỀN: {recDC:SUM(ThanhTien)/-/{0:n0}:recDC}</th>
</tr>
</table>
<p class="footer" style="text-align: center;">{iif-D}ConfigWeb:xml-19{/iif-D}</p>
</##table_end>
Nếu hiển thị số trang bên dưới mỗi trang
Tại Page_Bottom , thêm
Trang: ##Page_Number## / ##Page_Total##
Thêm trang trống vào trang đầu tiên
Tại VarStr
<##_CONFIG>
Page1_RowMax:20
Page1_RowMax_ColSet:
</##_CONFIG>
Ghi chú: dấu cách trống, nếu không để height sẽ rất bé
5. Một số lỗi khi tạo report details
Khi in phần page bottom bị lên giữa trang
Vào css Html_Add bổ sung thêm
@media print{
.page_contains{height:280mm;}/*chiều cào khi print - TÙY GIÁ TRỊ*/
}
Tạo report có details