Xây dựng một cơ sở dữ liệu bán hàng

Skip to content

Bài tập và thực hành 11 BẢO MẬT Cơ SỞ DỮ LIỆU Mục đích, yêu cầu Qua bài toán quản lí một cơ sở kinh doanh, HS cần đạt được các yêu cầu sau: Hiểu thêm khái niệm và tầm quan trọng của bảo mật CSDL; Biết một số cách thông dụng bảo mật CSDL; Có thái độ đúng đắn trong việc sử dụng và bảo mật CSDL. Nội dung Bài 1. Một cửa hàng bán buôn hàng điện tử thường xuyên nhận hàng từ một số công ti và bán lại cho các khách hàng. Hàng nhập và xuất trực tiếp từ kho của cửa hàng [để bài toán đơn giản, hạn chế chỉ có một thủ kho kiêm người giao hàng]. Cửa hàng này đã xây dựng một CSDL BAN_HANG [bán hàng] gồm các bảng sau: Bảng MAT_HANG [mặt hàng – quản lí các mặt hàng] MaHang TenHang DonVi GiaMua HangSX GiaBan [Mã hàng] [Tên hàng] [Đon vị tính] [Giá mua 1 đơn vị] [Hãng sản xuất] [Giá bán 1 đon vị] [1] [2] [3] [4] [5] [6] Bảng KHACH_HANG [khách hàng – quản lí khách hàng] MaKhach HoTen DiaChiKh DienThoaiKh TaiKhoanKh [Mã Khách hàng] [Họ và tên] [Địa chỉ] [Số điện thoại] [Tài khoản] [1] [2] [3] [4] [5] Bảng CONG_TI [công ti – quản lí các công ti cung cấp hàng] MaCT TenCT DiaChiCT DienThoaiCT TaiKhoanCT [Mã Công ti] [Tên Công ti] [Địa chỉ Công ti] [Số điện thoại Công ti] [Tài khoản Cõng ti] [1] [2] [3] [4] [5] Bảng PHIEILNHAP [phiếu nhập – quản lí phiếu nhập hàng] SoPhieuNhap MaCT MaHang SoLuong NgayNhap [Số phiếu nhập] [Mã Công ti] [Mã hàng] [Số lượng] [Ngày nhập] [1] [2] [3] [4] [5] Bảng PHIEU_XUAT [phiếu xuất – quản lí phiếu xuất hàng] SoPhieuXuat NgayXuat MaKhach MaHang SoLuong GiaBan [Số phiếu xuất] [Ngày xuất] [Mã Khách hàng] [Mã hàng] [Số lượng] [Giá bán 1 đơn vị] [1] [2] [3] [4] [5] [6] Các đối tượng sử dụng chương trình quản lí CSDL BAN_HANG là: Khách hàng; Thủ kho [kiêm người giao hàng]; Kế toán; Người quản lí cửa hàng. Theo em, mỗi đối tượng trên sẽ yêu cầu chương trình có những chức năng gì? Bài 2. Giả sử chương trình có các chức năng: . – Khách hàng được biết tên, số lượng các mặt hàng còn trong cửa hàng, một số thông tin cần thiết về mặt hàng. Thủ kho biết được tình hình hàng nhập, xuất và tồn kho. Kế toán biết được tình hình thu, chi. Người quản lí cửa hàng biết được mọi thông tin, trong đó đặc biệt quan tâm về tình hình xuất/nhập từng loại mặt hàng, tình hình kinh doanh của từng mặt hàng. Bảo mật CSDL. Nếu chức năng bảo mật CSDL được thực hiện bằng bảng phân quyền, thì. từng đối tượng nêu trên có thể được trao những quyền nào? Trong bảng phân quyền kí hiệu: đọc [Đ], sửa [S], bổ sung [B], xoá [X], không được truy cập [K]. Trong một số bảng dữ liệu; -đối tượng không được quyền Đ, s, B, X đối với một số cột thì ghi K kèm theo chỉ số cột. Ví dụ, quyền của đối tượng khách hàng đối với bảng MAT_HANG nếu ghi Đ[K4] thì được hiểu khách hàng có quyền đọc các cột của bảng dữ liệu MAT_HANG trừ cột 4 [là cột giá mua mặt hàng từ công ti cung cấp hàng cho cửa hàng, khách hàng không được biết giá mua mà chỉ được biết giá bán mặt hàng này]. Dưới đây là một bảng thể hiện phân quyền, theo em có những điểm nào chưa phù hợp, vì sao? MAT_HANG KHACH_HANG CONG_TI PHIEU_NHAP PHIEU_XUAT Khách hàng . Đ[K4] K K K K Cõng ti . K K K K K Thủ kho+Giao hàng Đ[K4] Đ Đ Đ Đ Kế toán Đ Đ Đ Đ, B, s, X Đ, B, s, X Quản lí Đ, B, s, X Đ, B, s, X Đ, B, s, X Đ Đ Bài 3. Khi xây dựng CSDL, người ta thường tạo giao diện có trang đầu tiên chứa các nút lệnh yêu cầu người dùng khai báo định danh [tên, mật khẩu] và xác định quyền truy cập. Sau khi khai báo, trang tiếp theo được mở sẽ hiển thị một danh sách các chức năng tương ứng với những quyền truy cập mà người dùng được phép sử dụng. Người dùng chỉ có thể sử dụng những chức năng này để truy cập phận dữ liệu với các mức phân quyền mà người lập trình đã dành cho.

Theo em, vì sao người ta làm như vậy?

Video liên quan

Source: //sangtaotrongtamtay.vn
Category: Công nghệ

