text:
- Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
- Tìm kiếm trước khi đặt câu hỏi
Sử dụng Report chuẩn của .NET, tại sao không?
Các bài viết hướng dẫn về Visual Basic .NET và C#
Điều hành viên: tungcan5diop, QUANITGROBEST
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Sử dụng Report chuẩn của .NET, tại sao không?
Tên bài viết: Sử dụng Report chuẩn của .NET, tại sao không?
Tác giả: ThuongBat
Cấp độ bài viết: Trung bình
Tóm tắt: Cách sử dụng Report chuẩn của .NET thay cho Crystal Report (hướng dẫn thao tác với VB.NET)
Mới ghé qua trang web này thấy có một số giải thích và ví dụ mẫu khá hay về ReportViewer. Mình đưa link lên đây để bạn nào cần thì tham khảo (web tiếng Anh nhé): http://gotreportviewer.com/
1. Đặt vấn đề:
Mình tìm trên forum thấy có khá nhiều bài viết hướng dẫn cách tạo báo cáo với Crystal Report (tạm viết tắt là CR). Nhiều bạn thích dùng CR bởi tính chuyên nghiệp của nó và CR được sử dụng Free trong Visual Studio. Nhưng CR có một điểm hạn chế là khi đóng gói chương trình mang sang máy khác nó không chạy được. Muốn CR hoạt động được, hoặc là máy khách phải cài Crystal Report (cái này không miễn phí) hoặc là bạn phải đóng kèm ứng dụng của mình một cái Merge Module khá nặng (khoảng 25Mb đối với Crystal Report cho Visual Studio 2005) làm cho bộ Setup của bạn phình to ra.
Report chuẩn của .NET cũng giống như Data Report trong Vb6 nhưng nó đã được nâng cấp lên nên cũng chuyên nghiệp không kém CR. Ngoài ra, vì nó là công cụ chuẩn của .NET nên được hỗ trợ khá tốt. Bạn đóng gói ứng dụng cũng chỉ cần mang theo vài cái DLL nhỏ là có thể chạy tốt.
2. Sử dụng Report của .NET (tạm gọi là Data Report cho nó gọn):
Tìm hiểu thông qua ví dụ là dễ hiểu nhất, vì vậy mình sẽ đưa ra 1 cái ví dụ để các bạn chưa biết thì tham khảo. Mình sẽ sử dụng Data Report để làm 1 cái báo cáo chi tiết sử dụng cước viễn thông (bạn nào sử dụng di động trả sau thì giữa tháng hay được gửi tặng cái báo cáo này). Tuy nhiên, có hơi khác 1 tí là: báo cáo chi tiết cước viễn thông sẽ liệt kê các cuộc gọi mà ta gọi đi, còn báo cáo này của mình là liệt kê các cuộc gọi đến.
Report của mình sau khi in ra sẽ có dạng như sau:
Phần Header và Footer sẽ trải dài từ trái qua phải, còn phần dữ liệu sẽ chia thành 2 cột (để tiết kiệm giấy)
2.1. Dữ liệu cần in:
Bảng dữ liệu của mình có cấu trúc như sau:
Đây là bảng dữ liệu mình đang làm (thiết kế trong MySQL), có 1 số cột không dùng đến nhưng mình không xóa đi (một phần là vì ngại thiết kế lại, một phần là muốn cho các bạn thấy là không cần thiết phải in ra tất cả các cột trong CSDL. Chỉ sử dụng những cột nào mình cần)
Ý nghĩa của các cột mình sẽ sử dụng như sau:
+ ID: là ID của bản ghi (số tự tăng)
+ Caller: số điện thoại của người gọi đến
+ StartAt: thời điểm bắt đầu kết nối cuộc gọi (có cả ngày và giờ)
+ Duration: thời gian đàm thoại (tính bằng giây)
+ BlockCount: số block của cuộc gọi (cái mình đang làm nó tính cước theo block). Các bạn chỉ cần hiểu đây là 1 trường Number là được
+ TotalCharge: tiền cước
2.2. Thiết kế bảng dữ liệu cần in trong Visual Studio:
Có nhiều bạn thích kết nối trực tiếp vào CSDL để in bằng mấy cái Data Source gì đó. Mình thì không làm theo cách đó. Mình chỉ tạo các Dataset và Datatable độc lập trong VS (có cấu trúc giống như cấu trúc trong CSDL) rồi thiết kế Report dựa vào các Datatable này. Khi nào cần in thì mới Fill dữ liệu vào Datatable để in. Để tạo ra Dataset độc lập trong VS, làm như sau:
+ Right Click vào tên Project trong cửa sổ Solution Explorer, chọn Add > New Item
+ Trong cửa sổ mới hiện ra, chọn Dataset
+ Nhập giá trị Name cho dataset là dsCallLogs rồi nhấn nút Add, bạn sẽ có một dataset là dsCallLogs.xsd trong Project của mình
Tiếp tục là việc tạo bảng cho Dataset:
+ Mở dsCallLogs.xsd ra,
+ Right CLick vào vùng trống của dataset và chọn Add > Datatable, bạn sẽ có 1 bảng là Datatable1
+ Sửa tên của Datatable từ Datatable1 thành tbl_Call_Logs
+ Right Click vào tbl_Call_Logs, chọn Add > Colum
+ Sửa tên column mới add thành ID
+ Tiếp tục add thêm các column khác để được 1 datatable có dạng như sau:
2.3. Tạo báo cáo:
Phần chuẩn bị dữ liệu đã xong, bây giờ đến bước tạo báo cáo.
+ Right Click vào tên Project trong Solution Explorer, chọn Add > New Item
+ Trong cửa sổ mới mở ra, chọn biểu tượng Report (lưu ý là Report chứ không phải Crystal Report nhé)
+ Nhập giá trị Name cho Report là rptCallLogs rồi nhấn nút Add. Bạn sẽ có một Report trong project của mình là rptCallLogs.rdlc
2.4. Thiết giao diện cho báo cáo: Phần này là hay nhất này. Các bạn có thể thấy việc thiết giao diện báo cáo này có khi còn đơn giản hơn cả Crystal Report (vậy mà không hiểu sao nhiều bạn vẫn thích dùng Crystal Report hơn ). Chém gió tí cho vui vẻ, các bạn thông cảm nhé
+ Double Click vào rptCallLogs.rdlc để mở giao diện thiết kế báo cáo ra
+ Vào menu Report, tích vào 2 mục Page Header và Page Footer để hiện header và footer cho báo cáo
+ Kéo từ Toolbox vào phần Header 9 cái textbox, sắp xếp và gõ chữ để nó giống như thế này:
(Lưu ý: các textbox có giá trị với dấu = ở phía trước là các tham số của Report. Khi gọi report lên, ta nhập cho tham số là cái gì thì nó sẽ hiện lên cái đó ở trên report. Cái này rất hữu dụng để in các giá trị được truyền từ Form vào Report. Tạm thời các bạn có thể để trống các textbox này. Ta sẽ thảo luận nó sau ở phần Tham số của Report.)
+ Kéo từ Toolbox vào phần Body 1 cái Table. Table này sẽ dùng để hiển thị dữ liệu dưới dạng bảng. Trông nó cũng giống cái DataGrid phải không các bạn. (Crystal Report hình như là mình không thấy cái này). Table sẽ có 3 phần Header, Detail và Footer với mặc định là 3 cột. Right Click vào Talbe, chọn Insert colum 3 lần để được 1 cái Table có 6 cột:
+ Gõ tiêu đề cho các cột của table (ở phần header nhé) lần lượt như sau:
+ Vào Menu Data > Show Data Source để hiện cửa sổ Data lên (nếu nó chưa hiện). Bạn sẽ thấy cái Datatable mà mình thiết kế ở bước 2.2 hiện ra. Bạn chỉ việc kéo các Field từ Datatable vào các cột tương ứng của của Table trên Report (kéo vào phần Detail nhé). Ở đây có 2 cột Ngày và T.G đàm thoại cùng sử dụng chung dữ liệu của Field: StartAt
2.5. Nhóm dữ liệu trên cột "Ngày":
Ta sẽ nhóm các cuộc gọi vào theo từng ngày để tiện theo dõi, đồng thời cũng giúp cho cái báo cáo nó sáng sủa hơn 1 chút. Quy trình làm như sau:
+ Chọn toàn bộ Table (click và rê chuột bao quanh table) - nhớ là chọn Table nhé, chứ không phải chọn một cell của table đâu
+ Right click vào table và chọn Properties để mở ra bảng Property của Table
+ Chọn sang tab Groups
+ Click vào nút Add để thêm 1 Group mới
+ Trong cửa sổ mới hiện ra, nhập giá trị =Format(Fields!StartAt.Value,"MM/dd/yyyy") (nhớ là có cả dấu = nhé). Ta phải dùng lệnh Format ở đây là vì trường StartAt là trường DateTime (có cả ngày và giờ) mà ta lại chỉ muốn nhóm theo ngày thôi chứ không nhóm theo giờ, phút giây. Lệnh Format sẽ cắt giá trị giờ,phút giây đi
+ Bỏ 2 dấu tích Include Group Header và Include Group Footer đi (bạn có thể để lại nếu muốn, tuy nhiên mình thấy không có header, footer sẽ đẹp hơn)
+ Nhấn Ok để đóng các cửa sổ Property lại.
2.6. Format các giá trị hiển thị cho report trông đẹp mắt hơn:
A. Cột "Ngày": chỉ cần hiển thị ngày và tháng là đủ rồi. Năm với lại cả giờ, phút, giây là không cần thiết. Hơn nữa, ta cũng chỉ cần hiện mỗi giá trị ngày 1 lần thôi (có 100 bản ghi cùng 1 nhóm thì cũng chỉ hiện ngày trên 1 bản ghi). Vì vậy ta có thể Format nó như sau:
+ Chọn Cell tương ứng với cột ngày (ở phần Detail nhé), nhấn F4 để hiện cửa sổ Properties của nó ra
+ Nhập giá trị Value trên cửa sổ Properties là =Format(First(Fields!StartAt.Value),"dd/MM") (Có cả dấu = nhé). Cái này để format kiểu hiển thị
+ Chọn Hide Duplicates là Table1_Group1 để không hiện các ngày trùng nhau ở các hàng liên tục
B. Cột "Bắt đầu": chỉ cần hiện giờ, phút, giây thôi (vì ngày đã có ở cột "Ngày" rồi). Bạn lại làm như sau
+ Chọn Cell của cột "Bắt đầu" (phần Detail), nhấn F4 để hiện cửa sổ Properties
+ Nhập giá trị cho Value là = Format(Fields!StartAt.Value,"hh:mm:ss") (có cả dấu = nhé)
2.7 Tính tổng:
Phần tính tổng sẽ được làm trên Footer của Table, Nhập các giá trị cho Footer của Table như sau:
+ Cột ngày (phần Footer), nhập giá trị "Tổng" - cái này chỉ là Text đơn thuần thôi
+ Cột "Người gọi" (phần footer): mình sẽ in tổng số cuộc gọi trên cột này,vì vậy bạn nhập giá trị cho nó là: =Count(Fields!Id.Value)
+ Cột "T.G": Tính tổng thời gian gọi, vì vậy bạn nhập giá trị cho nó là: =Sum(Fields!Duration.Value)
+ Cột "Blocks": tính tổng số block, vì vậy giá trị cần nhập là: =Sum(Fields!BlockCount.Value)
+ Cột "Tiền": tính tổng số tiền bằng công thức: =Sum(Fields!TotalCharge.Value)
Sau khi nhập các giá trị, format dữ liệu, kéo các cột to nhỏ cho hợp lý, bạn sẽ được cái table có dạng như sau:
Các bạn thấy không. Thao tác với Data Report đơn giản đấy chứ
2.8. Tham số của Report:
Bạn muốn truyền 1 giá trị nào đó từ Form vào Report, bạn chỉ việc tạo tham số cho report. Cách tạo tham số như sau:
+ Từ menu Report chọn muc Report Parameters
+ Click vào nút Add để thêm tham số mới
+ Nhập tên vào mục Name, chọn kiểu dữ liệu trong Data Type (mình chưa rành về mục này lắm nên toàn bộ kiểu dữ liệu mình đều để là String cho dễ thao tác. Nếu để các kiểu khác - ví dụ: datetime - thì khi chạy hay bị exception)
+ Tiếp tục add các Parameter khác, nhấn OK khi xong việc
Trong phần Report header, mình có mấy cái textbox có để parameter. Đó là các Report ở phần "Số máy", "Từ ngày", "Đến ngày". Vậy mình sẽ tạo ra 3 parameter là tương ứng là "PhoneNumber", "FromDate", "ToDate". Hãy nhớ tên của các Parameter này (hay ít nhất cũng là nhớ chỗ cần phải mở ra để xem nó) vì bạn còn cần dùng nó để truyền giá trị từ Form vào.
Sau khi thêm Parameters xong thì bạn chọn textbox để hiển thị các Parameter này. Nó chính là các textbox ở phần Report Header.
+Right Click vào textbox bên cạnh cái textbox có chữ "PhoneNumber" và chọn mục Expression
+ Trong cửa sổ hiện ra, chọn mục Parameters ở treeview bên tay trái
+ Double Click vào giá trị "PhoneNumber" ở listbox bên phải để thêm parameter này vào textbox. Bạn sẽ thấy nội dung của textbox có dạng =Parameters!phoneNumber.Value
+ Làm tương tự với các textbox còn lại
+ Riêng textbox chỗ có chữ "Trang" thì bạn nhập giá trị =Globals!PageNumber & "/" & Globals!TotalPages trong cửa sổ Expression của nó. Mấy cái giá trị PageNumber... bạn có thể tìm thấy trong nút Global của treeview
Cách truyền tham số cho Report trên đây áp dụng cho Visual Studio 2005 và 2008. Phiên bản VS2010 thì thao tác khác với cách trên 1 chút. Cảm ơn bạn Phung Manh Ninh đã cung cấp một ví dụ về cách truyền tham số cho Report trong VS2010. Các bạn có thể xem ví dụ đính kèm (có cả tệp hướng dẫn bằng Word trong đó)
2.9. Chia cột cho Report:
Vì cái vùng Data của mình tương đối hẹp về chiều ngang nên để tiết kiệm giấy ta sẽ in report trên 2 cột.
+ Vào Menu Report, chọn Report Properties
+ Chọn sang Tab Layout
+ Ở mục Columns, nhập giá trị 2
Vậy là đã xong phần thiết kế, bây giờ cái report của bạn sẽ có hình dạng như thế này:
Còn phần Form để show cái Report này lên, em sẽ post trong bài sau. Các bác thông cảm nhé
Tác giả: ThuongBat
Cấp độ bài viết: Trung bình
Tóm tắt: Cách sử dụng Report chuẩn của .NET thay cho Crystal Report (hướng dẫn thao tác với VB.NET)
Mới ghé qua trang web này thấy có một số giải thích và ví dụ mẫu khá hay về ReportViewer. Mình đưa link lên đây để bạn nào cần thì tham khảo (web tiếng Anh nhé): http://gotreportviewer.com/
1. Đặt vấn đề:
Mình tìm trên forum thấy có khá nhiều bài viết hướng dẫn cách tạo báo cáo với Crystal Report (tạm viết tắt là CR). Nhiều bạn thích dùng CR bởi tính chuyên nghiệp của nó và CR được sử dụng Free trong Visual Studio. Nhưng CR có một điểm hạn chế là khi đóng gói chương trình mang sang máy khác nó không chạy được. Muốn CR hoạt động được, hoặc là máy khách phải cài Crystal Report (cái này không miễn phí) hoặc là bạn phải đóng kèm ứng dụng của mình một cái Merge Module khá nặng (khoảng 25Mb đối với Crystal Report cho Visual Studio 2005) làm cho bộ Setup của bạn phình to ra.
Report chuẩn của .NET cũng giống như Data Report trong Vb6 nhưng nó đã được nâng cấp lên nên cũng chuyên nghiệp không kém CR. Ngoài ra, vì nó là công cụ chuẩn của .NET nên được hỗ trợ khá tốt. Bạn đóng gói ứng dụng cũng chỉ cần mang theo vài cái DLL nhỏ là có thể chạy tốt.
2. Sử dụng Report của .NET (tạm gọi là Data Report cho nó gọn):
Tìm hiểu thông qua ví dụ là dễ hiểu nhất, vì vậy mình sẽ đưa ra 1 cái ví dụ để các bạn chưa biết thì tham khảo. Mình sẽ sử dụng Data Report để làm 1 cái báo cáo chi tiết sử dụng cước viễn thông (bạn nào sử dụng di động trả sau thì giữa tháng hay được gửi tặng cái báo cáo này). Tuy nhiên, có hơi khác 1 tí là: báo cáo chi tiết cước viễn thông sẽ liệt kê các cuộc gọi mà ta gọi đi, còn báo cáo này của mình là liệt kê các cuộc gọi đến.
Report của mình sau khi in ra sẽ có dạng như sau:
Phần Header và Footer sẽ trải dài từ trái qua phải, còn phần dữ liệu sẽ chia thành 2 cột (để tiết kiệm giấy)
2.1. Dữ liệu cần in:
Bảng dữ liệu của mình có cấu trúc như sau:
Đây là bảng dữ liệu mình đang làm (thiết kế trong MySQL), có 1 số cột không dùng đến nhưng mình không xóa đi (một phần là vì ngại thiết kế lại, một phần là muốn cho các bạn thấy là không cần thiết phải in ra tất cả các cột trong CSDL. Chỉ sử dụng những cột nào mình cần)
Ý nghĩa của các cột mình sẽ sử dụng như sau:
+ ID: là ID của bản ghi (số tự tăng)
+ Caller: số điện thoại của người gọi đến
+ StartAt: thời điểm bắt đầu kết nối cuộc gọi (có cả ngày và giờ)
+ Duration: thời gian đàm thoại (tính bằng giây)
+ BlockCount: số block của cuộc gọi (cái mình đang làm nó tính cước theo block). Các bạn chỉ cần hiểu đây là 1 trường Number là được
+ TotalCharge: tiền cước
2.2. Thiết kế bảng dữ liệu cần in trong Visual Studio:
Có nhiều bạn thích kết nối trực tiếp vào CSDL để in bằng mấy cái Data Source gì đó. Mình thì không làm theo cách đó. Mình chỉ tạo các Dataset và Datatable độc lập trong VS (có cấu trúc giống như cấu trúc trong CSDL) rồi thiết kế Report dựa vào các Datatable này. Khi nào cần in thì mới Fill dữ liệu vào Datatable để in. Để tạo ra Dataset độc lập trong VS, làm như sau:
+ Right Click vào tên Project trong cửa sổ Solution Explorer, chọn Add > New Item
+ Trong cửa sổ mới hiện ra, chọn Dataset
+ Nhập giá trị Name cho dataset là dsCallLogs rồi nhấn nút Add, bạn sẽ có một dataset là dsCallLogs.xsd trong Project của mình
Tiếp tục là việc tạo bảng cho Dataset:
+ Mở dsCallLogs.xsd ra,
+ Right CLick vào vùng trống của dataset và chọn Add > Datatable, bạn sẽ có 1 bảng là Datatable1
+ Sửa tên của Datatable từ Datatable1 thành tbl_Call_Logs
+ Right Click vào tbl_Call_Logs, chọn Add > Colum
+ Sửa tên column mới add thành ID
+ Tiếp tục add thêm các column khác để được 1 datatable có dạng như sau:
2.3. Tạo báo cáo:
Phần chuẩn bị dữ liệu đã xong, bây giờ đến bước tạo báo cáo.
+ Right Click vào tên Project trong Solution Explorer, chọn Add > New Item
+ Trong cửa sổ mới mở ra, chọn biểu tượng Report (lưu ý là Report chứ không phải Crystal Report nhé)
+ Nhập giá trị Name cho Report là rptCallLogs rồi nhấn nút Add. Bạn sẽ có một Report trong project của mình là rptCallLogs.rdlc
2.4. Thiết giao diện cho báo cáo: Phần này là hay nhất này. Các bạn có thể thấy việc thiết giao diện báo cáo này có khi còn đơn giản hơn cả Crystal Report (vậy mà không hiểu sao nhiều bạn vẫn thích dùng Crystal Report hơn ). Chém gió tí cho vui vẻ, các bạn thông cảm nhé
+ Double Click vào rptCallLogs.rdlc để mở giao diện thiết kế báo cáo ra
+ Vào menu Report, tích vào 2 mục Page Header và Page Footer để hiện header và footer cho báo cáo
+ Kéo từ Toolbox vào phần Header 9 cái textbox, sắp xếp và gõ chữ để nó giống như thế này:
(Lưu ý: các textbox có giá trị với dấu = ở phía trước là các tham số của Report. Khi gọi report lên, ta nhập cho tham số là cái gì thì nó sẽ hiện lên cái đó ở trên report. Cái này rất hữu dụng để in các giá trị được truyền từ Form vào Report. Tạm thời các bạn có thể để trống các textbox này. Ta sẽ thảo luận nó sau ở phần Tham số của Report.)
+ Kéo từ Toolbox vào phần Body 1 cái Table. Table này sẽ dùng để hiển thị dữ liệu dưới dạng bảng. Trông nó cũng giống cái DataGrid phải không các bạn. (Crystal Report hình như là mình không thấy cái này). Table sẽ có 3 phần Header, Detail và Footer với mặc định là 3 cột. Right Click vào Talbe, chọn Insert colum 3 lần để được 1 cái Table có 6 cột:
+ Gõ tiêu đề cho các cột của table (ở phần header nhé) lần lượt như sau:
+ Vào Menu Data > Show Data Source để hiện cửa sổ Data lên (nếu nó chưa hiện). Bạn sẽ thấy cái Datatable mà mình thiết kế ở bước 2.2 hiện ra. Bạn chỉ việc kéo các Field từ Datatable vào các cột tương ứng của của Table trên Report (kéo vào phần Detail nhé). Ở đây có 2 cột Ngày và T.G đàm thoại cùng sử dụng chung dữ liệu của Field: StartAt
2.5. Nhóm dữ liệu trên cột "Ngày":
Ta sẽ nhóm các cuộc gọi vào theo từng ngày để tiện theo dõi, đồng thời cũng giúp cho cái báo cáo nó sáng sủa hơn 1 chút. Quy trình làm như sau:
+ Chọn toàn bộ Table (click và rê chuột bao quanh table) - nhớ là chọn Table nhé, chứ không phải chọn một cell của table đâu
+ Right click vào table và chọn Properties để mở ra bảng Property của Table
+ Chọn sang tab Groups
+ Click vào nút Add để thêm 1 Group mới
+ Trong cửa sổ mới hiện ra, nhập giá trị =Format(Fields!StartAt.Value,"MM/dd/yyyy") (nhớ là có cả dấu = nhé). Ta phải dùng lệnh Format ở đây là vì trường StartAt là trường DateTime (có cả ngày và giờ) mà ta lại chỉ muốn nhóm theo ngày thôi chứ không nhóm theo giờ, phút giây. Lệnh Format sẽ cắt giá trị giờ,phút giây đi
+ Bỏ 2 dấu tích Include Group Header và Include Group Footer đi (bạn có thể để lại nếu muốn, tuy nhiên mình thấy không có header, footer sẽ đẹp hơn)
+ Nhấn Ok để đóng các cửa sổ Property lại.
2.6. Format các giá trị hiển thị cho report trông đẹp mắt hơn:
A. Cột "Ngày": chỉ cần hiển thị ngày và tháng là đủ rồi. Năm với lại cả giờ, phút, giây là không cần thiết. Hơn nữa, ta cũng chỉ cần hiện mỗi giá trị ngày 1 lần thôi (có 100 bản ghi cùng 1 nhóm thì cũng chỉ hiện ngày trên 1 bản ghi). Vì vậy ta có thể Format nó như sau:
+ Chọn Cell tương ứng với cột ngày (ở phần Detail nhé), nhấn F4 để hiện cửa sổ Properties của nó ra
+ Nhập giá trị Value trên cửa sổ Properties là =Format(First(Fields!StartAt.Value),"dd/MM") (Có cả dấu = nhé). Cái này để format kiểu hiển thị
+ Chọn Hide Duplicates là Table1_Group1 để không hiện các ngày trùng nhau ở các hàng liên tục
B. Cột "Bắt đầu": chỉ cần hiện giờ, phút, giây thôi (vì ngày đã có ở cột "Ngày" rồi). Bạn lại làm như sau
+ Chọn Cell của cột "Bắt đầu" (phần Detail), nhấn F4 để hiện cửa sổ Properties
+ Nhập giá trị cho Value là = Format(Fields!StartAt.Value,"hh:mm:ss") (có cả dấu = nhé)
2.7 Tính tổng:
Phần tính tổng sẽ được làm trên Footer của Table, Nhập các giá trị cho Footer của Table như sau:
+ Cột ngày (phần Footer), nhập giá trị "Tổng" - cái này chỉ là Text đơn thuần thôi
+ Cột "Người gọi" (phần footer): mình sẽ in tổng số cuộc gọi trên cột này,vì vậy bạn nhập giá trị cho nó là: =Count(Fields!Id.Value)
+ Cột "T.G": Tính tổng thời gian gọi, vì vậy bạn nhập giá trị cho nó là: =Sum(Fields!Duration.Value)
+ Cột "Blocks": tính tổng số block, vì vậy giá trị cần nhập là: =Sum(Fields!BlockCount.Value)
+ Cột "Tiền": tính tổng số tiền bằng công thức: =Sum(Fields!TotalCharge.Value)
Sau khi nhập các giá trị, format dữ liệu, kéo các cột to nhỏ cho hợp lý, bạn sẽ được cái table có dạng như sau:
Các bạn thấy không. Thao tác với Data Report đơn giản đấy chứ
2.8. Tham số của Report:
Bạn muốn truyền 1 giá trị nào đó từ Form vào Report, bạn chỉ việc tạo tham số cho report. Cách tạo tham số như sau:
+ Từ menu Report chọn muc Report Parameters
+ Click vào nút Add để thêm tham số mới
+ Nhập tên vào mục Name, chọn kiểu dữ liệu trong Data Type (mình chưa rành về mục này lắm nên toàn bộ kiểu dữ liệu mình đều để là String cho dễ thao tác. Nếu để các kiểu khác - ví dụ: datetime - thì khi chạy hay bị exception)
+ Tiếp tục add các Parameter khác, nhấn OK khi xong việc
Trong phần Report header, mình có mấy cái textbox có để parameter. Đó là các Report ở phần "Số máy", "Từ ngày", "Đến ngày". Vậy mình sẽ tạo ra 3 parameter là tương ứng là "PhoneNumber", "FromDate", "ToDate". Hãy nhớ tên của các Parameter này (hay ít nhất cũng là nhớ chỗ cần phải mở ra để xem nó) vì bạn còn cần dùng nó để truyền giá trị từ Form vào.
Sau khi thêm Parameters xong thì bạn chọn textbox để hiển thị các Parameter này. Nó chính là các textbox ở phần Report Header.
+Right Click vào textbox bên cạnh cái textbox có chữ "PhoneNumber" và chọn mục Expression
+ Trong cửa sổ hiện ra, chọn mục Parameters ở treeview bên tay trái
+ Double Click vào giá trị "PhoneNumber" ở listbox bên phải để thêm parameter này vào textbox. Bạn sẽ thấy nội dung của textbox có dạng =Parameters!phoneNumber.Value
+ Làm tương tự với các textbox còn lại
+ Riêng textbox chỗ có chữ "Trang" thì bạn nhập giá trị =Globals!PageNumber & "/" & Globals!TotalPages trong cửa sổ Expression của nó. Mấy cái giá trị PageNumber... bạn có thể tìm thấy trong nút Global của treeview
Cách truyền tham số cho Report trên đây áp dụng cho Visual Studio 2005 và 2008. Phiên bản VS2010 thì thao tác khác với cách trên 1 chút. Cảm ơn bạn Phung Manh Ninh đã cung cấp một ví dụ về cách truyền tham số cho Report trong VS2010. Các bạn có thể xem ví dụ đính kèm (có cả tệp hướng dẫn bằng Word trong đó)
2.9. Chia cột cho Report:
Vì cái vùng Data của mình tương đối hẹp về chiều ngang nên để tiết kiệm giấy ta sẽ in report trên 2 cột.
+ Vào Menu Report, chọn Report Properties
+ Chọn sang Tab Layout
+ Ở mục Columns, nhập giá trị 2
Vậy là đã xong phần thiết kế, bây giờ cái report của bạn sẽ có hình dạng như thế này:
Còn phần Form để show cái Report này lên, em sẽ post trong bài sau. Các bác thông cảm nhé
Sửa lần cuối bởi thuongbat vào ngày T.Ba 05/06/2012 1:09 am với 4 lần sửa.
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Sử dụng Report chuẩn của .NET, tại sao không? <tiếp theo>
2.10. Tạo Form để hiển thị Report
Form để hiển thị Report cần nhất là 1 cái ReportViewer. Bạn có thể kéo cái control này vào Form từ thanh Toolbox. Khi bạn kéo ReportViewer1 vào trong Form, VS có thể sẽ hỏi bạn chọn Report cần hiển thị trong ReportViewer. Bạn chỉ việc bỏ qua bước này (Vì Report của ta gắn với 1 cái Datatable rỗng chứ không kết nối trực tiếp vào database nên bạn cần phải có 1 ít code để show report lên viewer thay vì chọn sẵn). Trên Form bạn cũng có thể bố trí thêm 1 số điều khiển khác để lọc dữ liệu cần hiển thị. Form của mình thiết kế đơn giản như sau:
+ 2 cái DateTimePicker dùng để lọc các bản ghi từ ngày...đến ngày
+ 1 cái Textbox có Label là Caller ID: dùng để lọc những bản ghi có số điện thoại người gọi giống với nhập vào textbox
+ 1 cái Combobox dùng để chọn loại báo cáo. Một Form này có thể show nhiều kiểu báo cáo khác nhau (tất nhiên là bạn phải thiết kế thêm các report khác). Ở đây mình mới thiết kế mẫu 1 cái report nên tạm thời không dùng đến combo này
+ 1 Button dùng để load report lên form khi click
+ 1 Reportviewer là nơi hiển thị report
Ta bắt đầu viết code cho cái Button "Show Report"
Quy trình thực hiện đã xong. Và đây là thành quả:
Trông cũng không đến nỗi tệ phải không các bạn.
Form để hiển thị Report cần nhất là 1 cái ReportViewer. Bạn có thể kéo cái control này vào Form từ thanh Toolbox. Khi bạn kéo ReportViewer1 vào trong Form, VS có thể sẽ hỏi bạn chọn Report cần hiển thị trong ReportViewer. Bạn chỉ việc bỏ qua bước này (Vì Report của ta gắn với 1 cái Datatable rỗng chứ không kết nối trực tiếp vào database nên bạn cần phải có 1 ít code để show report lên viewer thay vì chọn sẵn). Trên Form bạn cũng có thể bố trí thêm 1 số điều khiển khác để lọc dữ liệu cần hiển thị. Form của mình thiết kế đơn giản như sau:
+ 2 cái DateTimePicker dùng để lọc các bản ghi từ ngày...đến ngày
+ 1 cái Textbox có Label là Caller ID: dùng để lọc những bản ghi có số điện thoại người gọi giống với nhập vào textbox
+ 1 cái Combobox dùng để chọn loại báo cáo. Một Form này có thể show nhiều kiểu báo cáo khác nhau (tất nhiên là bạn phải thiết kế thêm các report khác). Ở đây mình mới thiết kế mẫu 1 cái report nên tạm thời không dùng đến combo này
+ 1 Button dùng để load report lên form khi click
+ 1 Reportviewer là nơi hiển thị report
Ta bắt đầu viết code cho cái Button "Show Report"
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShowReport.Click
- Dim dt As DataTable = Nothing 'datable dùng để query dữ liệu từ database và gán vào report
- Dim oDb As New CMySqlDao() 'đối tượng này sẽ kết nối với CSDL MySQL và query dữ liệu, các bạn có thể dùng kết nối của mình theo cách khác
- Dim sql As String 'câu sql cần query
- sql = "SELECT * FROM tbl_call_log"
- sql &= " WHERE DATE(startAt) BETWEEN '" & dtpFromDate.Value.ToString("yyyy-MM-dd") & "' AND '" & dtpToDate.Value.ToString("yyyy-MM-dd") & "'" 'câu SQL dùng để Query (mình viết cho MySQL). với các loại CSDL khác có thể câu SQL sẽ hơi khác 1 chút
- If (txtCallerId.TextLength > 0) Then 'nếu người sử dụng có nhập số điện thoại vào ô CallerId thì thêm điều kiện lọc này
- sql &= " AND caller LIKE '" & oDb.Quote(txtCallerId.Text.Replace("*", "%")) & "'"
- End If
- dt = oDb.ExecuteSql(sql) 'truy vấn vào CSDL để lấy dữ liệu vào Datatable
- ReportViewer1.Reset() 'reset cái Reportviewer
- ReportViewer1.LocalReport.ReportEmbeddedResource = "MyTestProgram.rptCallLogs.rdlc" 'gán cái Report mà ta đã thiết kế ở trên vào Reportviewer ("MyTestProgram" chính là tên NameSpace gốc - với VB.NET thì tên namespace gốc mặc định trùng với tên Project)
- ReportViewer1.LocalReport.DataSources.Clear() 'Clear DataSource cũ của Report (lúc thiết kế report, ta làm trên Datatable rỗng nên ở đây ta clear nó đi để thêm Datatable thực sự của ta vào)
- Dim newDataSource As Microsoft.Reporting.WinForms.ReportDataSource = New Microsoft.Reporting.WinForms.ReportDataSource("dsCallLogs_tbl_Call_Logs", dt) 'tạo DataSource mới cho Report. Lưu ý: tên "dsCallLogs_tbl_Call_Logs" chính là tên ghép của Dataset và Datatable ta thiết kế ở bước 2.2.
- ReportViewer1.LocalReport.DataSources.Add(newDataSource) 'gán DataSource mới tạo vào Report
- Dim Parameters As List(Of ReportParameter) = New List(Of ReportParameter) 'Tạo danh sách các Parameter để truyền cho Report
- Dim param As ReportParameter
- param = New ReportParameter("fromDate", dtpFromDate.Value.ToString("dd/MM/yyyy")) 'parameter "FromDate" của report
- Parameters.Add(param)
- param = New ReportParameter("toDate", dtpToDate.Value.ToString("dd/MM/yyyy")) 'parameter "ToDate" của report
- Parameters.Add(param)
- param = New ReportParameter("phoneNumber", txtCallerId.Text) 'parameter "PhoneNumber" của Report
- Parameters.Add(param)
- ReportViewer1.LocalReport.SetParameters(Parameters) 'gán danh sách các Parameter vào Report
- ReportViewer1.RefreshReport() 'gọi RefreshReport() để bắt đầu hiển thị
- ReportViewer1.LocalReport.DisplayName = "Call Logs" 'nếu bạn bỏ qua bước này, khi report hiện ra và bạn muốn export nó ra excel hoặc PDF thì VS sẽ lấy tên mặc định cho file export là rptCallLogs.
- ReportViewer1.SetDisplayMode(DisplayMode.PrintLayout) 'bắt Reportviewer hiển thị ở chế độ PrintLayout (trông sẽ đẹp mắt hơn)
- ReportViewer1.ZoomMode = ZoomMode.Percent 'đặt chế độ Zoom cho report là theo phần trăm
- ReportViewer1.ZoomPercent = 100 'và zoom nó lên 100%
- End Sub
Quy trình thực hiện đã xong. Và đây là thành quả:
Trông cũng không đến nỗi tệ phải không các bạn.
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
2.3 Thảo luận thêm:
2.3.1. Lọc dữ liệu nâng cao:
Với Report trên, tất cả các số điện thoại (cả số cố định và số di động) đều nằm chung trong 1 bảng dữ liệu. Bây giờ tôi muốn tách các số di động ra trên 1 bảng, các số cố định ra 1 bảng, còn các số khác (số hiển thị sai, hoặc không có hiển thị số do người gọi dùng dịch vụ dấu số) ra 1 bảng để tiện theo dõi hơn. Vậy thì phải làm như thế nào?
Trong CSDL của tôi có 1 trường là CallerIdType (kiểu số nguyên). Giá trị của trường này sẽ thể hiện số điện thoại của người gọi thuộc kiểu gì (di động, cố định hay không rõ số). Tất nhiên các bạn có thể có phương pháp riêng của mình để quy định các điều kiện lọc. Nhưng như ví dụ này của tôi thì quy định như sau: Giá trị của CallerIdType sẽ bằng:
+ 0: nếu số điện thoại của người gọi là 1 số cố định
+ 1: nếu số điện thoại là số di động
+ -1: nếu số điện thoại không có hoặc không rõ thuộc kiểu nào
(Tất nhiên các giá trị này tôi đã tính toán trong chương trình của mình trước khi Insert 1 bản ghi vào bảng CallLogs)
Vì vậy, bây giờ tôi muốn có 1 bảng hiện chỉ các số cố định thôi, dĩ nhiên là tôi sẽ lọc với CallerIdType = 0...
Việc bổ sung các Field phục vụ cho công tác lọc dữ liệu vào bảng trong Database có thể sẽ gây dư thừa dữ liệu (vì từ giá trị số điện thoại đã lưu, bạn có thể tính toán để cho ra kết quả số đó thuộc kiểu gì bất cứ lúc nào) nhưng sẽ giúp cho việc xử lý report nhanh hơn và đỡ phức tạp hơn (không cần tính toán nhiều trong Report).
Bây giờ tôi sẽ sửa lại cái báo cáo rptCallLogs để hiện ra 3 bảng với 3 loại số điện thoại khác nhau trên cùng 1 report. Quy trình như sau:
+ Mở report rptCallLogs ở chế độ Design.
+ Copy cái Table trong phần Detail của report và Paste vào phần trống của Detail 2 lần nữa, ta sẽ được 3 cái bảng giống hệt nhau (VS sẽ tự đặt tên cho các table là Table1, Table2, Table3). Sắp xếp 1 chút và thêm vào các Textbox chú thích. Ta sẽ có cái Report mới trông như thế này:
(Sắp xếp thứ tự của các Table từ trên xuống dưới là Table1, Table2, Table3)
+ Mở Properties Window của Table1 (bằng cách chọn Table1, right click vào nó và chọn Properties)
+ Chọn sang tab Filters
+ Trong Filter List, ở hàng đầu tiên, chọn Expression là =Fields!callerIdType.Value
+ Chọn Operator là dấu =
+ Cột Value, nhập giá trị là =1 (nhớ là có cả dấu = nhé. không có dấu = sẽ bị lỗi đấy)
+ Các bước vừa rồi là ta đã filter cho bảng Table1 chỉ hiện các bản ghi có CallerIdType=1 (chỉ hiện các số điện thoại di động). Làm tương tự như thế với 2 bảng còn lại (Table2 phải nhập Value cho filter là =0, còn Table3, giá trị cho filter là =-1)
Vậy là đã gần xong rồi đấy. Chỉ còn 1 bước nhỏ nữa thôi. Các bạn có nhớ là ở bước 2.6 ta đã chọn giá trị Hide Duplicates cho giá trị ở cột "Ngày" không? Hide Duplicates sẽ làm ẩn đi các giá trị ngày giống nhau ở cột "Ngày" (chỉ hiện giá trị trên hàng đầu tiên) làm cho Report trông sáng sủa hơn và ta cũng tiết kiệm được kha khá mực in. Bảng Table1 có một nhóm ta đã tạo để nhóm các bản ghi trong cùng 1 ngày lại với nhau. Khi bạn copy ra 2 bảng nữa thì trên mỗi bảng mới cũng sẽ có một nhóm tương tự (nhưng tên nhóm sẽ khác đi). Vì vậy ta phải chọn lại giá trị cho Hide Duplicates trên 2 bảng mới này (bảng 1 thì không cần vì nhóm của nó không thay đổi)
+ Chọn Cell tương ứng với cột "NGày" trên Table2, nhấn F4 để mở Properties của nó ra.
+ CHọn giá trị cho Hide Duplicates trong Properties Window là: table2_Group1
+ Tương tự, chọn Hide Duplicates trong Properties Window cho Cell của Table3 là table3_Group1
Đã xong, bạn lưu lại cái report đã sửa và chạy chương trình. Còn đây là kết quả:
Việc Filter dữ liệu hoàn toàn có thể thực hiện trên Report. Bạn không cần phải viết lại 1 dòng code nào cả.
2.3.2. Cài đặt trang in
Đa số báo cáo khi in ra, các bạn đều muốn in trên giấy A4 (có thể có bạn muốn khi trên khổ giấy to hơn hoặc nhỏ hơn). Tuy nhiên cái mình muốn nói đến là việc chúng ta sử dụng giấy A4 để in, trong khi thằng Microsoft lại đặt kiểu giấy mặc định cho cái Report là Letter. Giấy Letter có bề ngang to hơn giấy A4 1 chút nhưng nếu bạn nào không để ý thì thiết kế xong in ra sẽ bị cắt mất 1 đoạn ở lề bên phải. Trên Reportviewer cũng có nút Page Setup, nhưng nếu bạn để cái report của mình to hơn khổ A4 thì khi chạy chương trình lên, bạn sẽ không thể dùng nút Page Setup để chuyển khổ giấy từ Letter về A4. Để định dạng giấy in của mình là A4 các bạn làm như sau:
+ Mở Report ở chế độ Design
+ Từ menu Report, chọn Report Properties
+ Chọn sang Tab Layout
+ Nhập kích thước Page Width = 8.27, Page Height = 11.69. Đây là kích thước của giấy A4
+ Trên Report, sắp xếp các điều khiển, co giãn kích thước sao cho vừa mắt nhưng phải luôn chú ý, thuộc tính Size của Report Header và Report Footer không bao giờ được vượt quá kích thước ở trên. Nếu bạn để các điều khiển tràn sang bên phải làm chiều ngang của các Section lớn hơn 8.27 dù chỉ 1 chút thôi thì thằng ReportViewer sẽ tự động chuyển loại giấy sang Letter và bạn sẽ không thể chỉnh lại được bằng nút Page Setup lúc chạy chương trình
Update
2.4 Sử dụng Report chuẩn với LINQ:
Như các phần trên các bạn đã thấy, khi tạo Report, trước hết ta phải chuẩn bị dữ liệu cho chúng (là các Datatable, Dataset). Nhưng khi làm việc với LINQ, các khái niệm như Datatable, Dataset đã không còn được sử dụng nữa. Vậy làm cách nào mà ta đưa được dữ liệu vào trong Report?
Các bạn vẫn có thể tạo ra các Datatable, rồi dùng vòng For hay một số phương pháp nào đó khác để đưa dữ liệu từ kết quả của các Query trong LINQ vào những datatable này để gán cho Report, nhưng cách này quả thực là rất phiền phức. Có một phương pháp khác nhanh hơn và đơn giản hơn để đưa dữ liệu từ LINQ vào Report. Đó chính là nội dung mà tôi sẽ hướng dẫn dưới đây:
A. Chuẩn bị
Giả sử tôi có một bảng trong CSDL là tbl_contact. Cách thức để tạo ra cái DataContext cho CSDL như thế nào thì cũng không cần nói nữa vì đây là 1 cái căn bản nhất của LINQ rồi. Tôi đã tạo ra 1 cái DataContext như sau trong chương trình của tôi:
Sau khi tạo DataContext cho CSDL, bạn thêm vào Project của mình các thành phần như sau:
+ 1 cái Winform: đặt tên là Form1.cs đi. Form này sẽ làm form hiển thị báo cáo
Trong Form1.cs, bạn kéo vào 1 cái Reportviewer (mặc đinh sẽ tên là Reportviewer1)
+ 1 cái Report: đặt tên là Report1.rdlc để hiển thị dữ liệu
Sau khi thêm vào các thành phần như trên, Project sẽ có dạng như sau:
B. Bắt đầu thiết kế Report:
+ Double Click vào Report1.rdlc trong Solution Explorer để mở Report ra trong chế độ thiết kế
+ Từ menu Data, chọn Add New Data Source để mở cửa sổ Data Source Configuration Wizard.
+ Trên cửa sổ vừa mở ra, chọn Object, rồi click Next
+ VS sẽ tự tìm các Object trong Project cho bạn (bao gồm cả cái tbl_contact trong DataContext bạn đã tạo ở trên). Bạn chỉ việc click vào dấu (+) ở tên Project để Expand cái Project của mình ra, tìm đến chỗ có tbl_contact. Chọn nó và click Finish.
+ Vậy là bạn đã có DataSource để thiết kế Report rồi. Nếu cửa sổ DataSource chưa xuất hiện, bạn có thể vào Menu: Data > Show Data Sources để hiện nó lên. Còn nếu đã nhìn thấy data source rồi, thì cứ kéo nó vào Report thôi
C. Viết Code để Show Report:
Sau khi thiết kế Report xong, bạn cần viết code để hiện cái Report này lên trên Form1 như sau:
Chạy chương trình, và bạn sẽ thấy Report xuất hiện.
2.3.1. Lọc dữ liệu nâng cao:
Với Report trên, tất cả các số điện thoại (cả số cố định và số di động) đều nằm chung trong 1 bảng dữ liệu. Bây giờ tôi muốn tách các số di động ra trên 1 bảng, các số cố định ra 1 bảng, còn các số khác (số hiển thị sai, hoặc không có hiển thị số do người gọi dùng dịch vụ dấu số) ra 1 bảng để tiện theo dõi hơn. Vậy thì phải làm như thế nào?
Trong CSDL của tôi có 1 trường là CallerIdType (kiểu số nguyên). Giá trị của trường này sẽ thể hiện số điện thoại của người gọi thuộc kiểu gì (di động, cố định hay không rõ số). Tất nhiên các bạn có thể có phương pháp riêng của mình để quy định các điều kiện lọc. Nhưng như ví dụ này của tôi thì quy định như sau: Giá trị của CallerIdType sẽ bằng:
+ 0: nếu số điện thoại của người gọi là 1 số cố định
+ 1: nếu số điện thoại là số di động
+ -1: nếu số điện thoại không có hoặc không rõ thuộc kiểu nào
(Tất nhiên các giá trị này tôi đã tính toán trong chương trình của mình trước khi Insert 1 bản ghi vào bảng CallLogs)
Vì vậy, bây giờ tôi muốn có 1 bảng hiện chỉ các số cố định thôi, dĩ nhiên là tôi sẽ lọc với CallerIdType = 0...
Việc bổ sung các Field phục vụ cho công tác lọc dữ liệu vào bảng trong Database có thể sẽ gây dư thừa dữ liệu (vì từ giá trị số điện thoại đã lưu, bạn có thể tính toán để cho ra kết quả số đó thuộc kiểu gì bất cứ lúc nào) nhưng sẽ giúp cho việc xử lý report nhanh hơn và đỡ phức tạp hơn (không cần tính toán nhiều trong Report).
Bây giờ tôi sẽ sửa lại cái báo cáo rptCallLogs để hiện ra 3 bảng với 3 loại số điện thoại khác nhau trên cùng 1 report. Quy trình như sau:
+ Mở report rptCallLogs ở chế độ Design.
+ Copy cái Table trong phần Detail của report và Paste vào phần trống của Detail 2 lần nữa, ta sẽ được 3 cái bảng giống hệt nhau (VS sẽ tự đặt tên cho các table là Table1, Table2, Table3). Sắp xếp 1 chút và thêm vào các Textbox chú thích. Ta sẽ có cái Report mới trông như thế này:
(Sắp xếp thứ tự của các Table từ trên xuống dưới là Table1, Table2, Table3)
+ Mở Properties Window của Table1 (bằng cách chọn Table1, right click vào nó và chọn Properties)
+ Chọn sang tab Filters
+ Trong Filter List, ở hàng đầu tiên, chọn Expression là =Fields!callerIdType.Value
+ Chọn Operator là dấu =
+ Cột Value, nhập giá trị là =1 (nhớ là có cả dấu = nhé. không có dấu = sẽ bị lỗi đấy)
+ Các bước vừa rồi là ta đã filter cho bảng Table1 chỉ hiện các bản ghi có CallerIdType=1 (chỉ hiện các số điện thoại di động). Làm tương tự như thế với 2 bảng còn lại (Table2 phải nhập Value cho filter là =0, còn Table3, giá trị cho filter là =-1)
Vậy là đã gần xong rồi đấy. Chỉ còn 1 bước nhỏ nữa thôi. Các bạn có nhớ là ở bước 2.6 ta đã chọn giá trị Hide Duplicates cho giá trị ở cột "Ngày" không? Hide Duplicates sẽ làm ẩn đi các giá trị ngày giống nhau ở cột "Ngày" (chỉ hiện giá trị trên hàng đầu tiên) làm cho Report trông sáng sủa hơn và ta cũng tiết kiệm được kha khá mực in. Bảng Table1 có một nhóm ta đã tạo để nhóm các bản ghi trong cùng 1 ngày lại với nhau. Khi bạn copy ra 2 bảng nữa thì trên mỗi bảng mới cũng sẽ có một nhóm tương tự (nhưng tên nhóm sẽ khác đi). Vì vậy ta phải chọn lại giá trị cho Hide Duplicates trên 2 bảng mới này (bảng 1 thì không cần vì nhóm của nó không thay đổi)
+ Chọn Cell tương ứng với cột "NGày" trên Table2, nhấn F4 để mở Properties của nó ra.
+ CHọn giá trị cho Hide Duplicates trong Properties Window là: table2_Group1
+ Tương tự, chọn Hide Duplicates trong Properties Window cho Cell của Table3 là table3_Group1
Đã xong, bạn lưu lại cái report đã sửa và chạy chương trình. Còn đây là kết quả:
Việc Filter dữ liệu hoàn toàn có thể thực hiện trên Report. Bạn không cần phải viết lại 1 dòng code nào cả.
2.3.2. Cài đặt trang in
Đa số báo cáo khi in ra, các bạn đều muốn in trên giấy A4 (có thể có bạn muốn khi trên khổ giấy to hơn hoặc nhỏ hơn). Tuy nhiên cái mình muốn nói đến là việc chúng ta sử dụng giấy A4 để in, trong khi thằng Microsoft lại đặt kiểu giấy mặc định cho cái Report là Letter. Giấy Letter có bề ngang to hơn giấy A4 1 chút nhưng nếu bạn nào không để ý thì thiết kế xong in ra sẽ bị cắt mất 1 đoạn ở lề bên phải. Trên Reportviewer cũng có nút Page Setup, nhưng nếu bạn để cái report của mình to hơn khổ A4 thì khi chạy chương trình lên, bạn sẽ không thể dùng nút Page Setup để chuyển khổ giấy từ Letter về A4. Để định dạng giấy in của mình là A4 các bạn làm như sau:
+ Mở Report ở chế độ Design
+ Từ menu Report, chọn Report Properties
+ Chọn sang Tab Layout
+ Nhập kích thước Page Width = 8.27, Page Height = 11.69. Đây là kích thước của giấy A4
+ Trên Report, sắp xếp các điều khiển, co giãn kích thước sao cho vừa mắt nhưng phải luôn chú ý, thuộc tính Size của Report Header và Report Footer không bao giờ được vượt quá kích thước ở trên. Nếu bạn để các điều khiển tràn sang bên phải làm chiều ngang của các Section lớn hơn 8.27 dù chỉ 1 chút thôi thì thằng ReportViewer sẽ tự động chuyển loại giấy sang Letter và bạn sẽ không thể chỉnh lại được bằng nút Page Setup lúc chạy chương trình
Update
2.4 Sử dụng Report chuẩn với LINQ:
Như các phần trên các bạn đã thấy, khi tạo Report, trước hết ta phải chuẩn bị dữ liệu cho chúng (là các Datatable, Dataset). Nhưng khi làm việc với LINQ, các khái niệm như Datatable, Dataset đã không còn được sử dụng nữa. Vậy làm cách nào mà ta đưa được dữ liệu vào trong Report?
Các bạn vẫn có thể tạo ra các Datatable, rồi dùng vòng For hay một số phương pháp nào đó khác để đưa dữ liệu từ kết quả của các Query trong LINQ vào những datatable này để gán cho Report, nhưng cách này quả thực là rất phiền phức. Có một phương pháp khác nhanh hơn và đơn giản hơn để đưa dữ liệu từ LINQ vào Report. Đó chính là nội dung mà tôi sẽ hướng dẫn dưới đây:
A. Chuẩn bị
Giả sử tôi có một bảng trong CSDL là tbl_contact. Cách thức để tạo ra cái DataContext cho CSDL như thế nào thì cũng không cần nói nữa vì đây là 1 cái căn bản nhất của LINQ rồi. Tôi đã tạo ra 1 cái DataContext như sau trong chương trình của tôi:
Sau khi tạo DataContext cho CSDL, bạn thêm vào Project của mình các thành phần như sau:
+ 1 cái Winform: đặt tên là Form1.cs đi. Form này sẽ làm form hiển thị báo cáo
Trong Form1.cs, bạn kéo vào 1 cái Reportviewer (mặc đinh sẽ tên là Reportviewer1)
+ 1 cái Report: đặt tên là Report1.rdlc để hiển thị dữ liệu
Sau khi thêm vào các thành phần như trên, Project sẽ có dạng như sau:
B. Bắt đầu thiết kế Report:
+ Double Click vào Report1.rdlc trong Solution Explorer để mở Report ra trong chế độ thiết kế
+ Từ menu Data, chọn Add New Data Source để mở cửa sổ Data Source Configuration Wizard.
+ Trên cửa sổ vừa mở ra, chọn Object, rồi click Next
+ VS sẽ tự tìm các Object trong Project cho bạn (bao gồm cả cái tbl_contact trong DataContext bạn đã tạo ở trên). Bạn chỉ việc click vào dấu (+) ở tên Project để Expand cái Project của mình ra, tìm đến chỗ có tbl_contact. Chọn nó và click Finish.
+ Vậy là bạn đã có DataSource để thiết kế Report rồi. Nếu cửa sổ DataSource chưa xuất hiện, bạn có thể vào Menu: Data > Show Data Sources để hiện nó lên. Còn nếu đã nhìn thấy data source rồi, thì cứ kéo nó vào Report thôi
C. Viết Code để Show Report:
Sau khi thiết kế Report xong, bạn cần viết code để hiện cái Report này lên trên Form1 như sau:
- private void Form1_Load(object sender, EventArgs e)
- {
- //Chỗ này là Select thuần túy trong LINQ
- DataClasses1DataContext context =new DataClasses1DataContext();
- List<tbl_contact> ContactList = (from c in context.tbl_contacts
- select c).ToList();
- //bắt Reportviewer1 hiển thị cái Report1 ta vừa thiết kế
- reportViewer1.LocalReport.ReportEmbeddedResource = "WindowsFormsApplication1.Report1.rdlc";
- //Gán datasource cho Report (bạn có thể gán List, Array, IENumerable... làm DataSource cho Report)
- reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("WindowsFormsApplication1_tbl_contact", ContactList));
- reportViewer1.RefreshReport();
- }
Chạy chương trình, và bạn sẽ thấy Report xuất hiện.
Sửa lần cuối bởi thuongbat vào ngày T.Hai 18/04/2011 3:52 pm với 1 lần sửa.
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
-
- Guru
- Bài viết: 448
- Ngày tham gia: T.Hai 13/10/2008 3:12 pm
- Đến từ: Dĩ An - Bình Dương
- Been thanked: 32 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
Mình có 1 thắc mắc! Không biết khi Preview chúng ta có thể quay ngang trang A4 được không (bên vb6.0 thì hơi rắc rối tí). Không biết bên vb.net có cải thiện vấn đề này không? Sr: vì spam nhé
Dạo này nghiện honda SS50
Re: Sử dụng Report chuẩn của .NET, tại sao không?
xin lỗi bạn Thuongbat cho mình hỏi tí nhé.
mình thiết kế report theo hướng dẫn của bạn trên chuẩn .net như hình bên dưới đây:
Như bạn nhìn thấy mình có 2 bảng, bảng đầu tiên tạm gọi là bảng A , bảng thứ 2 là bảng ghi chú mình sẽ đổ dữ liệu từ CSDL lên 2 bảng này (mỗi bảng chứa dữ liệu của một bảng riêng đã được thiết kế trong CSDL).
bây giờ mình muốn trên Report sẽ in làm 2 cột (tiết kiệm giấy và cho đúng với mẫu báo cáo ấy mà) nhưng cột thứ 2 chỉ hiển thị nguyên dữ liệu tiếp theo của bảng thứ 2 vậy phải làm thế nào?
mong bạn giúp. Xin lỗi vì SPan bài nhé.
mình thiết kế report theo hướng dẫn của bạn trên chuẩn .net như hình bên dưới đây:
Như bạn nhìn thấy mình có 2 bảng, bảng đầu tiên tạm gọi là bảng A , bảng thứ 2 là bảng ghi chú mình sẽ đổ dữ liệu từ CSDL lên 2 bảng này (mỗi bảng chứa dữ liệu của một bảng riêng đã được thiết kế trong CSDL).
bây giờ mình muốn trên Report sẽ in làm 2 cột (tiết kiệm giấy và cho đúng với mẫu báo cáo ấy mà) nhưng cột thứ 2 chỉ hiển thị nguyên dữ liệu tiếp theo của bảng thứ 2 vậy phải làm thế nào?
mong bạn giúp. Xin lỗi vì SPan bài nhé.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
Theo cách sắp xếp của bạn thì dữ liệu từ bảng A sẽ in trên Table ở bên trái, còn dữ liệu từ bảng ghi chú sẽ in trên Table ở bên phải. Như vậy cũng tạo thành 2 cột rồi còn gì.
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
boy1234 đã viết:Mình có 1 thắc mắc! Không biết khi Preview chúng ta có thể quay ngang trang A4 được không (bên vb6.0 thì hơi rắc rối tí). Không biết bên vb.net có cải thiện vấn đề này không? Sr: vì spam nhé
THường thì khi tạo báo cáo, bạn đã thiết kế mẫu in của riêng mình thì cũng phải định kích thước sẵn cho khổ giấy (A4 hay A3....) và kiểu in (in dọc hay in ngang) rồi. Nếu bạn tạo báo cáo trên trang A4, in dọc mà khi in ra bạn lại chọn xoay ngang thì có phải sẽ thừa giấy không? Tuy nhiên, nếu bạn vẫn muốn xoay ngang giấy thì trên ReportViewer có nút PageSetup rồi đó. KHi đang Preview, bạn chỉ việc click vào nút PageSetup và chọn Orientation là LandScape thì giấy sẽ xoay ngang thôi (ngoài ra, bạn còn có thể đặt lề để canh chỉnh nội dung theo ý muốn)
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
Re: Sử dụng Report chuẩn của .NET, tại sao không?
bạn hiểu sai ý mình hỏi rồi.giả sử bây giờ ở cột "ghi chú " có 50 dòng, nhưng ta chỉ cho phép nó in dữ liệu trên mỗi bảng (như đã thiết kế) là 20 dòng, như vây còn 30 dòng nữa, bây giờ mình muốn sẽ có thêm một cột "ghi chú nữa" trên cùng trang của report này. Vậy là in được 40 dòng của dữ liệu rồi, còn 10 dòng nữa thì nó sẽ in bên trang thứ 2...
Ý mình muốn làm là vậy. Thank ThuongBat vì đã trả lời bài nhé.
Ý mình muốn làm là vậy. Thank ThuongBat vì đã trả lời bài nhé.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
Cũng phải thừa nhận là mình chưa hiểu sâu về cái Report chuẩn này. Các hướng dẫn ở trên là những điều mình đã tìm hiểu được và muốn chia sẻ cùng các bạn. Qua đây mình cũng muốn các bạn trao đổi thêm để chúng ta cùng nâng cao kiến thức.
Về vấn đề của bạn: theo những gì mình đã biết thì việc chia phần Detail của report thành các cột sẽ được report xử lý trong toàn bộ nội dung của phần Detail. Có nghĩa là: nó sẽ in tất cả các dữ liệu ở trong Section Detail trên cột 1, sau khi in đến cuối trang thì dữ liệu sẽ được in sang cột 2 và in đầy cột 2 rồi mới nhảy sang trang tiếp theo. Trong section Detail của bạn có 2 bảng xếp ngang hàng nhau. Nếu bạn muốn cả 2 bảng đều được in ra đầy cột 1 rồi nhảy sang cột 2 thì bạn có thể xem hướng dẫn của mình ở bước 2.9. Còn nếu bạn muốn dữ liệu của bảng A in trên 1 cột, dữ liệu bảng Ghi chú in trên 2 cột thì mình không biết cách xử lý
Về vấn đề của bạn: theo những gì mình đã biết thì việc chia phần Detail của report thành các cột sẽ được report xử lý trong toàn bộ nội dung của phần Detail. Có nghĩa là: nó sẽ in tất cả các dữ liệu ở trong Section Detail trên cột 1, sau khi in đến cuối trang thì dữ liệu sẽ được in sang cột 2 và in đầy cột 2 rồi mới nhảy sang trang tiếp theo. Trong section Detail của bạn có 2 bảng xếp ngang hàng nhau. Nếu bạn muốn cả 2 bảng đều được in ra đầy cột 1 rồi nhảy sang cột 2 thì bạn có thể xem hướng dẫn của mình ở bước 2.9. Còn nếu bạn muốn dữ liệu của bảng A in trên 1 cột, dữ liệu bảng Ghi chú in trên 2 cột thì mình không biết cách xử lý
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
Re: Sử dụng Report chuẩn của .NET, tại sao không?
đúng là mình đang muốn thể hiển trên report như vậy nhưng thấy khó quá, dù sao cũng cảm ơn bạn rất nhiều.
- vuathongtin
- Điều hành viên
- Bài viết: 1028
- Ngày tham gia: CN 02/05/2010 10:03 pm
- Đến từ: Xứ sở DG
- Has thanked: 2 time
- Been thanked: 105 time
- Liên hệ:
Re: Sử dụng Report chuẩn của .NET, tại sao không?
thuongbat có biết cách hiển thị kiểu Boolean theo ý muốn của mình hok. Ví dụ : như mình hiển thị Cột Giới tính là Nam/Nữ
Bùi Thành Nhân
CNTT-Sở Thông tin & Truyền thông tỉnh Phú Yên
giasulaptrinh.com
Skype:vuathongtin
CNTT-Sở Thông tin & Truyền thông tỉnh Phú Yên
giasulaptrinh.com
Skype:vuathongtin
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
có thể đặt giá trị cho cột giới tính như sau: trong Properties của cột giới tính, đặt Value là =IIf(Fields!GioiTinh.Value=True,"Nam","Nữ")
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
Re: Sử dụng Report chuẩn của .NET, tại sao không?
@thuongbat: anh up file vidu lên đi
như thế anh em dễ tìm hiểu hơn
như thế anh em dễ tìm hiểu hơn
- nhunv.vbard
- Thành viên chính thức
- Bài viết: 38
- Ngày tham gia: T.Ba 04/01/2011 10:41 am
- Đến từ: HV Ngân hàng
- Liên hệ:
Re: Sử dụng Report chuẩn của .NET, tại sao không?
@thuongbat: Em làm nhu huong dẫn mà không đuoc anh oi, trong đoạn code của anh "Dim Parameters As List (Of ReportParameter)=New List(Of Reportparameter)" thì nó gạch màu xanh duoi tu "ReportParameter". Cái lỗi này thì làm gì để hết lỗi vậy anh? u đúng rồi anh port cả chuong trình lên đi anh. Thank anh rất nhiều.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
+ Đối tượng ReportParameter nó nằm trong thư viện Microsoft.Reporting.WinForms. Bạn phải Import cái thư viện này ở đầu Form thì nó mới không bị lỗi
+ Về ví dụ mẫu: cái lúc trước mình thiết kế với CSDL là MySQL nên đưa ví dụ lên cũng hơi rắc rối. Đợi vài hôm nữa mình có thời gian sẽ viết một cái ví dụ cho các bạn với CSDL là Access
+ Về ví dụ mẫu: cái lúc trước mình thiết kế với CSDL là MySQL nên đưa ví dụ lên cũng hơi rắc rối. Đợi vài hôm nữa mình có thời gian sẽ viết một cái ví dụ cho các bạn với CSDL là Access
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
- lungocqua
- Guru
- Bài viết: 1225
- Ngày tham gia: T.Ba 18/08/2009 11:51 am
- Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
- Been thanked: 5 time
- Liên hệ:
Re: Sử dụng Report chuẩn của .NET, tại sao không?
Bài viết này của bạn hay đấy, trên diễn dàn đa số điều hỏi về Crystal Report, qua tới VB 2010 thì không thấy Crystal Report tích hợp vào nữa làm phải chạy đi tìm. Có cái này thì tiện thiết
Ta đã trở lại và quên hết tất cả!
- nhunv.vbard
- Thành viên chính thức
- Bài viết: 38
- Ngày tham gia: T.Ba 04/01/2011 10:41 am
- Đến từ: HV Ngân hàng
- Liên hệ:
Re: Sử dụng Report chuẩn của .NET, tại sao không?
thuongbat đã viết:+ Đối tượng ReportParameter nó nằm trong thư viện Microsoft.Reporting.WinForms. Bạn phải Import cái thư viện này ở đầu Form thì nó mới không bị lỗi
+ Về ví dụ mẫu: cái lúc trước mình thiết kế với CSDL là MySQL nên đưa ví dụ lên cũng hơi rắc rối. Đợi vài hôm nữa mình có thời gian sẽ viết một cái ví dụ cho các bạn với CSDL là Access
Thank anh nhiều nhé, em làm đuoc rồi, em hiện đang làm vói CSDL là SQL 2k5 có gì anh giúp nhé.
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
Tranh thủ buổi trưa viết cái ví dụ mẫu cho các bạn nào quan tâm
- Tập tin đính kèm
-
- MSReportSample.rar
- (203.3 KiB) Đã tải 3881 lần
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
- nhunv.vbard
- Thành viên chính thức
- Bài viết: 38
- Ngày tham gia: T.Ba 04/01/2011 10:41 am
- Đến từ: HV Ngân hàng
- Liên hệ:
Re: Sử dụng Report chuẩn của .NET, tại sao không?
VD này anh viết trên version bao nhiêu nhỉ, em mỏ bàng VB.net 2008 nó cho conver nhung không chạy đuoc, em soan nhu vi du trên thi nó nói nỗi ỏ phần "ReportVieer1.LocalReport.SetParameters(Parameters)" lỗi là "An error occurred during local report processing" mà em xem lại rồi report thiết kế có sai chỗ nào đâu nhỉ, anh chỉ giúp voi. Thank
- thuongbat
- Guru
- Bài viết: 346
- Ngày tham gia: CN 27/04/2008 10:11 am
- Has thanked: 4 time
- Been thanked: 79 time
Re: Sử dụng Report chuẩn của .NET, tại sao không?
Mình viết trên VB2005. Mình chạy thử ngon lành rồi mới post lên. Có lẽ là trong quá trình convert nó đã có thay đổi gì đó chăng?
Bạn có thể thử cách sửa đổi nội dung file Solution bằng Notepad để cho nó lên VB2008 thay vì sử dụng cách Convert
+ Mở file MSReportSample.sln bằng Notepad
+ Sửa chỗ 9.0 thành 10.0
+ Sửa chỗ 2005 thành 2008
+ Save lại và mở bằng Visual Studio
Bạn có thể thử cách sửa đổi nội dung file Solution bằng Notepad để cho nó lên VB2008 thay vì sử dụng cách Convert
+ Mở file MSReportSample.sln bằng Notepad
+ Sửa chỗ 9.0 thành 10.0
+ Sửa chỗ 2005 thành 2008
+ Save lại và mở bằng Visual Studio
Rượu gặp tri kỷ ngàn chén thiếu.
Chuyện người không hợp nửa câu thừa.
Chuyện người không hợp nửa câu thừa.
Quay về “[.NET] Bài viết hướng dẫn”
Đang trực tuyến
Đang xem chuyên mục này: Không có thành viên nào trực tuyến. và 1 khách

