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

(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 ( ex1) {

Các lệnh xử lý lỗi

} … catch ( exn) {

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:

.DataBindings.Add(“Tên thuộc tính”,

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:

.DataBindings.Add(“Tên thuộc tính”,

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:

.DataBindings.Add(“Tên thuộc

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:

.DataBindings.Add(“Tên thuộc tính”,

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ị:

.DataSource = nguồn dữ liệu .DisplayMember = “field hiển thị” .ValueMember = “field giá trị”

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

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)