Tóm tắt nội dung tài liệu

  1. cở sở dữ liệu Nhóm 1 Lớp hp:1201 Đề tài: Thiết kế cơ sở dữ liệu quản lý bán hàng
  2. Mở đầu
  3. Bài toán cụ thể Cửa hàng THẾ GIỚI DI ĐỘNG cần quản lý việc bán các mặt hàng với mô tả như sau: - Khi bán hàng, cửa hàng sẽ lưu lại thông tin c ủa khách hàng : mã khách hàng, tên khách hàng , địa chỉ, số điện thoại - Mỗi lần bán hàng : cửa hàng sẽ tạo ra các hóa đơn bán để lưu giữ thông tin. Các hóa đơn bán này bao gồm : số hóa đ ơn, tên mặt hàng bán,ngày bán, số lượng bán, đơn giá, s ố ti ền bán hàng. - Mỗi hóa đơn sẽ do một nhân viên phụ trách việc tạo lập và lưu trữ tại thời điểm bán hàng. Thông tin về các nhân viên nh ư : mã nhân viên [mỗi nhân viên có một mã số riêng] , tên nhân viên ,địa chỉ, giới tính,số điện thoại cũng được công ty lưu trữ để tiện việc quản lý.
  4. II.Xây dựng các mô hình thực thể liên kết 1.Xác định các thực thể NV[Ma NV,Ho ten, Đia chi, Ngay sinh,Gioi • tinh,SDT] HDBAN[Ma HDBAN, Ten mat hang, Ngay • ban, So luong, Don gia, Tong tien] K_HANG[Ma K_HANG,Ho ten, Dia chi, • SDT K_HANG] Trong đó SDT K_HANG là một thuộc tính đa trị
  5. II.Xây dựng các mô hình thực thể liên kết 2.Mối quan hệ giữa các thực thể a. Mối quan hệ giữa NV và HD_BAN b.Mối quan hệ giữa K_HANG và HD_BAN
  6. Mô hình thực thể liên kết Dia So chi Ten luong MA Ho MH HDBAN ten Ma NV 1,n [1,1] HDBAN NV Don gia Lập 1 1, Tong Gioi tinh Ngay tien Đặ t sinh bở i Ngay ban SDT 1,n K_HANG SDT K_HANG Ma K_HANG Dia chi Ho ten
  7. III.Chuyển sang mô hình quan hệ 1.Chuyển các tập thực thể liên kết thành các quan hệ cùng tên và tập thuộc tính và quan hệ không chứa thuộc tính đa trị - NV[Ma NV, Ho ten, Dia chi, Ngay sinh, Gioi tinh, SDT] - HDBAN[Ma HD_BAN,Ten MH,Ngay ban, So luong, Don gia, Tong tien] - K_HANG[Ma K_HANG, Ho ten, Dia chi]
  8. III.Chuyển sang mô hình quanị hệ 2.Biến đổi thuộc tính đa tr • SDT K_HANG[SDT K_HANG,Ma • K_HANG]
  9. III.Chuyển sang mô hình quan hệ 3.Xử lý các mối quan hệ • Mối quan hệ 1-n – HDBAN[Ma HDBAN,Ma NV,Ma K_HANG,Ten MH,Ngay • ban,So luong,Don gia[VND],Tong tien[VND]].
  10. III.Chuyển sang mô hình quan hệ 4.Mô tả chi tiết các quan hệ a.Quan hệ NV[nhân viên]
  11. III.Chuyển sang mô hình quan hệ b.Quan hệ HDBAN[ hóa đơn bán hàng]
  12. III.Chuyển sang mô hình quan hệ c.Mối quan hệ K_HANG[ khách mua hàng] Tên thuộc tính Diễn giải Kiểu dữ Loại dữ Khóa Khóa ngọi liệu liệu chính Mã số khách hàng Bắt buộc Ma K_HANG Text x Họ tên khách hàng Bắt buộc Ho ten Text Địa chỉ khách hàng Bắt buộc Dia chi Text
  13. III.Chuyển sang mô hình quan hệ d.Mối quan hệ SDT K_HANG[số điện thoại khách hàng] Tên thuộc tính Diễn giải Kiểu dữ Loại dữ liệu Khóa chính Khóa ngoại liệu Số điện thoại khách hàng Bắt buộc SDT K_HANG Number x Mã số khách hang Bắt buộc Ma K_HANG Text x
  14. III.Chuyển sang mô hình quan hệ 5.Lược đồ quan hệ Ma NV Ho ten Dia chi Ngay sinh Gioi tinh SDT NV Ma HDBAN Ma NV Ma K_HANG Ten MH Ngay ban So luon Don gia Tong tien HDBAN Ma K_HANG Ho ten Dia chi SDT K_HANG SDT K_HANG Ma K_HANG SDT K_HANG
  15. IV.Cài đặt trong máy tính 1.Tạo bảng và liên kết • Kết quả sau khi tạo bảng và • nhập dữ liệu 2.Thực hiện • truy vấn
  16. Thanks for the listen!

Page 2

LAVA

Cửa hàng THẾ GIỚI DI ĐỘNG cần quản lý việc bán các mặt hàng với mô tả như sau: - Khi bán hàng, cửa hàng sẽ lưu lại thông tin của khách hàng : mã khách hàng, tên khách hàng , địa chỉ, số điện thoại - Mỗi lần bán hàng : cửa hàng sẽ tạo ra các hóa đơn bán để lưu giữ thông tin. Các hóa đơn bán này bao gồm : số hóa đơn, tên mặt hàng bán,ngày bán, số lượng bán, đơn giá, số tiền bán hàng. - Mỗi hóa đơn sẽ do một nhân viên phụ trách việc tạo lập và lưu trữ tại...

14-11-2012 3726 191

Download

Giấy phép Mạng Xã Hội số: 670/GP-BTTTT cấp ngày 30/11/2015 Copyright © 2009-2019 TaiLieu.VN. All rights reserved.

Giới thiệu

Với sự ra đời của .Net và Visual Studio của Microsoft, việc xây dựng một chương trình quản lý với cơ sở dữ liệu đã đơn giản hơn rất nhiều. Bài này hướng dẫn bạn cách tạo ứng dụng quản lý bán hàng lưu niệm sử dụng ngôn ngữ lập trình C# và hệ quản trị cơ sở dữ liệu SQL Server. Tham khảo thêm khoá học đầy đủ lập trình .NET và khoá thành thạo với lập trình C#.

1. Yêu cầu

Xây dựng chương trình quản lý cửa hàng Bán hàng lưu niệm sử dụng ngôn ngữ C# và hệ quản trị cơ sở dữ liệu SQL Server. Hệ thống có các chức năng cơ bản như quản lý mặt hàng, quản lý khách hàng, quản lý hoá đơn bán. Cửa hàng có thể có một hoặc nhiều người bán, với mỗi hoá đơn bán hàng phải có thông tin của người bán cho khách hàng cụ thể.

2. Thiết kế cơ sở dữ liệu

a] Tạo ứng dụng mới

– Tên project: QuanLyBanHang

b] Tạo cơ sở dữ liệu

– Trong cửa sổ  Solution Explorer, nháy phải chuột lên tên ứng dụng, chọn Add ->New Item… Chọn Data -> Service-based Database [hoặc SQL Database trong Visual Studio Net 2005].

– Đặt tên cơ sở dữ liệu: Quanlybanhang.mdf

– Tạo các bảng: Trong cửa sổ Server Explorer, chọn cơ sở dữ liệu, nháy phải lên Tables, chọn Add New Table…

Bảng tblChatLieu [chất liệu]

Bảng tblKhach [khách]

Bảng tblHang [hàng]

Bảng tblNhanVien [nhân viên]

Bảng tblHDBan [hoá đơn bán]

Bảng tblChiTietHDBan [chi tiết hoá đơn bán]

Quan hệ giữa các bảng [Relationship]

Một số chú ý

– Để cho phép người dùng sửa đổi thông tin của các bảng, thực hiện như sau:

Vào Tools -> Options, chọn Database Tools ->Table and Database Designers, bỏ dấu chọn ở mục Prevent saving changes that require table re-creation.

– Xoá liên kết tới bản sao cơ sở dữ liệu: trong cửa sổ Solution Explorer, nháy phải lên file dữ liệu [Quanlybanhang.mdf], chọn Exclude From Project

– Thực hiện kết nối dữ liệu:

Trong Server Explorer, nháy phải Data Connections, chọn Add Connection, chọn Microsoft SQL Server Database File, nhấn Continue. Trong hộp thoại Add Connection, nhấn Browse tìm file dữ liệu [Quanlybanhang.mdf] [tìm đến thư mục Project của bạn]. Nhấn Test Connection, nếu thành công sẽ xuất hiện thông báo “Test connection succeeded”.

– Nên tạo thư mục chứa ảnh: nháy phải lên tên project QuanLyBanHang, chọn Add, chọn New Folder, đặt tên thư mục là Images. Nháy phải lên thư mục Images, chọn Add, chọn Existing Item và duyệt chọn các file ảnh, nhấn Add để thêm vào thư mục Images.

Xem video hướng dẫn

3. Thiết kế giao diện

a] Form chính

– Tên form: frmMain