markdown:
**Tên bài viết:**Sử dụng Report chuẩn của .NET, tại sao không? **Tác giả:** [ThuongBat](memberlist.php?mode=viewprofile&un=ThuongBat) **Cấp độ bài viết:**Trung bình **Tóm tắt:**Cách sử dụng Report chuẩn của .NET thay cho Crystal Report (hướng dẫn thao tác với VB.NET)
Mới ghé qua trang web này thấy có một số giải thích và ví dụ mẫu khá hay về ReportViewer. Mình đưa link lên đây để bạn nào cần thì tham khảo (web tiếng Anh nhé):
[http://gotreportviewer.com/](http://gotreportviewer.com/)
1. Đặt vấn đề:
Mình tìm trên forum thấy có khá nhiều bài viết hướng dẫn cách tạo báo cáo với Crystal Report (tạm viết tắt là CR). Nhiều bạn thích dùng CR bởi tính chuyên nghiệp của nó và CR được sử dụng Free trong Visual Studio. Nhưng CR có một điểm hạn chế là khi đóng gói chương trình mang sang máy khác nó không chạy được. Muốn CR hoạt động được, hoặc là máy khách phải cài Crystal Report (cái này không miễn phí) hoặc là bạn phải đóng kèm ứng dụng của mình một cái Merge Module khá nặng (khoảng 25Mb đối với Crystal Report cho Visual Studio 2005) làm cho bộ Setup của bạn phình to ra.
Report chuẩn của .NET cũng giống như Data Report trong Vb6 nhưng nó đã được nâng cấp lên nên cũng chuyên nghiệp không kém CR. Ngoài ra, vì nó là công cụ chuẩn của .NET nên được hỗ trợ khá tốt. Bạn đóng gói ứng dụng cũng chỉ cần mang theo vài cái DLL nhỏ là có thể chạy tốt.
2. Sử dụng Report của .NET (tạm gọi là Data Report cho nó gọn):
Tìm hiểu thông qua ví dụ là dễ hiểu nhất, vì vậy mình sẽ đưa ra 1 cái ví dụ để các bạn chưa biết thì tham khảo. Mình sẽ sử dụng Data Report để làm 1 cái báo cáo chi tiết sử dụng cước viễn thông (bạn nào sử dụng di động trả sau thì giữa tháng hay được gửi tặng cái báo cáo này). Tuy nhiên, có hơi khác 1 tí là: báo cáo chi tiết cước viễn thông sẽ liệt kê các cuộc gọi mà ta gọi đi, còn báo cáo này của mình là liệt kê các cuộc gọi đến.
Report của mình sau khi in ra sẽ có dạng như sau:
Phần Header và Footer sẽ trải dài từ trái qua phải, còn phần dữ liệu sẽ chia thành 2 cột (để tiết kiệm giấy)
2.1. Dữ liệu cần in:
Bảng dữ liệu của mình có cấu trúc như sau:
Đây là bảng dữ liệu mình đang làm (thiết kế trong MySQL), có 1 số cột không dùng đến nhưng mình không xóa đi (một phần là vì ngại thiết kế lại, một phần là muốn cho các bạn thấy là không cần thiết phải in ra tất cả các cột trong CSDL. Chỉ sử dụng những cột nào mình cần)
Ý nghĩa của các cột mình sẽ sử dụng như sau:
+ ID: là ID của bản ghi (số tự tăng)
+ Caller: số điện thoại của người gọi đến
+ StartAt: thời điểm bắt đầu kết nối cuộc gọi (có cả ngày và giờ)
+ Duration: thời gian đàm thoại (tính bằng giây)
+ BlockCount: số block của cuộc gọi (cái mình đang làm nó tính cước theo block). Các bạn chỉ cần hiểu đây là 1 trường Number là được
+ TotalCharge: tiền cước
2.2. Thiết kế bảng dữ liệu cần in trong Visual Studio:
Có nhiều bạn thích kết nối trực tiếp vào CSDL để in bằng mấy cái Data Source gì đó. Mình thì không làm theo cách đó. Mình chỉ tạo các Dataset và Datatable độc lập trong VS (có cấu trúc giống như cấu trúc trong CSDL) rồi thiết kế Report dựa vào các Datatable này. Khi nào cần in thì mới Fill dữ liệu vào Datatable để in. Để tạo ra Dataset độc lập trong VS, làm như sau:
+ Right Click vào tên Project trong cửa sổ Solution Explorer, chọn Add > New Item
+ Trong cửa sổ mới hiện ra, chọn Dataset
+ Nhập giá trị Name cho dataset là dsCallLogs rồi nhấn nút Add, bạn sẽ có một dataset là dsCallLogs.xsd trong Project của mình
Tiếp tục là việc tạo bảng cho Dataset:
+ Mở dsCallLogs.xsd ra,
+ Right CLick vào vùng trống của dataset và chọn Add > Datatable, bạn sẽ có 1 bảng là Datatable1
+ Sửa tên của Datatable từ Datatable1 thành tbl_Call_Logs
+ Right Click vào tbl_Call_Logs, chọn Add > Colum
+ Sửa tên column mới add thành ID
+ Tiếp tục add thêm các column khác để được 1 datatable có dạng như sau:
2.3. Tạo báo cáo:
Phần chuẩn bị dữ liệu đã xong, bây giờ đến bước tạo báo cáo.
+ Right Click vào tên Project trong Solution Explorer, chọn Add > New Item
+ Trong cửa sổ mới mở ra, chọn biểu tượng Report (lưu ý là Report chứ không phải Crystal Report nhé)
+ Nhập giá trị Name cho Report là rptCallLogs rồi nhấn nút Add. Bạn sẽ có một Report trong project của mình là rptCallLogs.rdlc
2.4. Thiết giao diện cho báo cáo: Phần này là hay nhất này. Các bạn có thể thấy việc thiết giao diện báo cáo này có khi còn đơn giản hơn cả Crystal Report (vậy mà không hiểu sao nhiều bạn vẫn thích dùng Crystal Report hơn
![Cười nhăn răng :D](./images/smilies/004.gif)
+ Double Click vào rptCallLogs.rdlc để mở giao diện thiết kế báo cáo ra
+ Vào menu Report, tích vào 2 mục Page Header và Page Footer để hiện header và footer cho báo cáo
+ Kéo từ Toolbox vào phần Header 9 cái textbox, sắp xếp và gõ chữ để nó giống như thế này:
(Lưu ý: các textbox có giá trị với dấu = ở phía trước là các tham số của Report. Khi gọi report lên, ta nhập cho tham số là cái gì thì nó sẽ hiện lên cái đó ở trên report. Cái này rất hữu dụng để in các giá trị được truyền từ Form vào Report. Tạm thời các bạn có thể để trống các textbox này. Ta sẽ thảo luận nó sau ở phần Tham số của Report.)
+ Kéo từ Toolbox vào phần Body 1 cái Table. Table này sẽ dùng để hiển thị dữ liệu dưới dạng bảng. Trông nó cũng giống cái DataGrid phải không các bạn. (Crystal Report hình như là mình không thấy cái này). Table sẽ có 3 phần Header, Detail và Footer với mặc định là 3 cột. Right Click vào Talbe, chọn Insert colum 3 lần để được 1 cái Table có 6 cột:
+ Gõ tiêu đề cho các cột của table (ở phần header nhé) lần lượt như sau:
+ Vào Menu Data > Show Data Source để hiện cửa sổ Data lên (nếu nó chưa hiện). Bạn sẽ thấy cái Datatable mà mình thiết kế ở bước 2.2 hiện ra. Bạn chỉ việc kéo các Field từ Datatable vào các cột tương ứng của của Table trên Report (kéo vào phần Detail nhé). Ở đây có 2 cột Ngày và T.G đàm thoại cùng sử dụng chung dữ liệu của Field: StartAt
2.5. Nhóm dữ liệu trên cột "Ngày":
Ta sẽ nhóm các cuộc gọi vào theo từng ngày để tiện theo dõi, đồng thời cũng giúp cho cái báo cáo nó sáng sủa hơn 1 chút. Quy trình làm như sau:
+ Chọn toàn bộ Table (click và rê chuột bao quanh table) - nhớ là chọn Table nhé, chứ không phải chọn một cell của table đâu
+ Right click vào table và chọn Properties để mở ra bảng Property của Table
+ Chọn sang tab Groups
+ Click vào nút Add để thêm 1 Group mới
+ Trong cửa sổ mới hiện ra, nhập giá trị =Format(Fields!StartAt.Value,"MM/dd/yyyy") (nhớ là có cả dấu = nhé). Ta phải dùng lệnh Format ở đây là vì trường StartAt là trường DateTime (có cả ngày và giờ) mà ta lại chỉ muốn nhóm theo ngày thôi chứ không nhóm theo giờ, phút giây. Lệnh Format sẽ cắt giá trị giờ,phút giây đi
+ Bỏ 2 dấu tích Include Group Header và Include Group Footer đi (bạn có thể để lại nếu muốn, tuy nhiên mình thấy không có header, footer sẽ đẹp hơn)
+ Nhấn Ok để đóng các cửa sổ Property lại.
2.6. Format các giá trị hiển thị cho report trông đẹp mắt hơn:
A. Cột "Ngày": chỉ cần hiển thị ngày và tháng là đủ rồi. Năm với lại cả giờ, phút, giây là không cần thiết. Hơn nữa, ta cũng chỉ cần hiện mỗi giá trị ngày 1 lần thôi (có 100 bản ghi cùng 1 nhóm thì cũng chỉ hiện ngày trên 1 bản ghi). Vì vậy ta có thể Format nó như sau:
+ Chọn Cell tương ứng với cột ngày (ở phần Detail nhé), nhấn F4 để hiện cửa sổ Properties của nó ra
+ Nhập giá trị Value trên cửa sổ Properties là =Format(First(Fields!StartAt.Value),"dd/MM") (Có cả dấu = nhé). Cái này để format kiểu hiển thị
+ Chọn Hide Duplicates là Table1_Group1 để không hiện các ngày trùng nhau ở các hàng liên tục
B. Cột "Bắt đầu": chỉ cần hiện giờ, phút, giây thôi (vì ngày đã có ở cột "Ngày" rồi). Bạn lại làm như sau
+ Chọn Cell của cột "Bắt đầu" (phần Detail), nhấn F4 để hiện cửa sổ Properties
+ Nhập giá trị cho Value là = Format(Fields!StartAt.Value,"hh:mm:ss") (có cả dấu = nhé)
2.7 Tính tổng:
Phần tính tổng sẽ được làm trên Footer của Table, Nhập các giá trị cho Footer của Table như sau:
+ Cột ngày (phần Footer), nhập giá trị "Tổng" - cái này chỉ là Text đơn thuần thôi
+ Cột "Người gọi" (phần footer): mình sẽ in tổng số cuộc gọi trên cột này,vì vậy bạn nhập giá trị cho nó là: =Count(Fields!Id.Value)
+ Cột "T.G": Tính tổng thời gian gọi, vì vậy bạn nhập giá trị cho nó là: =Sum(Fields!Duration.Value)
+ Cột "Blocks": tính tổng số block, vì vậy giá trị cần nhập là: =Sum(Fields!BlockCount.Value)
+ Cột "Tiền": tính tổng số tiền bằng công thức: =Sum(Fields!TotalCharge.Value)
Sau khi nhập các giá trị, format dữ liệu, kéo các cột to nhỏ cho hợp lý, bạn sẽ được cái table có dạng như sau:
Các bạn thấy không. Thao tác với Data Report đơn giản đấy chứ
2.8. Tham số của Report:
Bạn muốn truyền 1 giá trị nào đó từ Form vào Report, bạn chỉ việc tạo tham số cho report. Cách tạo tham số như sau:
+ Từ menu Report chọn muc Report Parameters
+ Click vào nút Add để thêm tham số mới
+ Nhập tên vào mục Name, chọn kiểu dữ liệu trong Data Type (mình chưa rành về mục này lắm nên toàn bộ kiểu dữ liệu mình đều để là String cho dễ thao tác. Nếu để các kiểu khác - ví dụ: datetime - thì khi chạy hay bị exception)
+ Tiếp tục add các Parameter khác, nhấn OK khi xong việc
Trong phần Report header, mình có mấy cái textbox có để parameter. Đó là các Report ở phần "Số máy", "Từ ngày", "Đến ngày". Vậy mình sẽ tạo ra 3 parameter là tương ứng là "PhoneNumber", "FromDate", "ToDate". Hãy nhớ tên của các Parameter này (hay ít nhất cũng là nhớ chỗ cần phải mở ra để xem nó) vì bạn còn cần dùng nó để truyền giá trị từ Form vào.
Sau khi thêm Parameters xong thì bạn chọn textbox để hiển thị các Parameter này. Nó chính là các textbox ở phần Report Header.
+Right Click vào textbox bên cạnh cái textbox có chữ "PhoneNumber" và chọn mục Expression
+ Trong cửa sổ hiện ra, chọn mục Parameters ở treeview bên tay trái
+ Double Click vào giá trị "PhoneNumber" ở listbox bên phải để thêm parameter này vào textbox. Bạn sẽ thấy nội dung của textbox có dạng =Parameters!phoneNumber.Value
+ Làm tương tự với các textbox còn lại
+ Riêng textbox chỗ có chữ "Trang" thì bạn nhập giá trị =Globals!PageNumber & "/" & Globals!TotalPages trong cửa sổ Expression của nó. Mấy cái giá trị PageNumber... bạn có thể tìm thấy trong nút Global của treeview
Cách truyền tham số cho Report trên đây áp dụng cho Visual Studio 2005 và 2008. Phiên bản VS2010 thì thao tác khác với cách trên 1 chút. Cảm ơn bạn
[Phung Manh Ninh](http://caulacbovb.com/forum/memberlist.php?mode=viewprofile&u=3190)đã cung cấp một ví dụ về cách truyền tham số cho Report trong VS2010. Các bạn có thể xem ví dụ đính kèm (có cả tệp hướng dẫn bằng Word trong đó)
2.9. Chia cột cho Report:
Vì cái vùng Data của mình tương đối hẹp về chiều ngang nên để tiết kiệm giấy ta sẽ in report trên 2 cột.
+ Vào Menu Report, chọn Report Properties
+ Chọn sang Tab Layout
+ Ở mục Columns, nhập giá trị 2
Vậy là đã xong phần thiết kế, bây giờ cái report của bạn sẽ có hình dạng như thế này:
Còn phần Form để show cái Report này lên, em sẽ post trong bài sau. Các bác thông cảm nhé

Cache-Control: private, no-cache="set-cookie"

Set-Cookie: vbclub_sid=85dd2ed3e05776e7c21d69702e0b29b1; expires=Sun, 25-Feb-2018 22:15:20 GMT; path=/; domain=caulacbovb.com; HttpOnly

X-Powered-By-Plesk: PleskWin


text:
ĐANG ONLINE:44
SỐ NGƯỜI TRUY CẬP:13761626
I - Sản phẩm thẻ
II - Biểu phí
III - Các NH liên minh
IV - Liên hệ
HÌNH ẢNH

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Connection: close

Cache-Control: private

Content-Type: text/html; charset=utf-8


text:
Lưu video
Bạn phải đăng nhập để sử dụng chức năng này. Xin vui lòng Đăng nhập tại đây!
Lựa chọn các vi phạm
Link hỏng
Video không đúng nội dung, spam, gây hiểu nhầm
Video phản cảm, đồi trụy, kích động bạo lực
Bản quyền video
Khác

X-Cache: MISS

Server: nginx

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Vary: Accept-Encoding

Content-Type: text/html


markdown:
Lưu video
Bạn phải đăng nhập để sử dụng chức năng này. Xin vui lòng Đăng nhập tại đây!
Lựa chọn các vi phạm
Link hỏng
Video không đúng nội dung, spam, gây hiểu nhầm
Video phản cảm, đồi trụy, kích động bạo lực
Bản quyền video
Khác


text:
skip to main
|
skip to sidebar
Vài thứ tỉ mẩn
Monday, 30 September 2013
Lại túi, lại ví...
Hôm trước may cái túi này. Hubby khen là đẹp, "ai như cái túi em đang đeo già như bà Năm Sa Đéc." Nghe chàng khen thì cố dùng nhiều hơn, và cũng đồng nghĩa với việc may thêm cái bóp đựng giấy giấy tờ tiền bạc cho cùng bộ với cái túi.
Xài cũng tạm được. Có điều dạo này mình may xấu quá.
Posted by
Chôm Chôm
at
09:48:00
0 comments
Labels:
May vá
,
Thêu thùa
Thursday, 12 September 2013
Beach Tote
May xong cái túi đựng đồ đi biển rồi. Túi sẽ dùng để đựng khăn tắm, áo tắm, áo choàng, chai sunblock, & mắt kiếng, etc.
Lót toàn bộ bên trong, có thể lộn bên trong ra làm mặt ngoài.
Hình mấy con ốc là thêu từ kit "Shells on Blue" của Dimensions.
Posted by
Chôm Chôm
at
15:02:00
2 comments
Labels:
May vá
,
Thêu thùa
Saturday, 7 September 2013
Banner cho Chó Con
Làm xong cái banner cho thằng Chó Con rồi đây.
Posted by
Chôm Chôm
at
12:23:00
1 comments
Labels:
May vá
,
Thêu thùa
Newer Posts
Older Posts
Home
Subscribe to:
Posts (Atom)
Những Trang Liên Quan
Trang Chính
Tỉa rau củ quả
Rau Câu
Trang Trí Bánh Kem
Mục Lục
Beading
(1)
Cắm hoa
(47)
Chăm sóc bản thân
(2)
Cọ quẹt vẽ vời
(3)
Giáng Sinh
(23)
Halloween
(2)
Hoa hồng làm từ lá khô
(1)
Knotting
(3)
Làm đèn cầy
(8)
Làm hoa giấy
(18)
Làm hộp/bao giấy
(13)
Lồng đèn
(9)
May vá
(22)
Móc đan
(4)
Origami
(10)
Thêu thùa
(107)
Trang trí bàn tiệc
(3)
Từ những nguyên liệu tái xử dụng
(33)
và những thứ linh tinh khác
(36)
Followers
Blog Archive
►
2015
(2)
►
April
(2)
►
2014
(29)
►
December
(1)
►
November
(9)
►
October
(1)
►
September
(1)
►
August
(5)
►
July
(3)
►
June
(2)
►
May
(3)
►
April
(1)
►
February
(2)
►
January
(1)
▼
2013
(27)
►
December
(2)
►
October
(2)
▼
September
(3)
Lại túi, lại ví...
Beach Tote
Banner cho Chó Con
►
August
(6)
►
July
(2)
►
June
(6)
►
May
(2)
►
April
(1)
►
March
(1)
►
February
(1)
►
January
(1)
►
2012
(35)
►
December
(1)
►
November
(6)
►
October
(5)
►
September
(5)
►
August
(2)
►
July
(1)
►
June
(2)
►
May
(6)
►
April
(2)
►
March
(3)
►
February
(2)
►
2011
(29)
►
September
(2)
►
August
(1)
►
July
(1)
►
June
(3)
►
May
(6)
►
April
(6)
►
March
(3)
►
February
(4)
►
January
(3)
►
2010
(42)
►
December
(3)
►
November
(2)
►
October
(6)
►
September
(4)
►
August
(5)
►
July
(6)
►
June
(4)
►
May
(4)
►
April
(3)
►
March
(2)
►
January
(3)
►
2009
(88)
►
December
(13)
►
November
(2)
►
October
(73)
Traffic Tracking
Feedjit Live Blog Stats
Bạn đến từ...
There was an error in this gadget

markdown:
## Monday, 30 September 2013
## Thursday, 12 September 2013
###
[Beach Tote](http://chomchomcraft.blogspot.com/2013/09/beach-tote.html)
Posted by Chôm Chôm at
[15:02:00](http://chomchomcraft.blogspot.com/2013/09/beach-tote.html) [2 comments](http://chomchomcraft.blogspot.com/2013/09/beach-tote.html#comment-form) [](https://www.blogger.com/post-edit.g?blogID=6477866024694118144&postID=4642854578564545391&from=pencil)
![ ](https://resources.blogblog.com/img/icon18_edit_allbkg.gif)
## Saturday, 7 September 2013
###
[Banner cho Chó Con](http://chomchomcraft.blogspot.com/2013/09/banner-cho-cho-con.html)
Posted by Chôm Chôm at
[12:23:00](http://chomchomcraft.blogspot.com/2013/09/banner-cho-cho-con.html) [1 comments](http://chomchomcraft.blogspot.com/2013/09/banner-cho-cho-con.html#comment-form) [](https://www.blogger.com/post-edit.g?blogID=6477866024694118144&postID=8675307805376566779&from=pencil)
![ ](https://resources.blogblog.com/img/icon18_edit_allbkg.gif)
Subscribe to:

WARC-Identified-Payload-Type: text/html

Server: GSE

X-Content-Type-Options: nosniff

Cache-Control: private, max-age=0

X-XSS-Protection: 1; mode=block

Content-Type: text/html; charset=UTF-8


text:
028 3995 1088
nhungntt@sontinhco.com
Hỗ trợ:
0938 319 386
Trang chủ
Giới thiệu
Sản phẩm
Thương hiệu
QUICSEAL
MARIS POLYMERS
SẢN PHẨM KHÁC
Sản phẩm
Sản phẩm chống thấm
Phụ gia chống thấm
Keo chà ron
Keo dán gạch
Epoxy và chất phủ sàn
Vữa đóng rắn nhanh
Vữa không co ngót
Bột trét tường
Thanh chèn khe Backer rod
Băng cản nước
Máy phun rửa áp lực cao
Sử dụng cho
Tầng hầm
Nhà vệ sinh
Bể bơi
Hố thang máy
Sân thượng và tầng mái
Tường nhà
Mái nhà
Cổ ống
Giải Pháp
Dự án
Khách hàng
Tin tức
Liên hệ
Trang chủ
Giới thiệu
Sản phẩm
Thương hiệu
QUICSEAL
MARIS POLYMERS
SẢN PHẨM KHÁC
Sản phẩm
Sản phẩm chống thấm
Phụ gia chống thấm
Keo chà ron
Keo dán gạch
Epoxy và chất phủ sàn
Vữa đóng rắn nhanh
Vữa không co ngót
Bột trét tường
Thanh chèn khe Backer rod
Băng cản nước
Máy phun rửa áp lực cao
Sử dụng cho
Tầng hầm
Nhà vệ sinh
Bể bơi
Hố thang máy
Sân thượng và tầng mái
Tường nhà
Mái nhà
Cổ ống
Giải Pháp
Chống thấm tầng hầm
Chống thấm nhà vệ sinh
Chống thấm bể bơi
Chống thấm hố thang máy
Chống thấm sân thượng và tầng mái
Chống thấm tường nhà
Chống thấm dột mái tôn hiệu quả vào mùa mưa
Xử lý khe lún
Dự án
Địa điểm
Miền Bắc
Miền Trung
Miền Nam
Tiến độ
Đã thi công
Đang thi công
Khách hàng
Tin tức
Liên hệ
Tìm
404
Không tìm thấy trang
Trở về
Trang Chủ
để tìm thấy nội dung của mà bạn tìm kiếm...

Powered-by: Deverlop by MyCMS

Vary: Accept-Encoding,User-Agent


text:
Đại sứ Lý Quốc Tuấn và Đại tá Nguyễn Văn Hùng-Tùy viên QP tại Philippines (thứ 3 và thứ 4 từ phải sang) gặp gỡ, động viên các ngư dân.
Tham dự hoạt động này có Tổng thống Philippines Rodrigo Duterte cùng đại diện chính quyền trung ương và tỉnh Pangasinan của Philippines.
Tổng thống Duterte nêu rõ theo đề nghị của Lãnh đạo Cấp cao Việt Nam, trên tinh thần nhân đạo và quan hệ hữu nghị hai nước, Chính phủ Philippines đã hoàn tất các thủ tục và hỗ trợ đưa ngư dân và tàu cá PY-96173-TS về nước.
Về phần mình, Đại sứ nước ta tại Philippines Lý Quốc Tuấn bày tỏ cảm ơn cá nhân Tổng thống Duterte cũng như chính phủ và các cơ quan chức năng Philippines đã quan tâm hỗ trợ đưa các ngư dân Việt Nam về nước.
Tàu Cảnh sát biển Philippines lai dắt tàu cá PY-96173-TS rời hải phận Philippines.
Tàu cá PY-96173-TS được cảnh sát biển Philippines lai dắt ra vùng biển quốc tế để bắt đầu hành trình về nước. Trước đó, hôm 7/10 vừa qua, thi thể hai ngư dân khác của tàu PY-96173-TS thiệt mạng đã được đưa về Việt Nam.
TTXVN (dantri.com.vn)
Công An Tỉnh Bình Thuận
Địa chỉ: đường Tôn Đức Thắng - Thành phố Phan Thiết
Giấy phép số 154/GP-TTĐT do Bộ Thông tin và Truyền thông cấp ngày 30/9/2008
Phát triển bởi Unitech trên nền Joomla

markdown:
|
|
|Thứ 5, 30 Tháng 11 2017 00:00|
|
Vào 17h30 ngày 29/11, tại cảng Sual, tỉnh Pangasinan, cách thủ đô Manila của Philippines 350km về phía Bắc, Đại sứ quán Việt Nam tại Philippines và các cơ quan chức năng của Philippines đã tổ chức đưa 5 ngư dân và tàu cá mang ký hiệu PY-96173-TS của tỉnh Phú Yên về nước.
|![]()
Đại sứ Lý Quốc Tuấn và Đại tá Nguyễn Văn Hùng-Tùy viên QP tại Philippines (thứ 3 và thứ 4 từ phải sang) gặp gỡ, động viên các ngư dân.
Tham dự hoạt động này có Tổng thống Philippines Rodrigo Duterte cùng đại diện chính quyền trung ương và tỉnh Pangasinan của Philippines.
Tổng thống Duterte nêu rõ theo đề nghị của Lãnh đạo Cấp cao Việt Nam, trên tinh thần nhân đạo và quan hệ hữu nghị hai nước, Chính phủ Philippines đã hoàn tất các thủ tục và hỗ trợ đưa ngư dân và tàu cá PY-96173-TS về nước.
Về phần mình, Đại sứ nước ta tại Philippines Lý Quốc Tuấn bày tỏ cảm ơn cá nhân Tổng thống Duterte cũng như chính phủ và các cơ quan chức năng Philippines đã quan tâm hỗ trợ đưa các ngư dân Việt Nam về nước.
![]()
Tàu Cảnh sát biển Philippines lai dắt tàu cá PY-96173-TS rời hải phận Philippines.
Tàu cá PY-96173-TS được cảnh sát biển Philippines lai dắt ra vùng biển quốc tế để bắt đầu hành trình về nước. Trước đó, hôm 7/10 vừa qua, thi thể hai ngư dân khác của tàu PY-96173-TS thiệt mạng đã được đưa về Việt Nam.

WARC-Truncated: length

Server: Apache/2.2.12 (Linux/SUSE) mod_ssl/2.2.12 OpenSSL/0.9.8h PHP/5.2.6 with Suhosin-Patch

P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"

Cache-Control: post-check=0, pre-check=0


text:
Khu đô thị do công ty cổ phần đầu tư IMG Huế thực hiện. Tiến độ công trình, sơ đồ vị trí, công trình tiện ích. Bảng giá nhà liền kề, biệt thự phố, sân vườn. Đăng ký mua nhà.
Dự án bất động sản
Công ty, Site quảng bá
Thừa Thiên - Huế, TP. Huế
Mở rộng

markdown:
Danh mục trực thuộc:
|
|
Khu đô thị do công ty cổ phần đầu tư IMG Huế thực hiện. Tiến độ công trình, sơ đồ vị trí, công trình tiện ích. Bảng giá nhà liền kề, biệt thự phố, sân vườn. Đăng ký mua nhà.
[Dự án bất động sản](/bds-xay-dung/bat-dong-san/dia-oc/du-an-bat-dong-san)
[Công ty](/to-chuc/cong-ty), [Site quảng bá](/thong-tin/site-quang-ba)
[Thừa Thiên - Huế](/viet-nam/mien-trung/thua-thien-hue), TP. Huế

Set-cookie: uid=0tNryVqJ+9KJZz6uAwRUAg==; expires=Mon, 18-Feb-19 22:18:58 GMT; domain=.wada.vn; path=/

X-Cache-Status: MISS

P3P: policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"


text:
Ngôi nhà cấp 4 này được thiết kế trên diện tích 176m2, nhà theo xu hướng hiện đại, phong cách mới trong năm 2016 này, tổng quát gồm 3 phòng ngủ + 1 phòng khách, không gian rộng rãi, thoáng mát thuận tiện cho sinh hoạt của gia đình có 4 người. Không chỉ thế nhà được xây dựng theo phong thủy cảnh quan, tuổi tác, hướng nhà…mẫu nhà cấp 4 có gác lửng!
Dự án này được thiết kế có sân để xe, khu vườn tiểu cảnh nhỏ xinh, đây là nơi thư giãn của gia chủ, mặt nền được lát đá vuông góc với căn nhà đẹp tạo nên 1 kiến trúc hiện đại về mọi phía. Bức tường được tổ lên điểm nổi bật bằng những chiếc bóng đèn vòm cong, khuôn viên thiết kế lên rất hoành tráng và lịch lãm.
Bản vẽ mẫu thiết kế nhà cấp 4 có gác lửng đẹp Mê Ly:
Mẫu thiết kế nhà cấp 4 có gác lửng đẹp xu hướng trong năm 2016
Mẫu nhà cấp 4 gác lửng theo hướng tây bắc phần bố trí phòng trên gác lửng rất hài hòa, có 2 phòng ngủ chính và 1 phòng thờ cổ kính, trang nghiêm, nơi đây được coi là chỗ tâm linh nên được thiết kế yên tĩnh. Có 1 nhà vệ sinh chung được thiết kế sát vách. Phía trước có cửa thông gió rất thoáng mát…
Trên đây là mẫu nhà cấp 4 có gác lửng được chúng tôi sưu tầm, ở nơi thành thị lẫn nông thôn đang được rất nhiều người ưa chuộng, hy vọng rằng các bạn sẽ thích với mẫu thiết kế này.
Xem thêm :
-> mẫu nhà cấp 4 giá 200 triệu
-> mẫu nhà cấp 4 nông thôn đơn giản
Hiện đang có 1 bình luận cho bài viết “Mẫu thiết kế nhà cấp 4 có gác lửng diện tích 8x22m”
Có thể cho tôi bản vẽ và mặt bằng tổng thể mặt trước của căn nhà mà k có hàng rào che Đc k nếu Đc xin LH: 0903653167

markdown:
Ngôi nhà cấp 4 này được thiết kế trên diện tích 176m2, nhà theo xu hướng hiện đại, phong cách mới trong năm 2016 này, tổng quát gồm 3 phòng ngủ + 1 phòng khách, không gian rộng rãi, thoáng mát thuận tiện cho sinh hoạt của gia đình có 4 người. Không chỉ thế nhà được xây dựng theo phong thủy cảnh quan, tuổi tác, hướng nhà…
**mẫu nhà cấp 4 có gác lửng**! ![ mau-thiet-ke-nha-cap-4-co-gac-lung-1](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-1.jpg)
![ mau-thiet-ke-nha-cap-4-co-gac-lung-1](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-1.jpg)
Dự án này được thiết kế có sân để xe, khu vườn tiểu cảnh nhỏ xinh, đây là nơi thư giãn của gia chủ, mặt nền được lát đá vuông góc với căn
[nhà đẹp](http://dbd.vn/khong-gian-nha-dep) tạo nên 1 kiến trúc hiện đại về mọi phía. Bức tường được tổ lên điểm nổi bật bằng những chiếc bóng đèn vòm cong, khuôn viên thiết kế lên rất hoành tráng và lịch lãm. ![ Trang trí khuôn viên đẹp.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-2.jpg)
![ Trang trí khuôn viên đẹp.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-2.jpg)
![ Bố trí bộ bàn ghế ngồi rất phù hợp.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-3.jpg)
![ Bố trí bộ bàn ghế ngồi rất phù hợp.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-3.jpg)
## Bản vẽ mẫu thiết kế nhà cấp 4 có gác lửng đẹp Mê Ly:
![ Mặt bằng tầng trệt.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-4.jpg)
![ Mặt bằng tầng trệt.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-4.jpg)
![ Mặt bằng gác lửng.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-5.jpg)
![ Mặt bằng gác lửng.](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-5.jpg)
### Mẫu thiết kế nhà cấp 4 có gác lửng đẹp xu hướng trong năm 2016
[Mẫu nhà cấp 4 gác lửng](http://dbd.vn/mau-nha-cap-4-dep) theo hướng tây bắc phần bố trí phòng trên gác lửng rất hài hòa, có 2 phòng ngủ chính và 1 phòng thờ cổ kính, trang nghiêm, nơi đây được coi là chỗ tâm linh nên được thiết kế yên tĩnh. Có 1 nhà vệ sinh chung được thiết kế sát vách. Phía trước có cửa thông gió rất thoáng mát… ![ mau-thiet-ke-nha-cap-4-co-gac-lung-1](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-11.jpg)
![ mau-thiet-ke-nha-cap-4-co-gac-lung-1](http://dbd.vn/wp-content/uploads/2016/04/mau-thiet-ke-nha-cap-4-co-gac-lung-11.jpg)
Trên đây là mẫu nhà cấp 4 có gác lửng được chúng tôi sưu tầm, ở nơi thành thị lẫn nông thôn đang được rất nhiều người ưa chuộng, hy vọng rằng các bạn sẽ thích với mẫu thiết kế này.
Xem thêm :
->
[mẫu nhà cấp 4 giá 200 triệu](http://dbd.vn/khong-gian-nha-dep/xin-gioi-thieu-14-mau-nha-cap-4-gia-200-trieu.html)
->
[mẫu nhà cấp 4 nông thôn đơn giản](http://dbd.vn/khong-gian-nha-dep/thiet-ke-mau-nha-cap-4-nong-thon-don-gian-duoc-nhieu-nguoi-uu-chuong.html)
## Hiện đang có 1 bình luận cho bài viết “Mẫu thiết kế nhà cấp 4 có gác lửng diện tích 8x22m”
Có thể cho tôi bản vẽ và mặt bằng tổng thể mặt trước của căn nhà mà k có hàng rào che Đc k nếu Đc xin LH: 0903653167

Server: Apache

Link: <http://dbd.vn/?p=34790>; rel=shortlink


text:
Mô tả sản phẩm
Đèn lồng tết trung thu Bươm Bướm bay ngộ nghĩnh đáng yêu bằng nguyên liệu chính từ nhựa, với nhiều mẫu mã độc đáo, không chứa chất độc hại và đặc biệt các em nhỏ có thể được tự tay trang trí, lắp ghép để tạo thành lồng đèn. Đây chính là nét sáng tạo mới có tính giáo dục và phát triển tư duy của trẻ. Lồng đèn trung thu sáng tạo đã thực hiện được mơ ước của rất nhiều em nhỏ khi được tự tay làm nên những chiếc lồng đèn cho riêng mình trong mùa Trung thu.
Đèn lồng trung thu Bươm Bướm bay sử dụng đèn pin để đáp ứng được nhu cầu vui chơi của các em nhỏ với giai điệu các hát trung thu Việt.
Bình luận & Đánh giá
Chưa có đánh giá nào cho sản phẩm này, bạn có muốn viết đánh giá?

markdown:
## Mô tả sản phẩm
**ngộ nghĩnh đáng yêu bằng nguyên liệu chính từ nhựa, với nhiều mẫu mã độc đáo, không chứa chất độc hại và đặc biệt các em nhỏ có thể được tự tay Đèn lồng tết trung thu Bươm Bướm bay ** [trang trí](http://denlongviet.vn/den-trang-tri/), lắp ghép để tạo thành lồng đèn. Đây chính là nét sáng tạo mới có tính giáo dục và phát triển tư duy của trẻ. [](http://denlongviet.vn/den-trung-thu/) **Lồng đèn trung thu** **sáng tạo đã thực hiện được mơ ước của rất nhiều em nhỏ khi được tự tay làm nên những chiếc lồng đèn cho riêng mình trong mùa Trung thu.** **sử dụng đèn pin để đáp ứng được nhu cầu vui chơi của các em nhỏ với giai điệu các hát trung thu Việt. Đèn lồng trung thu Bươm Bướm bay **
#### Hướng dẫn sử dụng
![](http://denlongviet.vn/wp-content/themes/blanco/images/assets/customtab.png)
#### Cách bảo quản
![](http://denlongviet.vn/wp-content/themes/blanco/images/assets/customtab2.png)
## Bình luận & Đánh giá
Chưa có đánh giá nào cho sản phẩm này, bạn có muốn viết đánh giá?

LCache: BYPASS

Link: <http://denlongviet.vn/wp-json/>; rel="https://api.w.org/", <http://denlongviet.vn/?p=7973>; rel=shortlink


text:
There are no events on this day.
Tên đăng nhập
Mật khẩu
Lưu mật khẩu!
Get the Flash Player to see this player.

Set-Cookie: co_training_tpl=co_training; expires=Fri, 08-Feb-2019 21:32:58 GMT; path=/