81
LẬP TRÌNH CƠ SỞ DỮ LIỆU Lập trình cơ sở dữ liệu là một trong những thế mạnh của C# cho phép dễ dàng tạo ra những phần mềm quản lý chuyên nghiệp, được kết nối tới cơ sở dữ liệu của các hệ quản trị cơ sở dữ liệu cho phép Thêm, Sửa, Xoá, Tìm kiếm và kết xuất dữ liệu với độ chính xác cao, chức năng phong phú và giao diện thân thiện. Trong phần này ta sẽ viết chương trình minh họa việc lập trình cơ sở dữ liệu trong C#. Các bước thực hiện như sau: 1. Giới thiệu bài toán Viết chương trình quản lý cửa hàng Bán hàng lưu niệm, cho phép cập nhập các mặt hàng, viết hoá đơn nhập xuất, tìm kiếm các thông tin, báo cáo tình hình doanh thu… 2. Tạo cơ sở dữ liệu Vào Microsoft Visual Studio 2010 tạo dự án mới có tên là Quanlybanhang và lưu vào thư mục D:\TenSV. Trong dự án ta tạo một số thư mục để lưu các nhóm đối tượng khác nhau. Trước hết ta tạo thư mục Database để lưu CSDL của dự án. Trong cửa sổ Solution Explorer kích chuột phải tại tên dự án, chọn Add, chọn New Folder.

Chuong 7 Lap Trinh CSDL

Embed Size (px)

Citation preview

Page 1: Chuong 7 Lap Trinh CSDL

LẬP TRÌNH CƠ SỞ DỮ LIỆU

Lập trình cơ sở dữ liệu là một trong những thế mạnh của C# cho phép dễ dàng tạo ra những phần mềm quản lý chuyên nghiệp, được kết nối tới cơ sở dữ liệu của các hệ quản trị cơ sở dữ liệu cho phép Thêm, Sửa, Xoá, Tìm kiếm và kết xuất dữ liệu với độ chính xác cao, chức năng phong phú và giao diện thân thiện.

Trong phần này ta sẽ viết chương trình minh họa việc lập trình cơ sở dữ liệu trong C#. Các bước thực hiện như sau:

1. Giới thiệu bài toán

Viết chương trình quản lý cửa hàng Bán hàng lưu niệm, cho phép cập nhập các mặt hàng, viết hoá đơn nhập xuất, tìm kiếm các thông tin, báo cáo tình hình doanh thu…

2. Tạo cơ sở dữ liệu

Vào Microsoft Visual Studio 2010 tạo dự án mới có tên là Quanlybanhang và lưu vào thư mục D:\TenSV. Trong dự án ta tạo một số thư mục để lưu các nhóm đối tượng khác nhau.

Trước hết ta tạo thư mục Database để lưu CSDL của dự án. Trong cửa sổ Solution Explorer kích chuột phải tại tên dự án, chọn Add, chọn New Folder.

Hình 1. Giao diện tạo thư mục mới

Tại cửa sổ Solution Explorer xuất hiện thư mục New Folder1, ta đổi tên thành Database.

Page 2: Chuong 7 Lap Trinh CSDL

Kích chuột phải tại thư mục Database, chọn Add, chọn New Item… hoặc kích chuột chọn thư mục Database rồi vào menu Project chọn Add New Item…

Xuất hiện cửa sổ Add New Item:

Hình 2. Giao diện tạo Database

Chọn Service-based Database (chọn SQL Database nếu là bản Visual Studio Net 2005), tại ô Name đặt tên cho cơ sở dữ liệu là Dulieu.mdf rồi bấm nút Add.

Page 3: Chuong 7 Lap Trinh CSDL

Kết quả xuất hiện hộp hội thoại Data Source Configuration Wizrad:

Hình 3. Data Source Configuration Wizrad bản 2010

Chọn Cancel để tạo một Database mới.

(Đối với bản 2005 chọn 4 kiểu thao tác CSDL như hình sau rồi chọn Finish

Hình 4. Data Source Configuration Wizrad bản 2005)

Kết quả trong thư mục Database xuất hiện đối tượng Dulieu.mdf, kích đúp vào đối tượng này xuất hiện cửa sổ Server Explorer cho phép tạo cơ sở dữ liệu cho dự án.

Page 4: Chuong 7 Lap Trinh CSDL

Hình 5. Giao diện cửa sổ Server Explorer

2.1. Tạo bảng tblChatlieu

Kích chuột phải tại Tables, chọn Add New Table xuất hiện một cửa sổ cho phép tạo một bảng mới. Tạo bảng chất liệu gồm các trường như sau:

Hình 6. Tạo bảng tblChatlieu

Để tạo khóa cho bảng ta kích chuột phải tại dòng Machatlieu chọn Set Primary Key.

Bấm Ctrl+S, trong hộp thoại Choose Name, đặt tên cho bảng là tblChatlieu rồi bấm OK.

2.2. Tạo bảng tblHang

Page 5: Chuong 7 Lap Trinh CSDL

2.3. Tạo bảng tblNhanvien

2.4. Tạo bảng tblKhach

2.5. Tạo bảng tblHDBan

2.6. Tạo bảng tblChitietHDBan

Page 6: Chuong 7 Lap Trinh CSDL

2.7. Tạo quan hệ Relationship

Kích chuột phải tại Database Diagrams chọn Add New Diagram và tạo Relationship như hình dưới đây:

Hình 7. Quan hệ Relationship

2.8. Tạo kết nối cơ sở dữ liệu

Page 7: Chuong 7 Lap Trinh CSDL

Để cập nhật dữ liệu vào các bảng trong CSDL Dulieu.mdf ta thực hiện theo các bước sau:

Bước 1: Xoá bản sao cơ sở dữ liệu Dulieu.mdf trong cửa sổ Solution Explorer. Kích chuột phải tại thư mục Database chọn Exclude From Project (chú ý phải lưu đồ án trước khi thực hiện bước này)

Hình 8. Xoá bản sao cơ sở dữ liệu

Bước 2: Kết nối tới cơ sở dữ liệu Dulieu.mdf trong thư mục D:\TenSV\Quanlybanhang\ Quanlybanhang\Database.

Trong cửa sổ Server Explorer kích chuột phải tại Data Connections chọn Add Connection… xuất hiện hộp thoại Choose Data Source

Page 8: Chuong 7 Lap Trinh CSDL

Trong hộp thoại Choose Data Source chọn Microsoft SQL Server Database File, chọn Continue. Xuất hiện hộp thoại Add Connection:

Hình 9. Kết nối cơ sở dữ liệu Dulieu.mdf

Kích chọn nút Browse, tìm và kích đúp tại tệp Dulieu.mdf (tại D:\TenSV\Quanlybanhang\ Quanlybanhang\Database). Kích chọn nút Test Connection, nếu thành công sẽ xuất hiện hộp thoại sau:

Kích chọn OK/OK. Kết quả tệp dữ liệu Dulieu.mdf đã được kết nối.

Page 9: Chuong 7 Lap Trinh CSDL

3. Tạo thư mục chứa ảnh

Chương trình phải quản lý rất nhiều tệp ảnh như ảnh nền của Form, ảnh minh họa của các mặt hàng… do đó ta tạo một thư mục Images để chứa danh sách các tệp ảnh này. Trong cửa sổ Solution Explorer kích chuột phải tại tên dự án Quanlybanhang, chọn Add, chọn New Folder, đổi tên thư mục mới xuất hiện thành Images.

Kích chuột phải tại thư mục Images, chọn Add, chọn Existing Item… xuất hiện cửa sổ Add Existing Item, tìm đường dẫn đến các tệp ảnh của chương trình và chọn nút Add để lưu các tệp ảnh đó vào thư mục Images.

4. Xây dựng Form chính cho chương trình

4.1. Tạo giao diện Form chính

Sửa lại một số thuộc tính của Form1 như sau:

Name frmMain

Text Quan ly ban hang

WindowState Maximized

Icon /Images/Users.ico

BackgroundImage /Images/bg0_4.jpg

Tạo menu cho chương trình gồm các mục menu với thuộc tính Name và Text như sau:

Danh mục mnuDanhmucChất liệu mnuChatlieuNhân viên mnuNhanvienKhách hàng mnuKhachhangHàng hóa mnuHanghoa

Hóa đơn mnuHoadonHóa đơn bán mnuHoadonban

Tìm kiếm mnuTimkiemHóa đơn mnuFindHoadonHàng mnuFindHangKhách hàng mnuFindKhachhang

Báo cáo mnuBaocaoHàng tồn mnuBCHangtonDoanh thu mnuBCDoanhthu

Trợ giúp mnuHelpThoát mnuThoat

Thêm 2 nhãn Label với Text là: ‘Chương trình quản lý’ và ‘Bán hàng lưu niệm’

Page 10: Chuong 7 Lap Trinh CSDL

Hình 10. Giao diện form chính

4.2. Viết mã lệnh Form chính

Form frmMain có nhiệm vụ kết nối tới cơ sở dữ liệu khi bắt đầu thực hiện dự án, đóng kết nối tới cơ sở dữ liệu khi đóng dự án và mở các form tương ứng với các mục menu.

public partial class frmMain : Form { public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { Class.Functions.Connect(); } private void mnuThoat_Click(object sender, EventArgs e) { Class.Functions.Disconnect(); Application.Exit(); }

private void mnuChatlieu_Click(object sender, EventArgs e) { Forms.frmDMChatlieu f = new Forms.frmDMChatlieu(); f.StartPosition = FormStartPosition.CenterScreen; f.Show(); } }

Page 11: Chuong 7 Lap Trinh CSDL

Trong đó Connect và Disconnect là hai hàm toàn cục được viết trong class Funtions, có tác dụng tạo kết nối và đóng kết nối tới CSDL.

Các hàm viết trong class sẽ được truy xuất bởi tất cả các đối tượng có trong dự án.

4.3. Tạo lớp – Class Functions

Trong cửa sổ Solution Explorer tạo một thư mục mới đặt tên là Class, kích chuột phải tại Class chọn Add/ New Item… chọn Class trong hộp thoại Add New Item và đặt tên cho class là Functions.cs tại ô Name.

Mã lệnh của lớp Functions được viết như sau:

Để sử dụng thư viện các đối tượng của SQL Server và sử dụng đối tượng Dataset ta phải khai báo 2 Namespace Data và Data.SqlClient.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using System.Windows.Forms; // Sử� dụng hàm MessageBox