Các thành phần của menu

Name Text
mnuFile Tập tin
mnuThoat     Thoát
mnuDanhMuc Danh mục
mnuChatLieu      Chất liệu
mnuNhanVien      Nhân viên
mnuKhachHang      Khách hàng
mnuHangHoa      Hàng hoá
mnuHoaDon Hoá đơn
mnuHoaDonBan      Hoá đơn bán
mnuTimKiem Tìm kiếm
mnuFindHoaDon      Hoá đơn
mnuFindHang      Hàng
mnuFindKhachHang      Khách hàng
mnuBaoCao Báo cáo
mnuBCHangTon      Hàng tồn
mnuBCDoanhThu      Doanh thu
mnuTroGiup Trợ giúp
mnuHienTroGiup      Trợ giúp
mnuVaiNet      Vài nét

Xem Video hướng dẫn

b] Form Danh mục chất liệu

 Tên form: frmDMChatLieu

Các thành phần trên form:

Điều khiển Name Text
TextBox txtMaChatLieu
txtTenChatLieu
Button btnThem Thêm
btnXoa Xoá
btnSua Sửa
btnLuu Lưu
btnBoqua Bỏ qua
btnDong Đóng
DataGridView dgvChatLieu

Xem Video hướng dẫn

c] Form Danh mục nhân viên

 Tên form: frmDMNhanvien

Các thành phần trên form:

Điều khiển Name Text
TextBox txtMaNhanVien
txtTenNhanVien
txtDiaChi
Button btnThem, btnXoa, btnSua, btnLuu, btnBoQua, btnDong
CheckBox chkGioiTinh Nam
MaskedTextBox mtbDienThoai Mask: Phone Number
mskNgaySinh Mask: Short Date
DataGridView dgvNhanVien

Xem Video hướng dẫn

d] Form Danh mục Khách Hàng

 Tên form: frmDMKhachHang

Các thành phần trên form:

Điều khiển Name Text
TextBox txtMaKhach
txtTenKhach
txtDiaChi
Button btnThem, btnXoa, btnSua, btnLuu, btnBoQua, btnDong
MaskedTextBox mtbDienThoai Mask: Phone Number
DataGridView dgvKhachHang

Xem Video hướng dẫn

e] Form Danh mục hàng hoá

 Tên form: frmDMHang

Các thành phần trên form

Điều khiển Name
TextBox txtMaHang, txtTenHang, txtSoLuong,  txtDonGiaNhap, txtDonGiaBan, txtAnh,  txtGhiChu
ComboBox cboMaChatLieu
PictureBox picAnh [thuộc tính SizeMode = Zoom]
DataGridView dgvHang
Button btnThem, btnXoa, btnSua, btnLuu, btnBoQua, btnTimKiem, btnHienThi, btnDong, btnOpen

Xem Video hướng dẫn

f] Form Hoá đơn bán hàng

 Tên form: frmHoaDonBan

Các thành phần trên form

Điều khiển Name Text
Label lblBangChu Bằng chữ:
TextBox txtMaHDBan, txtNgayBan, txtTenNhanVien,txtTenKhach, txtDiaChi, txtDienThoai, txtTongTien, txtTenHang, txtDonGiaBan, txtSoLuong, txtGiamGia, txtThanhTien.
ComboBox cboMaNhanVien, cboMaKhach, cboMaHang, cboMaHDBan.
DataGridView dgvHDBanHang
Button btnNgay, btnThem, btnLuu, btnXoa, btnInHoaDon, btnDong,  btnTimKiem

Xem Video hướng dẫn

g] Form Tìm kiếm hoá đơn

 Tên form: frmTimHDBan

Các thành phần trên form

Điều khiển Name
TextBox txtMaHDBan, txtThang, txtNam, txtMaNhanVien, txtMaKhach, txtTongTien.
DataGridView dgvTKHoaDon
Button btnTimKiem, btnTimLai, btnDong

Xem Video hướng dẫn

Chú ý:

– Tất cả các form [trừ frmMain], thuộc tính StartPostion = CenterParent, ShowInTaskbar = False

4. Xử lý sự kiện

4.1. Lớp Functions

– Chứa các phương thức dùng chung

– Trong khung Solution Explorer, nháy phải lên tên project, chọn Add -> New Folder, đặt tên thư mục là Class

– Nháy phải thư mục Class, nháy phải chọn Add -> Class, đặt tên Functions.cs

– Trong class Functions:

+ Khai báo bổ sung các thư viện:

using System.Data; using System.Data.SqlClient; using System.Windows.Forms; // Sử dụng đối tượng MessageBox

+ Viết 2 phương thức: Connect[] và Disconnect[]

namespace QuanLyBanHang.Class { class Functions { public static SqlConnection Con; //Khai báo đối tượng kết nối public static void Connect[] { Con = new SqlConnection[]; //Khởi tạo đối tượng Con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\Quanlybanhang.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; Con.Open[]; //Mở kết nối //Kiểm tra kết nối if [Con.State == ConnectionState.Open] MessageBox.Show["Kết nối thành công"]; else MessageBox.Show["Không thể kết nối với dữ liệu"]; } public static void Disconnect[] { if [Con.State == ConnectionState.Open] { Con.Close[]; //Đóng kết nối Con.Dispose[]; //Giải phóng tài nguyên Con = null; } } }

4.2. Form frmMain

a] Sự kiện frmMain_Load

private void frmMain_Load[object sender, EventArgs e] { Class.Functions.Connect[]; //Mở kết nối }

b] Sự kiện mnuThoat_Click

private void mnuThoat_Click[object sender, EventArgs e] { Class.Functions.Disconnect[]; //Đóng kết nối Application.Exit[]; //Thoát }

c] Hiển thị các form khác

Cú pháp:

= new []; //Khởi tạo đối tượng

.ShowDialog[]; //Hiển thị dưới dạng hộp thoại

Hoặc .Show[]; //Hiện thị dạng thông thường

+ Hiển thị form frmChatLieu

private void mnuChatLieu_Click[object sender, EventArgs e] { frmDMChatLieu frmChatLieu = new frmDMChatLieu[]; //Khởi tạo đối tượng frmChatLieu.ShowDialog[]; //Hiển thị }

4.3. Form Chất liệu

a] Khai báo

– Khai báo

using System.Data.SqlClient; //Sử dụng thư viện để làm việc SQL server using QuanLyBanHang.Class; //Sử dụng class Functions.cs

– Khai báo biến toàn cục

DataTable tblCL; //Chứa dữ liệu bảng Chất liệu

b] Sự kiện frmDMChatLieu_Load

private void frmDMChatLieu_Load[object sender, EventArgs e] { txtMaChatLieu.Enabled = false; btnLuu.Enabled = false; btnBoQua.Enabled = false; LoadDataGridView[]; //Hiển thị bảng tblChatLieu }

Trong đó, phương thức LoadDataGridView có tác dụng lấy dữ liệu từ bảng tblChatLieu đổ vào DataGridView

c] Phương thức LoadDataGridView

