TRÖÔØNG ÑAÏI HOÏC TOÂN ÑÖÙC THAÉNG PHOØNG TRUNG CAÁP CHUYEÂN NGHIEÄP VAØ DAÏY NGHEÀ NGAØNH TIN HOÏC _oOo_
XAÂY DÖÏÖÏNG NG COÂNG CUÏÏ XAÂY D COÂNG CU COÂNG CUÏ XAÂY DÖÏNG PHAPHAÀÀN MEN MEÀÀMM PHAÀN MEÀM N NAÂNG CAO) (PHA(PHAÀÀN NAÂNG CAO) (PHAÀN NAÂNG CAO)
1
ThS.Lê Văn Hạnh
NỘI DUNG
I. Mô hình triển khai ứng dụng II. ADO.NET III. Lưu trữ và xử lý dữ liệu IV. Trình bày dữ liệu V. Xây dựng ứng dụng quản lý đặt và bán
hàng
2
VI. Crystal Report VII. Bảo mật trong ứng dụng
I.-MÔ HÌNH TRIỂN KHAI ỨNG DỤNG
1. Kiến trúc n-tier
(cid:223) 2-tier (client / server) (cid:223) 3-tier
2. Mô hình thiết kế ứng dụng
(cid:223) WaterFall (thác nước) (cid:223) Prototyping (nguyên mẫu) (cid:223) Spiral (xoắn ốc)
3
I.1- Kiến trúc n-tier a/- 2-tier
1. Ứng dụng khách sử
dụng ADO/ADO.NET truy xuất trực tiếp CSDL
2. Thích hợp cho cácứ ng dụng vừa và nhỏ, không có quá nhiều form
4
I.1- Kiến trúc n-tier a/- 2-tier (tt)
1. Các kỹ thuật triển khai
(cid:223) Sử dụng các kỹ thuật gắn kết dữ liệu để kết nối tập
dữ liệu ADO.NET trực tiếp đến các control
(cid:223) Viết lệnh truy xuất các đối tượng ADO.NET và gắn
kết dữ liệu thủ công đến các control
2. Ưu điểm
(cid:223) Triển khai nhanh chóng và dễ dàng (cid:223) Quan sát toàn bộ mã lệnh trong form
3. Khuyết điểm
(cid:223) Thay đổi quy trình công việc (cid:206) biên dịch lại (cid:223) Thay đổi lược đồ dữ liệu (cid:206) biên dịch lại (cid:223)
5
Ít khả năng tận dụng được các lệnh xử lý giống nhau giữa các form do tên field, tên table khác nhau
I.1- Kiến trúc n-tier b/- 3-tier
1. Sử dụng XML Web/Windows service nhằm tách biệt công việc truy xuất CSDL
2. Thích hợp với các
6
ứng dụng lớn có số lượng form nhiều và xử lý dữ liệu phức tạp
I.1- Kiến trúc n-tier b/- 3-tier (tt)
1. Các kỹ thuật triển khai
(cid:223)
(cid:223)
Tất cả thao tác dữ liệu đều ở XML Web Service. Các tập dữ liệu đều được tạo dựng trên server và trả về thông qua XML stream Các tập dữ liệu được trả về từ XML Web Service có thể được gắn kết vào các control một cách trực tiếp hoặc thủ công
2. Ưu điểm
(cid:223) (cid:223)
(cid:223)
(cid:223)
Triển khai nhanh chóng và dễ dàng Người dùng có thể sử dụng ứng dụng tại bất kỳ nơi nào có kết nối mạng Các thao tác CSDL tập trung tại XML Web Service, giảm thiểu chi phí bảo trì ứng dụng khách Các thay đổi trên lược đồ CSDL hay quy trình công việc đều được cập nhật tách biệt
3. Khuyết điểm
7
(cid:223)
(cid:223) (cid:223) Thay đổi quy trình công việc sẽ dẫn đến việc cập nhật toàn bộ các ứng dụng khách nằm rải rác Lược đồ CSDL được xây dựng cố định (cid:206) chi phí cập nhật cao Hiệu suất thực hiện kém do phụ thuộc kết nối mạng
I.2.- Mô hình thiết kế ứng dụng: a/- WaterFall Model
Khảo sát
Phân tích
Thiết kế
Cài đặt
Thử nghiệm
Triển khai & Bảo trì
8
I.2.- Mô hình thiết kế ứng dụng (tt) b/- Prototyping Model
Yêu cầu
Đánh giá & Cải tiến
Thiết kế
Tạo mẫu
9
I.2.- Mô hình thiết kế ứng dụng (tt) c/- Spiral Model
Yêu cầu và cài đặt
Ước lượng và giảm thiểu rủi ro
Tính khả thi
...
Thiết kế đúng đắn
Hiểu rõ yêu cầu
Phát triển và đánh giá
Lập kế hoạch
10
NỘI DUNG (tt)
1. Mô hình triển khai ứng dụng 2. ADO.NET 3. Lưu trữ và xử lý dữ liệu 4. Trình bày dữ liệu 5. Xây dựng ứng dụng quản lý đặt và
11
bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng
II.- ADO.NET
1. Các công nghệ truy xuất dữ liệu 2. Các đối tượng của ADO.NET
(cid:223) Connection (cid:223) Command (cid:223) DataAdapter (cid:223) DataTable, DataSet
3. Tạo kết nối và truy xuất CSDL
12
II.- ADO.NET II.1.- Các công nghệ truy xuất dữ liệu
APPLICATION
ODBC
SQL Native
Oracle Native
Native Library
SQL Server
Oracle
Fox / Access
Kiến trúc ODBC.
13
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
APPLICATION
OLEDB
ODBC
SQL Native
Oracle Native
Native Library
SQL Server
Oracle
Fox / Access
14
Kiến trúc OLEDB.
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
APPLICATION .NET
ADO.NET Provider
SQL/Oracle Provider
OLEDB Provider
ODBC Provider
OLEDB
ODBC
SQL Native
Oracle Native
Native Library
SQL Server
Oracle
Fox / Access
15
Kiến trúc ADO.NET.
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
1. Active Data Object .NET 2. ADO.NET có thể kết nối và thao tác trên các hệ quản trị CSDL như SQL server, MySQL, MS Access, Oracle, . . .
3. Tối ưu cho các ứng dụng Internet và phân tán. 4. ADO.NET được thiết kế nhằm tăng tốc độ truy cập và thao tác dữ liệu trong môi trường đa lớp.
5. Hai thành phần chính của ADO.NET là:
(cid:223) (cid:223)
Thành phần kết nối (.NET Framework Data Providers) Thành phần lưu trữ và xử lý
16
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
1.
.NET Framework Data Providers (cid:223) Connection (cid:223) Command (cid:223) DataReader (cid:223) DataAdapter
2. Container – DataSet
(cid:223) DataTable = {DataRow, DataColumn,
Constraint}
(cid:223) DataView (cid:223) DataRelation
17
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
ADO.NET
DataTable
DataSet
DataRows DataColumns
DataTable
DataRelation collection
DataTable
Client Application
.NET framework Data Provider
Data Reader
Data Adapter
Command
Parameters
Select Command Insert Command Update Command Delete Command
Connection
Transaction
18
Data source
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
ADO.NET DataSet
Tables
DataTable
Columns
DataColumn
Rows
DataRow
Client Application
Relations
Data Reader Command DataRelation
Parameters
.NET framework Data Provider
Data Adapter
Data Reader
Command
Select Command Insert Command Update Command Delete Command
Parameters
Connection
Transaction
19
Data source
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
Dataset
Connection
Data Adapter
.NET framework Data Provider
Transaction SelectCommand
DataTableCollection DataTable DataRowCollection
Command
InsertCommand DataColumnCollection
Parameters ConstraintCollection UpdateCommand
Data Reader
XML
20
Database
DeleteCommand DataRelationCollection
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
1. ADO.NET chỉ cung cấp một đặc tả giao tiếp cho các đối tượng như Connection, Command, DataReader, DataAdapter
2. Các hệ quản trị CSDL sẽ được xây dựng riêng các
trình điều khiển gọi là Provider
SQL Server NET Data OLE DB . . NET Data
System.Data.SqlClient System.Data.OleDb
21
OleDbCommand OleDbConnection OleDbDataAdapter OleDbDataReader OleDbParameter SqlCommand SqlConnection SqlDataAdapter SqlDataReader SqlParameter
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt)
ADO.NET
using System.Data
.NET Framework Data Provider
DataSet
DataTableCollection
SQLDataAdapter
OleDBDataAdapte r
Order
Products
SQLCommand
OleDBCommand
DataRelationCollection
SQLConnection
OleDBConnection
Access
SQL Server
using System.Data.SqlClient
22
using System.Data.OleDb
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) a/- Đối tượng Connection SqlConnection
OleDbConnection
Open()
Cho phép mở kết nối CSDL với các thuộc tính khai báo trong ConnectionString
Close()
Cho phép đóng kết nối CSDL đang mở
CreateCommand()
Phương thức này cho phép gán hay trảvề một đối tượng SqlCommand / OleDbCommand ứng với đối tượng SqlConnection/ OleDbConnection
Begin Transaction()
Phương thức này khai báo bắt đầu 1 chuyển tác, để kết thúc chuyển tác bạn sử dụng Table Commit
Rollback()
Trong trường hợp có lỗi phát sinh bạn có thể sử dụng phương thức Rollback để hủy bỏ các chuyển tácđ ã được thực hiện
Dispose()
23
Dùng để giải phóng tài nguyên mà đối tượng SqlConnection đang sử dụng
Phương thức
II.- ADO.NET 2.- Các đối tượng của ADO.NET a/- Đối tượng Connection(tt)
1. ConnectionString: chuỗi chỉ định kết nối 2. Mỗi Provider có riêng một định dạng chuỗi kết nối 3. SQLConnection:
4. OleDBConnection:
(cid:223)
(cid:223)
(cid:223) “DataSource=(local);Initial Catalog=qlsv; user=sa;pwd=sa”
“Provider=SQLOLEDB;Data Source=(local);Initial Catalog=qlsv;Integrated Security=False;User ID=sa;Password=sa” “Provider=SQLOLEDB;Data Source=(local);Initial Catalog=qlsv;Integrated Security=True” “Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\qlsv.mdb;User ID=Admin;Password=”
24
(cid:223)
II.- ADO.NET 2.- Các đối tượng của ADO.NET a/- Đối tượng Connection (tt)
1. Kết nối CSDL với SQLConnection
(cid:223)
2. Kết nối CSDL với OleDbConnection
(cid:223) String connStr = “server=(local);Init Catalog=qlsv;Integrated Security=True;”; SqlConnection dbConn = new SqlConnection(connStr);
(cid:223)
String connStr = “Provider=SQLOLEDB;Data Source=(local);Init Catalog=qlsv;User ID=sa;pwd=sa;”;
3. Thực hiện kết nối
(cid:223) OleDbConnection dbConn = new OleDbConnection(connStr);
// Mở kết nối
25
(cid:223) (cid:223) (cid:223) dbConn.Open(); //… Các lệnh truy xuất và xử lý CSDL // Đóng kết nối dbConn.Close();
II.- ADO.NET 2.- Các đối tượng của ADO.NET (tt) b/- Đối tượng Command 2.b.1.- Đối tượng Command cho phép thi hành các câu lệnh truy vấn SQL, gọi thủ tục nội của SQL Server, . . .
Thuộc tính Mô tả
Connection
Mỗi đối tượng SqlCommand được sử dụng phải kèm theo đối tượng SqlConnection
CommandText
Tên bảng, lệnh Sql hoặc tên Storeprocedure muốn thực hiện trên nguồn dữ liệu
CommandType
Tương ứng với giá trị CommandText. Gồm Text, TableDirect, StoredProcedure
CommandTimeout Khai báo thời gian chờ cho câu lệnh thực hiện
26
(thời gian thực hiện mặc định là 30 giây)
Parameters Tập hợp các tham số dùng trong Command
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt)
Phương thức Mô tả
ExcuteNonQuery() Phương thức dùng để gọi thực thi các câu lệnh SQL,
thủ tục nội tại của Sql Server, tên bảng dữ liệu. Kết quả trả về là số mẫu tin chịu tác động của Command
ExcuteReader()
Phương thức này trả về một đối tượng DataReader chỉ đọc một chiều. DataReader đọc dữ liệu trực tiếp từ nguồn dữ liệu nên phải duy trì kết nối cho đến khi đọc xong.
27
ExcuteScalar()
Phương thức này thực hiện lệnh của Command và trả về giá trị của cột đầu tiên và dòng đầu tiên. Phương thức này thường được sử dụng khi muốn Command thực hiện các hàm tính thống kê như : SUM, COUNT, AVG, MAX, MIN… trên nguồn dữ liệu ngay lúc thực thi.
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt)
2.b.2.- Tạo lệnh truy xuất dữ liệu
(cid:223) (cid:223) (cid:223) (cid:223)
String sql = “SELECT * FROM SINHVIEN”; String sql = “vMonHoc”; String sql = “sp_KetQuaSV”; String sql = “INSERT INTO KETQUA VALUES(‘A01’,’K1’,9)”;
2.b.3.- Truy xuất CSDL với SqlCommand
(cid:223)
SqlCommand dbCmd = new SqlCommand(sql, dbConn);
2.b.4.- Truy xuất CSDL với OleDbCommand
(cid:223) OleDbCommand dbCmd = new OleDbCommand(sql, dbConn);
2.b.5.- Thực hiện
(cid:223) (cid:223)
dbCmd.CommandType = CommandType.XXX; dbCmd.ExecuteReader(); / ExecuteNoneQuery();
28
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt)
2.b.6.- Thực hiện và nhận kết quả vô hướng
(cid:223) Gọi Stored Procedure - OleDbCommand
(cid:122) OleDbCommand dbCmd = new OleDbCommand(“select count(*)
from MonHoc”, dbConn);
(cid:122) dbCmd.CommandType = CommandType.Text; (cid:122) int SLMonHoc = dbCmd.ExecuteScalar(); (cid:223) Gọi Stored Procedure – SqlCommand
(cid:122) SqlCommand dbCmd = new SqlCommand(“select count(*) from
MonHoc”, dbConn);
(cid:122) dbCmd.CommandType = CommandType.Text; (cid:122) int SLMonHoc = dbCmd.ExecuteScalar();
29
(cid:122) Parameter dùng để truyền tham số cho chuỗi lệnh Sql trong thuộc tính CommandText có thể sử dụng dấu ? thay thế cho các giá trị chưa xác định, hay thủ tục nội của Sql có thể cần phải truyền các tham số đầu vào/ đầu ra.
(cid:122) Cơ chế Parameter giúp cho việc truyền tải thông tin giữa ứng dụng và server mang tính bảo mật và an toàn hơn cách thức nối chuỗi SQL thông thường
30
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) 2.b.7.-Thuộc tính Parameters của Command
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) 2.b.7.-Thuộc tính Parameters của Command (tt)
Mô tả
Thuộc tính của Parameters
Direction
Giá trị cho biết loại tham số với các giá trị sau: + Input (mặc định): loại tham số đầu vào +Output: loại tham số đầu ra +InputOutput: loại tham số vào/ra +ReturnValue: loại tham số nhận giá trị trả về của một thủ tục nội, một hàm, hàm do người dùng định nghĩa.
Kiểu dữ liệu OleDb hoặc SqlDb của tham số (đọc ghi)
OleDbType SqlDbType
ParameterName Tên tham số (đọc ghi)
31
Value Giá trị của tham số (đọc ghi)
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt) 2.b.7.-Thuộc tính Parameters của Command (tt)
Để đưa tham số cho Command, chúng ta có thể sử dụng một trong các cách sau: 1. Dùng phương thức CreateParameter của Command và Add của tập hợp Parameters 2. Đưa tham số vào tập hợp Parameters 3. Tạo tham số và đưa vào tập hợp Parameters
32
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt)
1. Stored Procedure có tham số a/- Tạo Stored Procedure CREATE PROCEDURE sp_KetQuaSV
@masv as nvarchar(10)
AS BEGIN
SELECT MaSV, HoSV, TenSV, TenMH, Diem FROM SinhVien sv, KetQua kq, KhoaHoc k, MonHoc mh WHERE sv.MaSV=@masv AND sv.MaSV=kq.MaSV AND kq.MaKH=k.MaKH AND k.MaMH=mh.MaMH
END
33
II.- ADO.NET 2.- Các đối tượng của ADO.NET b/- Đối tượng Command (tt)
b/- Gọi Stored Procedure - OleDbCommand (cid:223) OleDbCommand dbCmd = new OleDbCommand(“sp_KetQuaSV”,
(cid:223) (cid:223)
c/- Gọi Stored Procedure – SqlCommand
(cid:223) dbConn); dbCmd.CommandType = CommandType.StoredProcedure; dbCmd.Parameters.Add("@masv", OleDbType.VarWChar).Value = "A01“; dbCmd.ExecuteNonQuery();
(cid:223)
(cid:223) (cid:223)
34
(cid:223) SqlCommand dbCmd = new SqlCommand(“sp_KetQuaSV”, dbConn); dbCmd.CommandType = CommandType.StoredProcedure; dbCmd.Parameters.Add("@masv", SqlType.NVarChar).Value = "A01“; dbCmd.ExecuteNonQuery();
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter
1. Dùng luân chuyển và trao đổi dữ liệu, xử lý logic một cách hiệu quả giữa ứng dụng và CSDL
2. Mỗi đối
tượng Command là một
lệnh tách rời. DataAdapter cung cấp cùng lúc tượng Command: Select, Insert, 4 đối Update, Delete.
35
3. DataAdapter không lưu trữ dữ liệu mà chỉ đóng vai trò cầu nối giữa Connection và DataTable (DataSet).
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
1. Khai báo sử dụng:
2. Lưu
ý:
dbCmd
đối
là
(cid:223) Dim adap As New SqlDataAdapter(dbCmd) (cid:223) Dim adap As New OleDbDataAdapter(dbCmd) tượng SqlCommand hoặc OleDbCommand tạo ra với tương ứng, đã được SqlConnection hoặc OleDbConnection tương ứng và Connection này phải đã được mở (Open).
36
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
3. Phương thức Fill – Đọc và lưu trữ dữ liệu
(cid:223) DataAdapter cung cấp 4 đối tuợng Command trong đó phương thức Fill tương ứng với việc gọi SELECT Command
(cid:223) Lệnh khai báo đối tượng ở slide trước chỉ nên dùng cho các đối tượng Command thực hiện lệnh SELECT
(cid:223) Khi
tạo DataAdapter có sử dụng cả 4 Command, chúng ta nên tạo riêng từng Command này.
37
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
4. SELECT Command (đổi Sql thành OleDb để sử
dụng OLEDB) (cid:223) SqlDataAdapter adap = new SqlDataAdapter(); (cid:223)
adap.SelectCommand = new SqlCommand(“SELECT * FROM MonHoc”, dbConn);
(cid:223) DataTable tbl = new DataTable(); (cid:223) (cid:223)
adap.Fill(tbl); ‘ Các lệnh xử lý khác
38
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
5.- Update – Cập nhật dữ liệu
(cid:223) Phương thức Update hoạt động dựa trên 3 Command còn lại (Insert, Update, Delete) (cid:223) Khi trình bày dữ liệu trên Form thông qua các control, phương thức Update sẽ tự động cập lên CSDL thông qua 3 nhật tất cả thay đổi Command này
(cid:223) Trước khi sử dụng, phải xây dựng tường
minh 3 Command này
39
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
6.- Đổi Sql thành OleDb để sử dụng OLEDB
a/- INSERT Command … adap.InsertCommand = new SqlCommand(“INSERT INTO MonHoc
VALUES (@mamh, @tenmh, @sotc)”, dbConn)
40
adap.InsertCommand.Parameters.Add(“@mamh”).SourceColumn=“MaMH” adap.InsertCommand.Parameters.Add(“@tenmh”).SourceColumn=“TenMH” adap.InsertCommand.Parameters.Add(“@sotc”).SourceColumn=“SoTC”
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
b/- UPDATE Command … adap.UpdateCommand = New SqlCommand(“UPDATE MonHoc SET
TenMH=@tenmh, SoTC=@sotc WHERE MaMH=@mamh”, dbConn)
adap.UpdateCommand.Parameters.Add(“@mamh”).SourceColumn=
“MaMH”
adap.UpdateCommand.Parameters.Add(“@tenmh”).SourceColumn=
“TenMH”
41
adap.UpdateCommand.Parameters.Add(“@sotc”).SourceColumn=“SoTC”
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
c/- DELETE Command … adap.DeleteCommand = New SqlCommand(“DELETE MonHoc WHERE
MaMH=@mamh”, dbConn)
adap.DeleteCommand.Parameters.Add(“@mamh”).SourceColumn=
d/- Sau khi xây dựng đủ 4 Command, sử dụng Fill để thực hiện SELECT Command lấy dữ liệu, (cid:122) Sử dụng Update để cập nhật dữ liệu DataTable tbl = new DataTable(); adap.Fill(tbl); // Các lệnh thao tác khác adap.Update(tbl);
42
“MaMH”
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt)
(cid:122) Sử dụng đối tượng SqlCommandBuilder /
OleDBCommandBuilder để xây dựng tự động 3 Command còn lại dựa vào SELECT Command được cung cấp ban đầu SqlDataAdapter adap = new SqlDataAdapter(“select
* from SinhVien”, dbConn);
SqlCommandBuilder cmdBuilder = new
SqlCommandBuilder(adap); DataTable tbl = new DataTable(); adap.Fill(tbl); ...
43
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) Ví dụ Đọc tên SV và hiển thị trong List private void btnKetNoi_Click(object sender, EventArgs e) {
String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“;
OleDbConnection dbConn = new OleDbConnection(connStr); OleDbCommand dbCmd = new OleDbCommand("select * from sinhvien",
dbConn);
OleDbAdapter adap = new OleDbDataAdapter(dbCmd); DataSet ds = new DataSet(); DataRow dr = null;
adap.Fill(ds); foreach (dr in ds.Tables(0).Rows)
ListBox1.Items.Add(dr["tensv“].ToString());
dbConn.Close();
44
}
II.- ADO.NET 2.- Các đối tượng của ADO.NET c/- Đối tượng DataAdapter (tt) Ví dụ Hiển thị và cập nhật trong DataGrid
1.
Tạo project mới, trong Form1 thêm các lệnh using cần thiết, vẽ 2 button và 1 DataGridView. Viết lệnh như sau
// biến thành viên của form OleDbConnection dbConn = new OleDbConnection(connStr); OleDbDataAdapter adap = new OleDbDataAdapter(); private void btnMonHoc_Click(object sender, EventArgs e) {
String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“;
// Gõ các lệnh xây dựng 4 Command ở các slide trước DataTable tbl = new DataTable(); adap.Fill(tbl); dgrSV.DataSource = tbl;
45
adap.Update(dgrSV.DataSource);
} private void btnUpdate_Click(object sender, EventArgs e) { }
NỘI DUNG (tt)
I. Mô hình triển khai ứng dụng II. ADO.NET III. Lưu trữ và xử lý dữ liệu IV. Trình bày dữ liệu V. Xây dựng ứng dụng quản lý đặt và
46
bán hàng VI. Crystal Report VII. Bảo mật trong ứng dụng
III.- LƯU TRỮ VÀ XỬ LÝ DỮ LIỆU
1. DataTable 2. DataSet 3. BindingSource
(cid:223) Di chuyển dữ liệu (cid:223) Ràng buộc dữ liệu
4. Dùng DataRelation thiết lập quan hệ 5. Xử lý lỗi phát sinh khi chạy ứng dụng
47
II.-Lưu trữ và xử lý dữ liệu 1.- DataTable
1. Dùng lưu trữ và xử lý dữ liệu được lấy từ CSDL thông qua đối tượng DataAdapter 2. DataTable có khả năng tạo bảng mới với cấu trúc bảng được tạo thông qua các đối tượng DataColumn; thêm dữ liệu mới và cập nhật dữ liệu đã có bằng DataRow 3. Trong môn học này, DataTable chủ yếu
được dùngđể lưu trữ dữ liệu phục vụ cho việc trình bày dữ liệu trên Form
4. using System.Data
48
II.-Lưu trữ và xử lý dữ liệu
1.- Đối tượng DataTable (tt)
Thuộc tính Mô tả
ChildRelations
Tập hợp những quan hệ trong đó bảng đóng vai trò bảng cha
ParentRelations Tập hợp những quan hệ trong đó bảng đóng vai trò
bảng con
TableName Tên của DataTable
Columns Tập hợp các cột trong bảng (thuộc lớp DataColumn)
Rows
Tập hợp các dòng dữ liệu của bảng (thuộc lớp DataRow)
Constraints Tập hợp các ràng buộc trong bảng
DataSet Cho biết DataSet chứa bảng
DefaultView Cho biết DefaultView phát sinh từ bảng
PrimaryKey Mảng các cột có chức năng làm khoá chính của bảng 49
II.-Lưu trữ và xử lý dữ liệu
1.- Đối tượng DataTable (tt)
Phương thức Mô tả
GetChanges()
Trả về một DataTable chứa các dòng dữ liệu bị người dùng thay đổi
RejectChanges() Hủy bỏ tất cả những thay đổi của người dùng trên
dữ liệu
AcceptChanges() Chấp nhận tất cả những thay đổi của người dùng
trên dữ liệu
Xóa toàn bộ dữ liệu trong bảng Clear()
Tạo DataTable mới có cùng cấu trúc và dữ liệu Copy()
Clone()
Tạo DataTable mới có cùng cấu trúc nhưng không có dữ liệu
LoadDataRow Thêm các dòng dữ liệu mới dạng mảng vào bảng
50
Ghi toàn bộ cấu trúc và dữ liệu ra file XML WriteXml
Đọc lại toàn bộ cấu trúc và dữ liệu từ file XML ReadXml
II.-Lưu trữ và xử lý dữ liệu
2.- Đối tượng DataSet
1. ADO.NET hoạt động theo cơ chế
Disconnected (cid:223) Tạo kết nối CSDL khi cần (cid:223) Ngắt kết nối khi thực hiện xong thao tác
2. Ưu điểm
(cid:223) Không chiếm giữ nhiều tài nguyên (cid:223) Phục vụ được nhiều ứng dụng
3. Khuyết điểm
51
(cid:223) Những thay đổi trên CSDL diễn ra tại một nơi khác sẽ không được cập nhật ngay cho người dùng
II.-Lưu trữ và xử lý dữ liệu
2.- Đối tượng DataSet (tt)
1. DataSet có thể được xem như một CSDL thu nhỏ, do nó có thể bao gồm nhiều: (cid:223) DataTable (các table, view trong CSDL) (cid:223) DataView (cid:223) DataRelation (cid:223) Stored Procedure 2. using System.Data
52
II.-Lưu trữ và xử lý dữ liệu
2.- Đối tượng DataSet (tt)
DataSet
DataTable
Tables
Columns
DataColumn
Rows
DataRow
Relations
DataRelation
53
II.-Lưu trữ và xử lý dữ liệu
2.- Đối tượng DataSet (tt)
Thuộc tính Relations
Tables
Name
Mô tả Tập hợp các quan hệ một- nhiều giữa các DataTable của DataSet Tập hợp các bảng, view, stored procedure của DataSet Tên của DataSet
54
II.-Lưu trữ và xử lý dữ liệu
2.- Đối tượng DataSet (tt)
1. Sử dụng các phương thức Add, Remove của hai đối tượng thuộc tính Relations và Tables để thêm, xóa DataTable hay DataRelation vào DataSet
2. Khi sử dụng phương thức Fill của
DataAdapter cho DataSet thì DataSet sẽ có số lượng DataTable tương ứng với số lượng câu truy vấn trong đối tượng SELECT Command của DataAdapter
55
II.-Lưu trữ và xử lý dữ liệu
3.- BindingSource
1. Điều khiển việc di chuyển dữ liệu giữa các dòng trong DataTable. Trong chức trò năng này, BindingSource đóng vai cầu nối giữa DataTable với control hiển thị dữ liệu (DataGridView)
2. Cung cấp cơ chế tạo liên kết di chuyển, cập nhật giữa 2 DataTable khi xây dựng Master/Detail form
56
II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource
1. Tạo project mới, đặt tên Form là
frmSinhVien
2. Thêm control DataGridView vào form 3. Thêm Toolbar vào form và tạo 5 button
57
cùng 1 TextBox trên Toolbar như trên hình
II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt)
4. Khai báo biến thành viên của lớp như sau:
(cid:223)
(cid:223) (cid:223) (cid:223) (cid:223)
private String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“; private OleDbConnection dbConn; private BindingSource bindSV; // dùng di chuyển record private OleDbDataAdapter adapSV; private DataSet dsSV;
58
II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt)
OleDbCommandBuilder cmdBuilder; // dùng xây dựng các lệnh dbConn = new OleDbConnection(connStr); dbConn.Open();
adapSV = new OleDbDataAdapter("select * from sinhvien", dbConn); cmdBuilder = new OleDbCommandBuilder(adapSV);
// lấy và lưu trữ dữ liệu
dsSV = new DataSet(); adapSV.Fill(dsSV); bindSV = new BindingSource(); // tạo BindingSource bindSV.DataSource = dsSV.Tables[0]; // chỉ định nguồn dữ liệu cho bind dgrSV.DataSource = bindSV; // nguồn dữ liệu cho lưới là bind
}
59
5. Chận sự kiện Form_Load, thực hiện: private void KetQuaSV_Load(object sender, EventArgs e) {
II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt)
6. Chận sự kiện Click của 4 button di chuyển
private void goFirst_Click(object sender, EventArgs e) {
bindSV.MoveFirst();
} private void goPrev_Click(object sender, EventArgs e) {
bindSV.MovePrevious();
} private void goNext_Click(object sender, EventArgs e) {
bindSV.MoveNext();
} private void goLast_Click(object sender, EventArgs e) {
bindSV.MoveLast();
}
60
II.-Lưu trữ và xử lý dữ liệu Ví dụ về DataSet, DataTable, BindingSource (tt)
7. Cập nhật giá trị cho TextBox trên ToolBar
Chận sự kiện SelectionChanged của DataGridView txtRec.Text = (bindSV.Position + 1).ToString() + " / " +
dsSV.Tables(0).Rows.Count.ToString(); 8. Chận sự kiện Click của button Update để
thực hiện lưu các thay đổi adapSV.Update(dsSV.Tables[0]);
9. F5 để chạy ứng dụng
61
II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ
1. Tạo project mới, đặt tên Form là frmKQMH 2. Thêm 2 control DataGridView vào form 3. Thêm Toolbar vào form và tạo 5 button
cùng 1 TextBox trên Toolbar như trên hình
62
II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ (tt)
4. Khai báo các biến thành viên:
private String connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\NghiaTran\Documents\qlsv.mdb;User ID=Admin;Password=“;
private OleDbConnection dbConn; private BindingSource bindMH; // dùng cho Table DM_MonHoc private BindingSource bindKQ; // dùng cho Table KetQua private OleDbDataAdapter adapMH; // dùng cho Table DM_MonHoc private OleDbDataAdapter adapKQ; // dùng cho Table KetQua private DateSet dsKQMH; // tập DataSet chứa dữ liệu của cả 2 table
63
DM_MonHoc và KetQua, đồng thời chứa Relation tạo ra cho 2 table này
II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ (tt)
‘ Tạo mối quan hệ giữa 2 table bằng DataRelation tblMH = dsKQMH.Tables["Master"]; tblKQ = dsKQMH.Tables["Detail"]; relation = new DataRelation("relKQMH",
tblMH.Columns["MaMH"], tblKQ.Columns["MaMH"]);
Gõ các lệnh sau trong sự kiện Form_Load OleDbCommandBuilder cmdBuilder; DataTable tblMH, tblKQ; DataRelation relation; dbConn = new OleDbConnection(connStr); dbConn.Open(); ‘ Lấy và xử lý dữ liệu dm_monhoc dbCmd = new OleDbCommand(); adapMH = new OleDbDataAdapter("select *
from dm_monhoc", dbConn);
cmdBuilder = new
OleDbCommandBuilder(adapMH)
‘ Lấy và xử lý dữ liệu ketqua adapKQ = new OleDbDataAdapter("select *
from ketqua", dbConn);
cmdBuilder = new
dsKQMH.Relations.Add(relation); ‘ Thiết lập quan hệ thực sự giữa 2 table bindMH = new BindingSource(); bindMH.DataSource = dsKQMH; bindMH.DataMember = "Master"; bindKQ = new BindingSource(); bindKQ.DataSource = bindMH; bindKQ.DataMember = "relKQMH“; ‘ Đặt nguồn dữ liệu hiển thị cho các control dgrMH.DataSource = bindMH; dgrKQ.DataSource = bindKQ;
OleDbCommandBuilder(adapKQ)
64
‘ Tạo DataSet chứa toàn bộ dữ liệu dsKQMH = new DataSet("dsKQMH"); ‘ Đặt dữ liệu từ 2 DataAdapter vào 2 table trong DataSet adapMH.Fill(dsKQMH, "Master"); adapKQ.Fill(dsKQMH, "Detail");
II.-Lưu trữ và xử lý dữ liệu 4.- Dùng DataRelation thiết lập quan hệ (tt)
1. Các chức năng di chuyển học viên tự
thực hiện
2. Khi chọn Update, ứng dụng cần cập nhật cả 2 table, do đó ta có 2 lệnh như sau: (cid:223) adapMH.Update(dsKQMH.Tables["Master"]); (cid:223) adapKQ.Update(dsKQMH.Tables["Detail"]);
65
II.-Lưu trữ và xử lý dữ liệu 5.- Xử lý lỗi phát sinh khi chạy ứng dụng
1. Giúp ứng dụng không bị hệ điều hành bắt ngưng hoạt động đột ngột khi xảy ra lỗi
2. Khi sử dụng bất kỳ phương thức nào của các đối tượng ADO.NET, cần tham khảo kỹ phương thức này sẽ phát sinh những ngoại lệ (exception) nào để ứng dụng có thể chận bắt hợp lệ
66
II.-Lưu trữ và xử lý dữ liệu 5.- Xử lý lỗi phát sinh khi chạy ứng dụng (tt)
1. Sử dụng khối try … catch cho ngoại lệ
try {
Các lệnh xử lý
} catch (
Các lệnh xử lý lỗi
}
…
catch (
Các lệnh xử lý lỗi
}
67
II.-Lưu trữ và xử lý dữ liệu 5.- Xử lý lỗi phát sinh khi chạy ứng dụng(tt)
try {
dbConn = new OleDbConnection(connStr); dbConn.Open(); // Lấy và xử lý dữ liệu dm_monhoc dbCmd = new OleDbCommand(); adapMH = new OleDbDataAdapter("SELECT * FROM
dm_monhoc", dbConn);
cmdBuilder = new OleDbCommandBuilder(adapMH); // Lấy và xử lý dữ liệu ketqua ...
} catch (OleDbException ex) {
MessageBox.Show(ex.Message, “Lỗi”, ...)
68
}
NỘI DUNG (tt)
1. Mô hình triển khai ứng dụng 2. ADO.NET 3. Lưu trữ và xử lý dữ liệu 4. Trình bày dữ liệu 5. Xây dựng ứng dụng quản lý đặt và
69
bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng
IV.- TRÌNH BÀY DỮ LIỆU
1. DataView 2. DataGridView 3. Windows Form controls
(cid:223) Label (cid:223) TextBox (cid:223) CheckBox (cid:223) ComboBox / ListBox
4. Binding Navigator
70
IV.- TRÌNH BÀY DỮ LIỆU
1.-DataView
1. Tương tự như view trong SQL Server, DataView là một dạng trình bày dữ liệu cho DataTable
2. Một DataView phải gắn kết với một
DataTable
3. Một DataTable có thể có nhiều DataView 4. Mỗi đối tượng DataTable đều có sẵn một tính
(thuộc
định
DataView mặc DefaultView)
71
IV.- TRÌNH BÀY DỮ LIỆU
1.-DataView (tt)
1. Lọc dữ liệu
(cid:223) String str = “ HoSV like ‘Trần*’ ”; (cid:223) tbl.DefaultView.RowFilter = str;
2. Sắp xếp dữ liệu
(cid:223) String str = “TenSV ASC”; (cid:223) tbl.DefaultView.Sort = str;
72
IV.- TRÌNH BÀY DỮ LIỆU
1.-DataView (tt)
1. Tạo view mới cho DataTable
(cid:223) View viewSortTenHo = new View(); (cid:223) (cid:223)
viewSortTenHo.Table = tbl; viewSortTenHo.Sort = “TenSV DESC, HoSV ASC”;
(cid:223) dgr.DataSource = viewSortTenHo;
73
IV.- TRÌNH BÀY DỮ LIỆU
2.- DataGridView
1. Tiếp nhận và trình bày dữ liệu từ các đối tượng DataSet, DataTable, DataView
2. Đây là đối tượng tiện dụng nhất cho việc xem
và nhập dữ liệu dạng bảng
3. Dữ liệu được cung cấp cho DataGridView
thông qua thuộc tính DataSource và DataMember (nếu nguồn dữ liệu là DataSet)
dgr.DataSource = dsKQMH dgr.DataMember = “Master”
74
IV.- TRÌNH BÀY DỮ LIỆU
2.- DataGridView (tt)
1. Thuộc tính CurrentRow: xác định dòng hiện
hành
2. Thuộc tính CurrentCell: xác định ô hiện hành 3. Thuộc tính RowCount: xác định số lượng dòng 4. Thuộc tính ColumnCount: xác định số lượng
cột
5. Rows(i)(j): xác định ô tại vị trí dòng i cột j 6. Rows(i)(j).Value: đọc (hay ấn định) giá trị cho ô
tại vị trí dòng i cột j
75
IV.- TRÌNH BÀY DỮ LIỆU
2.- DataGridView (tt)
6. Các sự kiện phát sinh (thường sử dụng)
(cid:223) SelectionChanged: xảy ra khi user di chuyển con trỏ sang dòng dữ liệu khác. Dùng sự kiện này để cập nhật lại thông tin hoặc kiểm tra tính đúng đắn của thông tin được nhập vào
(cid:223) DoubleClick: phát sinh khi user nhấn đôi chuột lên
DataGridView. Có thể dùng để hiển thị thông tin chi tiết của dòng được nhấn hoặc liên kết đến form dữ liệu khác
(cid:223) CellClick: phát sinh khi user nhấn trái chuột lên 1 cell của DataGridView. Thường dùng cho cột Button
76
2.- DataGridView (tt)
IV.- TRÌNH BÀY DỮ LIỆU
Các control nhập liệu
1. Khi muốn DataGridView hiển thị các cột theo ý muốn của mình (ComboBox, số lượng cột), ta có thể tạo riêng từng cột và thêm vào DataGridView
2. Cột của DataGridView có thể có dạng:
(cid:223) TextBox (mặc định) (cid:223) ComboBox (cid:223) Command Button (cid:223) CheckBox
77
IV.- TRÌNH BÀY DỮ LIỆU
Các control nhập liệu: TextBox
2.- DataGridView (tt)
(cid:223)
1. Đối với control dạng này, ta cần quan tâm đến thuộc tính:
DataPropertyName: chỉ định tên field của nguồn dữ liệu cung cấp cho DataGridView. TextBox control sẽ lấy dữ liệu từ field này để hiển thị và cập nhật dữ liệu
2. Ngoài ra, ta có thể điều chỉnh tiêu đề và dạng trình bày (font)
DataGridViewCellStyle cellStyleBoldItalicRed = new
DataGridViewCellStyle();
cellStyleBoldItalicRed.ForeColor = Color.Red; cellStyleBoldItalicRed.Font = new Font("Times New Roman", 10,
FontStyle.Bold | FontStyle.Italic);
DataGridViewTextBoxColumn dgrcolDiem = new
78
DataGridViewTextBoxColumn(); dgrcolDiem.DataPropertyName = “DIEM”; dgrcolDiem.HeaderText = “Điểm”; dgrcolDiem.DefaultCellStyle = cellStyleBoldItalicRed; dgrKQ.Columns.Add(dgrcolDiem);
IV.- TRÌNH BÀY DỮ LIỆU
Các control nhập liệu: ComboBox
1. Ngoài DataPropertyName, ta cần quan
tâm đến những thuộc tính sau: (cid:223) DataSource: nguồn dữ liệu hiển thị cho
ComboBox
(cid:223) DisplayMember: field của nguồn dữ liệu.
ComboBox sẽ hiển thị dữ liệu trong field này
(cid:223) ValueMember: field của nguồn dữ liệu.
ComboBox sẽ lấy dữ liệu trong field này cập nhật vào DataPropertyName
79
2.- DataGridView (tt)
IV.- TRÌNH BÀY DỮ LIỆU
Các control nhập liệu: ComboBox (tt)
DataGridViewComboBoxColumn dgrcolSV = new
DataGridViewComboBoxColumn();
dgrcolSV.DataSource = dsKQMH.Tables["DM_SV"]; dgrcolSV.ValueMember = "MASV"; dgrcolSV.DisplayMember = "HoTen"; dgrcolSV.DataPropertyName = "masv"; dgrcolSV.HeaderText = "Sinh Viên"; dgrKQ.Columns.Add(dgrcolSV);
80
2.- DataGridView (tt)
IV.- TRÌNH BÀY DỮ LIỆU
Ví dụ về Các control nhập liệu
1. Sử dụng lại project đã xây dựng trong
Slide 60
2. Xây dựng lại sự kiện Form_Load như sau
81
2.- DataGridView (tt)
IV.- TRÌNH BÀY DỮ LIỆU
2.- DataGridView (tt)
Ví dụ về Các control nhập liệu
(cid:122) Khai báo thêm biến thành viên dưới đây để lấy dữ liệu về danh mục sinh viên: private OleDbDataAdapter adapDMSV; (cid:122) Chỉ định dữ liệu cho adapDMSV:
adapDMSV = new OleDbDataAdapter("SELECT masv, hosv & \" \" & tensv as hoten FROM sinhvien", dbConn); (cid:122) Lấy dữ liệu vào DataSet
adapDMSV.Fill(dsKQMH, “DM_SV”);
82
IV.- TRÌNH BÀY DỮ LIỆU
Ví dụ về Các control nhập liệu
Thay lệnh dgrKQ.DataSource = bindKQ bằng các lệnh sau:
// Chỉ định nguồn dữ liệu hiển thị
// Chỉ định dữ liệu cập nhật
DataGridViewComboBoxColumn dgrcolSV=new DataGridViewComboBoxColumn();// ComboBox column dgrcolSV.DataSource = dsKQMH.Tables["DM_SV"]; dgrcolSV.ValueMember = "MASV"; dgrcolSV.DisplayMember = "HoTen"; dgrcolSV.DataPropertyName = "masv“; dgrcolSV.HeaderText = "Sinh viên“; dgrKQ.Columns.Add(dgrcolSV);
// Thêm cột vào DataGridView
DataGridViewCellStyle cellStyleBoldItalicRed = new DataGridViewCellStyle();// Định dạng hiển thị cell cellStyleBoldItalicRed.ForeColor = Color.Red; cellStyleBoldItalicRed.Font = new Font("Times New Roman", 10, FontStyle.Bold Or FontStyle.Italic);
// Chỉ định dữ liệu cập nhật
DataGridViewTextBoxColumn dgrcolDiem = new DataGridViewTextBoxColumn();// Tạo TextBox column dgrcolDiem.DataPropertyName = "diem“ ; dgrcolDiem.HeaderText = "Điểm“; dgrcolDiem.DefaultCellStyle = cellStyleBoldItalicRed; dgrKQ.Columns.Add(dgrcolDiem); dgrKQ.DataSource = bindKQ; dgrKQ.Columns["MAMH"].Visible = false;
// Thêm cột vào DataGridView // Chỉ định nguồn dữ liệu cho DataGridView // Ẩn cột MAMH
83
2.- DataGridView (tt)
4.-Ràng buộc dữ liệu với các control WindowsForm
1. Ngoài DataGridView cho phép hiển thị (và cập nhật dữ liệu) nhiều record, các control thông thường của WindowsForm cũng có thể hiển thị và cập nhật dữ liệu
2. Label 3. TextBox 4. CheckBox 5. ComboBox / ListBox
84
IV.- TRÌNH BÀY DỮ LIỆU
IV.- TRÌNH BÀY DỮ LIỆU
4.-Ràng buộc dữ liệu với các control WindowsForm: Label
1. Label là control chỉ hiển thị mà không cho
phép chỉnh sửa dữ liệu
2. Cú pháp:
nguồn dữ liệu, “Tên field”)
3. Ví dụ:
lblMaMH.DataBindings.Add(“Text”, bindMH, “MaMH”)
85
IV.- TRÌNH BÀY DỮ LIỆU
4.-Ràng buộc dữ liệu với các control WindowsForm: TextBox
1. TextBox là control cho phép hiển thị và chỉnh
sửa dữ liệu
2. Cú pháp:
nguồn dữ liệu, “Tên field”)
3. Ví dụ:
txtTenMH.DataBindings.Add(“Text”, bindMH,
“TenMH”)
86
IV.- TRÌNH BÀY DỮ LIỆU
4.-Ràng buộc dữ liệu với các control WindowsForm: CheckBox
1. CheckBox thường được ràng buộc với các field có kiểu Yes/No (Bit) trong dữ liệu 2. Cú pháp:
tính”, nguồn dữ liệu, “Tên field”)
3. Ví dụ:
chkPhaiNu.DataBindings.Add(“Checked”, bindSV,
“PhaiNu”)
87
IV.- TRÌNH BÀY DỮ LIỆU
4.-Ràng buộc dữ liệu với các control WindowsForm: ComboBox
1. Thường dùng cho những field là khóa ngoại
tham chiếu đến một table khác
2. ListBox sử dụng tương tự 3. Cú pháp phần dữ liệu cập nhật:
nguồn dữ liệu, “Tên field”)
4. Ví dụ:
cboDMKhoa.DataBindings.Add(“SelectedValue”, bindSV,
“MaKhoa”)
88
IV.- TRÌNH BÀY DỮ LIỆU
4.-Ràng buộc dữ liệu với các control WindowsForm:ComboBox (tt)
5. Cú pháp phần dữ liệu hiển thị:
6. Ví dụ:
cboDMKhoa.DataSource = dsSV.Tables[“DM-Khoa”]; cboDMKhoa.DisplayMember = “TenKhoa”; cboDMKhoa.ValueMember = “MaKhoa”;
89
IV.- TRÌNH BÀY DỮ LIỆU
5.- Binding Navigator
1. Cho phép user sử dụng để duyệt (di chuyển) giữa các record (đầu, cuối, trước, sau), thêm mới, xóa, cập nhật các record
2. Binding Navigator nằm trên ToolBox
thuộc nhóm Data
3. Sau khi đưa vào form, ta ấn định thuộc
tính BindingSource của control này
bindNaviSV.BindingSource = bindSV
90
IV.- TRÌNH BÀY DỮ LIỆU
6.- Ví dụ form danh mục sinh viên
1. Tạo project mới, đặt
tên form
là
control
(Label, TextBox, DateTimePicker,
frmQLSV 2. Thêm các ComboBox, BindingNavigator) vào form như hình vẽ
91
IV.- TRÌNH BÀY DỮ LIỆU
6.- Ví dụ form danh mục sinh viên (tt)
3. Khai báo các biến thành viên
private String connStr =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\NghiaTran\Documents\qlsv.mdb ;User ID=Admin;Password=“; private OleDbConnection dbConn; private OleDbDataAdapter adapSV; private OleDbDataAdapter adapKhoa; private DataSet dsSV; private BindingSource bindSV;
92
6.- Ví dụ form danh mục sinh viên (tt)
4. Gõ các lệnh sau vào sự kiện Form_Load
dbConn = new OleDbConnection(connStr); dbConn.Open();
adapSV = new OleDbDataAdapter("select * from
txtMaSV.DataBindings.Add("Text", bindSV, "MaSV"); txtHoSV.DataBindings.Add("Text", bindSV, "HoSV"); txtTenSV.DataBindings.Add("Text", bindSV, "tensv"); chkPhaiNu.DataBindings.Add("Checked", bindSV,
"PhaiNu");
sinhvien", dbConn); OleDbCommandBuilder cmdBuilder = new
dtpNgaySinh.DataBindings.Add("Value", bindSV,
OleDbCommandBuilder(adapSV);
"NgaySinh");
adapKhoa = new OleDbDataAdapter("select * from
txtNoiSinh.DataBindings.Add("Text", bindSV,
dm_khoa", dbConn);
"NoiSinh");
txtHocBong.DataBindings.Add("Text", bindSV,
"HocBong");
dsSV = new DataSet(); adapSV.Fill(dsSV, "SinhVien"); adapKhoa.Fill(dsSV, "Khoa");
cboKhoa.DataSource = dsSV.Tables["khoa"]; cboKhoa.DisplayMember = "TenKhoa“; cboKhoa.ValueMember = "MaKhoa“; cboKhoa.DataBindings.Add("SelectedValue", bindSV,
"MaKhoa");
bindSV = new BindingSource(); bindSV.DataSource = dsSV.Tables["sinhvien"]; bindSV.AllowNew = true;
bindNaviSV.BindingSource = bindSV;
93
IV.- TRÌNH BÀY DỮ LIỆU
6.- Ví dụ form danh mục sinh viên (tt)
5.Trên control BindingNavigator, thêm một Button item mới và chỉ định hình ảnh cho item này
6. Button này có chức năng cập nhật các thay đổi dữ liệu trên form, double click vào Button và gõ: bindSV.EndEdit(); adapSV.Update(dsSV, "sinhvien");
94
IV.- TRÌNH BÀY DỮ LIỆU
NỘI DUNG (tt)
1. Mô hình triển khai ứng dụng 2. ADO.NET 3. Lưu trữ và xử lý dữ liệu 4. Trình bày dữ liệu 5. Xây dựng ứng dụng quản lý đặt và
95
bán hàng 6. Crystal Report 7. Bảo mật trong ứng dụng
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3. Thiết kế xử lý
1. Thiết kế dữ liệu (cid:223) Mô tả ứng dụng (cid:223) Tables
(cid:223) Views (cid:223) Stored Procedures (cid:223) Triggers
2. Thiết kế giao
4. Xây dựng ứng dụng (cid:223) Quy hoạch DataSet (cid:223) Cài đặt giao diện
diện (cid:223) Main (cid:223) Danh mục (cid:223) Master / Detail (cid:223) Báo biểu
96
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
a/- Mô tả ứng dụng
LoaiHH
HangHoa
(1,n)
(1,1)
thuộc
(0,n)
(0,n)
KhachHang
(0,n)
(0,n)
gồm
gồm
lập
lập
(1,n)
(1,n)
(1,n)
(1,1)
(1,1)
DonDatHang
HoaDon
(1,1)
(1,1)
NhanVien
(0,n)
lập do
lập do
97
1.- Thiết kế dữ liệu
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
b/- Tables
CHITIETDDH
MAHH = MAHH
LOAIHH
SODDH MAHH SOLUONG
Nvarchar(10) Nvarchar(10) integer
MALOAI TENLOAI
Nvarchar(10) Nvarchar(10)
KHACHHANG
SODDH = SODDH
MAHH = MALOAI
MAKH = MAKH
MAKH TENKH DIACHI DIENTHOAI FAX
Nvarchar(10) Nvarchar(50) Nvarchar(50) Nvarchar(15) Nvarchar(15)
DDH
HANGHOA
MANV = MANV
SODDH NGAYDH NGAYGH TONGTIEN MAKH MANV
Nvarchar(10) timestamp timestamp float Nvarchar(10) Nvarchar(10)
MAHH TENHH MOTA THOIGIANBH DVT DONGIA MALOAI
Nvarchar(10) Nvarchar(50) Nvarchar(100) timestamp Nvarchar(10) float Nvarchar(10)
SODDH = SODDH
CHITIETHD
HOADON
NHANVIEN
SOHD = SOHD
MANV = MANV
SOHD MAHH SOLUONG
Nvarchar(10) Nvarchar(10) integer
98
MANV TENNV DIACHI DIENTHOAI
Nvarchar(10) Nvarchar(50) Nvarchar(50) Nvarchar(15)
SOHD NGAYHD TONGTIEN SODDH MANV
Nvarchar(10) timestamp float Nvarchar(10) Nvarchar(10)
1.- Thiết kế dữ liệu
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
1. Màn hình chính được thiết kế
dạng MDI có hệ thống trình đơn gọi các giao diện
2. Hệ thống trình đơn:
(cid:223) Ứng dụng
(cid:223) Đặt hàng
(cid:122) Lập đơn đặt
(cid:122) Đăng nhập (cid:122) Đăng xuất (cid:122) Thoát (cid:223) Danh mục
hàng (cid:122) Báo cáo (cid:223) Hóa đơn
(cid:122) Loại hàng hóa (cid:122) Hàng hóa (cid:122) Khách hàng (cid:122) Nhân viên
(cid:122) Lập hóa đơn (cid:122) Báo cáo
99
2.- Thiết kế giao diện a/– Main
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
b/–Danh mục
1. Các giao diện cho cập nhật danh mục được thiết kế cho
phép xem và chỉnh sửa theo cả 2 dạng
2.- Thiết kế giao diện
100
(cid:223) Grid (xem và chỉnh sửa tổng thể) (cid:223) Columnar (xem và chỉnh sửa chi tiết)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
2.- Thiết kế giao diện
c/– Master/Detail
1. Hai chức năng: đơn đặt hàng và hóa đơn
sẽ được thiết kế giao diện dạng Master/Detail
101
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
d/–Báo biểu
1. Báo biểu thống kê cho các đơn đặt hàng
/ hóa đơn từ ngày … đến ngày …
102
2.- Thiết kế giao diện
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
a/– View
1. Khi trình bày dữ liệu trên form, ta nên tạo ra các View đối với các ComboBox muốn hiển thị nhiều field (cid:223) Thông tin hàng hóa hiển thị
trong các ComboBox nên là Mã hàng hóa, Tên hàng hóa kết hợp với đơn vị tính
2. Tạo các View cho các báo biểu không
cần tham số đầu vào
103
2.- Thiết kế xử lý
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
2.- Thiết kế xử lý
b/– Stored Procedures
1. Tạo các stored procedure phục vụ cho
các mục tiêu sau: (cid:223) Các xử lý, tính toán phức tạp trên form (cid:223) Cập nhật các giá trị được tính toán liên quan
hệ, liên thuộc tính
(cid:223) Truy vấn các giá trị tính toán bổ sung không
thuộc phạm vi dữ liệu trên form (cid:223) Các báo biểu cần tham số đầu vào
104
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
c/–Triggers
1.
Liệt kê và cài đặt tất cả các ràng buộc toàn vẹn cho dữ liệu
(cid:223)
(cid:223)
(cid:223)
(cid:223)
(cid:223)
(cid:223)
Số lượng của một mặt hàng được đặt trong một đơn đặt hàng phải ≥ số lượng đã bán của mặt hàng này trong các hóa đơn của đơn đặt hàng đó Tổng tiền của một đơn đặt hàng phải bằng tổng số tiền của các mặt hàng trong đơn đặt hàng đó Các mặt hàng trong một hóa đơn phải thuộc một trong các mặt hàng đã được đặt hàng trong đơn đặt hàng tương ứng Số lượng của một mặt hàng trong một hóa đơn không được vượt quá số lượng đã đặt của mặt hàng này Tổng tiền của một hóa đơn phải bằng tổng số tiền của các mặt hàng trong hóa đơn đó Ngày lập hóa đơn không thể trước ngày đặt hàng
2. Chú ý: tránh cài đặt trùng lặp các chức năng đã được xử
lý trong stored procedure
105
2.- Thiết kế xử lý
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
a/–Quy hoạch DataSet
1. Nguồn cung cấp dữ liệu cho một form nên được quản lý gói gọn trong một DataSet 2. Dựa vào phần thiết kế giao diện, ta cần xác định những dữ liệu nào cần thiết (cid:223) Tạo DataAdapter và CommandBuilder cho các
dữ liệu có cập nhật
(cid:223) Tạo DataAdapter cho các dữ liệu tham chiếu 3. Fill các DataAdapter này vào một DataSet
106
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện
107
1. Dữ liệu cần cho form: Table LoaiHH 2. Dữ liệu được cập nhật: LoaiHH 3. DataSet cho form danh mục loại hàng hóa: dsLoaiHH
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
4. Bổ sung form mới vào
project, frmDMLoaiHH 5. Thêm TabControl vào form,
(cid:223)
(cid:223)
đặt tên là TabLoaiHangHoa TabPage1: (cid:122) Name: tabPageLoaiHHAll (cid:122) Text: Tất cả TabPage2: (cid:122) Name:
tabPageLoaiHHDetail
(cid:122) Text: Chi tiết
108
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
tabPageLoaiHHAll, DataGridView,
6. Trong thêm dgrLoaiHH
7. Trong tabPageLoaiHHDetail, thêm 2 Label, 2 TextBox. 8. Đặt tên cho 2 TextBox tương field
tên
với
ứng (txtMaLoaiHH, txtTenLoaiHH)
109
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
9. Đặt control BindingNavigator vào form, tên
bindNaviLoaiHH
10. Bổ sung 1 Button, 1 Label và 1 TextBox
(txtFilter) vào trên control này
Update Button
Label
txtFilter
110
Click để thêm control mới
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
11. Khai báo thư viện SQL
using System.Data.SqlClient; 12. Khai báo các biến thành viên
private String connStr = "Data Source=(local);Initial
Catalog=qlbh;Integrated Security=True“;
// kết nối CSDL
private SqlConnection dbConn private SqlDataAdapter adapLoaiHH private DataSet dsLoaiHH; // chứa dữ liệu cho form private BindingSource bindLoaiHH;// di chuyển trên dữ liệu
111
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void frmHangHoa_Load(object sender, EventArgs e) {
try {
dbConn = new SqlConnection(connStr); dbConn.Open();
adapLoaiHH = new SqlDataAdapter("select * from loaihh", dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapLoaiHH); dsLoaiHH = new DataSet(); adapLoaiHH.Fill(dsLoaiHH, "LoaiHH"); bindHH = new BindingSource(); bindHH.DataSource = dsLoaiHH; bindHH.DataMember = “LoaiHH“;
BindingControls(); } catch (SqlException ex) {
MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
112
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
dgrLoaiHH.DataSource = bindHH; FormatDataGridView(); // định dạng và điều chỉnh cột cho DataGridView
txtMaLoaiHH.DataBindings.Add("Text", bindLoaiHH, "MaLoai"); txtTenLoaiHH.DataBindings.Add("Text", bindLoaiHH, "TenLoai");
bindNaviLoaiHH.BindingSource = bindLoaiHH;
private void BindingControls() {
dgrLoaiHH.Columns[0].HeaderText = "Mã loại hàng hóa“; dgrLoaiHH.Columns[1].HeaderText = "Tên loại hàng hóa“;
113
} private void FormatDataGridView() {
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void tsbtnUpdate_Click(object sender, EventArgs e) {
try {
if (dgrLoaiHH.Focused = false) bindLoaiHH.EndEdit(); adapLoaiHH.Update(dsLoaiHH, “LoaiHH");
} Catch (SqlException ex) {
MessageBox.Show(ex.Message, "Lỗi",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
114
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
13. Dữ liệu cần cho form: Table HangHoa, LoaiHH 14. Dữ liệu được cập nhật: HangHoa 15. DataSet cho form danh mục hàng hóa: dsHH
115
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
16. Bổ sung form mới vào project, frmDMHH
17. Thêm TabControl vào form, đặt tên là TabHangHoa (cid:223) TabPage1:
(cid:122) Name: tabPageHHAll (cid:122) Text: Tất cả (cid:223) TabPage2:
(cid:122) Name: tabPageHHDetail (cid:122) Text: Chi tiết
116
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
17. Trong tabPageHHAll, thêm DataGridView, dgrHH 18. Trong tabPageHHDetail, thêm 7 Label, 6 TextBox và 1 ComboBox. 19. Đặt tên cho 6 TextBox
tương ứng với tên field (txtMaHH, txtTenHH, ...) 20. Đặt tên cho ComboBox là
cboLoaiHH
117
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
21. Đặt control BindingNavigator vào form, tên
bindNaviHH
22. Bổ sung 1 Button, 1 Label và 1 TextBox
(txtFilter) vào trên control này
Update Button
Label
txtFilter
118
Click để thêm control mới
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
23. Khai báo thư viện SQL
using System.Data.SqlClient; 24. Khai báo các biến thành viên
private String connStr = "Data Source=(local);Initial
Catalog=qlbh;Integrated Security=True“;
// kết nối CSDL // HangHoa DataAdapter
// DataSet chứa dữ liệu cho form
private SqlConnection dbConn; private SqlDataAdapter adapHH; private SqlDataAdapter adapLoaiHH; private DataSet dsHH; private BindingSource bindHH;
// di chuyển trên dữ liệu
119
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void frmHangHoa_Load(object sender, EventArgs e) {
try {
dbConn = new SqlConnection(connStr); dbConn.Open();
adapHH = new SqlDataAdapter("select * from hanghoa", dbConn); adapLoaiHH = new SqlDataAdapter("select * from loaihh", dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapHH); dsHH = new DataSet(); adapHH.Fill(dsHH, "HangHoa"); adapLoaiHH.Fill(dsHH, "LoaiHH"); bindHH = new BindingSource(); bindHH.DataSource = dsHH; bindHH.DataMember = "HangHoa“;
BindingControls(); } catch (SqlException ex) {
MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
120
}
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void BindingControls() {
dgrHH.DataSource = bindHH; FormatDataGridView();// định dạng và điều chỉnh cột cho DataGridView
txtMaHH.DataBindings.Add("Text", bindHH, "MaHH"); txtTenHH.DataBindings.Add("Text", bindHH, "TenHH"); txtMoTa.DataBindings.Add("Text", bindHH, "MoTa"); txtTGBH.DataBindings.Add("Text", bindHH, "ThoiGianBH"); txtDVT.DataBindings.Add("Text", bindHH, "DVT"); txtDG.DataBindings.Add("Text", bindHH, "DonGia"); cboLoaiHH.DataBindings.Add("SelectedValue", bindHH, "MaLoai"); cboLoaiHH.DataSource = dsHH.Tables["LoaiHH“]; cboLoaiHH.DisplayMember = "TenLoai“; cboLoaiHH.ValueMember = "MaLoai“;
121
bindNaviHangHoa.BindingSource = bindHH;
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
dgrHH.Columns[0].HeaderText = "Mã hàng hóa“; dgrHH.Columns[1].HeaderText = "Tên hàng hóa“; dgrHH.Columns[2].HeaderText = "Mô tả“; dgrHH.Columns[3].HeaderText = "Thời gian bảo hành“; dgrHH.Columns[4].HeaderText = "Đơn vị tính“; dgrHH.Columns[5].HeaderText = "Đơn giá“; // Loại bỏ cột loại hàng hóa cũ và thay bằng ComboBox dgrHH.Columns.RemoveAt(6); DataGridViewComboBoxColumn dgrcolLoaiHH=new
DataGridViewComboBoxColumn(); dgrcolLoaiHH.HeaderText = "Loại hàng hóa“; dgrcolLoaiHH.DataPropertyName = "MaLoai“; // Field cập nhật của table
HangHoa
dgrcolLoaiHH.DataSource = dsHH.Tables["LoaiHH“]; dgrcolLoaiHH.DisplayMember = "TenLoai“; dgrcolLoaiHH.ValueMember = "MaLoai“; dgrcolLoaiHH.Name = "MaLoai“; dgrHH.Columns.Add(dgrcolLoaiHH);
//Thêm cột mới
122
private void FormatDataGridView() {
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void tsbtnUpdate_Click(object sender,
EventArgs e)
{
try {
if (dgrHH.Focused = false) bindHH.EndEdit(); adapHH.Update(dsHH, "HangHoa");
} catch (SqlException ex) {
MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK,
MessageBoxIcon.Error)
}
}
123
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
25. Dữ liệu cần cho form: Table DDH, CTDDH, NhanVien, KhachHang,
124
HangHoa
26. Dữ liệu được cập nhật: DDH, CTDDH 27. DataSet cho form đặt hàng: dsDatHang
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
28. Bổ sung form mới vào project, frmDatHang 29. Thêm 2 DataGridView (dgrDDH, dgrCTDDH) vào form
125
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
30. Đặt control BindingNavigator vào form, tên
bindNaviDDH
31. Bổ sung 1 Button, 1 Label và 1 TextBox
(txtFilter) vào trên control này
Update Button
Label
txtFilter
126
Click để thêm control mới
b/– Xây dựng giao diện (tt)
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
32. Khai báo thư viện SQL
b/– Xây dựng giao diện (tt)
using System.Data.SqlClient; 33. Khai báo các biến thành viên
private String connStr = "Data Source=(local);Initial Catalog=qlbh;Integrated Security=True“;
// kết nối CSDL
127
private SqlConnection dbConn; private SqlDataAdapter adapDDH; private SqlDataAdapter adapCTDDH; private SqlDataAdapter adapKH; private SqlDataAdapter adapNV; private SqlDataAdapter adapHH; private DataSet dsDatHang; private BindingSource bindDDH; private BindingSource bindCTDDH; private DataRelation relDDH; // Tạo quan hệ Master / Detail
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void frmDatHang_Load(object sender, EventArgs e) {
try {
dbConn = new SqlConnection(connStr); dbConn.Open();
adapDDH = new SqlDataAdapter("select * from DDH", dbConn); adapCTDDH = new SqlDataAdapter("select * from CTDDH", dbConn); adapKH = new SqlDataAdapter("select MaKH, TenKH from KhachHang", dbConn); adapNV = new SqlDataAdapter("select MaNV, TenNV from NhanVien", dbConn); adapHH = new SqlDataAdapter("select MaHH, MoTaHH from vHangHoa", dbConn); SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(adapDDH); cmdBuilder = new SqlCommandBuilder(adapCTDDH); dsDatHang = new DataSet();
adapDDH.Fill(dsDatHang, "DDH"); adapCTDDH.Fill(dsDatHang, "CTDDH"); adapKH.Fill(dsDatHang, "KhachHang"); adapNV.Fill(dsDatHang, "NhanVien"); adapHH.Fill(dsDatHang, "HangHoa");
128
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
relDDH = new DataRelation("relDDH",
dsDatHang.Tables["DDH“].Columns["SoDDH“], dsDatHang.Tables["CTDDH“].Columns["SoDDH“]);
dsDatHang.Relations.Add(relDDH);
bindDDH = new BindingSource(); bindDDH.DataSource = dsDatHang; bindDDH.DataMember = "DDH“; bindCTDDH = new BindingSource(); bindCTDDH.DataSource = bindDDH; bindCTDDH.DataMember = "relDDH“;
dgrDDH.DataSource = bindDDH; dgrCTDDH.DataSource = bindCTDDH;
b/– Xây dựng giao diện (tt)
FormatDataGrid();
bindNaviDDH.BindingSource = bindDDH;
} catch (SqlException ex) {
MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error)
129
}
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void FormatDataGrid() { DataGridViewComboBoxColumn dgrcolKH,
dgrcolNV, dgrcolHH;
dgrcolKH = new
DataGridViewComboBoxColumn();
dgrcolKH.DataPropertyName = "MaKH“; dgrcolKH.DataSource =
dgrDDH.Columns["SoDDH“].HeaderText = "Số ĐĐH“; dgrDDH.Columns["NgayDH“].HeaderText = "Ngày ĐH“; dgrDDH.Columns["NgayGH“].HeaderText = "Ngày GH“; dgrDDH.Columns["TongTien“].HeaderText = "Tổng tiền“; dgrDDH.Columns.Remove("MaKH"); dgrDDH.Columns.Remove("MaNV"); dgrDDH.Columns.Add(dgrcolKH); dgrDDH.Columns.Add(dgrcolNV);
dsDatHang.Tables["KhachHang“];
dgrcolKH.DisplayMember = "TenKH“; dgrcolKH.ValueMember = "MaKH“; dgrcolKH.HeaderText = "Khách hàng“;
dgrcolHH = new DataGridViewComboBoxColumn(); dgrcolHH.DataPropertyName = "MaHH“; dgrcolHH.DataSource =
dgrcolNV = new
dsDatHang.Tables["HangHoa“];
DataGridViewComboBoxColumn();
dgrcolNV.DataPropertyName = "MaNV“; dgrcolNV.DataSource =
dgrcolHH.DisplayMember = "MoTaHH“; dgrcolHH.ValueMember = "MaHH“; dgrcolHH.HeaderText = "Hàng hóa“;
dsDatHang.Tables["NhanVien“];
dgrcolNV.DisplayMember = "TenNV“; dgrcolNV.ValueMember = "MaNV“; dgrcolNV.HeaderText = "Nhân viên“;
dgrCTDDH.Columns["SoDDH“].Visible = false; dgrCTDDH.Columns.Remove("MaHH"); dgrCTDDH.Columns.Insert(1, dgrcolHH); dgrCTDDH.Columns["SL“].HeaderText = "Số lượng“;
130
}
V.- XÂY DỰNG ỨNG DỤNG QUẢN LÝ BÁN HÀNG
3.- Xây dựng ứng dụng
b/– Xây dựng giao diện (tt)
private void tsbtnUpdate_Click(object sender,
EventArgs e) try {
adapDDH.Update(dsDatHang, "ddh"); adapCTDDH.Update(dsDatHang, "ctddh");
} catch (SqlException ex) {
MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK,
MessageBoxIcon.Error)
}
}
131
NỘI DUNG (tt)
1. Mô hình triển khai ứng dụng 2. ADO.NET 3. Lưu trữ và xử lý dữ liệu 4. Trình bày dữ liệu 5. Xây dựng ứng dụng quản lý đặt và
bán hàng
132
6. Crystal Report 7. Bảo mật trong ứng dụng
VI.- Crystal Report
3. Trình bày và in báo
(cid:223)
biểu (cid:223) Phân loại báo biểu (cid:223) Xem báo biểu trước
1. Tạo báo biểu 2. Tùy biến báo biểu Tùy biến môi trường thiết kế Tùy biến các control
(cid:223)
khi in In báo biểu trực tiếp 4. Báo biểu có tham số
(cid:223) (cid:223) Các loại control (cid:223) Sắp xếp (cid:223) Gom nhóm
133
VI.-Crystal Report
1.– Tạo báo biểu
1. Phần này hướng dẫn từng bước cách tạo một báo biểu cho danh mục hàng hóa được trình bày theo từng loại hàng hóa
2. Tạo nguồn dữ liệu cho báo biểu:
CREATE STORED PROCEDURE sp_rptDMHH AS BEGIN
SELECT MaHH, TenHH, MoTa, DVT, DonGia, TenLoai FROM HangHoa hh, LoaiHH loai WHERE hh.MaLoai = loai.MaLoai
END
134
VI.-Crystal Report
1.– Tạo báo biểu (tt)
3. Chọn Project / Add New Item, sau đó chọn Crystal Report.
Đặt tên cho báo biểu là rptDMHH
135
VI.-Crystal Report
1.– Tạo báo biểu (tt)
4. Chọn Using the Report Expert, Standard
136
VI.-Crystal Report
1.– Tạo báo biểu (tt)
5. Chọn Create
New Connection. Click dấu + bên trái OLEDB (ADO), hộp thoại ở slide sau xuất hiện.
137
VI.-Crystal Report
1.– Tạo báo biểu (tt)
6. Chọn như trong hình để tạo kết nối OLEDB đến CSDL SQL Server
7. Next
138
VI.-Crystal Report
1.– Tạo báo biểu (tt)
8. Điền tên của SQL Server, User ID, Password
9. Chọn CSDL qlbh 10. Next 11. Finish
139
VI.-Crystal Report
1.– Tạo báo biểu (tt)
140
12. Chọn kết nối vừa tạo và chọn tiếp sp_DMHH 13. Click “>” để ấn định nguồn dữ liệu
VI.-Crystal Report
1.– Tạo báo biểu (tt)
141
14. Click “>>” để chọn toàn bộ field sẽ được trình bàu trong báo biểu 15. Next
Crystal Report – Tạo báo biểu
16. Chọn
TenLoai rồi click “>” để ấn định báo biểu sẽ được trình bày gom nhóm theo TenLoai
17. Next
142
VI.-Crystal Report
1.– Tạo báo biểu (tt)
Click chọn, rồi click “<“ để không tính tổng theo ThoiGianBH
Click chọn, rồi click vào ô Sum ở dưới, chọn lại là Count để dếm số lượng mặt hàng của một loại
143
VI.-Crystal Report
1.– Tạo báo biểu (tt)
18. Giữ
nguyên phần mặc định
19. Next
144
VI.-Crystal Report
1.– Tạo báo biểu (tt)
20. Giữ
nguyên phần mặc định
21. Next
145
VI.-Crystal Report
1.– Tạo báo biểu (tt)
22. Giữ nguyên
phần mặc định 23. Next
146
VI.-Crystal Report
1.– Tạo báo biểu (tt)
24. Chọn
kiểu trình bày báo biểu 25. Finish
147
VI.-Crystal Report
1.– Tạo báo biểu (tt)
26. Báo biểu vừa tạo ra sẽ mặc định ở chế độ Design cho phép chỉnh sửa
148
VI.-Crystal Report
1.– Tạo báo biểu (tt)
27. Click Main Report Preview để xem trước
kết quả
149
Crystal Report
3. Trình bày và in báo
(cid:223)
biểu (cid:223) Phân loại báo biểu (cid:223) Xem báo biểu trước
1. Tạo báo biểu 2. Tùy biến báo biểu Tùy biến môi trường thiết kế Tùy biến các control
(cid:223)
khi in In báo biểu trực tiếp 4. Báo biểu có tham số
(cid:223) (cid:223) Các loại control (cid:223) Sắp xếp (cid:223) Gom nhóm
150
VI.-Crystal Report
2.– Tuỳ biến báo biểu
a/- Tùy biến môi trường thiết kế
1. Đây là môi trường chúng ta làm việc nhiều nhất trong quá trình tạo báo biểu, bao gồm điều chỉnh vị trí, thêm mới, xóa các control
2. Một số thiết lập ta cần quan tâm:
(cid:223) Default Settings (cid:223) Page Setup
151
VI.-Crystal Report
2.– Tuỳ biến báo biểu
a/- Tùy biến môi trường thiết kế (tt)
152
3. Default Settings: vào Click phải vùng xám trên chọn Report, (cid:198) Design Default Settings 4. Nên chọn Show Grid và Snap to Grid để dễ điều chỉnh vị trí các control
VI.-Crystal Report
153
2.– Tuỳ biến báo biểu
a/- Tùy biến môi trường thiết kế (tt) 5. Default Settings: Click phải vào vùng xám trên Report, chọn Design (cid:198) Default Settings 6. Chọn dạng hiển thị cho các control tùy theo kiểu dữ liệu của field
VI.-Crystal Report
2.– Tuỳ biến báo biểu
a/- Tùy biến môi trường thiết kế (tt)
154
VI.-Crystal Report
2.– Tuỳ biến báo biểu
a/- Tùy biến môi trường thiết kế (tt)
7. Page Setup: Click phải vào vùng xám trên Report, chọn Design (cid:198) Page Setup 8. Cỡ giấy tùy theo máy in (Printer Setup)
155
VI.-Crystal Report
2.– Tuỳ biến báo biểu
b/- Tùy biến các control
1. Các control thông thường có thể thêm vào Report bằng cách chọn chúng trên ToolBox hoặc copy và paste control có sẵn
2. Click chọn nhiều control bằng cách giữ
thêm phím Ctrl hoặc Shift
3. Có thể điều chỉnh kích thước cho 1
hoặc nhiều control cùng lúc
4. Gióng thẳng hàng dọc hoặc ngang các
control thông qua menu Align
156
VI.-Crystal Report
2.– Tuỳ biến báo biểu
b/- Tùy biến các control (tt)
5. Định dạng trình bày cho một hoặc nhiều control (chỉ có thể chọn các control tương lên chúng và thích) bằng cách click phải chọn Format Object
157
6. Tùy theo kiểu dữ liệu được ấn định cho control, Crystal Report sẽ hiển thị hộp thoại Format tương ứng. Hộp thoại này là một trong các hộp thoại tương ứng với các kiểu dữ liệu được trình bày trong slide 151
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control
field
1. Text control: dùng hiển thị các văn bản trong thường (Label), các thông CSDL hoặc các công thức tính toán, ... 2. Field control: thực chất là 1 Text control tương ứng với 1 field trong nguồn dữ liệu 3. Line, Box control: vẽ các đường thẳng hoặc HCN phân định các vùng dữ liệu trong report. Có thể thay đổi màu, độ rộng và kiểu đường kẻ. Box control có thể hiển thị dạng Ellipse hoặc Rounding
158
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
4. Picture: Click phải / Insert / Picture để
thêm control này vào report 5. Chart: Click phải / Insert / Chart 6. OLE: Click phải / Insert / OLE Object.
Nhúng các tài liệu Word, Excel, ...
7. Hyperlink: liên kết đến 1 trang web hay
sub report
159
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
8. Insert / Special Field:
(cid:223) DataDate: ngày cuối cùng cập nhật report (cid:223) DateTime: giờ cuối cùng cập nhật report (cid:223) FileAuthor: thông tin tác giả (cid:223) FileCreationDate: ngày tạo report (cid:223) Filename: tên file report (cid:223) GroupNumber: Nhóm số hiện tại (cid:223) ModificationDate: ngày chỉnh sửa cuối cùng (cid:223) ModificationTime: giờ chỉnh sửa cuối cùng
160
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
9. Insert / Special Field:
161
(cid:223) PageNofM: In dạng “Page N of M” (cid:223) PageNumber: số trang hiện tại (cid:223) PrintDate: ngày in report (cid:223) PrintTime: giờ in report (cid:223) RecordNumber: số record hiện tại (cid:223) RecordSelection: cách chọn record được in (cid:223) ReportComments: ghi chú của report (cid:223) ReportTitle: tiêu đề của report (cid:223) TotalPageCount: tổng số trang
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
Vùng ẩn (suppress), không được in ra. Click phải vào Section1, chọn Don’t Suppress để in phần này
Special control
Text control
Field control
162
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
10. Điều chỉnh report:
1. Thêm Text control vào ReportHeader, thuộc tính Text=DANH MỤC HÀNG HÓA, đổ bóng, border nét đôi, màu chữ SeaGreen, canh giữa, kích thước bằng chiều rộng report
2. Di chuyển TenLoai trong PageHeader xuống GroupHeader và gõ nội dung “Loại hàng hóa”, di chuyển TenLoai trong Detail lên GroupHeader. Font chữ kích thước 14, đậm, nghiêng
3. Đổi nội dung
tất cả Text control
trong PageHeader thành tiếng việt có dấu, kích thước 12 và di chuyển xuống GroupHeader
163
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
1. Điều chỉnh report (tt):
4. Điều chỉnh hình chữ nhật bao trọn phần Detail và các đường thẳng dọc cùng các Text control trong Detail sao cho ngay ngắn với phần GroupHeader
5. Thêm Text control “Số lượng mặt hàng” vào
GroupFooter có định dạng giống “Loại hàng hóa” trong GroupHeader.
6. Xóa control trong ReportFooter. 7. Rút gọn tối thiểu PageHeader và ReportFooter 8. Kết quả cuối cùng như sau
164
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
165
VI.-Crystal Report
2.– Tuỳ biến báo biểu
c/- Các loại control (tt)
166
VI.-Crystal Report
2.– Tuỳ biến báo biểu
d/- Sắp xếp
1. Ngoài việc chỉnh định sắp xếp dữ liệu từ trong CSDL, Crystal Report cũng cho phép sắp xếp thông qua chức năng Record Sort Expert
2. Click phải / Report / Record Sort Expert 3. Nguyên tắc sắp xếp theo thứ tự từ trên xuống, field trên cùng sắp trước, nếu trùng sẽ sắp đến field phía dưới
167
VI.-Crystal Report
2.– Tuỳ biến báo biểu
d/- Sắp xếp
Chọn field sắp xếp
Giảm dần, đã chọn lúc tạo report
Hủy field sắp xếp
Điều chỉnh thứ tự sắp xếp
Giảm dần
Tăng dần
168
VI.-Crystal Report
2.– Tuỳ biến báo biểu
e/- Gom nhóm
1. Ngoài việc gom nhóm ngay khi tạo report, ta có thể điều chỉnh gom nhóm trong lúc thiết kế report
2. Click phải / Report / Group Expert
169
VI.-Crystal Report
2.– Tuỳ biến báo biểu
e/- Gom nhóm (tt)
1. Bổ sung gom nhóm theo DVT như hình vẽ 2. Di chuyển “Đơn vị tính” từ GroupHeader TenLoai
xuống GroupHeader DVT
3. Di chuyển “DVT” từ Detail lên GroupHeader DVT 4. Điều chỉnh font chữ và các định dạng khác cho 2
control này theo ý thích
5. Di chuyển các Text control từ GroupHeader
TenLoai xuống GroupHeader DVT
6. Điều chỉnh phần GroupHeader TenLoai và Detail
170
VI.-Crystal Report
2.– Tuỳ biến báo biểu
e/- Gom nhóm (tt)
171
VI.-Crystal Report
2.– Tuỳ biến báo biểu
e/- Gom nhóm (tt)
172
Crystal Report
3. Trình bày và in báo
(cid:223)
biểu (cid:223) Phân loại báo biểu (cid:223) Xem báo biểu trước
1. Tạo báo biểu 2. Tùy biến báo biểu Tùy biến môi trường thiết kế Tùy biến các control
(cid:223)
khi in In báo biểu trực tiếp 4. Báo biểu có tham số
(cid:223) (cid:223) Các loại control (cid:223) Sắp xếp (cid:223) Gom nhóm
173
VI.-Crystal Report
3.– Trình bày và in báo biều
a/- Phân loại báo biểu
1. Báo biểu định kiểu (Strongly-Typed)
(cid:223) Khi 1 báo biểu được tạo ra, .NET tự động tạo 1 lớp báo biểu (Report Class) cho riêng báo biểu này trong project hiện hành
(cid:223) Lớp này được sử dụng bình thường như các
lớp .NET khác
(cid:223) Được biên dịch và kết hợp trực tiếp vào file
thực thi của ứng dụng
174
VI.-Crystal Report
3.– Trình bày và in báo biều
a/- Phân loại báo biểu
2. Báo biểu phi định kiểu (Untyped)
(cid:223) Mỗi báo biểu được tạo ra sẽ được lưu thêm trong 1 file .rpt riêng biệt, độc lập với project (cid:223) File .rpt có thể được chép sang và sử dụng
trong 1 project khác thông qua tên file của nó (cid:223) Báo biểu được sử dụng bởi tên file thay vì tên
lớp là báo biểu phi định kiểu
175
VI.-Crystal Report
3.– Trình bày và in báo biều
b/- Xem báo biểu trước khi in
1. Bổ sung 1 form mới vào project và đặt
tên là frmInDMHH
2. Trong ToolBox, phần CrystalReport,
chọn đưa control CrystalReportViewer vào form, đặt tên là rptViewerDMHH
(cid:223)
3. Trong sự kiện Load của form, gõ: rptViewerDMHH.ReportSource = new rptDMHH();
176
VI.-Crystal Report
3.– Trình bày và in báo biều
b/- Xem báo biểu trước khi in (tt)
1. Trong form frmHangHoa, bổ sung 1
button trên BindingNavigator và viết các lệnh sau cho sự kiện click của button này: (cid:223) (cid:223)
frmInDMHH frm = new frmInDMHH(); frm.Show();
177
VI.-Crystal Report
3.– Trình bày và in báo biều
b/- Xem báo biểu trước khi in (tt)
1. Mỗi lần gọi hiển thị report, ứng dụng đều yêu cầu đăng nhập lại CSDL. Để tránh điều này, ta cần ấn định thông tin đăng nhập trước khi hiển thị report
(cid:223) (cid:223)
(cid:223)
2. Điều chỉnh thông tin đăng nhập CSDL rptDMHH rpt = new rptDMHH(); rpt.SetDatabaseLogon("sa", “…", "nghiatran-pc", "qlbh"); rptViewerDMHH.ReportSource = rpt;
178
VI.-Crystal Report
3.– Trình bày và in báo biều
c/- In báo biểu trực tiếp
1. Bổ sung 1 button trên BindingNavigator và viết các lệnh sau cho sự kiện click của button này: (cid:223) (cid:223)
(cid:223)
rptDSSV rpt = new rptDSSV(); rpt.SetDatabaseLogon("sa", “...", "nghiatran- pc", "qlbh"); rpt.PrintToPrinter(1, False, 0, 0);
179
VI.-Crystal Report
4. Báo biểu có tham số
1. Trong form frmDatHang, chọn lệnh In để in đơn đặt hàng
hiện hành 2. Nguồn dữ liệu
CREATE PROCEDURE sp_In_DDH
@SoDDH nvarchar(10)
AS BEGIN
SELECT d.SoDDH, NgayDH, NgayGH, kh.MaKH, TenKH, kh.DiaChi,
kh.DienThoai, kh.Fax, nv.TenNV, TenHH, SL, DonGia, 'ThanhTien'=SL*DonGia
FROM DDH d, CTDDH ctd, KhachHang kh, NhanVien nv, HangHoa
hh WHERE and and d.SoDDH = @SoDDH and d.SoDDH = ctd.SoDDH d.MaKH = kh.MaKH and d.MaNV = nv.MaNV ctd.MaHH = hh.MaHH
180
END
VI.-Crystal Report
4. Báo biểu có tham số (tt)
3. Thiết kế report theo mẫu sau:
181
VI.-Crystal Report
4. Báo biểu có tham số (tt)
4. Tạo form frmInDonDatHang để xem trước báo biểu vừa tạo, gõ lệnh sau vào sự kiện Form_Load (cid:223) (cid:223)
(cid:223) (cid:223)
rptDonDatHang rpt = new rptDonDatHang(); rpt.SetDatabaseLogon("sa", “...", "nghiatran-pc", "qlbh"); rpt.SetParameterValue("@SoDDH", _SoDDH); rptViewerDDH.ReportSource = rpt;
182
VI.-Crystal Report
4. Báo biểu có tham số (tt)
5. Do báo biểu nhận dữ liệu từ stored procedure có tham số là SoDDH, ta cần chuyển giá trị SoDDH hiện hành trên DataGridView cho frmInDonDatHang để form này gán giá trị cho tham số: rpt.SetParameterValue("@SoDDH", _SoDDH) 6. Trong frmInDonDatHang, ta xây dựng thuộc tính sau:
private String _SoDDH; public String SoDDH {
get {
return _SoDDH;
} set {
_SoDDH = value;
183
}
}
VI.-Crystal Report
4. Báo biểu có tham số (tt)
7. Trong form frmDatHang, bổ sung 1 button
vào BindingNavigator và viết lệnh như sau cho sự kiện click: frmInDonDatHang frm = new frmInDonDatHang(); frm.SoDDH =
dgrDDH.CurrentRow.Cells("SoDDH").Value;
frm.Show();
184
VI.-Crystal Report
4. Báo biểu có tham số (tt)
8. Báo
biểu khi in ra có dạng như sau:
185
4. Báo biểu có tham số (tt)
VI.-Crystal Report
9. Trong form frmMain, chọn menu Đặt hàng / Báo biểu để in các đơn đặt
hàng trong khoảng thời gian từ ngày X đến ngày Y gom nhóm theo ngày đặt hàng, đơn đặt hàng, thông tin chi tiết là các hóa đơn của đơn đặt hàng 10. Nguồn dữ liệu
CREATE PROCEDURE sp_In_DDH
@from as datetime, @to as datetime
AS BEGIN
SELECT 'NgayDDH'=cast(day(d.NgayDH) as char(2)) + '/' +
cast(month(NgayDH) as char(2)) + '/' + cast(year(NgayDH) as char(4)), d.SoDDH, d.NgayGH, kh.TenKH, 'NVDDH'=nvddh.TenNV, 'TongTienDDH'=d.TongTien, hd.SoHD, hd.LanGiao, hd.NgayHD, 'NVHD'=nvhd.TenNV, 'TongTienHD'=hd.TongTien
FROM DDH d, HoaDon hd, NhanVien nvddh, KhachHang kh,
186
NhanVien nvhd
WHERE d.SoDDH=hd.SoDDH and d.MaNV=nvddh.MaNV AND d.MaKH=kh.MaKH and hd.MaNV=nvhd.MaNV AND (d.NgayDH between @from and @to)
END
VI.-Crystal Report
4. Báo biểu có tham số (tt)
187
11. Thiết kế report theo mẫu sau:
4. Báo biểu có tham số (tt)
12. Tạo form frmInThongKeDDH để xem trước báo biểu vừa tạo, gõ lệnh sau vào sự kiện Form_Load (cid:223) (cid:223)
(cid:223) (cid:223) (cid:223)
rptThongKeDDH rpt = new rptThongKeDDH(); rpt.SetDatabaseLogon("sa", “...", "nghiatran-pc", "qlbh"); rpt.SetParameterValue("@from", _NgayBD); rpt.SetParameterValue("@to", _NgayKT); rptViewerDDH.ReportSource = rpt;
188
VI.-Crystal Report
4. Báo biểu có tham số (tt)
13. Do báo biểu nhận dữ liệu từ stored procedure có tham số là ngày bắt đầu và ngày kết thúc, ta cần chuyển 2 giá trị này cho frmInDonDatHang để form này gán giá trị cho tham số Trong frmInDonDatHang, ta xây dựng thuộc tính sau:
private Date _NgayBD; public Date NgayBD {
private Date _NgayKT; public Date NgayKT {
get {
get {
return _NgayBD;
return _NgayKT;
} set {
} set {
_NgayBD = value;
_NgayKT = value;
}
}
189
}
}
VI.-Crystal Report
4. Báo biểu có tham số (tt)
VI.-Crystal Report
14. Trong form frmMain, viết lệnh như sau cho sự kiện click trên menu
Đặt Hàng / Báo biểu:
Date bd, kt; String sbd=“1/5/2001”, skt=“31/5/2001”; if (Date.TryParse(sbd, out bd) = false)
MessageBox.Show("Ngày sai", "Lỗi", MessageBoxButtons.OK,
MessageBoxIcon.Error);
else if (Date.TryParse(skt, out kt) = false)
MessageBox.Show("Ngày sai", "Lỗi",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Else {
190
frmInThongKeDDH frm = new frmInThongKeDDH(); frm.NgayBD = bd; frm.NgayKT = kt; frm.Show();
}
4. Báo biểu có tham số (tt)
VI.-Crystal Report
15. Báo
191
biểu khi in ra có dạng như sau:
NỘI DUNG (tt)
I. Mô hình triển khai ứng dụng II. ADO.NET III. Lưu trữ và xử lý dữ liệu IV. Trình bày dữ liệu V. Xây dựng ứng dụng quản lý đặt và
bán hàng VI. Crystal Report VII. Bảo mật trong ứng dụng
192
VII.- BẢO MẬT TRONG ỨNG DỤNG
1. Cung cấp cho người dùng khả năng sử dụng các chức năng trong ứng dụng tùy theo quyền hạn đã được ấn định trong CSDL
2. Ứng dụng khi khởi chạy sẽ làm mờ tất cả
chức năng
3. Sau khi đăng nhập với 1 user (login) hợp lệ,
các chức năng sẽ được phép sử dụng
4. Các lệnh tạo kết nối và truy xuất dữ liệu trong mỗi form sẽ được đặt trong lệnh Try...Catch để xác định người dùng hiện hành có được sử dụng form này hay không
193
5. Chuỗi kết nối CSDL và thông tin về Server, User,
… sẽ được lưu trong Registry
6. Mỗi form hoặc báo biểu khi cần tạo kết nối sẽ lấy
những thông tin cần thiết từ Registry
7. Các thông tin này có thể được mã hóa trước khi lưu vào Registry. Tuy nhiên, để giữ tính đơn giản và dễ nắm bắt cho môn học, công việc này sẽ được bỏ qua
194
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
8. Xây dựng form đăng nhập như sau 9. Đặt UseSystemPassword cho TextBox password là True
10. Khai báo thư viện
using System.Data.SqlClient; using Microsoft.Win32;
195
11. Khai báo biến thành viên private String connStr = "“; private String userRoot = "HKEY_CURRENT_USER“; private String subkey = "QLBanHang”; private String keyName = userRoot + "\" + subkey;
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
12. Viết các lệnh sau trong sự kiện Form_Load
String strServer = Registry.GetValue(keyName, "Server",
"None");
String strUser = Registry.GetValue(keyName, "User",
"None");
if (strServer==null && !strServer.Equals("None“)) {
txtServer.Text = strServer; txtUser.Text = strUser; txtPassword.Focus();
else
txtServer.Focus();
196
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
13. Viết các lệnh sau trong sự kiện Click của Kết nối
if (txtServer.Text.Length == 0 || txtUser.Text.Length == 0) {
MessageBox.Show("Thông tin về ServerName và UserName là bắt buộc", "Lỗi",
MessageBoxButtons.OK, MessageBoxIcon.Hand);
return;
} connStr = "Data Source=" + txtServer.Text + ";Initial Catalog=qlbh;user=" + txtUser.Text + ";pwd=" +
txtPassword.Text;
try {
SqlConnection dbConn = new SqlConnection(connStr); dbConn.Open(); dbConn.Close(); Registry.SetValue(keyName, "ConnectionString", connStr); Registry.SetValue(keyName, "Server", txtServer.Text); Registry.SetValue(keyName, "User", txtUser.Text); Registry.SetValue(keyName, "Password", txtPassword.Text); Me.DialogResult = Windows.Forms.DialogResult.OK; Close();
} catch (ArgumentException err) {
MessageBox.Show(err.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Hand);
} catch (SqlException sqlerr) {
MessageBox.Show(sqlerr.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Hand);
}
197
14. Phần lệnh cho button Hủy bỏ chỉ đơn
giản là thiết lập giá trị trả về của form là Cancel và đóng form lại (cid:223)
this.DialogResult = Windows.Forms.DialogResult.Cancel;
(cid:223) Close();
198
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
15. Trong frmMain, xây dựng 2 hàm sau:
private void MoChucNang() {
DanhMụcToolStripMenuItem.Enabled = true; ĐặthàngToolStripMenuItem.Enabled = true; HóaĐơnToolStripMenuItem.Enabled = true;
}
private void DongChucNang() {
DanhMụcToolStripMenuItem.Enabled = false; ĐặthàngToolStripMenuItem.Enabled = false; HóaĐơnToolStripMenuItem.Enabled = false;
}
199
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
16. Khởi chạy, ứng dụng sẽ làm mờ tất cả chức năng, do đó, trong sự kiện Form_Load của frmMain: (cid:223) DongChucNang();
17. Sự kiện Click của menu Đăng xuất:
(cid:223) DongChucNang();
200
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
18. Sự kiện Click của menu Đăng nhập: frmDangNhap frm = new frmDangNhap(); if (frm.ShowDialog() ==
Windows.Forms.DialogResult.OK) MoChucNang();
}
201
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)
19. Trong sự kiện Form_Load của tất cả các form đã xây dựng, điều chỉnh thông tin kết nối như sau: try {
connStr = Registry.GetValue(
"HKEY_CURRENT_USER\QLBanHang_VB", "ConnectionString", "");
dbConn = new SqlConnection(connStr); dbConn.Open(); ... ‘ Các lệnh khác như cũ
202
VII.- BẢO MẬT TRONG ỨNG DỤNG (tt)