namespace Quanlybanhang.Class{ class Functions { public static SqlConnection Conn; //Khai báo đố8i tượng kế8t nố8i public static string connString; //Khai báo biế8n chứa chuố=i kế8t nố8i

public static void Connect() { //Thiế8t lập giá trị cho chuố=i kế8t nố8i connString = "Data Source=.\\SQLEXPRESS; AttachDbFilename= D:\\Baigiang\\

C#HVNH\\Baitap\\Quanlybanhang\\Quanlybanhang\\Database\\Dulieu.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True";

Conn = new SqlConnection(); //Cấ8p phát đố8i tượng Conn.ConnectionString = connString; //Kế8t nố8i Conn.Open(); //MởO kế8t nố8i }

public static void Disconnect() { if (Conn.State == ConnectionState.Open) { Conn.Close(); //Đóng kế8t nố8i Conn.Dispose(); //GiaOi phóng tài nguyến Conn = null;

Page 12: Chuong 7 Lap Trinh CSDL

} } }}

Để xác định giá trị cho chuỗi kết nối, trong cửa sổ Server Explorer kích chọn tệp dữ liệu Dulieu.mdf, chuỗi kết nối là giá trị của thuộc tính Connection String trong cửa sổ Properties.

5. Xây dựng Form cập nhật danh mục Chất liệu

Trong cửa sổ Solution Explorer tạo một thư mục mới đặt tên là Forms, kích chuột phải tại Forms, chọn Add, chọn New Item… Trong cửa sổ Add New Item chọn WindowForms và đặt tên cho Form tại ô Name là frmDMChatlieu rồi bấm Add.

Form frmDMChatlieu cho phép thêm, xem, xoá, sửa danh sách các loại chất liệu trong bảng tblChatlieu.

Hình 11. Giao diện form Chất liệu

5.1. Tạo giao diện Form frmDMChatlieu

Điều khiển Name Text

Form frmDMChatlieu DANH MUC CHAT LIEU

TextBox txtMachatlieu

Page 13: Chuong 7 Lap Trinh CSDL

txtTenchatlieu

Button btnThem Thêm

btnXoa Xoá

btnSua Sửa

btnLuu Lưu

btnBoqua Bỏ qua

btnDong Đóng

DataGridView DataGridView

5.2. Viết mã lệnh Form frmDMChatlieu

5.2.1. Khai báo các lớp tham chiếu

using System.Data;using System.Data.SqlClient;

// Khai báo biến toàn cục DataTable tblCL;

5.2.2. Viết thủ tục Form_Load của dự án

private void frmDMChatlieu_Load(object sender, EventArgs e) { txtMachatlieu.Enabled = false; btnLuu.Enabled = false; btnBoqua.Enabled = false; Load_DataGridView(); }

Với Load_DataGridView là thủ tục cục bộ được viết trong phần code của form frmDM Chatlieu có tác dụng lấy dữ liệu từ bảng tblChatlieu đổ vào lưới DataGrid View.

5.2.3. Viết thủ tục Load_DataGridView

private void Load_DataGridView() { string sql; sql = "SELECT Machatlieu, Tenchatlieu FROM tblChatlieu"; tblCL = Class.Functions.GetDataToTable(sql); DataGridView.DataSource = tblCL; DataGridView.Columns[0].HeaderText = "Mã chấ8t liệu"; DataGridView.Columns[1].HeaderText = "Tến chấ8t liệu"; DataGridView.Columns[0].Width = 100; DataGridView.Columns[1].Width = 300; // Khống cho phép thếm mơi dữ liệu trưc tiế8p trến lươi DataGridView.AllowUserToAddRows = false ; // Khống cho phép sưOa dữ liệu trưc tiế8p trến lươi DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;

Page 14: Chuong 7 Lap Trinh CSDL

}

Với GetDataToTable là hàm toàn cục được viết trong lớp Functions có tác dụng thực hiện câu lệnh SQL truy vấn dữ liệu từ CSDL đổ vào đối tượng bảng trong C#.

5.2.4. Viết hàm GetDataToTable

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static DataTable GetDataToTable(string sql) { SqlDataAdapter Mydata = new SqlDataAdapter(); // Khai báo // Tạo đố8i tượng Command thưc hiện cấu lệnh SELECT Mydata.SelectCommand = new SqlCommand(); Mydata.SelectCommand.Connection = Functions.Conn; // Kế8t nố8i CSDL Mydata.SelectCommand.CommandText = sql; // Gán cấu lệnh SELECT DataTable table = new DataTable(); // Khai báo DataTable nhận dữ liệu traO vế^ Mydata.Fill(table); //Thưc hiện cấu lệnh SELECT và đốO dữ liệu vào baOng table return table; }

Hoặc có thể thực hiện ngắn gọn bằng cách gán tham số khi khai báo đối tượng như sau:

public static DataTable GetDataToTable(string sql) { SqlDataAdapter Mydata = new SqlDataAdapter(sql, Functions.Conn); DataTable table = new DataTable(); Mydata.Fill(table); return table; }

5.2.5. Tìm hiểu đối tượng SqlDataAdapter

SqlDataAdapter là đối tượng dùng để điều phối dữ liệu, tức là nó không lưu trữ dữ liệu mà chỉ phát đi các lệnh SQL và nhận dữ liệu trả về của CSDL sau đó chuyển cho đối tượng khác (thường là DataTable).

Đối tượng SqlDataAdapter nằm trong thư viện System.Data.SqlClient.

SqlDataAdapter có thể thực hiện cùng một lúc các lệnh SQL gồm: SELECT, INSERT, UPDATE, DELETE thông qua các thành phần cơ bản sau:

SelectCommand: truy vấn dữ liệu, tương ứng với lệnh SELECT trong SQL.

InsertCommand: chèn dữ liệu mới, tương ứng với lệnh INSERT.

UpdateCommand: cập nhật dữ liệu, tương ứng với lệnh UPDATE.

DeleteCommand: xóa dữ liệu, tương ứng với lệnh DELETE.

Page 15: Chuong 7 Lap Trinh CSDL

SqlDataAdapter có 2 phương thức cơ bản Fill() và Update():

Fill: thực thi câu lệnh SelectCommand và đổ dữ liệu vào đối tượng DataTable.

Update: thực thi các câu lệnh InsertCommand, UpdateCommand, DeleteCommand.

5.2.6. Viết thủ tục DataGridView_Click

Thủ tục này có tác dụng lấy nội dung dòng dữ liệu người dùng kích chọn trong lưới DataGridView và hiển thị lên các điều khiển trên Form.

private void DataGridView_Click(object sender, EventArgs e) { if (btnThem.Enabled == false) { MessageBox.Show("Đang ởO chế8 độ thếm mơi!", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); txtMachatlieu.Focus(); return; } if (tblCL.Rows.Count == 0 ) { MessageBox.Show("Khống có dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } txtMachatlieu.Text = DataGridView.CurrentRow.Cells["Machatlieu"].Value.ToString(); txtTenchatlieu.Text = DataGridView.CurrentRow.Cells["Tenchatlieu"].Value.ToString(); btnSua.Enabled = true; btnXoa.Enabled = true; btnBoqua.Enabled = true; }

5.2.7. Viết thủ tục btnThem_Click

private void btnThem_Click(object sender, EventArgs e) { btnSua.Enabled = false; btnXoa.Enabled = false; btnBoqua.Enabled = true; btnLuu.Enabled = true; btnThem.Enabled = false; ResetValues(); txtMachatlieu.Enabled = true; txtMachatlieu.Focus(); }

Với ResetValues là thủ tục cục bộ được viết trong phần code của form frmDMChatlieu có tác dụng xóa hết dữ liệu trong các điều khiển trên Form.

5.2.8. Viết thủ tục ResetValues

Page 16: Chuong 7 Lap Trinh CSDL

private void ResetValues() { txtMachatlieu.Text = ""; txtTenchatlieu.Text = ""; }

5.2.9. Viết thủ tục btnLuu_Click

Thủ tục này có tác dụng kiểm tra thông tin người dùng nhập vào các điều khiển trên Form trong trường hợp thêm mới và lưu các thông tin đó vào CSDL.

private void btnLuu_Click(object sender, EventArgs e) { string sql; if (txtMachatlieu.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập mã chấ8t liệu", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtMachatlieu.Focus(); return; } if (txtTenchatlieu.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập tến chấ8t liệu", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtTenchatlieu.Focus(); return ; } sql = "SELECT MaChatlieu FROM tblChatlieu WHERE MaChatlieu=N'" +

txtMachatlieu.Text.Trim() + "'"; if (Class.Functions.CheckKey(sql)) { MessageBox.Show("Mã chấ8t liệu này đã có, bạn phaOi nhập mã khác", "Thống

báo", MessageBoxButtons.OK, MessageBoxIcon.Warning); txtMachatlieu.Focus(); txtMachatlieu.Text = ""; return; } sql = "INSERT INTO tblChatlieu(Machatlieu,Tenchatlieu) VALUES(N'" +

txtMachatlieu.Text + "',N'" + txtTenchatlieu.Text + "')"; Class.Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnXoa.Enabled = true; btnThem.Enabled = true; btnSua.Enabled = true; btnBoqua.Enabled = false; btnLuu.Enabled = false; txtMachatlieu.Enabled = false; }

Với CheckKey và RunSql là các hàm và thủ tục toàn cục được viết trong lớp Functions.

Page 17: Chuong 7 Lap Trinh CSDL

CheckKey có tác dụng kiểm tra khóa trùng, RunSql có tác dụng thực thi các câu lệnh SQL.

5.2.10. Viết hàm CheckKey

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static bool CheckKey(string sql) { SqlDataAdapter Mydata = new SqlDataAdapter(sql, Functions.Conn); DataTable table = new DataTable(); Mydata.Fill(table); if (table.Rows.Count > 0) return true; else return false; }

5.2.11. Viết thủ tục RunSql

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static void RunSql(string sql) { SqlCommand cmd; // Khai báo đố8i tượng SqlCommand cmd = new SqlCommand(); // KhởOi tạo đố8i tượng cmd.Connection = Functions.Conn; // Gán kế8t nố8i cmd.CommandText = sql; // Gán cấu lệnh SQL try { cmd.ExecuteNonQuery(); // Thưc hiện cấu lệnh SQL } catch (System.Exception ex) { MessageBox.Show(ex.ToString()); } cmd.Dispose(); cmd = null; }

Chú ý: Đối tượng SqlCommand có hai phương thức để thực thi câu lệnh SQL, trong đó:

ExecuteReader: thực thi câu lệnh SQL có dữ liệu trả về, ví dụ SELECT.

ExecuteNoneQuery: thực thi các câu lệnh SQL không yêu cầu trả về tập dữ liệu, ví dụ: INSERT, UPDATE, DELETE.

5.2.12. Viết thủ tục btnSua_Click

Page 18: Chuong 7 Lap Trinh CSDL

Khi người dùng kích chuột vào một dòng bản ghi bất kỳ trên lưới để hiển thị dữ liệu của bản ghi đó lên Form thì người dùng có thể chỉnh sửa các thông tin đó.

Thủ tục btnSua_Click có tác dụng lưu các thông tin người dùng đã sửa vào CSDL.

private void btnSua_Click(object sender, EventArgs e) { string sql; if (tblCL.Rows.Count == 0 ) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return ; } if (txtMachatlieu.Text == "" ) { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return ; } if (txtTenchatlieu.Text.Trim().Length == 0 ) { MessageBox.Show("Bạn phaOi nhập tến chấ8t liệu", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtTenchatlieu.Focus(); return ; } sql = "UPDATE tblChatlieu SET Tenchatlieu=N'" + txtTenchatlieu.Text.ToString() +

"' WHERE Machatlieu=N'" + txtMachatlieu.Text + "'"; Class.Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnBoqua.Enabled = false; }

5.2.13. Viết thủ tục btnXoa_Click

private void btnXoa_Click(object sender, EventArgs e) { string sql; if (tblCL.Rows.Count == 0) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return ; } if (txtMachatlieu.Text == "" ) { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return ; } if (MessageBox.Show("Bạn có muố8n xóa khống?", "Thống báo",

Page 19: Chuong 7 Lap Trinh CSDL

MessageBoxButtons.OKCancel,MessageBoxIcon.Question) == DialogResult.OK) { sql = "DELETE tblChatlieu WHERE Machatlieu=N'" + txtMachatlieu.Text + "'"; Class.Functions.RunSqlDel(sql); Load_DataGridView(); ResetValues(); } }

5.2.14.Viết thủ tục RunSqlDel

Thủ tục RunSqlDel tương tự như RunSql nhưng trong trường hợp xóa dữ liệu nếu dữ liệu đang được dùng bởi một đối tượng khác thì không được phép xóa.

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static void RunSqlDel(string sql) { SqlCommand cmd = new SqlCommand(); cmd.Connection = Functions.Conn; cmd.CommandText = sql; try { cmd.ExecuteNonQuery(); } catch (System.Exception) { MessageBox.Show("Dữ liệu đang được dùng, khống thếO xóa...", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Stop); } cmd.Dispose(); cmd = null; }

5.2.15. Viết thủ tục btnBoqua_Click

Thủ tục này là thủ tục cục bộ được gọi khi người dùng muốn hủy bỏ các chức năng Thêm mới hoặc Sửa dữ liệu.

private void btnBoqua_Click(object sender, EventArgs e) { ResetValues(); btnBoqua.Enabled = false; btnThem.Enabled = true; btnXoa.Enabled = true; btnSua.Enabled = true; btnLuu.Enabled = false; txtMachatlieu.Enabled = false; }

5.2.16.Viết thủ tục dùng phím Enter thay cho phím Tab

private void txtMachatlieu_KeyUp(object sender, KeyEventArgs e)

Page 20: Chuong 7 Lap Trinh CSDL

{ if (e.KeyCode == Keys.Enter) SendKeys.Send("{TAB}"); }

Thực hiện tương tự cho txtTenchatlieu_KeyUp

5.2.17. Viết thủ tục btnDong_Click

private void btnDong_Click(object sender, EventArgs e) { this.Close(); }

6. Xây dựng Form cập nhật danh mục Nhân viên

Mở một Form mới đặt tên là frmDMNhanvien rồi lưu vào thư mục Forms.

Hình 12. Giao diện form Nhân viên

Form frmDMNhanvien cho phép thêm, xem, xoá, sửa danh sách các nhân viên trong bảng tblNhanvien.

6.1. Tạo giao diện Form frmDMNhanvien

Page 21: Chuong 7 Lap Trinh CSDL

Điều khiển Name Text

Form frmDMNhanvien DANH MUC NHAN VIEN

TextBox txtManhanvien

txtTennhanvien

txtDiachi

Button btnThem, btnXoa, btnSua, btnLuu, btnBoqua, btnDong

CheckBox chkGioitinh Nam

MaskedTextBox mskDienthoai Mask: Phone Number

mskNgaysinh Mask: Short Date

DataGridView DataGridView

6.2. Viết mã lệnh Form frmDMNhanvien

6.2.1. Khai báo các lớp tham chiểu

using System.Data;using System.Data.SqlClient;using Quanlybanhang.Class; // Khai báo lơp Functions

// Khai báo biến toàn cục DataTable tblNV;

6.2.2. Viết thủ tục FormLoad

private void frmDMNhanvien_Load(object sender, EventArgs e) { txtManhanvien.Enabled = false; btnLuu.Enabled = false; btnBoqua.Enabled = false; Load_DataGridView(); }

6.2.3. Viết thủ tục Load_DataGridView – Hiển thị dữ liệu lên lưới

private void Load_DataGridView() { string sql; sql = "SELECT Manhanvien, Tennhanvien, Gioitinh, Diachi, Dienthoai, Ngaysinh

FROM tblNhanvien"; tblNV = Functions.GetDataToTable(sql); DataGridView.DataSource = tblNV; DataGridView.Columns[0].HeaderText = "Mã nhấn viến"; DataGridView.Columns[1].HeaderText = "Tến nhấn viến"; DataGridView.Columns[2].HeaderText = "Giơi tính"; DataGridView.Columns[3].HeaderText = "Địa chỉO"; DataGridView.Columns[4].HeaderText = "Điện thoại"; DataGridView.Columns[5].HeaderText = "Ngày sinh"; DataGridView.Columns[0].Width = 100; DataGridView.Columns[1].Width = 150; DataGridView.Columns[2].Width = 100;

Page 22: Chuong 7 Lap Trinh CSDL

DataGridView.Columns[3].Width = 150; DataGridView.Columns[4].Width = 100; DataGridView.Columns[5].Width = 100; DataGridView.AllowUserToAddRows = false; DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically;

}

6.2.4. Viết thủ tục DataGridView_Click

private void DataGridView_Click(object sender, EventArgs e) { if (btnThem.Enabled == false) { MessageBox.Show("Đang ởO chế8 độ thếm mơi!", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); txtManhanvien.Focus(); return; } if (tblNV.Rows.Count == 0) { MessageBox.Show("Khống có dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } txtManhanvien.Text = DataGridView.CurrentRow.Cells["Manhanvien"].Value.ToString(); txtTennhanvien.Text = DataGridView.CurrentRow.Cells["Tennhanvien"].Value.ToString(); if (DataGridView.CurrentRow.Cells["Gioitinh"].Value.ToString() == "Nam") chkGioitinh.Checked = true; else chkGioitinh.Checked = false; txtDiachi.Text = DataGridView.CurrentRow.Cells["Diachi"].Value.ToString(); mskDienthoai.Text = DataGridView.CurrentRow.Cells["Dienthoai"].Value.ToString(); mskNgaysinh.Text = DataGridView.CurrentRow.Cells["Ngaysinh"].Value.ToString (); btnSua.Enabled = true; btnXoa.Enabled = true; btnBoqua.Enabled = true; }

6.2.5. Viết thủ tục btnThem_Click

private void btnThem_Click(object sender, EventArgs e) { btnSua.Enabled = false; btnXoa.Enabled = false; btnBoqua.Enabled = true; btnLuu.Enabled = true; btnThem.Enabled = false; ResetValues(); txtManhanvien.Enabled = true; txtManhanvien.Focus(); }

Page 23: Chuong 7 Lap Trinh CSDL

6.2.6. Viết thủ tục ResetValues

private void ResetValues() { txtManhanvien.Text = ""; txtTennhanvien.Text = ""; chkGioitinh.Checked = false; txtDiachi.Text = ""; mskNgaysinh.Text = ""; mskDienthoai.Text = ""; }

6.2.7. Viết thủ tục btnLuu_Click

private void btnLuu_Click(object sender, EventArgs e) { string sql,gt; if (txtManhanvien.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập mã nhấn viến", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtManhanvien.Focus(); return; } if (txtTennhanvien.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập tến nhấn viến", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtTennhanvien.Focus(); return ; } if (txtDiachi.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập địa chỉO", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtDiachi.Focus(); return ; } if (mskDienthoai.Text == "( ) -") { MessageBox.Show("Bạn phaOi nhập điện thoại", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskDienthoai.Focus(); return ; } if (mskNgaysinh.Text == " / /") { MessageBox.Show("Bạn phaOi nhập ngày sinh", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskNgaysinh.Focus(); return ; } if (!Functions.IsDate(mskNgaysinh.Text)) { MessageBox.Show("Bạn phaOi nhập lại ngày sinh", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning);

Page 24: Chuong 7 Lap Trinh CSDL

mskNgaysinh.Text = ""; mskNgaysinh.Focus(); return ; } if (chkGioitinh.Checked == true) gt = "Nam"; else gt = "Nữ"; sql = "SELECT Manhanvien FROM tblNhanvien WHERE Manhanvien=N'" +

txtManhanvien.Text.Trim() + "'"; if (Functions.CheckKey(sql)) { MessageBox.Show("Mã nhấn viến này đã có, bạn phaOi nhập mã khác", "Thống

báo", MessageBoxButtons.OK, MessageBoxIcon.Warning); txtManhanvien.Focus(); txtManhanvien.Text = ""; return ; } sql = "INSERT INTO tblNhanvien(Manhanvien,Tennhanvien,Gioitinh, Diachi,

Dienthoai, Ngaysinh) VALUES (N'" + txtManhanvien.Text.Trim() + "',N'" + txtTennhanvien.Text.Trim() + "',N'" + gt + "',N'" + txtDiachi.Text.Trim() + "','" + mskDienthoai.Text + "','" + Functions.ConvertDateTime(mskNgaysinh.Text) + "')"; Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnXoa.Enabled = true; btnThem.Enabled = true; btnSua.Enabled = true; btnBoqua.Enabled = false; btnLuu.Enabled = false; txtManhanvien.Enabled = false; }

Với IsDate và ConvertDateTime là các hàm toàn cục được viết trong lớp Functions.

IsDate có tác dụng kiểm tra một biến có ở dạng ngày tháng không, ConvertDateTime có tác dụng đổi một chuỗi ngày tháng do người dùng nhập có dạng dd/mm/yyyy thành chuỗi ngày tháng có dạng mm/dd/yyyy để lưu vào CSDL.

6.2.8. Viết hàm IsDate

Mở cửa sổ code của lớp Functions và gõ vào đoạn mã lệnh như sau:

public static bool IsDate(string d) { string[] parts = d.Split('/'); if ((Convert.ToInt32(parts[0]) >= 1) && (Convert.ToInt32(parts[0]) <= 31) &&

(Convert.ToInt32(parts[1]) >= 1) && (Convert.ToInt32(parts[1]) <= 12) && (Convert.ToInt32(parts[2]) >= 1900))

return true; else return false; }

Page 25: Chuong 7 Lap Trinh CSDL

6.2.9. Viết hàm ConvertDateTime

Mở cửa sổ code của lớp Functions và gõ vào đoạn mã lệnh như sau:

public static string ConvertDateTime(string d) { string[] parts = d.Split('/'); string dt = String.Format("{0}/{1}/{2}", parts[1], parts[0], parts[2]); return dt; }

6.2.10.Viết thủ tục btnSua_Click

private void btnSua_Click(object sender, EventArgs e) { string sql,gt; if (tblNV.Rows.Count == 0 ) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return ; } if (txtManhanvien.Text == "" ) { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return ; } if (txtTennhanvien.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập tến nhấn viến", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtTennhanvien.Focus(); return ; } if (txtDiachi.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập địa chỉO", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtDiachi.Focus(); return ; } if (mskDienthoai.Text == "( ) -") { MessageBox.Show("Bạn phaOi nhập điện thoại", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskDienthoai.Focus(); return ; } if (mskNgaysinh.Text == " / /") { MessageBox.Show("Bạn phaOi nhập ngày sinh", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskNgaysinh.Focus();

Page 26: Chuong 7 Lap Trinh CSDL

return ; } if (!Functions.IsDate(mskNgaysinh.Text)) { MessageBox.Show("Bạn phaOi nhập lại ngày sinh", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskNgaysinh.Text = ""; mskNgaysinh.Focus(); return ; } if (chkGioitinh.Checked == true) gt = "Nam"; else gt = "Nữ"; sql = "UPDATE tblNhanvien SET Tennhanvien=N'" +

txtTennhanvien.Text.Trim().ToString() + "',Diachi=N'" + txtDiachi.Text.Trim().ToString() + "',Dienthoai='" + mskDienthoai.Text.ToString() +

"',Gioitinh=N'" + gt + "',Ngaysinh='" + Functions.ConvertDateTime(mskNgaysinh.Text)

+ "' WHERE Manhanvien=N'" + txtManhanvien.Text + "'";

Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnBoqua.Enabled = false; }

6.2.11.Viết thủ tục btnXoa_Click

private void btnXoa_Click(object sender, EventArgs e) { string sql; if (tblNV.Rows.Count == 0) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } if (txtManhanvien.Text == "") { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (MessageBox.Show("Bạn có muố8n xóa khống?", "Thống báo",

MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { sql = "DELETE tblNhanvien WHERE Manhanvien=N'" + txtManhanvien.Text + "'"; Functions.RunSqlDel(sql); Load_DataGridView(); ResetValues(); } }

Page 27: Chuong 7 Lap Trinh CSDL

6.2.12.Viết thủ tục btnBoqua_Click

private void btnBoqua_Click(object sender, EventArgs e) { ResetValues(); btnBoqua.Enabled = false; btnThem.Enabled = true; btnXoa.Enabled = true; btnSua.Enabled = true; btnLuu.Enabled = false; txtManhanvien.Enabled = false; }

6.2.13.Viết thủ tục dùng phím Enter thay cho phím Tab

private void txtManhanvien_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) SendKeys.Send("{TAB}"); }

Thực hiện tương tự cho txtTennhanvien.KeyUp, txtDiachi.KeyUp, mskDienthoai.KeyUp, mskNgaysinh.KeyUp.

6.2.14.Viết thủ tục btnDong_Click

private void btnDong_Click(object sender, EventArgs e) { this.Close(); }

7. Xây dựng Form cập nhật danh mục Khách hàng

Mở một Form mới đặt tên là frmDMKhachhang rồi lưu vào thư mục Forms.

Page 28: Chuong 7 Lap Trinh CSDL

Hình 13. Giao diện form Khách hàng

Form frmDMKhachhang cho phép thêm, xem, xoá, sửa danh sách các khách hàng trong bảng tblKhach.

7.1. Tạo giao diện Form frmDMKhachhang

Điều khiển Name Text

Form frmDMKhachhang DANH MUC KHACH HANG

TextBox txtMakhach

txtTenkhach

txtDiachi

Button btnThem, btnXoa, btnSua, btnLuu, btnBoqua, btnDong

CheckBox chkGioitinh Nam

MaskedTextBox mskDienthoai Mask: Phone Number

DataGridView DataGridView

Page 29: Chuong 7 Lap Trinh CSDL

7.2. Viết mã lệnh Form frmDMKhachhang

7.2.1. Khai báo các lớp tham chiếu

using System.Data;using System.Data.SqlClient;using Quanlybanhang.Class;

// Khai báo biến toàn cục DataTable tblKH;

7.2.2. Viết thủ tục FormLoad

private void frmDMKhachhang_Load(object sender, EventArgs e) { txtMakhach.Enabled = false; btnLuu.Enabled = false; btnBoqua.Enabled = false; Load_DataGridView(); }

7.2.3. Viết thủ tục Load_DataGridView

private void Load_DataGridView() { string sql; sql = "SELECT Makhach, Tenkhach, Diachi, Dienthoai FROM tblKhach"; tblKH = Functions.GetDataToTable(sql); DataGridView.DataSource = tblKH; DataGridView.Columns[0].HeaderText = "Mã khách"; DataGridView.Columns[1].HeaderText = "Tến khách"; DataGridView.Columns[2].HeaderText = "Địa chỉO"; DataGridView.Columns[3].HeaderText = "Điện thoại"; DataGridView.Columns[0].Width = 100; DataGridView.Columns[1].Width = 150; DataGridView.Columns[2].Width = 150; DataGridView.Columns[3].Width = 150; DataGridView.AllowUserToAddRows = false; DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically; }

7.2.4. Viết thủ tục DataGridView_Click

private void DataGridView_Click(object sender, EventArgs e) { if (btnThem.Enabled == false) { MessageBox.Show("Đang ởO chế8 độ thếm mơi!", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); txtMakhach.Focus(); return; } if (tblKH.Rows.Count == 0) {

Page 30: Chuong 7 Lap Trinh CSDL

MessageBox.Show("Khống có dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } txtMakhach.Text = DataGridView.CurrentRow.Cells["Makhach"].Value.ToString(); txtTenkhach.Text = DataGridView.CurrentRow.Cells["Tenkhach"].Value.ToString(); txtDiachi.Text = DataGridView.CurrentRow.Cells["Diachi"].Value.ToString(); mskDienthoai.Text = DataGridView.CurrentRow.Cells["Dienthoai"].Value.ToString(); btnSua.Enabled = true; btnXoa.Enabled = true; btnBoqua.Enabled = true; }

7.2.5. Viết thủ tục btnThem_Click

private void btnThem_Click(object sender, EventArgs e) { btnSua.Enabled = false; btnXoa.Enabled = false; btnBoqua.Enabled = true; btnLuu.Enabled = true; btnThem.Enabled = false; ResetValues(); txtMakhach.Enabled = true; txtMakhach.Focus(); }

7.2.6. Viết thủ tục ResetValues

private void ResetValues() { txtMakhach.Text = ""; txtTenkhach.Text = ""; txtDiachi.Text = ""; mskDienthoai.Text = ""; }

7.2.7. Viết thủ tục btnLuu_Click

private void btnLuu_Click(object sender, EventArgs e) { string sql; if (txtMakhach.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập mã khách", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtMakhach.Focus(); return; } if (txtTenkhach.Text.Trim().Length == 0) {

Page 31: Chuong 7 Lap Trinh CSDL

MessageBox.Show("Bạn phaOi nhập tến khách", "Thống báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);

txtTenkhach.Focus(); return; } if (txtDiachi.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập địa chỉO", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtDiachi.Focus(); return; } if (mskDienthoai.Text == "( ) -") { MessageBox.Show("Bạn phaOi nhập điện thoại", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskDienthoai.Focus(); return; } sql = "SELECT Makhach FROM tblKhach WHERE Makhach=N'" + txtMakhach.Text.Trim() + "'"; if (Functions.CheckKey(sql)) { MessageBox.Show("Mã khách này đã có, bạn phaOi nhập mã khác", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtMakhach.Focus(); txtMakhach.Text = ""; return; } sql = "INSERT INTO tblKhach(Makhach,Tenkhach,Diachi,Dienthoai) VALUES (N'" +

txtMakhach.Text.Trim() + "',N'" + txtTenkhach.Text.Trim() + "',N'" + txtDiachi.Text.Trim() + "','" + mskDienthoai.Text + "')";

Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnXoa.Enabled = true; btnThem.Enabled = true; btnSua.Enabled = true; btnBoqua.Enabled = false; btnLuu.Enabled = false; txtMakhach.Enabled = false; }

7.2.8. Viết thủ tục btnSua_Click

private void btnSua_Click(object sender, EventArgs e) { string sql; if (tblKH.Rows.Count == 0) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; }

Page 32: Chuong 7 Lap Trinh CSDL

if (txtMakhach.Text == "") { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (txtTenkhach.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập tến khách", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtTenkhach.Focus(); return; } if (txtDiachi.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập địa chỉO", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtDiachi.Focus(); return; } if (mskDienthoai.Text == "( ) -") { MessageBox.Show("Bạn phaOi nhập điện thoại", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); mskDienthoai.Focus(); return; } sql = "UPDATE tblKhach SET Tenkhach=N'" + txtTenkhach.Text.Trim().ToString() + "',Diachi=N'" + txtDiachi.Text.Trim().ToString() + "',Dienthoai='" + mskDienthoai.Text.ToString() + "' WHERE Makhach=N'" + txtMakhach.Text + "'"; Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnBoqua.Enabled = false; }

7.2.9. Viết thủ tục btnXoa_Click

private void btnXoa_Click(object sender, EventArgs e) { string sql; if (tblKH.Rows.Count == 0) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } if (txtMakhach.Text == "") { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return; }

Page 33: Chuong 7 Lap Trinh CSDL

if (MessageBox.Show("Bạn có muố8n xóa khống?", "Thống báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)

{ sql = "DELETE tblKhach WHERE Makhach=N'" + txtMakhach.Text + "'"; Functions.RunSqlDel(sql); Load_DataGridView(); ResetValues(); } }

7.2.10.Viết thủ tục btnBoqua_Click

private void btnBoqua_Click(object sender, EventArgs e) { ResetValues(); btnBoqua.Enabled = false; btnThem.Enabled = true; btnXoa.Enabled = true; btnSua.Enabled = true; btnLuu.Enabled = false; txtMakhach.Enabled = false; }

7.2.11.Viết thủ tục dùng phím Enter thay cho phím Tab

private void txtMakhach_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) SendKeys.Send("{TAB}"); }

7.2.12.Viết thủ tục btnDong_Click

private void btnDong_Click(object sender, EventArgs e) { this.Close(); }

8. Xây dựng Form cập nhật danh mục Hàng

Mở một Form mới đặt tên là frmDMHang rồi lưu vào thư mục Forms.

Form frmDMHang cho phép thêm, xem, xoá, sửa danh sách các hàng trong bảng tblHang.

8.1. Tạo giao diện Form frmDMHang

Điều khiển Name Text

Form frmDMHang DANH MUC HANG HOA

TextBox txtMahang, txtTenhang, txtSoluong, txtDongianhap, txtDongiaban, txtAnh, txtGhichu.

Page 34: Chuong 7 Lap Trinh CSDL

ComboBox cboMachatlieu

PictureBox picAnh

DataGridView DataGridView

Button btnThem, btnXoa, btnSua, btnLuu, btnBoqua,btnTimkiem, btnHienthi, btnDong, btnOpen.

Hình 14. Giao diện form Hàng

8.2. Viết mã lệnh Form frmDMHang

8.2.1. Khai báo các lớp tham chiếu

using System.Data;using System.Data.SqlClient;using Quanlybanhang.Class;

Page 35: Chuong 7 Lap Trinh CSDL

// Khai báo biến toàn cục DataTable tblH;

8.2.2. Viết thủ tục FormLoad

private void frmDMHang_Load(object sender, EventArgs e) { txtMahang.Enabled = false; btnLuu.Enabled = false; btnBoqua.Enabled = false; Load_DataGridView(); Functions.FillCombo("SELECT Machatlieu, Tenchatlieu FROM tblChatlieu",

cboMachatlieu, "Machatlieu", "Tenchatlieu"); cboMachatlieu.SelectedIndex = -1;

ResetValues(); }

Với FillCombo là một thủ tục toàn cục được viết trong Class Functions, có tác dụng lấy dữ liệu từ một câu lệnh SQL đổ vào một ComboBox.

8.2.3. Viết thủ tục FillCombo

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static void FillCombo(string sql, ComboBox cbo, string ma, string ten) { SqlDataAdapter Mydata =new SqlDataAdapter(sql, Functions.Conn); DataTable table = new DataTable(); Mydata.Fill(table); cbo.DataSource = table; cbo.ValueMember = ma; // Truong gia tri cbo.DisplayMember = ten; // Truong hien thi }

8.2.4. Viết thủ tục ResetValues

private void ResetValues() { txtMahang.Text = ""; txtTenhang.Text = ""; cboMachatlieu.Text = ""; txtSoluong.Text = "0"; txtDongianhap.Text = "0"; txtDongiaban.Text = "0"; txtSoluong.Enabled = false; txtDongianhap.Enabled = false; txtDongiaban.Enabled = false; txtAnh.Text = ""; picAnh.Image = null; txtGhichu.Text = ""; }

8.2.5. Viết thủ tục Load_DataGridView

Page 36: Chuong 7 Lap Trinh CSDL

private void Load_DataGridView() { string sql; sql = "SELECT Mahang, Tenhang, Machatlieu, Soluong, Dongianhap, Dongiaban FROM

tblHang"; tblH = Functions.GetDataToTable(sql); DataGridView.DataSource = tblH; DataGridView.Columns[0].HeaderText = "Mã hàng"; DataGridView.Columns[1].HeaderText = "Tến hàng"; DataGridView.Columns[2].HeaderText = "Chấ8t liệu"; DataGridView.Columns[3].HeaderText = "Số8 lượng"; DataGridView.Columns[4].HeaderText = "Đởn giá nhập"; DataGridView.Columns[5].HeaderText = "Đởn giá bán"; DataGridView.Columns[0].Width = 80; DataGridView.Columns[1].Width = 140; DataGridView.Columns[2].Width = 80; DataGridView.Columns[3].Width = 80; DataGridView.Columns[4].Width = 100; DataGridView.Columns[5].Width = 100; DataGridView.AllowUserToAddRows = false; DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically; }

8.2.6. Viết thủ tục DataGridView_Click

private void DataGridView_Click(object sender, EventArgs e) { string ma; if (btnThem.Enabled == false) { MessageBox.Show("Đang ởO chế8 độ thếm mơi!", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); txtMahang.Focus(); return; } if (tblH.Rows.Count == 0) { MessageBox.Show("Khống có dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } txtMahang.Text = DataGridView.CurrentRow.Cells["Mahang"].Value.ToString(); txtTenhang.Text = DataGridView.CurrentRow.Cells["Tenhang"].Value.ToString(); ma = DataGridView.CurrentRow.Cells["Machatlieu"].Value.ToString(); cboMachatlieu.Text = Functions.GetFieldValues("SELECT Tenchatlieu FROM

tblChatlieu WHERE Machatlieu = N'" + ma + "'"); txtSoluong.Text = DataGridView.CurrentRow.Cells["Soluong"].Value.ToString(); txtDongianhap.Text = DataGridView.CurrentRow.Cells["Dongianhap"].Value.ToString(); txtDongiaban.Text = DataGridView.CurrentRow.Cells["Dongiaban"].Value.ToString();

Page 37: Chuong 7 Lap Trinh CSDL

txtAnh.Text = Functions.GetFieldValues("SELECT Anh FROM tblHang WHERE Mahang =

N'" + txtMahang.Text + "'"); picAnh.Image = Image.FromFile(txtAnh.Text); txtGhichu.Text = Functions.GetFieldValues("SELECT Ghichu FROM tblHang WHERE

Mahang = N'" + txtMahang.Text + "'"); btnSua.Enabled = true; btnXoa.Enabled = true; btnBoqua.Enabled = true; }

Với GetFieldValues là một hàm toàn cục được viết trong Class Functions, có tác dụng lấy dữ liệu từ một câu lệnh SQL.

8.2.7. Viết hàm GetFieldValues

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static string GetFieldValues(string sql) { string ma = ""; SqlCommand cmd = new SqlCommand(sql, Functions.Conn); SqlDataReader reader ;

reader = cmd.ExecuteReader(); while (reader.Read()) { ma = reader.GetValue(0).ToString(); } reader.Close(); return ma; }

8.2.8. Tìm hiểu đối tượng SqlDataReader

SqlCommand thực thi câu lệnh Sql SELECT và trả về tập dữ liệu SqlDataReader. Dữ liệu trong SqlDataReader được lưu trữ dưới dạng các dòng và các cột, ta chỉ có thể duyệt dữ liệu theo một chiều từ đầu đến cuối.

Để đọc từng dòng dữ liệu trong SqlDataReader ta sử dụng phương thức Read với cú pháp như sau:

reader.Read();

SqlDataReader không cung cấp cách thức cho phép kiểm soát số bản ghi đang nắm giữ mà quy định phương thức Read() trả về giá trị True nếu vẫn tồn tại bản ghi kế tiếp. Do đó để duyệt qua danh sách tất cả các bản ghi ta có thể sử dụng vòng lặp while.

Để đọc dữ liệu của từng cột ta sử dụng phương thức GetValue với cú pháp như sau:

reader.GetValue(FieldIndex);

Page 38: Chuong 7 Lap Trinh CSDL

với FieldIndex là số thứ tự của cột muốn lấy dữ liệu (bắt đầu từ 0). Ngoài ra nếu biết rõ kiểu dữ liệu của cột cần lấy dữ liệu ta có thể sử dụng các phương thức gọi tường minh như: GetString(), GetInt32()… khi đó tốc độ đọc sẽ nhanh hơn.

8.2.9. Viết thủ tục btnThem_Click

private void btnThem_Click(object sender, EventArgs e) { btnSua.Enabled = false; btnXoa.Enabled = false; btnBoqua.Enabled = true; btnLuu.Enabled = true; btnThem.Enabled = false; ResetValues(); txtMahang.Enabled = true; txtMahang.Focus(); }

8.2.10.Viết thủ tục btnLuu_Click

private void btnLuu_Click(object sender, EventArgs e) { string sql; if (txtMahang.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập mã hàng", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtMahang.Focus(); return; } if (txtTenhang.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập tến hàng", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtTenhang.Focus(); return; } if (cboMachatlieu.Text.Trim().Length == 0 ) { MessageBox.Show("Bạn phaOi nhập chấ8t liệu", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); cboMachatlieu.Focus(); return; } if (txtAnh.Text.Trim().Length == 0 ) { MessageBox.Show("Bạn phaOi chọn aOnh minh họa cho hàng", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtAnh.Focus(); return; } sql = "SELECT Mahang FROM tblHang WHERE Mahang=N'" + txtMahang.Text.Trim() + "'";

Page 39: Chuong 7 Lap Trinh CSDL

if (Functions.CheckKey(sql)) { MessageBox.Show("Mã hàng này đã có, bạn phaOi nhập mã khác", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtMahang.Focus(); txtMahang.Text = ""; return; } sql = "INSERT INTO tblHang(Mahang,Tenhang,Machatlieu,Soluong,Dongianhap,

Dongiaban,Anh,Ghichu) VALUES(N'" + txtMahang.Text.Trim() + "',N'" + txtTenhang.Text.Trim() + "',N'" +

cboMachatlieu.SelectedValue.ToString() + "'," + txtSoluong.Text.Trim() + "," + txtDongianhap.Text + "," + txtDongiaban.Text +

",'" + txtAnh.Text + "',N'" + txtGhichu.Text.Trim() + "')"; Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnXoa.Enabled = true; btnThem.Enabled = true; btnSua.Enabled = true; btnBoqua.Enabled = false; btnLuu.Enabled = false; txtMahang.Enabled = false; }

8.2.11.Viết thủ tục btnSua_Click

private void btnSua_Click(object sender, EventArgs e) { string sql; if (tblH.Rows.Count == 0) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } if (txtMahang.Text == "") { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (txtTenhang.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập tến hàng", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtTenhang.Focus(); return; } if (cboMachatlieu.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi nhập chấ8t liệu", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); cboMachatlieu.Focus();

Page 40: Chuong 7 Lap Trinh CSDL

return; } if (txtAnh.Text.Trim().Length == 0) { MessageBox.Show("Bạn phaOi chọn aOnh minh họa cho hàng", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtAnh.Focus(); return; } sql = "UPDATE tblHang SET Tenhang=N'" + txtTenhang.Text.Trim().ToString() +

"',Machatlieu=N'" + cboMachatlieu.SelectedValue.ToString() + "',Anh='" + txtAnh.Text +

"',Ghichu=N'" + txtGhichu.Text + "' WHERE Mahang=N'" + txtMahang.Text + "'";

Functions.RunSql(sql); Load_DataGridView(); ResetValues(); btnBoqua.Enabled = false; }

8.2.12.Viết thủ tục btnXoa_Click

private void btnXoa_Click(object sender, EventArgs e) { string sql; if (tblH.Rows.Count == 0) { MessageBox.Show("Khống còn dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return; } if (txtMahang.Text == "") { MessageBox.Show("Bạn chưa chọn baOn ghi nào", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (MessageBox.Show("Bạn có muố8n xóa khống?", "Thống báo",

MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { sql = "DELETE tblHang WHERE Mahang=N'" + txtMahang.Text + "'"; Functions.RunSqlDel(sql); Load_DataGridView(); ResetValues(); } }

8.2.13.Viết thủ tục btnBoqua_Click

private void btnBoqua_Click(object sender, EventArgs e) { ResetValues(); btnBoqua.Enabled = false; btnThem.Enabled = true;

Page 41: Chuong 7 Lap Trinh CSDL

btnXoa.Enabled = true; btnSua.Enabled = true; btnLuu.Enabled = false; txtMahang.Enabled = false; }

8.2.14.Viết thủ tục btnOpen_Click

private void btnOpen_Click(object sender, EventArgs e) { OpenFileDialog dlgOpen = new OpenFileDialog(); dlgOpen.Filter = "Bitmap(*.bmp)|*.bmp|Gif(*.gif)|*.gif|All files(*.*)|*.*"; dlgOpen.InitialDirectory = "D:\\"; dlgOpen.FilterIndex = 2; dlgOpen.Title = "Chon hinh anh de hien thi"; if (dlgOpen.ShowDialog() == DialogResult.OK) { picAnh.Image = Image.FromFile(dlgOpen.FileName); txtAnh.Text = dlgOpen.FileName; } }

8.2.15.Viết thủ tục btnTimkiem_Click

Thủ tục tìm kiếm cho phép tìm các bản ghi thỏa mãn một số điều kiện nào đấy và hiển thị kết quả tìm được vào lưới DataGridView.

private void btnTimkiem_Click(object sender, EventArgs e) { string sql; if ((txtMahang.Text == "") && (txtTenhang.Text == "") && (cboMachatlieu.Text ==

"")) { MessageBox.Show("Hãy nhập một điếu kiện tìm kiế8m!!!", "Yếu cấu ...",

MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } sql = "SELECT * FROM tblHang WHERE 1=1"; if (txtMahang.Text != "") sql = sql + " AND Mahang Like N'%" + txtMahang.Text + "%'"; if (txtTenhang.Text != "") sql = sql + " AND Tenhang Like N'%" + txtTenhang.Text + "%'"; if (cboMachatlieu.Text != "") sql = sql + " AND Machatlieu Like N'%" + cboMachatlieu.SelectedValue + "%'"; tblH = Functions.GetDataToTable(sql); if (tblH.Rows.Count == 0 ) MessageBox.Show("Khống có baOn ghi thoOa mãn điếu kiện!!!", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); else MessageBox.Show("Có " + tblH.Rows.Count + " baOn ghi thoOa mãn điếu kiện!!!",

Page 42: Chuong 7 Lap Trinh CSDL

"Thống báo", MessageBoxButtons.OK, MessageBoxIcon.Warning); DataGridView.DataSource = tblH; ResetValues(); }

8.2.16.Viết thủ tục btnHienthi_Click

Thủ tục có tác dụng hiển thị toàn bộ danh sách các mặt hàng có trong cơ sở dữ liệu lên lưới.

private void btnHienthi_Click(object sender, EventArgs e) { string sql; sql = "SELECT Mahang, Tenhang, Machatlieu, Soluong, Dongianhap, Dongiaban, Anh,

Ghichu FROM tblHang"; tblH = Functions.GetDataToTable(sql); DataGridView.DataSource = tblH; }

9. Xây dựng Form cập nhật Hóa đơn bán

Mở một Form mới đặt tên là frmHoadonBan và lưu vào thư mục Forms.

Form frmHoadonBan cho phép thêm, xem, xoá danh sách các hóa đơn và các mặt hàng có trong bảng tblHDBan và tblChitietHDBan.

Page 43: Chuong 7 Lap Trinh CSDL

Hình 15. Giao diện form Hoá đơn bán

Ngoài ra form này cho phép chúng ta kết xuất các thông tin trong hóa đơn ra một tệp Excel thông qua nút lệnh In hóa đơn. Để làm được điều này ta phải tham chiếu tới đối tượng COM của Excel do Microsoft Visual Studio cung cấp. COM là một đối tượng đóng gói theo 1 chuẩn do Microsoft Visual Studio định ra và nó có khả năng chạy được trên nhiều nền tảng ứng dụng khác nhau.

9.1. Tham chiếu thư viện Microsoft.Office.Interop.Excel

Vào menu Project/Add Reference… xuất hiện hộp hội thoại Add Reference.

Chọn tab COM, kích chọn Microsoft Excel 14.0 Object Library rồi chọn OK.

Page 44: Chuong 7 Lap Trinh CSDL

Hình 16. Tham chiếu thư viện Excel

9.2. Tạo giao diện Form frmHoadonBan

Điều khiển Name Text

Form frmHoadonBan HOA DON BAN

Label lblBangchu Bằng chữ:

TextBox txtMaHDBan, txtNgayban, txtTennhanvien,txtTenkhach, txtDiachi, txtDienthoai, txtTongtien, txtTenhang, txtDongiabakn, txtSoluong, txtGiamgia, txtThanhtien.

ComboBox cboManhanvien, cboMakhach, cboMahang, cboMaHDBan.

DataGridView DataGridViewChitiet

Button btnNgay, btnThemmoi, btnLuu, btnXoa, btnInhoadon,

btnDong, btnTimkiem

9.3. Viết mã lệnh Form frmDMHoadonBan

9.3.1. Khai báo các lớp tham chiếu

using System.Data.SqlClient;using COMExcel = Microsoft.Office.Interop.Excel;using Quanlybanhang.Class;

DataTable tblCTHDB;

Page 45: Chuong 7 Lap Trinh CSDL

9.3.2. Viết thủ tục FormLoad

private void frmHoadonban_Load(object sender, EventArgs e) { btnThemmoi.Enabled = true; btnLuu.Enabled = false; btnXoaHD.Enabled = false; btnInhoadon.Enabled = false; txtMaHDBan.ReadOnly = true; txtTennhanvien.ReadOnly = true; txtTenkhach.ReadOnly = true; txtDiachi.ReadOnly = true; txtDienthoai.ReadOnly = true; txtTenhang.ReadOnly = true; txtDongiaban.ReadOnly = true; txtThanhtien.ReadOnly = true; txtTongtien.ReadOnly = true; txtGiamgia.Text = "0"; txtTongtien.Text = "0"; Functions.FillCombo("SELECT Makhach, Tenkhach FROM tblKhach",cboMakhach,

"Makhach", "Tenkhach"); cboMakhach.SelectedIndex = -1; Functions.FillCombo("SELECT Manhanvien, Tennhanvien FROM tblNhanvien",

cboManhanvien, "Manhanvien", "Tennhanvien"); cboManhanvien.SelectedIndex = -1; Functions.FillCombo("SELECT Mahang, Tenhang FROM tblHang",cboMahang,

"Mahang","Tenhang"); cboMahang.SelectedIndex = -1; //HiếOn thị thống tin cuOa một hóa đởn được gọi từ form tìm kiế8m if (txtMaHDBan.Text != "") { Load_ThongtinHD(); btnXoaHD.Enabled = true; btnInhoadon.Enabled = true; } Load_DataGridViewChitiet(); }

9.3.3. Viết thủ tục Load_DataGridViewChitiet

private void Load_DataGridViewChitiet() { string sql; sql = "SELECT a.Mahang, b.Tenhang, a.Soluong, b.Dongiaban, a.Giamgia,

a.Thanhtien FROM tblChitietHDBan AS a, tblHang AS b WHERE a.MaHDBan = N'" + txtMaHDBan.Text + "' AND a.Mahang=b.Mahang";

tblCTHDB = Functions.GetDataToTable(sql); DataGridViewChitiet.DataSource = tblCTHDB; DataGridViewChitiet.Columns[0].HeaderText = "Mã hàng"; DataGridViewChitiet.Columns[1].HeaderText = "Tến hàng"; DataGridViewChitiet.Columns[2].HeaderText = "Số8 lượng"; DataGridViewChitiet.Columns[3].HeaderText = "Đởn giá"; DataGridViewChitiet.Columns[4].HeaderText = "GiaOm giá %"; DataGridViewChitiet.Columns[5].HeaderText = "Thành tiến"; DataGridViewChitiet.Columns[0].Width = 80;

Page 46: Chuong 7 Lap Trinh CSDL

DataGridViewChitiet.Columns[1].Width = 100; DataGridViewChitiet.Columns[2].Width = 80; DataGridViewChitiet.Columns[3].Width = 90; DataGridViewChitiet.Columns[4].Width = 90; DataGridViewChitiet.Columns[5].Width = 90; DataGridViewChitiet.AllowUserToAddRows = false; DataGridViewChitiet.EditMode = DataGridViewEditMode.EditProgrammatically; }

9.3.4. Viết thủ tục Load_ThongtinHD()

private void Load_ThongtinHD() { string str; str = "SELECT Ngayban FROM tblHDBan WHERE MaHDBan = N'" + txtMaHDBan.Text + "'"; txtNgayban.Text = Functions.ConvertDateTime(Functions.GetFieldValues(str)); str = "SELECT Manhanvien FROM tblHDBan WHERE MaHDBan = N'" + txtMaHDBan.Text + "'"; cboManhanvien.Text = Functions.GetFieldValues(str); str = "SELECT Makhach FROM tblHDBan WHERE MaHDBan = N'" + txtMaHDBan.Text + "'"; cboMakhach.Text = Functions.GetFieldValues(str); str = "SELECT Tongtien FROM tblHDBan WHERE MaHDBan = N'" + txtMaHDBan.Text + "'"; txtTongtien.Text = Functions.GetFieldValues(str); lblBangchu.Text = "Bằng chữ: " + Functions.ChuyenSoSangChu(txtTongtien.Text); }

9.3.5. Viết thủ tục btnThemmoi_Click

private void btnThemmoi_Click(object sender, EventArgs e) { btnXoaHD.Enabled = false; btnLuu.Enabled = true; btnInhoadon.Enabled = false; btnThemmoi.Enabled = false; ResetValues(); txtMaHDBan.Text = Functions.CreateKey("HDB"); Load_DataGridViewChitiet(); }

Với CreateKey là một hàm toàn cục được viết trong Class Functions, có tác dụng sinh khóa tự động cho Mã hóa đơn bán.

9.3.6. Viết hàm CreateKey

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

//Hàm tạo khóa có dạng: TientoNgaythangnam_giophutgiaypublic static string CreateKey(string tiento )

{

Page 47: Chuong 7 Lap Trinh CSDL

string key = tiento; string[] partsDay; partsDay = DateTime.Now.ToShortDateString().Split('/'); //Ví dụ 07/08/2009 string d = String.Format("{0}{1}{2}", partsDay[0], partsDay[1], partsDay[2]); key = key + d; string[] partsTime; partsTime = DateTime.Now.ToLongTimeString().Split(':'); //Ví dụ 7:08:03 PM hoặc 7:08:03 AM if( partsTime[2].Substring(3, 2) == "PM" ) partsTime[0] = ConvertTimeTo24(partsTime[0]); if( partsTime[2].Substring(3, 2) == "AM" ) if( partsTime[0].Length == 1 ) partsTime[0] = "0" + partsTime[0]; //Xóa ký tư trắ8ng và PM hoặc AM partsTime[2] = partsTime[2].Remove(2, 3); string t; t= String.Format("_{0}{1}{2}", partsTime[0], partsTime[1], partsTime[2]); key = key + t; return key; }

Với ConvertTimeTo24 là một hàm toàn cục được viết trong Class Functions, có tác dụng chuyển đổi giờ từ dạng PM sang dạng 24h.

9.3.7. Viết hàm ConvertTimeTo24

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static string ConvertTimeTo24(string hour) { string h = ""; switch (hour) { case "1": h = "13"; break; case "2": h = "14"; break; case "3": h = "15"; break; case "4": h = "16"; break; case "5": h = "17"; break; case "6": h = "18"; break; case "7": h = "19";

Page 48: Chuong 7 Lap Trinh CSDL

break; case "8": h = "20"; break; case "9": h = "21"; break; case "10": h = "22"; break; case "11": h = "23"; break; case "12": h = "0"; break; } return h; }

9.3.8. Viết thủ tục ResetValues

private void ResetValues() { txtMaHDBan.Text = ""; txtNgayban.Text = DateTime.Now.ToShortDateString(); cboManhanvien.Text = ""; cboMakhach.Text = ""; txtTongtien.Text = "0"; lblBangchu.Text = "Bằng chữ: "; cboMahang.Text = ""; txtSoluong.Text = ""; txtGiamgia.Text = "0"; txtThanhtien.Text = "0"; }

9.3.9. Viết thủ tục btnLuu_Click

private void btnLuu_Click(object sender, EventArgs e) { string sql; double sl, SLcon, tong, Tongmoi; sql = "SELECT MaHDBan FROM tblHDBan WHERE MaHDBan=N'" + txtMaHDBan.Text + "'"; if( ! Functions.CheckKey(sql) ) { // Mã hóa đởn chưa có, tiế8n hành lưu các thống tin chung // Mã HDBan được sinh tư động do đó khống có trường hợp trùng khóa if( txtNgayban.Text.Length == 0 ) { MessageBox.Show("Bạn phaOi nhập ngày bán", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); txtNgayban.Focus(); return ; } if( cboManhanvien.Text.Length == 0 )

Page 49: Chuong 7 Lap Trinh CSDL

{ MessageBox.Show("Bạn phaOi nhập nhấn viến", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); cboManhanvien.Focus(); return; } if( cboMakhach.Text.Length == 0 ) { MessageBox.Show("Bạn phaOi nhập khách hàng", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); cboMakhach.Focus(); return; } sql = "INSERT INTO tblHDBan(MaHDBan, Ngayban, Manhanvien, Makhach, Tongtien)

VALUES (N'" + txtMaHDBan.Text.Trim() + "','" + Functions.ConvertDateTime(txtNgayban.Text.Trim()) +

"',N'" + cboManhanvien.SelectedValue + "',N'" + cboMakhach.SelectedValue + "'," + txtTongtien.Text + ")"; Functions.RunSql(sql); } // Lưu thống tin cuOa các mặt hàng if( cboMahang.Text.Trim().Length == 0 ) { MessageBox.Show("Bạn phaOi nhập mã hàng", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); cboMahang.Focus(); return; } if( (txtSoluong.Text.Trim().Length == 0) || (txtSoluong.Text == "0" )) { MessageBox.Show("Bạn phaOi nhập số8 lượng", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtSoluong.Text = ""; txtSoluong.Focus(); return; } if( txtGiamgia.Text.Trim().Length == 0 ) { MessageBox.Show("Bạn phaOi nhập giaOm giá", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Warning); txtGiamgia.Focus(); return; } sql = "SELECT Mahang FROM tblChitietHDBan WHERE MaHang=N'" +

cboMahang.SelectedValue + "' AND MaHDBan = N'" + txtMaHDBan.Text.Trim() + "'"; if(Functions.CheckKey(sql)) { MessageBox.Show("Mã hàng này đã có, bạn phaOi nhập mã khác", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); ResetValuesHang(); cboMahang.Focus(); return;

Page 50: Chuong 7 Lap Trinh CSDL

} // KiếOm tra xem số8 lượng hàng trong kho còn đuO đếO cung cấ8p khống? sl = Convert.ToDouble(Functions.GetFieldValues("SELECT Soluong FROM tblHang

WHERE Mahang = N'" + cboMahang.SelectedValue + "'")); if( Convert.ToDouble(txtSoluong.Text) > sl ) { MessageBox.Show("Số8 lượng mặt hàng này chỉO còn " + sl, "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Information); txtSoluong.Text = ""; txtSoluong.Focus(); return; } sql = "INSERT INTO tblChitietHDBan(MaHDBan,Mahang,Soluong,Giamgia, Thanhtien)

VALUES(N'" + txtMaHDBan.Text.Trim() + "',N'" + cboMahang.SelectedValue + "'," + txtSoluong.Text + "," + txtGiamgia.Text + "," + txtThanhtien.Text + ")";

Functions.RunSql(sql); Load_DataGridViewChitiet(); // Cập nhật lại số8 lượng cuOa mặt hàng vào baOng tblHang SLcon = sl - Convert.ToDouble(txtSoluong.Text); sql = "UPDATE tblHang SET Soluong =" + SLcon + " WHERE Mahang= N'" +

cboMahang.SelectedValue + "'"; Functions.RunSql(sql); // Cập nhật lại tốOng tiến cho hóa đởn bán tong = Convert.ToDouble(Functions.GetFieldValues("SELECT Tongtien FROM tblHDBan

WHERE MaHDBan = N'" + txtMaHDBan.Text + "'")); Tongmoi = tong + Convert.ToDouble(txtThanhtien.Text); sql = "UPDATE tblHDBan SET Tongtien =" + Tongmoi + " WHERE MaHDBan = N'" +

txtMaHDBan.Text + "'"; Functions.RunSql(sql); txtTongtien.Text = Tongmoi.ToString(); lblBangchu.Text = "Bằng chữ: " + Functions.ChuyenSoSangChu(Tongmoi.ToString()); ResetValuesHang(); btnXoaHD.Enabled = true; btnThemmoi.Enabled = true; btnInhoadon.Enabled = true; }

Với ChuyenSoSangChu là một hàm toàn cục được viết trong Class Functions, có tác dụng đọc từ dạng số sang dạng chữ.

9.3.10.Viết hàm ChuyenSoSangChu

Mở cửa sổ lớp Class Functions viết mã lệnh như sau:

public static string ChuyenSoSangChu(string sNumber) { int mLen, mDigit; string mTemp = ""; string[] mNumText; //Xóa các dấ8u "," nế8u có

Page 51: Chuong 7 Lap Trinh CSDL

sNumber = sNumber.Replace(",",""); mNumText = "khống;một;hai;ba;bố8n;nắm;sáu;baOy;tám;chín".Split(';'); mLen = sNumber.Length - 1; // trừ 1 vì thứ tư đi từ 0 for (int i = 0; i <= mLen; i++) { mDigit = Convert.ToInt32(sNumber.Substring(i, 1)); mTemp = mTemp + " " + mNumText[mDigit]; if (mLen == i) // Chữ số8 cuố8i cùng khống cấn xét tiế8p break; switch ((mLen - i) % 9) { case 0: mTemp = mTemp + " tyO"; if (sNumber.Substring(i + 1, 3) == "000") i = i + 3; if (sNumber.Substring(i + 1, 3) == "000") i = i + 3; if (sNumber.Substring(i + 1, 3) == "000") i = i + 3; break; case 6: mTemp = mTemp + " triệu"; if (sNumber.Substring(i + 1, 3) == "000") i = i + 3; if (sNumber.Substring(i + 1, 3) == "000") i = i + 3; break; case 3: mTemp = mTemp + " nghìn"; if (sNumber.Substring(i + 1, 3) == "000") i = i + 3; break; default: switch ((mLen - i) % 3) { case 2: mTemp = mTemp + " trắm"; break; case 1: mTemp = mTemp + " mưởi"; break; } break; } } //Loại boO trường hợp x00 mTemp = mTemp.Replace("khống mưởi khống ", ""); mTemp = mTemp.Replace("khống mưởi khống", ""); //Loại boO trường hợp 00x mTemp = mTemp.Replace("khống mưởi ", "linh "); //Loại boO trường hợp x0, x>=2 mTemp = mTemp.Replace("mưởi khống", "mưởi"); //Fix trường hợp 10 mTemp = mTemp.Replace("một mưởi", "mười"); //Fix trường hợp x4, x>=2 mTemp = mTemp.Replace("mưởi bố8n", "mưởi tư"); //Fix trường hợp x04 mTemp = mTemp.Replace("linh bố8n", "linh tư");

Page 52: Chuong 7 Lap Trinh CSDL

//Fix trường hợp x5, x>=2 mTemp = mTemp.Replace("mưởi nắm", "mưởi lắm"); //Fix trường hợp x1, x>=2 mTemp = mTemp.Replace("mưởi một", "mưởi mố8t"); //Fix trường hợp x15 mTemp = mTemp.Replace("mười nắm", "mười lắm"); //BoO ký tư space mTemp = mTemp.Trim(); //Viế8t hoa ký tư đấu tiến mTemp = mTemp.Substring(0, 1).ToUpper() + mTemp.Substring(1) + " đống"; return mTemp ; }

9.3.11.Viết thủ tục ResetValuesHang

private void ResetValuesHang() { cboMahang.Text = ""; txtSoluong.Text = ""; txtGiamgia.Text = "0"; txtThanhtien.Text = "0"; }

9.3.12.Viết thủ tục DataGridViewChitiet_CellDoubleClick

Thủ tục này cho phép người dùng kích đúp chuột vào một mặt hàng trong lưới để xóa.

private void DataGridViewChitiet_CellDoubleClick(object sender, DataGridViewCellEventArgs e)

{ string mahang; Double Thanhtien; if(tblCTHDB.Rows.Count == 0 ) { MessageBox.Show("Khống có dữ liệu!", "Thống báo", MessageBoxButtons.OK,

MessageBoxIcon.Information); return ; } if((MessageBox.Show("Bạn có chắ8c chắ8n muố8n xóa khống?", "Thống báo",

MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)) { //Xóa hàng và cập nhật lại số8 lượng hàng mahang = DataGridViewChitiet.CurrentRow.Cells["Mahang"].Value.ToString(); DelHang(txtMaHDBan.Text, mahang); // Cập nhật lại tốOng tiến cho hóa đởn bán Thanhtien = Convert.ToDouble(DataGridViewChitiet.CurrentRow.

Cells["Thanhtien"].Value.ToString()); DelUpdateTongtien(txtMaHDBan.Text, Thanhtien); Load_DataGridViewChitiet(); } }

9.3.13.Viết thủ tục DelHang

Page 53: Chuong 7 Lap Trinh CSDL

private void DelHang(string Mahoadon, string Mahang) { Double s, sl, SLcon; string sql; sql = "SELECT Soluong FROM tblChitietHDBan WHERE MaHDBan = N'" + Mahoadon + "'

AND MaHang=N'" + Mahang + "'"; s = Convert.ToDouble(Functions.GetFieldValues(sql)); sql = "DELETE tblChitietHDBan WHERE MaHDBan=N'" + Mahoadon + "' AND Mahang = N'"

+ Mahang + "'"; Functions.RunSqlDel(sql); // Cập nhật lại số8 lượng cho các mặt hàng sql = "SELECT Soluong FROM tblHang WHERE Mahang = N'" + Mahang + "'"; sl = Convert.ToDouble(Functions.GetFieldValues(sql)); SLcon = sl + s; sql = "UPDATE tblHang SET Soluong =" +Slcon + " WHERE Mahang= N'" +Mahang + "'"; Functions.RunSql(sql); }

9.3.14.Viết thủ tục DelUpdateTongtien

private void DelUpdateTongtien(string Mahoadon, double Thanhtien) { Double Tong, Tongmoi; string sql; sql = "SELECT Tongtien FROM tblHDBan WHERE MaHDBan = N'" + Mahoadon + "'"; Tong = Convert.ToDouble(Functions.GetFieldValues(sql)); Tongmoi = Tong - Thanhtien; sql = "UPDATE tblHDBan SET Tongtien =" + Tongmoi + " WHERE MaHDBan = N'" +

Mahoadon + "'"; Functions.RunSql(sql); txtTongtien.Text = Tongmoi.ToString(); lblBangchu.Text = "Bằng chữ: " + Functions.ChuyenSoSangChu(Tongmoi.ToString()); }

9.3.15.Viết thủ tục btnXoaHD_Click

Thủ tục này cho phép xóa toàn bộ thông tin của một hóa đơn

private void btnXoaHD_Click(object sender, EventArgs e) { if (MessageBox.Show("Bạn có chắ8c chắ8n muố8n xóa khống?", "Thống báo",

MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { string[] Mahang = new string[20]; string sql; int n = 0; int i; sql = "SELECT Mahang FROM tblChitietHDBan WHERE MaHDBan = N'" +

txtMaHDBan.Text + "'"; SqlCommand cmd = new SqlCommand(sql, Functions.Conn); SqlDataReader reader = cmd.ExecuteReader();

Page 54: Chuong 7 Lap Trinh CSDL

while (reader.Read()) { Mahang[n] = reader.GetString(0).ToString(); n = n + 1; } reader.Close(); //Xóa danh sách các mặt hàng cuOa hóa đởn for (i = 0 ; i <= n - 1; i++) DelHang(txtMaHDBan.Text, Mahang[i]); //Xóa hóa đởn sql = "DELETE tblHDBan WHERE MaHDBan=N'" + txtMaHDBan.Text + "'"; Functions.RunSqlDel(sql); ResetValues(); Load_DataGridViewChitiet(); btnXoaHD.Enabled = false; btnInhoadon.Enabled = false; } }

9.3.16.Viết thủ tục cboManhanvien_TextChanged

private void cboManhanvien_TextChanged(object sender, EventArgs e) { string str; if (cboManhanvien.Text == "") txtTennhanvien.Text = ""; // Khi kich chon Ma nhan vien thi ten nhan vien se tu dong hien ra str = "Select Tennhanvien from tblNhanvien where Manhanvien =N'" +

cboManhanvien.SelectedValue + "'"; txtTennhanvien.Text = Functions.GetFieldValues(str); }

9.3.17.Viết thủ tục cboMakhach_TextChanged

private void cboMakhach_TextChanged(object sender, EventArgs e) { string str; if (cboMakhach.Text == "") { txtTenkhach.Text = ""; txtDiachi.Text = ""; txtDienthoai.Text = ""; } //Khi kich chon Ma khach thi ten khach, dia chi, dien thoai se tu dong hien ra str="Select Tenkhach from tblKhach where Makhach = N'" + boMakhach.SelectedValue

+ "'"; txtTenkhach.Text = Functions.GetFieldValues(str); str ="Select Diachi from tblKhach where Makhach = N'" + cboMakhach.SelectedValue

+ "'"; txtDiachi.Text = Functions.GetFieldValues(str); str="Select Dienthoai from tblKhach where Makhach= N'" + cboMakhach.SelectedValue

+ "'"; txtDienthoai.Text = Functions.GetFieldValues(str);

Page 55: Chuong 7 Lap Trinh CSDL

}

9.3.18.Viết thủ tục cboMahang_TextChanged

private void cboMahang_TextChanged(object sender, EventArgs e) { string str; if (cboMahang.Text == "") { txtTenhang.Text = ""; txtDongiaban.Text = ""; } // Khi kich chon Ma hang thi ten hang va gia ban se tu dong hien ra str = "SELECT Tenhang FROM tblHang WHERE Mahang =N'" + cboMahang.SelectedValue

+ "'"; txtTenhang.Text = Functions.GetFieldValues(str); str = "SELECT Dongiaban FROM tblHang WHERE Mahang =N'" + cboMahang.SelectedValue

+ "'"; txtDongiaban.Text = Functions.GetFieldValues(str); }

9.3.19.Viết thủ tục txtSoluong_TextChanged

private void txtSoluong_TextChanged(object sender, EventArgs e) { //Khi thay doi So luong, Giam gia thi Thanh tien tu dong cap nhat lai gia tri double tt, sl, dg, gg; if (txtSoluong.Text == "") sl = 0; else sl = Convert.ToDouble(txtSoluong.Text); if (txtGiamgia.Text == "") gg = 0; else gg = Convert.ToDouble(txtGiamgia.Text); if (txtDongiaban.Text == "") dg = 0; else dg = Convert.ToDouble(txtDongiaban.Text); tt = sl * dg - sl * dg * gg / 100; txtThanhtien.Text = tt.ToString(); }

9.3.20.Viết thủ tục txtGiamgia_TextChanged

private void txtGiamgia_TextChanged(object sender, EventArgs e) { //Khi thay doi So luong, Giam gia thi Thanh tien tu dong cap nhat lai gia tri double tt, sl, dg, gg; if (txtSoluong.Text == "") sl = 0; else sl = Convert.ToDouble(txtSoluong.Text);

Page 56: Chuong 7 Lap Trinh CSDL

if (txtGiamgia.Text == "") gg = 0; else gg = Convert.ToDouble(txtGiamgia.Text);

if (txtDongiaban.Text == "") dg = 0; else dg = Convert.ToDouble(txtDongiaban.Text); tt = sl * dg - sl * dg * gg / 100; txtThanhtien.Text = tt.ToString(); }

9.3.21.Viết thủ tục Inhoadon_Click

private void btnInhoadon_Click(object sender, EventArgs e) { // KhởOi động chưởng trình Excel COMExcel.Application exApp = new COMExcel.Application(); COMExcel.Workbook exBook; //Trong 1 chưởng trình Excel có nhiếu Workbook COMExcel.Worksheet exSheet; //Trong 1 Workbook có nhiếu Worksheet COMExcel.Range exRange; string sql; int hang=0, cot=0; DataTable tblThongtinHD, tblThongtinHang; exBook = exApp.Workbooks.Add(COMExcel.XlWBATemplate.xlWBATWorksheet); exSheet = exBook.Worksheets[1]; // Định dạng chung exRange = exSheet.Cells[1, 1]; exRange.Range["A1:B3"].Font.Size = 10; exRange.Range["A1:B3"].Font.Name = "Times new roman"; exRange.Range["A1:B3"].Font.Bold = true; exRange.Range["A1:B3"].Font.ColorIndex = 5; //Màu xanh da trời exRange.Range["A1:A1"].ColumnWidth = 7; exRange.Range["B1:B1"].ColumnWidth = 15; exRange.Range["A1:B1"].MergeCells = true; exRange.Range["A1:B1"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["A1:B1"].Value = "Shop Lấm Anh"; exRange.Range["A2:B2"].MergeCells = true; exRange.Range["A2:B2"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["A2:B2"].Value = "Cấu Giấ8y - Hà Nội"; exRange.Range["A3:B3"].MergeCells = true; exRange.Range["A3:B3"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["A3:B3"].Value = "Điện thoại: (04)37562222"; exRange.Range["C2:E2"].Font.Size = 16; exRange.Range["C2:E2"].Font.Name = "Times new roman"; exRange.Range["C2:E2"].Font.Bold = true; exRange.Range["C2:E2"].Font.ColorIndex = 3; //Màu đoO exRange.Range["C2:E2"].MergeCells = true; exRange.Range["C2:E2"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["C2:E2"].Value = "HÓA ĐƠN BÁN"; // BiếOu diế=n thống tin chung cuOa hóa đởn bán sql = "SELECT a.MaHDBan, a.Ngayban, a.Tongtien, b.Tenkhach, b.Diachi,

Page 57: Chuong 7 Lap Trinh CSDL

b.Dienthoai, c.Tennhanvien FROM tblHDBan AS a, tblKhach AS b, tblNhanvien AS c WHERE

a.MaHDBan = N'" + txtMaHDBan.Text + "' AND a.Makhach = b.Makhach AND a.Manhanvien =

c.Manhanvien"; tblThongtinHD = Functions.GetDataToTable(sql); exRange.Range["B6:C9"].Font.Size = 12; exRange.Range["B6:C9"].Font.Name = "Times new roman"; exRange.Range["B6:B6"].Value = "Mã hóa đởn:"; exRange.Range["C6:E6"].MergeCells = true; exRange.Range["C6:E6"].Value = tblThongtinHD.Rows[0][0].ToString(); exRange.Range["B7:B7"].Value = "Khách hàng:"; exRange.Range["C7:E7"].MergeCells = true; exRange.Range["C7:E7"].Value = tblThongtinHD.Rows[0][3].ToString(); exRange.Range["B8:B8"].Value = "Địa chỉO:"; exRange.Range["C8:E8"].MergeCells = true; exRange.Range["C8:E8"].Value = tblThongtinHD.Rows[0][4].ToString(); exRange.Range["B9:B9"].Value = "Điện thoại:"; exRange.Range["C9:E9"].MergeCells = true; exRange.Range["C9:E9"].Value = tblThongtinHD.Rows[0][5].ToString(); //Lấ8y thống tin các mặt hàng sql = "SELECT b.Tenhang, a.Soluong, b.Dongiaban, a.Giamgia, a.Thanhtien " + "FROM tblChitietHDBan AS a , tblHang AS b WHERE a.MaHDBan = N'" + txtMaHDBan.Text + "' AND a.Mahang = b.Mahang"; tblThongtinHang = Functions.GetDataToTable(sql); //Tạo dòng tiếu đế baOng exRange.Range["A11:F11"].Font.Bold = true; exRange.Range["A11:F11"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["C11:F11"].ColumnWidth = 12; exRange.Range["A11:A11"].Value = "STT"; exRange.Range["B11:B11"].Value = "Tến hàng"; exRange.Range["C11:C11"].Value = "Số8 lượng"; exRange.Range["D11:D11"].Value = "Đởn giá"; exRange.Range["E11:E11"].Value = "GiaOm giá"; exRange.Range["F11:F11"].Value = "Thành tiến"; for (hang = 0 ; hang <= tblThongtinHang.Rows.Count - 1; hang ++) { //Điến số8 thứ tư vào cột 1 từ dòng 12 exSheet.Cells[1][hang + 12] = hang + 1; for (cot = 0 ; cot <= tblThongtinHang.Columns.Count - 1; cot++) //Điến thống tin hàng từ cột thứ 2, dòng 12 exSheet.Cells[cot + 2][hang + 12]= tblThongtinHang.Rows[hang][cot].ToString(); } exRange = exSheet.Cells[cot][hang + 14]; exRange.Font.Bold = true; exRange.Value2 = "TốOng tiến:"; exRange = exSheet.Cells[cot + 1][hang + 14]; exRange.Font.Bold = true; exRange.Value2 = tblThongtinHD.Rows[0][2].ToString(); exRange = exSheet.Cells[1][hang + 15]; //Ô A1 exRange.Range["A1:F1"].MergeCells = true; exRange.Range["A1:F1"].Font.Bold = true; exRange.Range["A1:F1"].Font.Italic = true;

Page 58: Chuong 7 Lap Trinh CSDL

exRange.Range["A1:F1"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignRight; exRange.Range["A1:F1"].Value = "Bằng chữ: " + Functions.ChuyenSoSangChu

(tblThongtinHD.Rows[0][2].ToString ()); exRange = exSheet.Cells[4][hang + 17]; //Ô A1 exRange.Range["A1:C1"].MergeCells = true; exRange.Range["A1:C1"].Font.Italic = true; exRange.Range["A1:C1"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; DateTime d = Convert.ToDateTime(tblThongtinHD.Rows[0][1]); exRange.Range["A1:C1"].Value = "Hà Nội, ngày " + d.Day + " tháng " + d.Month + "

nắm " + d.Year; exRange.Range["A2:C2"].MergeCells = true; exRange.Range["A2:C2"].Font.Italic = true; exRange.Range["A2:C2"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["A2:C2"].Value = "Nhấn viến bán hàng"; exRange.Range["A6:C6"].MergeCells = true; exRange.Range["A6:C6"].Font.Italic = true; exRange.Range["A6:C6"].HorizontalAlignment = COMExcel.XlHAlign.xlHAlignCenter; exRange.Range["A6:C6"].Value = tblThongtinHD.Rows[0][6]; exSheet.Name = "Hóa đởn nhập"; exApp.Visible = true; }

Kết quả ta có tệp Excel như sau:

Page 59: Chuong 7 Lap Trinh CSDL

Hình 17. Giao diện in hoá đơn bán

9.3.22.Viết thủ tục btnTimkiem_Click

private void btnTimkiem_Click(object sender, EventArgs e) { if (cboMaHDBan.Text == "") { MessageBox.Show("Bạn phaOi chọn một mã hóa đởn đếO tìm", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); cboMaHDBan.Focus(); return; } txtMaHDBan.Text = cboMaHDBan.Text; Load_ThongtinHD(); Load_DataGridViewChitiet(); btnXoaHD.Enabled = true;

btnLuu.Enabled = true; btnInhoadon.Enabled = true; cboMaHDBan.SelectedIndex = -1;

Page 60: Chuong 7 Lap Trinh CSDL

}

9.3.23.Viết thủ tục txtSoluong_KeyPress

private void txtSoluong_KeyPress(object sender, KeyPressEventArgs e) { if(((e.KeyChar >='0') && (e.KeyChar <= '9')) || (Convert.ToInt32(e.KeyChar) == 8)) e.Handled = false; else e.Handled = true; }

Thực hiện tương tự cho txtGiamgia_KeyPress.

9.3.24.Viết thủ tục cboMaHDBan_DropDown

Thủ tục này cập nhật lại danh sách các mã hóa đơn bán và lưu vào cboMaHDBan mỗi khi người dùng kích chuột vào nút sổ xuống của cbo.

private void cboMaHDBan_DropDown(object sender, EventArgs e) { Functions.FillCombo("SELECT MaHDBan FROM tblHDBan", cboMaHDBan, "MaHDBan",

"MaHDBan"); cboMaHDBan.SelectedIndex = -1; }

9.3.25.Viết thủ tục frmHoadonBan_FormClosing

private void frmHoadonban_FormClosing(object sender, FormClosingEventArgs e) { //Xóa dữ liệu trong các điếu khiếOn trươc khi đóng Form ResetValues(); }

9.3.26.Viết thủ tục btnDong_Click

private void btnDong_Click(object sender, EventArgs e) { this.Close(); }

10. Xây dựng Form tìm kiếm Hóa đơn bán

Mở một Form mới đặt tên là frmTimHDBan và lưu vào thư mục Forms.

Page 61: Chuong 7 Lap Trinh CSDL

Hình 18. Giao diện form Tìm kiếm hoá đơn bán

10.1. Tạo giao diện form frmTimHDBan

Điều khiển Name Text

Form frmTimHDBan TIM HOA DON BAN

TextBox txtMaHDBan, txtThang, txtNam, txtManhanvien,

txtMakhach, txtTongtien.

DataGridView DataGridView

Button btnTimkiem, btnTimlai, btnDong

10.2. Viết mã lệnh cho form frmTimHDBan

10.2.1. Khai báo các lớp tham chiếu

using System.Data.SqlClient;using Quanlybanhang.Class;

DataTable tblHDB;

10.2.2. Viết thủ tục FormLoad

private void frmTimHDBan_Load(object sender, EventArgs e) {

Page 62: Chuong 7 Lap Trinh CSDL

ResetValues(); DataGridView.DataSource = null; }

10.2.3. Viết thủ tục ResetValues

private void ResetValues() { foreach (Control Ctl in this.Controls) if (Ctl is TextBox) Ctl.Text = ""; txtMaHDBan.Focus(); }

10.2.4. Viết thủ tục btnTimkiem_Click

private void btnTimkiem_Click(object sender, EventArgs e) { string sql; if ((txtMaHDBan.Text == "") && (txtThang.Text == "") && (txtNam.Text == "") && (txtManhanvien.Text == "") && (txtMakhach.Text == "") && (txtTongtien.Text == "")) { MessageBox.Show("Hãy nhập một điếu kiện tìm kiế8m!!!", "Yeu cau ...",

MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } sql = "SELECT * FROM tblHDBan WHERE 1=1"; if( txtMaHDBan.Text != "" ) sql = sql + " AND MaHDBan Like N'%" + txtMaHDBan.Text + "%'"; if( txtThang.Text != "" ) sql = sql + " AND MONTH(Ngayban) =" + txtThang.Text; if( txtNam.Text != "" ) sql = sql + " AND YEAR(Ngayban) =" + txtNam.Text; if( txtManhanvien.Text != "" ) sql = sql + " AND Manhanvien Like N'%" + txtManhanvien.Text + "%'"; if( txtMakhach.Text != "" ) sql = sql + " AND Makhach Like N'%" + txtMakhach.Text + "%'"; if( txtTongtien.Text != "" ) sql = sql + " AND Tongtien <=" + txtTongtien.Text; tblHDB = Functions.GetDataToTable(sql); if( tblHDB.Rows.Count == 0 ) { MessageBox.Show("Khống có baOn ghi thoOa mãn điếu kiện!!!", "Thống báo",

MessageBoxButtons.OK, MessageBoxIcon.Warning); ResetValues(); } else MessageBox.Show("Có "+ tblHDB.Rows.Count + " baOn ghi thoOa mãn điếu kiện!!!",

"Thống báo", MessageBoxButtons.OK, MessageBoxIcon.Warning); DataGridView.DataSource = tblHDB; Load_DataGridView();

Page 63: Chuong 7 Lap Trinh CSDL

}

10.2.5. Viết thủ tục Load_DataGridView

private void Load_DataGridView() { DataGridView.Columns[0].HeaderText = "Mã HĐB"; DataGridView.Columns[1].HeaderText = "Mã nhấn viến"; DataGridView.Columns[2].HeaderText = "Ngày bán"; DataGridView.Columns[3].HeaderText = "Mã khách"; DataGridView.Columns[4].HeaderText = "TốOng tiến"; DataGridView.Columns[0].Width = 150; DataGridView.Columns[1].Width = 100; DataGridView.Columns[2].Width = 80; DataGridView.Columns[3].Width = 80; DataGridView.Columns[4].Width = 80; DataGridView.AllowUserToAddRows = false; DataGridView.EditMode = DataGridViewEditMode.EditProgrammatically; }

10.2.6. Viết thủ tục btnTimlai_Click

private void btnTimlai_Click(object sender, EventArgs e) { ResetValues(); DataGridView.DataSource = null; }

10.2.7. Viết thủ tục txtTongtien_KeyPress

private void txtTongtien_KeyPress(object sender, KeyPressEventArgs e) { if (((e.KeyChar >='0') && (e.KeyChar <= '9'))||(Convert.ToInt32(e.KeyChar)== 8)) e.Handled = false; else e.Handled = true; }

10.2.8. Viết thủ tục DataGridView_DoubleClick

Thủ tục này cho phép người dùng kích đúp chuột chọn một hóa đơn trên lưới, rồi gọi và hiển thị thông tin của hóa đơn đó lên form frmHoadonBan.

Chú ý: trong form frmHoadonBan đổi thuộc tính Modifiers của điều khiển txtMaHDBan thành Public

private void DataGridView_DoubleClick(object sender, EventArgs e) { string mahd; if (MessageBox.Show("Bạn có muố8n hiếOn thị thống tin chi tiế8t?", "Xác nhận",

MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) {

Page 64: Chuong 7 Lap Trinh CSDL

mahd = DataGridView.CurrentRow.Cells["MaHDBan"].Value.ToString(); frmHoadonban frm = new frmHoadonban(); frm.txtMaHDBan.Text = mahd; frm.StartPosition = FormStartPosition.CenterScreen; frm.ShowDialog(); } }

10.2.9. Viết thủ tục btnDong_Click

private void btnDong_Click(object sender, EventArgs e) { this.Close(); }

Page 65: Chuong 7 Lap Trinh CSDL

CHƯƠNG 1.

NÂNG CẤP VÀ HOÀN THIỆN GIAO DIỆN

1. Điều khiển DataGridView và cách nhập dữ liệu trực tiếp trên lưới

Viết chương trình quản lý điểm của sinh viên, cho phép Thêm, Xem, Sửa, Xoá điểm trực tiếp trên lưới.

Tạo một dự án mới đặt tên là QuanlyDiem.

1.1. Tạo cơ sở dữ liệu

Tạo mới cơ sở dữ liệu đặt tên là Diem.mdf gồm các bảng như sau:

Bảng btlLop

Bảng tblSinhvien

Bảng tblDiem

Page 66: Chuong 7 Lap Trinh CSDL

Giả sử bảng tblLop và tblSinhvien đã có sẵn dữ liệu như sau (để nhập dữ liệu cho các bảng tại SQL, trong cửa sổ Server Explorer kích chuột phải tại tên bảng, chọn Show Table Data và nhập dữ liệu cho các dòng của bảng).

Bảng tblLop

Bảng tblSinhvien

Chú ý : Tạo kết nối tới CSDL được thực hiện tương tự như mục 2.8 của chương 7.

1.2. Xây dựng form cho chương trình

Sửa lại một số thuộc tính của Form1 và thêm các điều khiển như sau:

Điều khiển Name Text

Form frmDiem QUAN LY DIEM

Button btnNhapdiem, btnCapnhat, btnDong

ComboBox cboLop

DataGridView DataGridView

1.3. Viết mã lệnh Form frmDiem

Giả sử đã có lớp Functions trong thư mục Class.

Page 67: Chuong 7 Lap Trinh CSDL

3/- TreeView

Là điều khiển để hiển thị hệ thống phân cấp như cấu trúc tổ chức, gia phả, hệ thống thư mục, …

Điều khiển TreeView

Các thuộc tính thường dùng của TreeView :

Nodes

Tập hợp các nút con của TreeView.

CheckBoxes

Hiển thị CheckBox cho mỗi Node hay không.

SelectedNode

Node được chọn trên TreeView (chỉ có khi viết lệnh).

Page 68: Chuong 7 Lap Trinh CSDL

HideSelection

Thuộc tính luận lý, mặc định là True, node được chọn không hiển thị màu chọn khi điều khiển không còn focus. Nếu là False nút chọn vẫn được tô dạng chọn khi điều khiển mất focus.

ImageList

Chỉ định điều khiển ImageList có sẵn trên form làm nguồn hình ảnh cho TreeView.

ImageIndex, ImageKey

Quy định hình ảnh mặc định nào trên ImageList hiển thị trên mỗi node của TreeView.

Indent

Quy định khoảng cách theo chiều ngang giữa mỗi cấp.

ItemHeight

Quy định chiều cao của mỗi node.

SelectedImageIndex, SelectedImageKey

Quy định hình ảnh nào trên ImageList hiển thị trên node được chọn.

Các thuộc tính của node :

Nodes

Tập hợp các nút con của mình.

Text

Nội dung đang hiển thị trên nút.

NodeFont

Font chữ hiển thị của nút.

BackColor, ForeColor

Màu nền, màu chữ của nút.

Page 69: Chuong 7 Lap Trinh CSDL

Checked

CheckBox của nút được chọn hay không.

Các thao tác trên Node :

Thêm Node con vào tập hợp Nodes :

Hoặc

Loại bỏ Node con khỏi tập hợp Nodes :

Hoặc

Loại bỏ tất cả các Node con khỏi tập hợp Nodes :

Xác định Node tại vị trí nhấn chuột (MouseDown) :

Các sự kiện chính trên TreeView :

AfterSelect

Sự kiện xảy ra khi người dùng chọn một node.