private void LoadDataGridView[] { string sql; sql = "SELECT MaChatLieu, TenChatLieu FROM tblChatLieu"; tblCL = Class.Functions.GetDataToTable[sql]; //Đọc dữ liệu từ bảng dgvChatLieu.DataSource = tblCL; //Nguồn dữ liệu dgvChatLieu.Columns[0].HeaderText = "Mã chất liệu"; dgvChatLieu.Columns[1].HeaderText = "Mã chất liệu"; dgvChatLieu.Columns[0].Width = 100; dgvChatLieu.Columns[1].Width = 300; dgvChatLieu.AllowUserToAddRows = false; //Không cho người dùng thêm dữ liệu trực tiếp dgvChatLieu.EditMode = DataGridViewEditMode.EditProgrammatically; //Không cho sửa dữ liệu trực tiếp }

Với GetDataToTable đượ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.

d] Phương thức GetDataToTable

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

//Lấy dữ liệu vào bảng public static DataTable GetDataToTable[string sql] { SqlDataAdapter dap = new SqlDataAdapter[]; //Định nghĩa đối tượng thuộc lớp SqlDataAdapter //Tạo đối tượng thuộc lớp SqlCommand dap.SelectCommand = new SqlCommand[]; dap.SelectCommand.Connection = Functions.Con; //Kết nối cơ sở dữ liệu dap.SelectCommand.CommandText = sql; //Lệnh SQL //Khai báo đối tượng table thuộc lớp DataTable DataTable table = new DataTable[]; dap.Fill[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:

//Lấy dữ liệu vào bảng public static DataTable GetDataToTable[string sql] { SqlDataAdapter dap = new SqlDataAdapter[sql, Con]; //Định nghĩa đối tượng thuộc lớp SqlDataAdapter //Khai báo đối tượng table thuộc lớp DataTable DataTable table = new DataTable[]; dap.Fill[table]; //Đổ kết quả từ câu lệnh sql vào table return table; }

Xem Video hướng dẫn

e] Phương thức dgvChatLieu_Click

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

private void dgvChatLieu_Click[object sender, EventArgs e] { if [btnThem.Enabled == false] { MessageBox.Show["Đang ở chế độ thêm mới!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaChatLieu.Focus[]; return; } if [tblCL.Rows.Count == 0] //Nếu không có dữ liệu { MessageBox.Show["Không có dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } txtMaChatLieu.Text = dgvChatLieu.CurrentRow.Cells["MaChatLieu"].Value.ToString[]; txtTenChatLieu.Text = dgvChatLieu.CurrentRow.Cells["TenChatLieu"].Value.ToString[]; btnSua.Enabled = true; btnXoa.Enabled = true; btnBoQua.Enabled = true; }

f] Phương thứ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; ResetValue[]; //Xoá trắng các textbox txtMaChatLieu.Enabled = true; //cho phép nhập mới txtMaChatLieu.Focus[]; }

Với ResetValues là phương thức 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.

g] Phương thức ResetValues

private void ResetValue[] { txtMaChatLieu.Text = ""; txtTenChatLieu.Text = ""; }

h] Phương thức btnLuu_Click

Phương thứ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; //Lưu lệnh sql if [txtMaChatLieu.Text.Trim[].Length == 0] //Nếu chưa nhập mã chất liệu { MessageBox.Show["Bạn phải nhập mã chất liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaChatLieu.Focus[]; return; } if[txtTenChatLieu.Text.Trim[].Length==0] //Nếu chưa nhập tên chất liệu { MessageBox.Show["Bạn phải nhập tên chất liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtTenChatLieu.Focus[]; return; } sql = "Select MaChatLieu From tblChatLieu where MaChatLieu=N'" + txtMaChatLieu.Text.Trim[] + "'"; if [Class.Functions.CheckKey[sql]] { MessageBox.Show["Mã chất liệu này đã có, bạn phải nhập mã khác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning]; txtMaChatLieu.Focus[]; return; } sql = "INSERT INTO tblChatLieu VALUES[N'" + txtMaChatLieu.Text + "',N'" + txtTenChatLieu.Text +"']"; Class.Functions.RunSQL[sql]; //Thực hiện câu lệnh sql LoadDataGridView[]; //Nạp lại DataGridView ResetValue[]; 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 phương thức được viết trong lớp Functions.

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.

i] Hàm CheckKey

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

//Hàm kiểm tra khoá trùng public static bool CheckKey[string sql] { SqlDataAdapter dap = new SqlDataAdapter[sql,Con]; DataTable table = new DataTable[]; dap.Fill[table]; if [table.Rows.Count > 0] return true; else return false; }

j] Phương thức RunSQL

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

//Hàm thực hiện câu lệnh SQL public static void RunSQL[string sql] { SqlCommand cmd; //Đối tượng thuộc lớp SqlCommand cmd = new SqlCommand[]; cmd.Connection = Con; //Gán kết nối cmd.CommandText = sql; //Gán lệnh SQL try { cmd.ExecuteNonQuery[]; //Thực hiện câu lệnh SQL } catch [Exception ex] { MessageBox.Show[ex.ToString[]]; } cmd.Dispose[];//Giải phóng bộ nhớ 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.

k] Phương thức btnSua_Click

Khi người dùng nháy 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 đó.

Phương thứ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; //Lưu câu lệnh 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 == ""] //nếu chưa chọn bản ghi nào { MessageBox.Show["Bạn chưa chọn bản ghi nào", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [txtTenChatLieu.Text.Trim[].Length==0] //nếu chưa nhập tên chất liệu { MessageBox.Show["Bạn chưa nhập tên chất liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } sql = "UPDATE tblChatLieu SET TenChatLieu=N'" + txtTenChatLieu.Text.ToString[] + "' WHERE MaChatLieu=N'" + txtMaChatLieu.Text + "'"; Class.Functions.RunSQL[sql]; LoadDataGridView[]; ResetValue[]; btnBoQua.Enabled = false; }

l] Phương thứ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 == ""] //nếu chưa chọn bản ghi nào { MessageBox.Show["Bạn chưa chọn bản ghi nào", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [MessageBox.Show["Bạn có muốn xoá không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question] == DialogResult.Yes] { sql = "DELETE tblChatLieu WHERE MaChatLieu=N'" + txtMaChatLieu.Text + "'"; Class.Functions.RunSqlDel[sql]; LoadDataGridView[]; ResetValue[]; } }

m] Phương thức RunSQLDel

Phương thứ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.Con; cmd.CommandText = sql; try { cmd.ExecuteNonQuery[]; } catch [Exception ex] { //MessageBox.Show["Dữ liệu đang được dùng, không thể xoá...", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Stop]; MessageBox.Show[ex.ToString[]]; } cmd.Dispose[]; cmd = null; }

n] Phương thức btnBoQua_Click

Phương thức này đượ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] { ResetValue[]; btnBoQua.Enabled = false; btnThem.Enabled = true; btnXoa.Enabled = true; btnSua.Enabled = true; btnLuu.Enabled = false; txtMaChatLieu.Enabled = false; }

o] Phương thức dùng phím Enter thay cho phím Tab

private void txtMaChatLieu_KeyUp[object sender, KeyEventArgs e] { if [e.KeyCode == Keys.Enter] SendKeys.Send["{TAB}"]; }

Thực hiện tương tự cho txtTenChatLieu_KeyUp
p] Phương thức btnDong_Click

private void btnDong_Click[object sender, EventArgs e] { this.Close[]; }

Xem video hướng dẫn phần trên

4.4. Form Danh mục Nhân viên

a] Khai báo

– Thư viện:

using System.Data; using System.Data.SqlClient; using QuanLyBanHang.Class;

– Biến:

DataTable tblNV; //Lưu dữ liệu bảng nhân viên

b] Phương thức frmDMNhanvien_Load

