Tạo report có details

Tạo report có details

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.

  1. Cách không sử dụng Html Var
  2. Cách sử dụng Html Var
  3. Cách cấu hình số dòng của 1 page
  4. Lệnh sử dụng trong report (tổng giá trị cột của Details, số trang, chèn trang trống)
  5. Một số lỗi khi tạo report details

 

*********************
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:&nbsp;
</##_CONFIG>

Ghi chú: &nbsp; 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Ị*/
}

Bài viết liên quan:

Tạo report có details