private void frmDMNhanvien_Load[object sender, EventArgs e] { txtMaNhanVien.Enabled = false; btnLuu.Enabled = false; btnBoQua.Enabled = false; LoadDataGridView[]; }

c] Phương thức LoadDataGridView – Hiển thị dữ liệu lên lưới

public void LoadDataGridView[] { string sql; sql = "SELECT MaNhanVien,TenNhanVien,GioiTinh,DiaChi,DienThoai,NgaySinh FROm tblNhanVien"; tblNV = Functions.GetDataToTable[sql]; //lấy dữ liệu dgvNhanVien.DataSource = tblNV; dgvNhanVien.Columns[0].HeaderText = "Mã nhân viên"; dgvNhanVien.Columns[1].HeaderText = "Tên nhân viên"; dgvNhanVien.Columns[2].HeaderText = "Giới tính"; dgvNhanVien.Columns[3].HeaderText = "Địa chỉ"; dgvNhanVien.Columns[4].HeaderText = "Điện thoại"; dgvNhanVien.Columns[5].HeaderText = "Ngày sinh"; dgvNhanVien.Columns[0].Width = 100; dgvNhanVien.Columns[1].Width = 150; dgvNhanVien.Columns[2].Width = 100; dgvNhanVien.Columns[3].Width = 150; dgvNhanVien.Columns[4].Width = 100; dgvNhanVien.Columns[5].Width = 100; dgvNhanVien.AllowUserToAddRows = false; dgvNhanVien.EditMode = DataGridViewEditMode.EditProgrammatically; }

d] Phương thức dgvNhanVien_Click

private void dgvNhanVien_Click[object sender, EventArgs e] { if [btnThem.Enabled == false] { MessageBox.Show["Đang ở chế độ 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 = dgvNhanVien.CurrentRow.Cells["MaNhanVien"].Value.ToString[]; txtTenNhanVien.Text = dgvNhanVien.CurrentRow.Cells["TenNhanVien"].Value.ToString[]; if [dgvNhanVien.CurrentRow.Cells["GioiTinh"].Value.ToString[] == "Nam"] chkGioiTinh.Checked = true; else chkGioiTinh.Checked = false; txtDiaChi.Text = dgvNhanVien.CurrentRow.Cells["DiaChi"].Value.ToString[]; mtbDienThoai.Text = dgvNhanVien.CurrentRow.Cells["DienThoai"].Value.ToString[]; mskNgaySinh.Text = dgvNhanVien.CurrentRow.Cells["NgaySinh"].Value.ToString[]; btnSua.Enabled = true; btnXoa.Enabled = true; btnXoa.Enabled = true; }

e] Phương thứ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[]; }

f] Phương thức ResetValues

private void ResetValues[] { txtMaNhanVien.Text = ""; txtTenNhanVien.Text = ""; chkGioiTinh.Checked = false; txtDiaChi.Text = ""; mskNgaySinh.Text = ""; mtbDienThoai.Text = ""; }

g] Phương thức btnLuu_Click

private void btnLuu_Click[object sender, EventArgs e] { string sql,gt; if [txtMaNhanVien.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải 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 phải 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 phải nhập địa chỉ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning]; txtDiaChi.Focus[]; return ; } if [mtbDienThoai.Text == "[ ] -"] { MessageBox.Show["Bạn phải nhập điện thoại", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning]; mtbDienThoai.Focus[]; return ; } if [mskNgaySinh.Text == " / /"] { MessageBox.Show["Bạn phải 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 phải 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 = "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 phải 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[] + "','" + mtbDienThoai.Text + "','" + Functions.ConvertDateTime[mskNgaySinh.Text] + "']"; Functions.RunSQL[sql]; LoadDataGridView[]; 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 đượ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.

h] Hàm IsDate

Soạn thảo trong lớp Functions:

public static bool IsDate[string date] { string[] elements = date.Split['/']; if [[Convert.ToInt32[elements[0]] >= 1] && [Convert.ToInt32[elements[0]] = 1] && [Convert.ToInt32[elements[1]] = 1900]] return true; else return false; }

i] Hàm ConvertDateTime

Soạn thảo hàm trong lớp Functions:

public static string ConvertDateTime[string date] { string[] elements = date.Split['/']; string dt = string.Format["{0}/{1}/{2}", elements[0], elements[1], elements[2]]; return dt; }

j] Phương thứ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 bản ghi nào", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [txtTenNhanVien.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải 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 phải nhập địa chỉ", "Thông báo", MessageBoxButtons.OK,MessageBoxIcon.Warning]; txtDiaChi.Focus[]; return; } if [mtbDienThoai.Text == "[ ] -"] { MessageBox.Show["Bạn phải nhập điện thoại", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Warning]; mtbDienThoai.Focus[]; return; } if [mskNgaySinh.Text == " / /"] { MessageBox.Show["Bạn phải 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 phải 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='" + mtbDienThoai.Text.ToString[] + "',GioiTinh=N'" + gt + "',NgaySinh='" + Functions.ConvertDateTime[mskNgaySinh.Text] + "' WHERE MaNhanVien=N'" + txtMaNhanVien.Text + "'"; Functions.RunSQL[sql]; LoadDataGridView[]; ResetValues[]; btnBoQua.Enabled = false; }

k] Phương thứ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 bản ghi nào", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [MessageBox.Show["Bạn có muốn 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]; LoadDataGridView[]; ResetValues[]; } }

l] Phương thứ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; }

m] Phương thứ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, mtbDienThoai.KeyUp, mskNgaySinh.KeyUp.

n] Phương thức btnDong_Click

private void btnDong_Click[object sender, EventArgs e] { this.Close[]; }

Xem video hướng dẫn chi tiết

4.5. Form Danh mục Khách hàng

a] Khai báo

– Thư viện

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

– Biến

DataTable tblKH; //Bảng khách hàng

b] Phương thức frmDMKhachHang_Load

private void frmDMKhachHang_Load[object sender, EventArgs e] { txtMaKhach.Enabled = false; btnLuu.Enabled = false; btnBoQua.Enabled = false; LoadDataGridView[]; }

c] Phương thức LoadDataGridView

private void LoadDataGridView[] { string sql; sql = "SELECT * from tblKhach"; tblKH = Functions.GetDataToTable[sql]; //Lấy dữ liệu từ bảng dgvKhachHang.DataSource = tblKH; //Hiển thị vào dataGridView dgvKhachHang.Columns[0].HeaderText = "Mã khách"; dgvKhachHang.Columns[1].HeaderText = "Tên khách"; dgvKhachHang.Columns[2].HeaderText = "Địa chỉ"; dgvKhachHang.Columns[3].HeaderText = "Điện thoại"; dgvKhachHang.Columns[0].Width = 100; dgvKhachHang.Columns[1].Width = 150; dgvKhachHang.Columns[2].Width = 150; dgvKhachHang.Columns[3].Width = 150; dgvKhachHang.AllowUserToAddRows = false; dgvKhachHang.EditMode = DataGridViewEditMode.EditProgrammatically; }

d] Phương thức dgvKhachHang_Click

private void dgvKhachHang_Click[object sender, EventArgs e] { if [btnThem.Enabled == false] { MessageBox.Show["Đang ở chế độ thêm mới!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaKhach.Focus[]; return; } if [tblKH.Rows.Count == 0] { MessageBox.Show["Không có dữ liệu!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } txtMaKhach.Text = dgvKhachHang.CurrentRow.Cells["MaKhach"].Value.ToString[]; txtTenKhach.Text = dgvKhachHang.CurrentRow.Cells["TenKhach"].Value.ToString[]; txtDiaChi.Text = dgvKhachHang.CurrentRow.Cells["DiaChi"].Value.ToString[]; mtbDienThoai.Text = dgvKhachHang.CurrentRow.Cells["DienThoai"].Value.ToString[]; btnSua.Enabled = true; btnXoa.Enabled = true; btnBoQua.Enabled = true; }

e] Phương thứ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[]; }

f] Phương thức ResetValues

private void ResetValues[] { txtMaKhach.Text = ""; txtTenKhach.Text = ""; txtDiaChi.Text = ""; mtbDienThoai.Text = ""; }

g] Phương thức btnLuu_Click

private void btnLuu_Click[object sender, EventArgs e] { string sql; if [txtMaKhach.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập mã khách", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaKhach.Focus[]; return; } if [txtTenKhach.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập tên khách", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtTenKhach.Focus[]; return; } if [txtDiaChi.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập địa chỉ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtDiaChi.Focus[]; return; } if [mtbDienThoai.Text == "[ ] -"] { MessageBox.Show["Bạn phải nhập điện thoại", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; mtbDienThoai.Focus[]; return; } //Kiểm tra đã tồn tại mã khách chưa sql = "SELECT MaKhach FROM tblKhach WHERE MaKhach=N'" + txtMaKhach.Text.Trim[] + "'"; if [Functions.CheckKey[sql]] { MessageBox.Show["Mã khách này đã tồn tại", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaKhach.Focus[]; return; } //Chèn thêm sql = "INSERT INTO tblKhach VALUES [N'" + txtMaKhach.Text.Trim[] + "',N'" + txtTenKhach.Text.Trim[] + "',N'" + txtDiaChi.Text.Trim[] + "','" + mtbDienThoai.Text + "']"; Functions.RunSQL[sql]; LoadDataGridView[]; ResetValues[]; btnXoa.Enabled = true; btnThem.Enabled = true; btnSua.Enabled = true; btnBoQua.Enabled = false; btnLuu.Enabled = false; txtMaKhach.Enabled = false; }

h] Phương thứ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; } if [txtMaKhach.Text == ""] { MessageBox.Show["Bạn phải chọn bản ghi cần sửa", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [txtTenKhach.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập tên khách", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtTenKhach.Focus[]; return; } if [txtDiaChi.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập địa chỉ", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtDiaChi.Focus[]; return; } if [mtbDienThoai.Text=="[ ] -"] { MessageBox.Show["Bạn phải nhập điện thoại", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; mtbDienThoai.Focus[]; return; } sql = "UPDATE tblKhach SET TenKhach=N'" + txtTenKhach.Text.Trim[].ToString[] + "',DiaChi=N'" + txtDiaChi.Text.Trim[].ToString[] + "',DienThoai='" + mtbDienThoai.Text.ToString[] + "' WHERE MaKhach=N'" + txtMaKhach.Text + "'"; Functions.RunSQL[sql]; LoadDataGridView[]; ResetValues[]; btnBoQua.Enabled = false; }

i] Phương thứ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.Trim[] == ""] { MessageBox.Show["Bạn chưa chọn bản ghi nào", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [MessageBox.Show["Bạn có muốn xoá bản ghi này không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question] == DialogResult.Yes] { sql = "DELETE tblKhach WHERE MaKhach=N'" + txtMaKhach.Text + "'"; Functions.RunSqlDel[sql]; LoadDataGridView[]; ResetValues[]; } }

j] Phương thứ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; }

k] Phương thứ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}"]; }

l] Phương thức btnDong_Click

private void btnDong_Click[object sender, EventArgs e] { this.Close[]; }

Xem video hướng dẫn Quản lý Khách Hàng

4.6. Form Danh mục Hàng hóa

a] Khai báo

– Thư viện

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

– Biến

DataTable tblH; //Bảng hàng

b] Phương thức frmDMHang_Load

private void frmDMHang_Load[object sender, EventArgs e] { string sql; sql = "SELECT * from tblChatLieu"; txtMaHang.Enabled = false; btnLuu.Enabled = false; btnBoQua.Enabled = false; LoadDataGridView[]; Functions.FillCombo[sql, cboMaChatLieu, "MaChatLieu", "TenChatLieu"]; cboMaChatLieu.SelectedIndex = -1; ResetValues[]; }

Với FillCombo là một phương thứ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.

c] Phương thức FillCombo

Soạn thảo trong Class Functions :

public static void FillCombo[string sql, ComboBox cbo, string ma, string ten] { SqlDataAdapter dap = new SqlDataAdapter[sql, Con]; DataTable table = new DataTable[]; dap.Fill[table]; cbo.DataSource = table; cbo.ValueMember = ma; //Trường giá trị cbo.DisplayMember = ten; //Trường hiển thị }

d] Phương thức ResetValues

private void ResetValues[] { txtMaHang.Text = ""; txtTenHang.Text = ""; cboMaChatLieu.Text = ""; txtSoLuong.Text = "0"; txtDonGiaNhap.Text = "0"; txtDonGiaBan.Text = "0"; txtSoLuong.Enabled = true ; txtDonGiaNhap.Enabled = false; txtDonGiaBan.Enabled = false; txtAnh.Text = ""; picAnh.Image = null; txtGhichu.Text = ""; }

e] Phương thức LoadDataGridView

private void LoadDataGridView[] { string sql; sql = "SELECT * from tblHang"; tblH = Functions.GetDataToTable[sql]; dgvHang.DataSource = tblH; dgvHang.Columns[0].HeaderText = "Mã hàng"; dgvHang.Columns[1].HeaderText = "Tên hàng"; dgvHang.Columns[2].HeaderText = "Chất liệu"; dgvHang.Columns[3].HeaderText = "Số lượng"; dgvHang.Columns[4].HeaderText = "Đơn giá nhập"; dgvHang.Columns[5].HeaderText = "Đơn giá bán"; dgvHang.Columns[6].HeaderText = "Ảnh"; dgvHang.Columns[7].HeaderText = "Ghi chú"; dgvHang.Columns[0].Width = 80; dgvHang.Columns[1].Width = 140; dgvHang.Columns[2].Width = 80; dgvHang.Columns[3].Width = 80; dgvHang.Columns[4].Width = 100; dgvHang.Columns[5].Width = 100; dgvHang.Columns[6].Width = 200; dgvHang.Columns[7].Width = 300; dgvHang.AllowUserToAddRows = false; dgvHang.EditMode = DataGridViewEditMode.EditProgrammatically; }

f] Phương thức dgvHang_Click

private void dgvHang_Click[object sender, EventArgs e] { string MaChatLieu; string sql; if [btnThem.Enabled == false] { MessageBox.Show["Đang ở chế độ 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 = dgvHang.CurrentRow.Cells["MaHang"].Value.ToString[]; txtTenHang.Text = dgvHang.CurrentRow.Cells["TenHang"].Value.ToString[]; MaChatLieu = dgvHang.CurrentRow.Cells["MaChatLieu"].Value.ToString[]; sql = "SELECT TenChatLieu FROM tblChatLieu WHERE MaChatLieu=N'" + MaChatLieu + "'"; cboMaChatLieu.Text = Functions.GetFieldValues[sql]; txtSoLuong.Text = dgvHang.CurrentRow.Cells["SoLuong"].Value.ToString[]; txtDonGiaNhap.Text = dgvHang.CurrentRow.Cells["DonGiaNhap"].Value.ToString[]; txtDonGiaBan.Text = dgvHang.CurrentRow.Cells["DonGiaBan"].Value.ToString[]; sql = "SELECT Anh FROM tblHang WHERE MaHang=N'" + txtMaHang.Text + "'"; txtAnh.Text = Functions.GetFieldValues[sql]; picAnh.Image = Image.FromFile[txtAnh.Text]; sql = "SELECT Ghichu FROM tblHang WHERE MaHang = N'" + txtMaHang.Text + "'"; txtGhichu.Text = Functions.GetFieldValues[sql]; btnSua.Enabled = true; btnXoa.Enabled = true; btnBoQua.Enabled = true; }

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

public static string GetFieldValues[string sql] { string ma = ""; SqlCommand cmd = new SqlCommand[sql, Con]; SqlDataReader reader; reader = cmd.ExecuteReader[]; while [reader.Read[]] ma = reader.GetValue[0].ToString[]; reader.Close[]; return ma; }

h] Phương thứ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[]; txtSoLuong.Enabled = true; txtDonGiaNhap.Enabled = true; txtDonGiaBan.Enabled = true; }

i] Phương thức btnLuu_Click

private void btnLuu_Click[object sender, EventArgs e] { string sql; if [txtMaHang.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập mã hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaHang.Focus[]; return; } if [txtTenHang.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập tên hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtTenHang.Focus[]; return; } if [cboMaChatLieu.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập chất liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; cboMaChatLieu.Focus[]; return; } if [txtAnh.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải chọn ảnh minh hoạ cho hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; btnOpen.Focus[]; return; } sql = "SELECT MaHang FROM tblHang WHERE MaHang=N'" + txtMaHang.Text.Trim[] + "'"; if [Functions.CheckKey[sql]] { MessageBox.Show["Mã hàng này đã tồn tại, bạn phải chọn mã hàng khác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaHang.Focus[]; 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]; LoadDataGridView[]; //ResetValues[]; btnXoa.Enabled=true; btnThem.Enabled = true; btnSua.Enabled = true; btnBoQua.Enabled = false; btnLuu.Enabled = false; txtMaHang.Enabled = false; }

j] Phương thứ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 bản ghi nào", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtMaHang.Focus[]; return; } if [txtTenHang.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập tên hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtTenHang.Focus[]; return; } if [cboMaChatLieu.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải nhập chất liệu", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; cboMaChatLieu.Focus[]; return; } if [txtAnh.Text.Trim[].Length == 0] { MessageBox.Show["Bạn phải ảnh minh hoạ cho hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtAnh.Focus[]; return; } sql = "UPDATE tblHang SET TenHang=N'" + txtTenHang.Text.Trim[].ToString[] + "',MaChatLieu=N'" + cboMaChatLieu.SelectedValue.ToString[] + "',SoLuong="+txtSoLuong.Text+ ",Anh='" + txtAnh.Text + "',Ghichu=N'" + txtGhichu.Text +"' WHERE MaHang=N'" + txtMaHang.Text + "'"; Functions.RunSQL[sql]; LoadDataGridView[]; ResetValues[]; btnBoQua.Enabled = false; }

k] Phương thứ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 bản ghi nào", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; return; } if [MessageBox.Show["Bạn có muốn xoá bản ghi này không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question] == DialogResult.Yes] { sql = "DELETE tblHang WHERE MaHang=N'" + txtMaHang.Text + "'"; Functions.RunSqlDel[sql]; LoadDataGridView[]; ResetValues[]; } }

l] Phương thức btnBoQua_Click

private void btnBoQua_Click[object sender, EventArgs e] { ResetValues[]; btnXoa.Enabled = true; btnSua.Enabled = true; btnThem.Enabled = true; btnBoQua.Enabled = false; btnLuu.Enabled = false; txtMaHang.Enabled = false; }

m] Phương thức btnOpen_Click

private void btnOpen_Click[object sender, EventArgs e] { OpenFileDialog dlgOpen = new OpenFileDialog[]; dlgOpen.Filter = "Bitmap[*.bmp]|*.bmp|JPEG[*.jpg]|*.jpg|GIF[*.gif]|*.gif|All files[*.*]|*.*"; dlgOpen.FilterIndex = 2; dlgOpen.Title = "Chọn ảnh minh hoạ cho sản phẩm"; if [dlgOpen.ShowDialog[] == DialogResult.OK] { picAnh.Image = Image.FromFile[dlgOpen.FileName]; txtAnh.Text = dlgOpen.FileName; } }

n] Phương thức btnTimKiem_Click

Phương thứ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["Bạn hãy nhập điều kiện tìm kiếm", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning]; return; } sql = "SELECT * from tblHang WHERE 1=1"; if [txtMaHang.Text != ""] sql += " AND MaHang LIKE N'%" + txtMaHang.Text + "%'"; if [txtTenHang.Text != ""] sql += " AND TenHang LIKE N'%" + txtTenHang.Text + "%'"; if [cboMaChatLieu.Text!=""] sql += " AND MaChatLieu LIKE N'%" + cboMaChatLieu.SelectedValue + "%'"; tblH = Functions.GetDataToTable[sql]; if [tblH.Rows.Count == 0] MessageBox.Show["Không có bản ghi thoả mãn điều kiện tìm kiếm!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; else MessageBox.Show["Có " + tblH.Rows.Count + " bản ghi thoả mãn điều kiện!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; dgvHang.DataSource = tblH; ResetValues[]; }

o] Phương thức btnHienThi_Click

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]; dgvHang.DataSource = tblH; }

p] Phương thức btnDong_Click

private void btnDong_Click[object sender, EventArgs e] { this.Close[]; }

Xem Video hướng dẫn Quản lý Hàng Hoá

4.7. Form Hóa đơn bán

a] Khai báo

Chọn menu Project/Add Reference, chọn thẻ COM hộp thoại Add Reference, chọn Microsoft Excel 14.0 Object Library, nhấn OK.

– Thư viện

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

– Biến

DataTable tblCTHDB; //Bảng chi tiết hoá đơn bán

b] Phương thức frmHoaDonBan_Load

private void frmHoaDonBan_Load[object sender, EventArgs e] { btnThem.Enabled = true; btnLuu.Enabled = false; btnXoa.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", "MaKhach"]; cboMaKhach.SelectedIndex = -1; Functions.FillCombo["SELECT MaNhanVien, TenNhanVien FROM tblNhanVien",cboMaNhanVien, "MaNhanVien", "TenKhach"]; cboMaNhanVien.SelectedIndex = -1; Functions.FillCombo["SELECT MaHang, TenHang FROM tblHang", cboMaHang,"MaHang", "MaHang"]; cboMaHang.SelectedIndex = -1; //Hiển thị thông tin của một hóa đơn được gọi từ form tìm kiếm if [txtMaHDBan.Text != ""] { LoadInfoHoaDon[]; btnXoa.Enabled = true; btnInHoaDon.Enabled = true; } LoadDataGridView[]; }

c] Phương thức LoadDataGridView

private void LoadDataGridView[] { 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]; dgvHDBanHang.DataSource = tblCTHDB; dgvHDBanHang.Columns[0].HeaderText = "Mã hàng"; dgvHDBanHang.Columns[1].HeaderText = "Tên hàng"; dgvHDBanHang.Columns[2].HeaderText = "Số lượng"; dgvHDBanHang.Columns[3].HeaderText = "Đơn giá"; dgvHDBanHang.Columns[4].HeaderText = "Giảm giá %"; dgvHDBanHang.Columns[5].HeaderText = "Thành tiền"; dgvHDBanHang.Columns[0].Width = 80; dgvHDBanHang.Columns[1].Width = 130; dgvHDBanHang.Columns[2].Width = 80; dgvHDBanHang.Columns[3].Width = 90; dgvHDBanHang.Columns[4].Width = 90; dgvHDBanHang.Columns[5].Width = 90; dgvHDBanHang.AllowUserToAddRows = false; dgvHDBanHang.EditMode = DataGridViewEditMode.EditProgrammatically; }

d] Phương thức LoadInfoHoaDon[]

private void LoadInfoHoaDon[] { 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]; }

e] Phương thức btnThem_Click

private void btnThem_Click[object sender, EventArgs e] { btnXoa.Enabled = false; btnLuu.Enabled = true; btnInHoaDon.Enabled = false; btnThem.Enabled = false; ResetValues[]; txtMaHDBan.Text = Functions.CreateKey["HDB"]; LoadDataGridView[]; }

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

f] Hàm CreateKey

Soạn thảo trong Class Functions:

//Hàm tạo khóa có dạng: TientoNgaythangnam_giophutgiay public static string CreateKey[string tiento] { 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ắng 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.

g] Hàm ConvertTimeTo24

Soạn thảo trong Class Functions:

//Chuyển đổi từ PM sang dạng 24h 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"; 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; }

h] Phương thứ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"; }

i] Phương thứ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ến 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 phải nhập ngày bán", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Information]; txtNgayBan.Focus[]; return ; } if[ cboMaNhanVien.Text.Length == 0 ] { MessageBox.Show["Bạn phải nhập nhân viên", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; cboMaNhanVien.Focus[]; return; } if[ cboMaKhach.Text.Length == 0 ] { MessageBox.Show["Bạn phải nhập khách hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information ]; 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 của các mặt hàng if[ cboMaHang.Text.Trim[].Length == 0 ] { MessageBox.Show["Bạn phải nhập mã hàng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; cboMaHang.Focus[]; return; } if[ [txtSoLuong.Text.Trim[].Length == 0] || [txtSoLuong.Text == "0" ]] { MessageBox.Show["Bạn phải nhập số lượng", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information ]; txtSoLuong.Text = ""; txtSoLuong.Focus[]; return; } if[ txtGiamGia.Text.Trim[].Length == 0 ] { MessageBox.Show["Bạn phải nhập giảm giá", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; 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 phải nhập mã khác", "Thông báo",MessageBoxButtons.OK, MessageBoxIcon.Information]; ResetValuesHang[]; cboMaHang.Focus[]; return; } // Kiểm tra xem số lượng hàng trong kho còn đủ để cung cấp 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ố lượng mặt hàng này chỉ còn " + sl, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information]; txtSoLuong.Text = ""; txtSoLuong.Focus[]; return; } sql = "INSERT INTO tblChiTietHDBan[MaHDBan,MaHang,SoLuong,DonGia, GiamGia,ThanhTien] VALUES[N'" + txtMaHDBan.Text.Trim[] + "',N'" + cboMaHang.SelectedValue + "'," + txtSoLuong.Text + "," + txtDonGiaBan.Text+ ","+ txtGiamGia.Text + "," + txtThanhTien.Text + "]"; Functions.RunSQL[sql]; LoadDataGridView[]; // Cập nhật lại số lượng của mặt hàng vào bảng 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ổng 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[]; btnXoa.Enabled = true; btnThem.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ữ.

j] Hàm ChuyenSoSangChu

Soạn thảo trong Class Functions:

public static string ChuyenSoSangChu[string sNumber] { int mLen, mDigit; string mTemp = ""; string[] mNumText; //Xóa các dấu "," nếu có sNumber = sNumber.Replace[",", ""]; mNumText = "không;một;hai;ba;bốn;năm;sáu;bảy;tám;chín".Split[';']; mLen = sNumber.Length - 1; // trừ 1 vì thứ tự đi từ 0 for [int i = 0; i =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ốn", "mươi tư"]; //Fix trường hợp x04 mTemp = mTemp.Replace["linh bốn", "linh tư"]; //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ốt"]; //Fix trường hợp x15 mTemp = mTemp.Replace["mười năm", "mười lăm"]; //Bỏ ký tự space mTemp = mTemp.Trim[]; //Viết hoa ký tự đầu tiên mTemp = mTemp.Substring[0, 1].ToUpper[] + mTemp.Substring[1] + " đồng"; return mTemp; }

k] Phương thức ResetValuesHang

private void ResetValuesHang[] { cboMaHang.Text = ""; txtSoLuong.Text = ""; txtGiamGia.Text = "0"; txtThanhTien.Text = "0"; }

l] Phương thức dgvHDBanHang_DoubleClick

Phương thức này cho phép người dùng nháy đúp chuột vào một mặt hàng trong lưới để xóa.

private void dgvHDBanHang_DoubleClick[object sender, EventArgs e] { string MaHangxoa,sql; Double ThanhTienxoa, SoLuongxoa, sl, slcon, tong, tongmoi; 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ắc chắn muốn 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ố lượng hàng MaHangxoa = dgvHDBanHang.CurrentRow.Cells["MaHang"].Value.ToString[]; SoLuongxoa = Convert.ToDouble[dgvHDBanHang.CurrentRow.Cells["SoLuong"].Value.ToString[]]; ThanhTienxoa = Convert.ToDouble[dgvHDBanHang.CurrentRow.Cells["ThanhTien"].Value.ToString[]]; sql = "DELETE tblChiTietHDBan WHERE MaHDBan=N'" + txtMaHDBan.Text + "' AND MaHang = N'" + MaHangxoa + "'"; Functions.RunSQL[sql]; // Cập nhật lại số lượng cho các mặt hàng sl = Convert.ToDouble[Functions.GetFieldValues["SELECT SoLuong FROM tblHang WHERE MaHang = N'" + MaHangxoa + "'"]]; slcon = sl + SoLuongxoa; sql = "UPDATE tblHang SET SoLuong =" + slcon + " WHERE MaHang= N'" + MaHangxoa + "'"; Functions.RunSQL[sql]; // Cập nhật lại tổng tiền cho hóa đơn bán tong = Convert.ToDouble[Functions.GetFieldValues["SELECT TongTien FROM tblHDBan WHERE MaHDBan = N'" + txtMaHDBan.Text + "'"]]; tongmoi = tong - ThanhTienxoa; 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[]]; LoadDataGridView[]; } }

m] Phương thức btnXoa_Click

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

private void btnXoa_Click[object sender, EventArgs e] { double sl, slcon, slxoa; if [MessageBox.Show["Bạn có chắc chắn muốn xóa không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question] == DialogResult.Yes] { string sql = "SELECT MaHang,SoLuong FROM tblChiTietHDBan WHERE MaHDBan = N'" + txtMaHDBan.Text + "'"; DataTable tblHang = Functions.GetDataToTable[sql]; for [int hang = 0; hang = '0'] && [e.KeyChar = '0'] && [e.KeyChar

Chủ Đề