GIỚI THIỆU ĐỒ ÁN CỦA HP
Tổng quan về ĐỒ ÁN HỌC PHẦN
ĐỒ ÁN HỌC PHẦN thiết kế và LẬP TRÌNH PHÁT TRIỂN WEBAPP BÁN SÁCH ONLINE CỦA HỆ THỐNG CỬA HÀNG LH trên nền tảng công nghệ ASP.NET : phiên bản 4.8.04084 với công cụ MS Visual Studio.NET 2019, dùng ngôn ngữ lập trình C#.NET: G112_1921006704_NguyenThiLanHuing_BanSachOnlineLhBShop
Hệ thống WebApp nêu trên được triển khai thực nghiệm trên Host Web của www.somee.com với URL là: o http://LHshop112ntlhuong.somee.com o http://www.LHshop112ntlhuong.somee.com
Hệ thống CSDL dùng cho WebApp nên trên 1G112NguyenThiLanHuongBanSach.bak được thiết kế và cập nhật trên
MS SQL Server 2019 (trên somee là : MS SQL 2019 Express)
Nội dung chuyên môn chính của ĐỒ ÁN HỌC PHẦN
Áp dụng kiến thức thiết kế và lập trình WebApp một lớp trên nền tảng ASP.NET vào việc phát triển một WebApp đơn giản áp dụng trong thực tế là Hệ thống quản lý học viên, giảng viên và khóa học tại một trung tâm đào tạo Hệ thống này cung cấp chức năng tạo, chỉnh sửa, xóa, tìm kiếm học viên, giảng viên và khóa học, đồng thời cho phép quản lý lịch học và điểm danh.
Websites bán sách trực tuyến.
Công cụ và nền tảng kỹ thuật thực hiện ĐỒ ÁN HỌC PHẦN
+ ASP.NET 4.8.04084 trên MS Visual Studio NET 2019
+ Hệ quản trị CSDL MS SQL Server 2019 trên Local
+ Wfee Host Web: some.com dùng MS SQL 2019 Express trên host somee onine 1.4 Sản phẩm của ĐỒ ÁN HỌC PHẦN
+ Hệ thống WebApp bán sách trực tuyến (online) dạng Online trên somee: http://LHShop112ntlhuong.somee.com hoặc http://www.LHShop112ntlhuong.somee.com
1.5 Bố cục của báo cáo
Báo cáo gồm những nội dung như sau:
Chương 1: Giới thiệu đồ án của HP là Hệ thống WebApp bán sách Online
Chương 2: Các cơ sở lý thuyết của HP Lập trình Web (4 TC) phục việc thực hiện đề tài HP
Chương 3: Thiết kế và cập nhật CSDL phục vụ WebApp bán sách
Chương 4: Thiết kế và lập trình WebApp phần giao dịch trực tuyến của khách hàng mua sách
Chương 5: Thiết kế và lập trình WebApp phần quản lý trực tuyến của cơ sở bán sách Chương 6: Triển khai và phát hành WebApp bán sách trực tuyến trên Host: somee Chương 7: Tổng kết các kết quả đạt được và còn hạn chế của đồ án, đồng thời đề xuất hướng khắc phục hạn chế và phát triển Đồ án.
Bố cục của báo cáo
Báo cáo gồm những nội dung như sau:
Chương 1: Giới thiệu đồ án của HP là Hệ thống WebApp bán sách Online
Chương 2: Các cơ sở lý thuyết của HP Lập trình Web (4 TC) phục việc thực hiện đề tài HP
Chương 3: Thiết kế và cập nhật CSDL phục vụ WebApp bán sách
Chương 4: Thiết kế và lập trình WebApp phần giao dịch trực tuyến của khách hàng mua sách
Chương 5: Thiết kế và lập trình WebApp phần quản lý trực tuyến của cơ sở bán sách Chương 6: Triển khai và phát hành WebApp bán sách trực tuyến trên Host: somee Chương 7: Tổng kết các kết quả đạt được và còn hạn chế của đồ án, đồng thời đề xuất hướng khắc phục hạn chế và phát triển Đồ án.
CƠ SỞ LÝ THUYẾT CỦA HỌC PHẦN
Phát triển các chức năng GIAO DỊCH trên WebApp ASP.NET 27 1 Trưng bày sản phẩm (dịch vụ) trên DataList
2.4.1 Trưng bày sản phẩm (dịch vụ) trên DataList
DataList được sử dụng để hiển thị dữ liệu, chúng ta phải tự thiết kế hình thức hiển thị dữ liệu, đây là thế mạnh của DataList.
Chúng ta có thể thực hiện một giao diện trình bày có tương tác dữ liệu hiển thị giống như một website bán hàng, nó bao gồm tiêu đề, hình ảnh và giá thành sản phẩm chi tiết … với datalist trên ASP.NET.
Session là cơ chế để lưu lại dữ liệu của phiên làm việc cho của ứng dụng - ứng với từng khách truy cập Để trao đổi dữ liệu từ trang này qua trang khác Ví dụ nếu người dùng đã đăng nhập, thì thông tin đăng nhập được lưu lại và chuyển cho các trang khác nhau trong phiên làm việc để khỏi mỗi lần gửi request lại phải đăng nhập, hay người dùng chọn đựa mặt hàng vào giỏ hàng thì phải nhớ khi chuyển đến trang thanh toán Session là một trong những biến quan trọng nhất trong ứng dụng web, nó là riêng biệt với các đối tượng người dùng tuy nhiên biến này được tạo ra sẽ sử dụng ở tất cả mọi trang trong website và lưu vết của người dùng đó đã làm những gì trên website mình.
Lập trình thủ tục giao dịch Đặt hàng (Order)
2.6 Phát triển các chức năng QUẢN LÝ trên WebApp ASP.NET 2.5.1 Quản lý đăng nhập và bảo mật
2.5.3 Các chức năng thao tác dữ liệu: Thêm _ Sửa _ Xóa
2.7 Xử lý Ràng buộc toàn vẹn dữ liệu (RBTV) trên CSDL trong ASP.NET
2.6.1 Giới thiệu về lập trình xử lý RBTV dữ liệu trên CSDL trong ASP.NET
2.6.2 Thiết kế hệ thống xử lý RBTV dữ liệu
2.6.3 Lập trình hệ thống xử lý RBTV dữ liệu
2.8 Lập trình thủ tục Chuyển nhóm dữ liệu trong ASP.NET
2.7.1 Giới thiệu về lập trình Chuyển nhóm dữ liệu trên CSDL trong ASP.NET
2.7.2 Thiết kế hệ thống xử lý Chuyển nhóm dữ liệu
2.7.3 Lập trình hệ thống xử lý Chuyển nhóm dữ liệu
2.9 Lập trình thủ tục giao dịch Đặt hàng (Order)
2.8.1 Giới thiệu về lập trình xử lý giao dịch đặt hàng trong ASP.NET 2.8.2 Chức năng khách hàng
2.8.3 Chức năng đơn đặt hàng
2.8.4 Chức năng chi tiết đơn hàng
2.8.5 Xử lý lưu trữ vào DB
2.10 Triển khai phát hành WebApp ASP.NET trên Internet (hoặc Intranet)
THIẾT KẾ VÀ CẬP NHẬT CSDL PHỤC VỤ WEBAPP
Phân tích và thiết kế DB
Hê thống DB phục vụ cho hoạt động của WebApp bán sách trực tuyến được mô tả như sau:
Quản lý các cửa hàng và nhân viên:
Các chi nhánh (tb_chinhanh) của cửa hàng được chia và quản lý theo từng khu vực (tb_khuvuc) Để phân biệt các chi nhánh và khu vực với nhau, mỗi chi nhánh và khu vực có một mã riêng và có tên của khu vực/chi nhánh Mỗi chi nhánh có các nhân viên (tb_nhanvien), các nhân viên cần cung cấp họ, tên, số điện thoại, email để người quản lý có thể quản lý thông tin của họ và được phân biệt bằng mã nhân viên ( manv) và mỗi nhân viên có một chuyên môn (tb_chuyenmon) của họ.
Các sản phẩm sách tại LHshop được quản lý vô cùng chặt chẻ để đem đến một chất lượng uy tín nhất, tốt nhất Các sách được quản lý trong một danh sách ( tb_dss) bao gồm các thông tin như: mã để phân biệt các sách, tên sách, ngày sản xuất, hạn sử dụng, khối lượng, đơn vị tính, giá bán và mô tả sơ lược về quyển sách đó Các sách tại được mang đến từ các thương hiệu lớn ( thuonghieu).Sách luôn có một lượng tồn kho ( tonkho) lớn để đảm bảo cung cấp các sách cho khách hàng mọi lúc.
Quản lý bán hàng: Để có thể mua hàng ở LH, các khách hàng ( khachhang) của LH phải để lại các thông tin như tên, địa chỉ, phương thức liên lạc và tất nhiên các khách hàng đều có một mã để người quản lý cửa hàng có thể quản lý dễ dàng hơn.
Khi khách hàng tiến hành đặt hàng, hệ thống sẽ cho phép khách hàng lựa chọn địa chỉ giao hàng không nhất thiết phải trùng khớp với địa chỉ của chính họ Bên cạnh đó, khách hàng có thể cung cấp một cái tên và số điện thoại khác để người nhận thay họ nhận hàng hóa Dữ liệu về sản phẩm đã mua và số lượng của chúng sẽ được lưu vào một danh sách chi tiết.
Các quy định cơ bản của hệ thốngquản lý bán hàng của cửa hàng kinh doanh bán sách:
Quy định 1: Giá bán của các sách là số dương và phải lớn hơn hoặc bằng 0. Quy định 2: Số lượng tồn kho phải lớn hơn hoặc bằng 0.
Quy định 3: Lương của nhân viên phải từ 3.000.000 VNĐ trở lên.
Quy định 4: Khi tuyển một nhân viên mới, mã hoa hồng của nhân viên đó mặc định là 0.
Quy định 5: Khi thêm một sách vào danh sách, nếu không nhập số lượng, nó sẽ mặc định là 0.
Quy định 6: Số lượng đặt hàng phải lớn hơn 0.
Quy định 7: Khi thêm một đơn hàng, tình trạng đơn hàng mặc định là “Chua duoc giao”.
Dự vào phân tích nghiệp vụ ở trên DB phục vụ cho hệ thống quản lý bán hàng của LH bao gồm các thực thể sau đây: o khuvuc (makv, tenkv) o chinhanh (macn, tencn, diachi, hotline) o loaisach (maloais, tenloais) o thuonghieu (math, tenth) o dss (mas, tenS, ngaysx, soluong, dvt, giaban, mota, maloais, math) o tonkho (macn, mas, slton) o hoahong (mahh, hoahong) o congviec (macv, tencv) o nhanvien (manv, honv, tennv, ngayvaolam, luong, sdt, email, mahh, macv, makv) o khachhang (makh, tenkh, diachi, sdt, email) o dondathang (maddh, ngaylap, makh, manv, makv, macn, ten_nguoinhan, diachi_giao, sdt_nguoinhan, tinhtrang, ghichu) o ctdonhang (maddh, mas, sl)
Diagram của DB bán sách online
Dựa trên phân tích và thiết kế thành phần cơ sở dữ liệu đã trình bày ở mục 3.1, chúng ta có sơ đồ cơ sở dữ liệu phục vụ cho hoạt động của ứng dụng bán sách trực tuyến LHshop như hình 3.1.
Hình 3.1: Diagram của DB quản lý bán sách online
Thiết kế Tables dữ liệu
3.3.1 Thiết kế Table tb_dsS
Hình 3.2: Thiết kế bảng tb_dsS
3.3.2 Thiết kế Table tb_thuonghieu
Hình 3.3: Thiết kế bảng tb_thuonghieu
1.1.1 Thiết kế Table tb_loaiS
Hình 3.4: Thiết kế bảng tb_ loaiS
1.1.1 Thiết kế Table tb_chinhanh
Hình 3.5: Thiết kế bảng tb_ chinhanh
1.1.2 Thiết kế Table tb_hangton
1.1.3 Thiết kế Table tb_khuvuc
Hình 3.7: Thiết kế bảng tb_ khuvuc
1.1.4 Thiết kế Table tb_nhanvien
Hình 3.8: Thiết kế bảng tb_ nhanvien
1.1.5 Thiết kế Table tb_dondathang
Hình 3.9: Thiết kế bảng tb_ dondathang
1.1.6 Thiết kế Table tb_chitietddh
Hình 3.10: Thiết kế bảng tb_ chitietddh
1.1.1 Thiết kế Table tb_khachhang
Cập nhật dữ liệu DB thực nghiệm cho WebApp bán sách LHshop Online
Để đảm bảo dữ liệu được nhập vào mà không vi phạm bất cứ ràng buộc nào, dữ liệu nên được nhập theo thứ tự sau:
7 tb_hangton Ở 3 table tb_khachhang, tb_dondathang và tb_chitietddh sẽ là dữ liệu phát sinh được nhập vào từ người truy cập và thực hiện giao dịch trên webapp.
Giới thiệu một số View, SP và Trigger trong DB quản lý bán sách online
1.1.2 View xem thông tin đơn giản của nhân viên create view v_thongtin_nhanvien as select msnv, honv + ' ' + tennv as hoten_nv, mskv, macm from nhanvien
1.1.3 Trigger thực hiện hủy chi tiết đơn đặt hàng trước khi thực hiện hủy đơn đặt hàng: create trigger tg_d_xoadon_xoachitiet on tb_dondathang instead of delete as begin declare @ma nchar(20) select @ma = msddh wfom deleted delete wfom tb_chitietddh where msddh = @ma delete wfom tb_dondathang where msddh = @ma end
1.1.4 Trigger thực hiện hủy đơn đặt hàng khi thực hiện xóa một khách hàng: create trigger tg_d_xoakh_xoadon on tb_khachhang instead of delete as begin declare @ma nchar(20) select @ma = mskh wfom deleted delete wfom tb_dondathang where mskh = @ma delete wfom tb_khachhang where mskh = @ma end
1.1.5 Trigger khi xóa một loại sách, các sách còn lại của loại đó ở cửa hàng sẽ được sửa mã loại là “LS00” với tên loại là “Khác”: create trigger tg_d_xoaloai_capnhat_loaiS on tb_loaiS instead of delete as begin declare @ma nchar(20) select @ma = msloais from deleted update tb_dsS set msloais = 'LS00' where msloais =
@ma delete from tb_loaiS where msloais = @ma end
1.1.6 Trigger khi xóa một thương hiệu sách, các sách còn lại của thương hiệu đó ở cửa hàng được sửa mã thương hiệu là “TH00” với tên thương hiệu là “Thương hiệu khác”: create trigger tg_d_xoath_capnhat_loaiS on tb_thuonghieu instead of delete as begin declare @ma nchar(20) select @ma = math from deleted update tb_dsS set math = 'TH00' where math = @ma delete from tb_thuonghieu where math = @ma end
1.1.7 Trigger khi xóa một chuyên môn nhân viên tại cửa hàng thì các nhân viên thuộc chuyên môn đó sẽ được sửa mã chuyên môn là “OO” với tên là chưa phân công: create trigger tg_d_xoacm_capnhat_nv on tb_chuyenmon instead of delete as begin declare @ma nchar(20) select @ma = macm from deleted update tb_nhanvien set macm = 'OO' where macm =
@ma delete from tb_chuyenmon where macm = @ma end
3.6 Tổ chức hệ thống DB thực nghiệm
Chạy local = nhập dl nhiều + hình = thực nghiệm app Nhập ít dữ liệu hơn
THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN GIAO DỊCH
Giới thiệu về WebApp bán sách LHshop online
Đây là thành phần các WebWfoms phục vụ cho khách hàng thực hiện các chức năng giao dịch đặt hàng cần mua tại website của LHshop: thông thường đây là các chức năng phục vụ các cá nhân, đơn vị bên ngoài đơn vị bán hàng tương tác online với hệ thống nên không cho phép làm thay đổi các thông tin bên trong hệ thống Chủ yếu là các thao tác đặt hàng, góp ý, bình luận, đề xuất, đề nghị Không thực hiện thêm sách, xóa hay sửa sách, thông tin sách, các sản phẩm được trưng bày trên website
Phần giao dịch của WebApp này bao gồm:
+ MauTrang.Master: là Master mẫu dùng chung cho các trang giao dịch và các trang quản lý của Chương 5:60.
+ wfHomePage.aspx: là trang chủ, trưng bày các sản phẩm sách cho phép khách hàng thực hiện chọn các sách bỏ vào “giỏ hàng” để đặt mua hàng.
+ wfCart.aspx: cho phép khách hàng xem các sản phẩm sách mà họ đã đưa vào “giỏ hàng” hiện có và thực hiện một số thao tác cơ bản trên “giỏ hàng”, như: “Mua thêm”, “Hủy giỏ hàng”, “Đặt mua giỏ hàng”, “đổi hàng” , “bỏ bớt hàng trong giỏ ra” .
+ wfOrder.aspx: cho phép khách hàng thực hiện việc đặt mua hàng khi ”giỏ hàng” không rổng (có các sản phẩm sách của cửa hàng).
MasterPage giao dịch : Transaction.Master
4.2.1 Thiết kế Masterpage giao dịch
THIẾT KẾ MASTERPAGE (Design View)
Hình 4.1: Thiết kế MasterPage Giao dịch dùng chung cho cả phần quản lý
Trong thiết kế MasterPage như Hình 4 bao gồm:
+ Thiết kế Table có 1 cột và nhiều dòng tạo thuận lợi cho việc kết cấu vị trí các thành phần thiết kế trên các WebPage thừa kế MasterPage này.
+ Banner giới thiệu về cơ sở kinh doanh bán sách trực tuyến
+ Menu ngang (Horizontalization) cho phép khách hàng truy xuất các trang thông tin liên quan đế hệ thống Websites.
4.2.2 Lập trình (Codes) Masterpage giao dịch
MÃ LỆNH LẬP TRÌNH CỦA MASTERPAGE (Code View) o Page load khi truy cập vào webapp: protected void Page_Load(object sender, EventArgs e)
{ //Mặc định khi giao diện được khởi tạo phần login sẽ ẩn lgnhanvien.Visible = false;
} o Sự kiện nháy vào menu trên master page:
/ Chạy khi nhân viên nháy chọn vào mục chọn trên menu
/ protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
//nếu nháy chọn mục "Quản lý" hoặc "Đăng nhập" trên
Menu if (e.Item.Value == "ql" || e.Item.Value == "dn") {
//hiện giao diện login lgnhanvien.Visible = true;
{ //giao hiện login được ẩn lgnhanvien.Visible = false;
} } o Kiểm tra tài khoản đăng nhập: protected void lgnhanvien_Authenticate(object sender, AuthenticateEventArgs e) { //NẾU NSD ĐĂNG NHẬP BẰNG TK BÊN DƯỚI THÌ DN THÀNH CÔNG if ((lgnhanvien.UserName == "Admin" && lgnhanvien.Password == "admin@vn")
|| lgnhanvien.UserName == "Guest" && lgnhanvien.Password ==
{ e.Authenticated = false;//DN KHÔNG THÀNH CÔNG
Trang chủ trưng bày các sách: HomePage.aspx
4.3.1 Thiết kế (Design) WebApp giao dịch bán sách online
* Hệ Websites hỗ trợ chức năng giao dịch bán sách online thừa kế
Masterpage nên trên, gồm các thành phần như sau:
THIẾT KẾ TRANG CHỦ HomePage (Design View)
Hình 4.2: Thiết kế trang chủ HomePage
Trong thiết kế trang chủ HomePage như Hình bao gồm:
+ Thiết kế Table có 1 cột và nhiều dòng tạo thuận lợi cho việc kết cấu vị trí các thành phần thiết kế trên HomepagePage.
+ Dùng DataList để trưng bày các sách cho phép khách hàng chọn mua trực tuyến.
+ Dùng Button để khách hàng thực hiện các thao tác “thêm hàng vào giỏ” hay “xem giỏ hàng”.
+ Dùng TextBox để khách hàng có thể lựa chọn số lượng mua của một sản phẩm.
+ Dùng Image để hiển thị hình ảnh của sản phẩm sách cầu lông để khách hàng có cái nhìn trực quan hơn vê sản phẩm.
4.3.2 Lập trình (Codes) WebApp giao dịch bán sách online: wfHomePage.aspx MÃ LỆNH LẬP TRÌNH CỦA HOMEPAGE (Code View) o Khai báo biến toàn cục
//biến toàn cục static DataTable cart = new DataTable(); o Page load khi wrHomePage được khởi tạo protected void Page_Load(object sender, EventArgs e)
{ if(!IsPostBack)/*chỉ thiết lập giỏ hàng khi homepage được chạy lần đầu, postback sẽ không mất giỏ hàng*/
{ if (Session["cart"] != null)//nếu đã có giỏ hàng
{ cart = Session["cart"] as DataTable;//sử dụng giỏ hàng có sẵn // có thể khai kiểu (DataTable) cart = Session["cart"]
} else//nếu chưa có giỏ hàng => tạo một giỏ mới { //xóa các dữ liệu rác cart.Rows.Clear(); cart.Columns.Clear();
To create a data table and add columns to it, the following code can be utilized: `cart.Columns.Add("msS", typeof(string));` Columns can be added with different data types, such as strings, integers, or calculated values using a formula, like `cart.Columns.Add("tien", typeof(int), "giaban * sl");` for calculating the product price based on unit price and quantity.
}//page_load o Sự kiện ItemCommand khi nháy vào “chọn mua” trong datalist: protected void dtlDSS_ItemCommand(object source, DataListCommandEventArgs e) { if (e.CommandName == "chonmua")
{ //Lấy thông tin món hàng
String ma = dtlDSS.DataKeys[e.Item.ItemIndex].ToString().Trim();
String ten = ((Label)e.Item.Finsontrol("tensLabel")).Text; int giaban = int.Parse(((Label)e.Item.Finsontrol("giaLabel")).Text.Trim()); string dvt = ((Label)e.Item.Finsontrol("dvtLabel")).Text; int sl = int.Parse(((TextBox)e.Item.Finsontrol("txtsl")).Text.Trim()); //Kiểm tra xem item đã có trong giỏ chưa? foreach(DataRow row in cart.Rows)//dò các mặt hàng đã có trong giỏ { if(ma == (string)row["msS"])//hàng có trong giỏ
{ row["sl"] = (int)row["sl"] + sl;//tăng số lượng hàng goto } kt;
} //nếu hàng chưa có trong giỏ cart.Rows.Add(ma, ten, giaban, dvt, sl);
//gửi giỏ hàng lên session lblketqua.Text = "GIỎ HÀNG HIỆN CÓ: " + cart.Compute("count(msS)", "").ToString() +
" SÁCH TỔNG GIÁ TIỀN: " + cart.Compute("sum(tien)","").ToString() + "đ";
}//dtlDSS_ItemCommand } o Sự kiện khi nháy vào button “xem giỏ hàng”: protected void btnxemgio_Click(object sender, EventArgs e)
Trang “Giỏ hàng” của khách hàng khi thực hiện mua sách tại cửa hàng
4.4.1 Thiết kế (Design) WebPage “Giỏ hàng”
THIẾT KẾ TRANG GIỎ HÀNG Cart (Design View)
* Webpage “giỏ hàng” của cửa hàng bán sách LHshop online thừa kế
Masterpage nên trên, gồm các thành phần như sau:
Hình 4.3: Thiết kế trang giỏ hàng
+ Thiết kế Table có 1 cột và nhiều dòng tạo thuận lợi cho việc kết cấu vị trí các thành phần thiết kế trên HomePage.
+ Dùng Gridview để hiển thị các sản phẩm sách mà khách hàng đã chọn mua trên trang chủ HomePage.
+ Các Button dùng để thực hiện các thao tác như “đặt hàng”, “về trang chủ”,
“hủy giỏ hàng” hay “chọn mua tiếp”.
Dùng Label để hiển thị tổng số tiền của các mặt hàng trong giỏ (shopping cart) Nếu shopping cart trống, hãy thông báo cho người dùng về tình trạng trống đó và gợi ý "hãy mua hàng nào!", giúp hướng dẫn chi tiết người dùng về cách thực hiện các bước tiếp theo để mua hàng.
4.4.2 Mã lệnh (Codes) WebPage “Giỏ hàng” o Khai báo biến: static DataTable cart = new DataTable();//biến toàn cục o Page load khi wfCart được khởi tạo: protected void Page_Load(object sender, EventArgs e)
{ lblTitle.Text = "Giỏ hàng đang trống, hãy mua hàng thôi nào!!!"; btnmua.Text = "Chọn mua"; dgvgiohang.DataSource = null; lblSum.Text = ""; btndat.Visible = false; btnhuy.Visible = false;
{ lblTitle.Text = "Giỏ hàng của bạn:"; btnmua.Text = "Chọn mua tiếp!"; cart = Session["cart"] as DataTable; dgvgiohang.DataSource = cart; dgvgiohang.DataBind(); lblSum.Text = "Giỏ hàng của bạn có: " + cart.Compute("Count(msS)","").ToString()+" mặt hàng Tổng tiền: "+ cart.Compute("Sum(tien)", "") + " VNĐ"; btndat.Visible = true; btnhuy.Visible = true;
} } o Sự kiện nháy vào button “mua”: protected void btnmua_Click(object sender, EventArgs e)
} o Sự kiện nháy vào button “hủy”: protected void btnhuy_Click(object sender, EventArgs e)
{ Session["cart"] = null; btnmua_Click(sender, e);
Đơn đặt hàng của khách hàng: wfOrder.aspx
* Trang này (wfOrder) được gọi từ trang “Gỏi hàng” [wfCart.aspx] không rổng:protected void Page_Load(object sender, EventArgs e) btndat.Visible = false;
} … else //nếu giỏ hàng không rỗng
* Nếu giỏ hàng đã có thì có thể gọi được trang đặt hàng: wfOrder.aspx
Hình 4.4: Các nút trên trang giỏ hàng
//ĐẶT HÀNG protected void btndat_Click(object sender, EventArgs e)
* Để thực hiện được trang đặt hàng: wfOrder.aspx thì cần phải “chạy” từ trang chủ (wfHomePage.aspx: trưng bày hàng hóa), cho phép KH chọn hàng “bỏ vào giỏ” và đã có “giỏ hàng”: Set As Start Page từ wfHomePage.aspx
* ĐẶT HÀNG PHẢI XÁC ĐỊNH 3 NỘI DUNG:
+ Khách hàng: Khách hàng sẽ thực hiện thao tác tìm khách hàng để chọn mua hàng. Nếu là lần đầu mua hàng, khách hàng sẽ cần để lại thông tin như tên, địa chỉ, số điện thoại và email để thực hiện lưu thông tin cho các lần mua hàng sau này.
+ Thông tin đơn hàng: Thông tin đơn hàng gồm các thông tin như địa chỉ giao, người nhận, số điện thoại người nhận, ghi chú, hạn giao để thực hiện tạo đơn đặt hàng.
+ Đơn này đặt mua những mua những mặt hàng nào và số lượng là bao nhiêu, dữ liệu này sẽ được lấy từ giỏ hàng của khách hàng.
Sau khi đặt hàng phải xác định được hàng sẽ được giao ở đâu, cho ai, số điện thoại người nhận, hạn giao
4.5.2 Thiết kế trang Đặt hàng: wfOrder.aspx
Thiết kế FORM “Đặt hàng”: có 3 phần
* Thông tin khách hàng: Tìm (tìm bằng mã, tên, địa chỉ hay số điện thoại); nếu tìm không có thì cho thực hiện thêm khách hàng mới.
* Thông tin đơn đặt hàng (xem table tb_dondathang trong DB): Mã số đơn đặt hàng (được định theo dạng của thời điểm chọn khách hàng thực hiện đặt hàng), ngày lập (ngày giờ hiện tại), địa chỉ giao hàng, người nhận, số đt người nhận, khu vực, thời hạn giao, ghi chú.
Thông tin "giỏ hàng" được lấy từ trang "giỏ hàng" (wfCart), cho phép khách hàng xem và kiểm tra các mặt hàng đã đặt, tổng tiền, Tuy nhiên, khách hàng không thể thực hiện thêm, xóa hoặc sửa các mục trong giỏ hàng.
(việc này thực hiện trên trang “giỏ hàng”).
PHẦN THÔNG TIN KHÁC HÀNG: Tìm khách hàng, nếu chưa có thì thêm mới, nếu đã có thì chọn khách hàng (vì có thể tìm thấy nhiều khách hàng), được thiết kế như Hình
Hình 4.5: Thiết kế phần thông tin KH của Đơn hàng
+ Nếu tìm có khách hàng thì phần thông tin khách hàng mới sẽ bị ẩn; dgv… Visible = False
+ Ghi chú: Khi GridView rổng (không có dòng nào) nó sẽ tự ẩn.
+ Bổ sung Nút “Chọn” trên mỗi dòng của GridViewKH
+ Thông tin đơn hàng được thiết kế theo Table tb_dondathang đã có trong DB: tb_dondathang (msddh, ngaylap, diachi_giao, ten_nguoinhan, sdt_nguoinhan, thoihan_giao, ghichu)
+ Thông tin đơn hàng chỉ hiển thi khi đã có thông tin khách hàng, tức là trong phần thông tin khách hàng đã “Chọn khách hàng”, vì vậy, ban đầu, các đối tượng thiết
Hình 4.6: Thiết kế phần thông tin Đơn hàng trên trang Đặt hàng PHẦN THÔNG TIN CÁC MẶT HÀNG ĐẶT MUA CỦA ĐƠN HÀNG (GIỎ HÀNG)
4.5.3 Lập trình mã lệnh (Codes) của trang Đặt hàng: wfOrder.aspx PHẦN THÔNG TIN KHÁC HÀNG
* Tìm khách hàng, nếu chưa có thì thêm mới, nếu đã có thì chọn KH; vì có thể tìm thấy nhiều KH:
SELECT mskh, tenkh, diachi, sdt
WHERE (mskh = @mskh) OR (tenkh = @tenkh) OR (diachi = @diachi)
OR (sdt = @sdt) Với tham số như Hình
Hình 4.7: Tham số lệnh SQL tìm KH + Lệnh SQL thêm KH mới: Insert KH: SqlDataSource_KH
INSERT INTO tb_khachhang(mskh, tenkh, diachi, sdt)
VALUES (@mskh, @tenkh, @diachi, @sdt) Với tham số như Hình
Hình 4.8: Tham số lệnh SQL thêm KH mới
+ Lệnh SQL chấp nhận đơn đặt hàng: Insert DDH và ctDDH: SqlDataSouce_ DDH và SqlDataSouce_CTDDH
INSERT INTO tb_dondathang(msddh, ngaylap, mskh, nguoinhan, sgiao, thoihangiao, sdtnguoinhan, tinhtrang, ghichu)
VALUES (@msddh, @ngaylap, @mskh, @nguoinhan, @sgiao,
Hình 4.9: Tham số lệnh SQL chấp nhận đơn đặt hàng
INSERT INTO tb_chitietddh(msddh, mss, sl)
Với các tham số được khai báo ở code: r["msS"].ToString().Trim());
SqlDataSource_CTDDH.InsertParameters.Add("sl",
DbType.Int32, r["sl"].ToString().Trim());
+ Lệnh SQL hủy đơn đặt hàng: Delete DDH: SqlDataSouce_ DDH [1] Delete DDH
Hình 4.10: Tham số lệnh SQL hủy đơn đặt hàng
+ MÃ LỆNH NÚT TÌM KH
[1] Tìm khách hàng [thủ tục chính] = Tim KH + Nhập KH mới + Lưu DB + chọn KH
// [1].TÌM KH + [2].NHẬP KH MỚI + [3] LƯU THÔNG TIN KH MỚI VỪA NHẬP + [4]CHỌN KH TRONG GRIDVIEW TÌM THẤY (TẠI VỊ TRÍ vt ĐÃ CHỌN TRÊN GIRDVIEW) protected void btntimkiem_Click(object sender, EventArgs e)
{ //hiện thị nút lệnh hủy tìm btnhuy.Visible = true; if (btntimkiem.Text.Trim() == "Tìm")//nếu text của nút tìm là "Tìm"
{ dgvkhachhang.DataBind(); //cập nhật dgvkhachhang if (dgvkhachhang.Rows.Count < 1) //không tìm thấy khách hàng { btntimkiem.Text = "Thêm khách hàng mới";
} else//tìm thấy khách hàng { btntimkiem.Text = "Chọn khách hàng"; txtms.Text = dgvkhachhang.Rows[0].Cells[1].Text.Trim();
//nếu text của nút tìm là "Thêm khách hàng mới" else if (btntimkiem.Text.Trim() == "Thêm khách hàng mới")
Upon user interaction, the application's interface undergoes a transformation, displaying previously hidden fields related to customer information These fields include customer ID, full name, class, and phone number, and their accompanying text input controls become visible, allowing for data entry and modification.
//xóa trắng các txt txtms.Text = txttimkiem.Text.Trim(); txtms.ToolTip = "Không để trống " +
"mã hoặc nhập trùng"; txthoten.Text = ""; txts.Text = ""; txtsdt.Text = ""; btntimkiem.Text = "Lưu thông tin khách hàng mới";
} //nếu text của nút tìm là "Lưu thông tin khách hàng mới" else if (btntimkiem.Text.Trim() == "Lưu thông tin khách hàng mới")
{ //thực hiện thêm khách hàng try {
SqlDataSource_KH.Insert(); this.Title = "Thêm mới khách hàng"; txttimkiem.Text = txtms.Text.Trim();
//cập nhật lại dgv khách hàng dgvkhachhang.DataBind();
{ //hiển thị lỗi nếu xảy ra lỗi this.Title = "Lỗi: " + ex.Message;
} //ẩn vùng thêm kh lblthemkh.Visible = false; lblms.Visible = false; lblhoten.Visible = false; lbls.Visible = false; lblsdt.Visible = false; txtms.Visible = false; txthoten.Visible = false; txts.Visible = false; txtsdt.Visible = false; else if (btntimkiem.Text.Trim() == "Chọn khách hàng")
This code snippet relates to the display of order details in a web application By setting the value of `txttimkiem` to the trimmed value of `txtms`, the customer details in the `dgvkhachhang` grid are bound The search button `btntimkiem` is disabled, while various labels for order information become visible, including `lblmadon`, `lblmaddh`, `lblngay`, `lblngaylap`, `lblsgiao`, `lblnguoinhan`, `lblhangiao`, `lblghichu`, and `lblsdtnhan` Additionally, textboxes and a calendar control are made visible for input of shipping address `txtsgiao`, recipient name `txtnguoinhan`, order notes `txtghichu`, shipping date `cldhangiao`, and recipient phone number `txtsdtnhan`.
This code automatically creates a unique customer code that combines the customer's name with the current date and time The customer code is generated by appending the last two digits of the current year, followed by the month, day, hour, minute, and second to the customer's name The date of order creation is also captured and displayed in a user-friendly format By incorporating these variables into the customer code, businesses can ensure that each order is assigned a unique and easily identifiable reference number.
//Hiển thị nút chấp nhận và hủy đơn btnchapnhan.Visible = true; btnhuydon.Visible = true;
//hiển thị thông tin chi tiết đơn hàng từ session ở trang giỏ hàng lblthongtinctdon.Visible = true; cart = Session["cart"] as DataTable; dgvgiohang.DataSource = cart; dgvgiohang.DataBind(); lblSum.Text = "Giỏ hàng của bạn có: " + cart.Compute("Count(msS)", "").ToString() +
" mặt hàng Tổng tiền: " + cart.Compute("Sum(tien)", "") + " VNĐ"; dgvgiohang.Visible = true; lblSum.Visible = true;
[2] Hủy kết quả tìm và tìm lại KH khác
// HỦY : TÌM LẠI KH KHÁC protected void btnhuy_Click(object sender, EventArgs e) { //tìm lại btntimkiem.Enabled = true; btntimkiem.Text = "Tìm";
//ẩn vùng thêm kh lblthemkh.Visible = false; lblms.Visible = false; lblhoten.Visible = false; lbls.Visible = false; lblsdt.Visible = false; txtms.Visible = false; txthoten.Visible = false; txts.Visible = false; txtsdt.Visible = false;
//xóa trắng txttimkiem txttimkiem.Text = "";
//xóa trắng dgv dgvkhachhang.DataBind();
//ẩn nút hủy btnhuy.Visible = false;
//hủy thông tin đơn hàng lblthongtindon.Visible = false; lblmadon.Visible = false; lblmaddh.Visible = false; lblmaddh.Text = ""; lblngay.Visible = false; lblngaylap.Visible = false; lblngaylap.Text = ""; lblsgiao.Visible = false; lblnguoinhan.Visible = false; lblhangiao.Visible = false; lblghichu.Visible = false; lblsdtnhan.Visible = false; txtsgiao.Visible = false; txtnguoinhan.Visible = false; txtghichu.Visible = false; cldhangiao.Visible = false; txtsdtnhan.Visible = false; btnchapnhan.Visible = false; btnhuydon.Visible = false; dgvgiohang.Visible = false; lblSum.Visible = false;
PHẦN THÔNG TIN ĐƠN HÀNG
[1] Hiển thị mã số đơn hàng khi đã chọn KH
PHẦN THÔNG TIN CÁC MẶT HÀNG ĐẶT MUA CỦA ĐƠN HÀNG (GIỎ HÀNG)
THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN QUẢN LÝ
Giới thiệu về WebApp quản lý hệ thống bán sách LHshop online
[1] Chức năng chính của phần quản lý
* Hệ thống này dành cho nhân viên của đơn vị kinh doanh sách thực hiện các chức năng cập nhật thông về hàng hóa, dịch vụ kinh doanh sách online, như: bổ sung sản phẩm thể thao mới, thay đổi giá bán, cập nhật chính sách khuyến mãi,…
Để thực hiện được việc quản lý thì nhân viên phải đăng nhập thành công trước khi thực hiện nghiệp vụ nào đó và có chức năng thêm, xóa, sửa đối với nghiệp vụ quản lý.
[2] Thiết kế và lập trình chức năng đăng nhập dành cho nhân viên
* Từ trang HomePage, các nhân viên phải thực hiện đăng nhập thành công mới được truy xuất trang "Quản lý".
Trong đề tài tạm sử dụng 2 Accounts mặc định:
Username1: Admin Password1: admin@vn
* Vì các nhân viên có thể đăng nhập và thực hiện các chức năng quản lý liên quan từ bất kỳ trang web nào trong hệ thống nên thiết kế và lập trình chức năng đăng nhập (Login) phải được thực hiện trên mautrang.master.
Masterpage quản lý hệ thống bán sách online
5.2.1 Thiết kế Masterpage quản lý
Sử dung lại Masterpage giao dịch Transaction.Master bằng cách thiết kế và lập trình bổ sung thực đơn (Menu quản lý) như Hình trang 61THIẾT KẾ: Designing (MauTrang.Master):
Hình 5.1: Thiết kế Menu chính trên MasterPage
[Task]->Edit menu item || Properties: Item …: định nghĩa các mục chọn menu
Item : Text Value NavigateURL : như Hình trang 61
Hình 5.2: Thiết lập thuộc tính cho mục chọn (Item) của Menu
5.2.2 Lập trình bổ sung Masterpage quản lý
MÃ LỆNH LẬP TRÌNH: Coding (MauTrang.Master): o Page load khi web app được chạy: protected void Page_Load(object sender, EventArgs e)
} o Kiểm tra đăng nhập: protected void lgnhanvien_Authenticate(object sender, AuthenticateEventArgs e) { //NẾU NSD ĐĂNG NHẬP BẰNG TK BÊN DƯỚI THÌ DN THÀNH CÔNG if ((lgnhanvien.UserName == "Admin" && lgnhanvien.Password == "admin@vn")
|| lgnhanvien.UserName == "Guest" && lgnhanvien.Password == "guest@vn") { e.Authenticated = true;//DN THÀNH CÔNG
Session["dn"] = lgnhanvien.UserName as string;
{ e.Authenticated = false;//DN KHÔNG THÀNH CÔNG
Chú giải: Code trên chỉ là tượng trưng; trong mở rộng và phát triển sản phẩm đề tài sẽ:
1 Tổ chức Username và Password: lưu trữ và kiểm tra từ một Table trong DB.
2 Xử lý bảo mật khi NSD nhớ (copy) Link url : như trình bày trong Chương 2: trang
Trang chính của hệ thống quản lý hệ thống bán sách LHshop
5.3.1 Thiết kế (Design) trang quản lý chung (chính): wfTrangQLChung.aspx
Hình 5.3: Thiết kế trang quản lý chung
5.3.2 Lập trình (Codes) trang quản lý chung (chính): wfTrangQLChung.aspx
//gọi trang quản lý danh mục S protected void btnQLS_Click(object sender, EventArgs e)
//gọi trang quản lý loại S protected void btnloaiS_Click(object sender, EventArgs e)
//gọi trang quản lý chi nhánh S protected void btnQLCN_Click(object sender, EventArgs e)
//gọi trang quản lý nhân viên protected void btnQLnv_Click(object sender, EventArgs e)
//gọi trang quản lý chi tiết đơn đặt hàng protected void btnQLctdh_Click(object sender, EventArgs e)
//gọi trang quản lý khách hàng protected void btnQLkh_Click(object sender, EventArgs e)
//gọi trang quản lý đơn đặt hàng protected void btnQLdh_Click(object sender, EventArgs e)
//gọi trang chuyển loại S protected void btnchuyenloai_Click(object sender, EventArgs e) { Response.Redirect("~\\wfChangeGroupManagement.aspx"); }
//gọi trang chuyển thương hiệu S protected void btnchuyenth_Click(object sender, EventArgs e) { Response.Redirect("~\\wfChangeTrademarkManagements.aspx"); }
//gọi trang quản lý thương hiệu S protected void btnQLthuonghieu_Click(object sender, EventArgs e) { Response.Redirect("~\\wfTrademarkManagements.aspx"); }
//gọi trang quản lý xuất nhập kho protected void btnQLx_nkho_Click(object sender, EventArgs e)
//gọi trang quản lý khu vực protected void btnQLkvbh_Click(object sender, EventArgs e)
//gọi trang homepage protected void btnTC_Click(object sender, EventArgs e)
//gọi trang quản lý phân công phụ trách DDH protected void btnQLpcgh_Click(object sender, EventArgs e)
5.4 Trang quản lý danh mục sách: wfGoodsManagements.aspx
5.4.1 Phân tích trang quản lý danh mục sách
+ Dành cho nhân viên sau khi đăng nhập thành công và chọn chức năng quản lý sách từ trang quản lý chung.
Hình 5.4: Các table liên quan đến trang quản lý danh mục sách + Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa sách trong các loại sách + Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl
5.4.2 Thiết kế (Design) trang quản lý danh mục sách: wfGoodsManagements.aspx
Hình 5.5: Thiết kế trang quản lý danh mục sách
DropDownList ddlLoaiS: DataSourceID = SqlDataSource_LoaiS Câu lệnh kết nối DB: SELECT * FROM [tb_loaiS]
Các thiết lập thuộc tính : + v Enable Auto Postback
GridView dgvQLS: DataSourceID = SqlDataSource_DSS
GridView gdvskhongxacdinh: DataSourceID = SqlDataSource_scoloaivath00
2 GridView phụ dgvtonkho có DataSourceID SqlDataSource_TONKHO và dgvctdh có DataSourceID SqlDataSource_CTHD dùng để xử lý ràng buộc toàn vẹn Các Button để thực hiện thao tác thêm hoặc hủy thêm một sách mới Câu lệnh SQL kết nối DataBase của dgvQLS:
SELECT * FROM [tb_dsS] WHERE ([msloais] @msloais) @msloais = ddlLoaiS.SelectedValue Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgvskhongxacdinh: SELECT mss, tens, msloais, math FROM tb_dsS
WHERE (msloais = @msloais) OR (math
@math = TH00 Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgvtonkho: SELECT * FROM [tb_hangton] WHERE ([mss]
Câu lệnh SQL kết nối DataBase của dgvctdh:
SELECT * FROM [tb_chitietddh] WHERE ([mss]
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) CheckBox cbxhienhinh: Cho người dùng chọn có/không hiển thị hình ảnh của sách trong GridView (Mặc định “không” = vì tải hình ảnh sẽ làm chậm trang web):
Text = Hiển thị hình mẫu
Checked = False (ban đầu “không” chọn)
Bổ sung mục chọn “Tất cả” trong DropDownList và hiển thị msloais cạnh bên B1:Bổ sung Item mới=Dropdownlist[Task…]->Edit Item: Add [.Text = Tất cả, Value = *]
B2: Properties[Dropdownlist] AppendDataBoundItems = True: các mục chọn trong DDL sẽ bao gồm các mục Edit Items ở B1 ghép (Append) với các mục chọn có trong DB được kết vào DDL này (ddlLoaiS).
B3: Viết bổ sung câu lệnh trong thủ tục sự kiện SelectedIndexChanged của ddlLoaiS protected void ddlLoaiS_SelectedIndexChanged(object sender, EventArgs e)
{ //xử lý chọn tất cả if (ddlLoaiS.SelectedValue.Trim() == "*")
{ SqlDataSource_DSS.SelectCommand = "SELECT * FROM
[tb_dsS]"; btnthem.Enabled = false; ddlLoaiS.ToolTip = "Phải chọn loại sách cụ thể";
{ btnthem.Enabled = true; ddlLoaiS.ToolTip = "";
} //hiển thị msnhom lblmanhom.Text = ddlLoaiS.SelectedValue.Trim();
When the webpage is loaded, the dropdown list "All" (as the first item) is selected, and the GridView below will list all books.Protected void Page_Load(object sender, EventArgs e)
Checkbox cho hiển thị / không hiển thị Hình ảnh của sách Trong GridView B1: Chuyển đổi cột “Hình” GridView sang chế độ tự thiết kế: Template Field [GridView]Task->Edit Columns: “Hinh” -> Chọn “Convert to Template Field”
Ta thực hiện tương tự với 2 cột là math và ngayxhtrentt
B2: Thiết kế lại cột hình ảnh trong GridView: [GridView]Task->ItemTemplates
Hình 5.6: Thiết kế lại cột "Hình" trên GridView
Thay thế Label… bởi Image (lấy từ Toolbox):
Image Task->Edit DataBinding: ImageURL = hinh (trong DB) B3: Codes thay đổi lựa chọn của CheckBox (.Auto Postback = True)
//ẩn hiện hình protected void cbxhienhinh_Checkeshanged(object sender, EventArgs e){
PostBack = True khi chỉ cần 1 lựa chọn (DropDownList || CheckBox) là thực hiện tải lại
DB PostBack = False khi chỉ cần Nhiều lựa chọn (DropDownList, CheckBox, ) thì mới tải lại DB
Paging: Phân trang cho GridView
[GridView] Task -> tích chọn Enable Paging
- Figure 5.7: Paging on GridView.- 5.4.3 Programming (Codes) to initialize the book catalog management page: wfGoodsManagements.aspx- static string us = "unknown name";- protected void Page_Load(object sender, EventArgs e)
{ us = Session["dn"] as string; lblTitle.Text = "CHÀO MỪNG " + us.ToUpper()
+ " ĐẾN VỚI TRANG QUẢN LÝ DANH MỤC SÁCH TẠI LHSHOP"; ddlLoaiS_SelectedIndexChanged(sender, e);
5.4.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục sách: wfGoodsManagements.aspx
B1: Thiết kế nút lệnh [Thêm | Xóa | Sửa | Chọn] trên các dòng của Gridview 5.4.4.1 Thêm sách
B2: Viết lệnh SQL thêm sách trrong SqlDataSource_DSS tương ứng INSERT INTO tb_dsS(mss, tens, gia, dvt, mau, soluong, motas, ngayxhtrentt, hinh, msloais, math)
VALUES (@mss, @tens, @gia, @dvt, @mau, @thongso, @motas,
B3: Thiết kế các textbox cho phép người dùng thêm sách
Hình 5.8: Thiết kế textbox cho phép người dùng thêm sách
B4: Không cho phép “Thêm Mặt hàng mới” khi người dùng chọn “ Tất cả” trong DropDownList ddlLoaiS; Vì khi thêm mới, được hiểu là thêm mới vào “loại sách” đã chọn trong ddlLoaiS.
B5: Viết mã lệnh (Codes) cho nút lênh “Thêm sách mới” protected void btnthem_Click(object sender, EventArgs e)
{ //hiển thị phần thêm dữ liệu cho sách mới lbldvt.Visible = !lbldvt.Visible; lblgia.Visible = !lblgia.Visible; lblhinh.Visible = !lblhinh.Visible; lblmau.Visible = !lblmau.Visible; lblmota.Visible = !lblmota.Visible; lblmsS.Visible = !lblmsS.Visible; lblngay.Visible = !lblngay.Visible; lbltens.Visible = !lbltens.Visible; lblth.Visible = !lblth.Visible; lblts.Visible = !lblts.Visible; txtdvt.Visible = !txtdvt.Visible; txtgia.Visible = ! txtgia.Visible; txtmau.Visible = !txtmau.Visible; txtmota.Visible = !txtmota.Visible; txtmsS.Visible = ! txtmsS.Visible; txttens.Visible = !txttens.Visible; txtts.Visible = !txtts.Visible; ddlthemthuonghieu.Visible = ! ddlthemthuonghieu.Visible; cldngayxh.Visible = ! cldngayxh.Visible; fuHinh.Visible = !fuHinh.Visible; btnhuy.Visible = !btnhuy.Visible; if(btnthem.Text.Trim() == "Thêm sách mới")
{ //xóa trống các textbox txtmsS.Text = "000"; txtmsS.ToolTip = "Không được để trống mã" +" sách, không nhập mã đã tồn tại"; txttens.Text = ""; txtts.Text = "";
//đổi nhãn thêm -> lưu btnthem.Text = "Lưu sách";
{ /*định nghĩa tham số cho insert_command (tham số hình có dạng:
SqlDataSource_DSS.InsertParameters.Add("mss", txtmsS.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("tens", txttens.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("gia",
System.Data.DbType.Double, txtgia.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("dvt", txtdvt.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("mau", txtmau.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("thongso", txtts.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("motas", txtmota.Text.Trim());
SqlDataSource_DSS.InsertParameters.Add("ngayxhtrentt",
System.Data.DbType.Date, cldngayxh.SelectedDate.ToString()); SqlDataSource_DSS.InsertParameters.Add("math", ddlthemthuonghieu.SelectedValue.Trim());
SqlDataSource_DSS.InsertParameters.Add("msloais", ddlLoaiS.SelectedValue.Trim());
SqlDataSource_DSS.InsertParameters.Add("hinh",
//lưu hình fuHinh.SaveAs("d:\\DZHosts\\LocalUser\\vmhLTWeb\\" +
"www.LHShop112ntlhuong.somee.com\\HinhVaAmThanh\\" + fuHinh.FileName.Trim());
{ this.Title = "Có lỗi xảy ra khi thêm dữ liệu: " + ex;
} //tải thông tin lên dgv dgvQLS.DataBind(); btnthem.Text = "Thêm sách mới";
B6: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnhuy_Click(object sender, EventArgs e)
{ //ẩn các textbox lbldvt.Visible = false; lblgia.Visible = false; lblhinh.Visible = false; lblmau.Visible = false; lblmota.Visible = false; lblmsS.Visible = false; lblngay.Visible = false; lbltens.Visible = false; lblth.Visible = false; lblts.Visible = false; txtdvt.Visible = false; txtgia.Visible = false; txtmau.Visible = false; txtmota.Visible = false; txtmsS.Visible = false; txttens.Visible = false; txtts.Visible = false; ddlthemthuonghieu.Visible = false; cldngayxh.Visible = false; fuHinh.Visible = false; btnhuy.Visible = false;
//đổi nhãn btnthem.Text = "Thêm sách mới";
B2: Chỉnh sửa Edit Item Template cho mã thương hiệu (math), ngày sách được bày bán trên thị trường (ngayxhtrentt) và Hình (hinh)
[GridView] Task -> EditItemTemplate ở cột “Mã thương hiệu” và thay thế TextBox thành
1 DropDownList với các thuộc tính DataSourceID: SqlDataSource_ThuongHieu, DataTextField: tenthuonghieu và DataValueField: math
Hình 5.9: EditItemTemplate ở cột “Mã thương hiệu”
Hình 5.10: EditItemTemplate ở cột “Ngày xuất hiện trên thị trường”
[GridView] Task -> EditItemTemplate ở cột “Hình” và thêm 1 button có thuộc tính CommandName: chon, 1 FileUpLoad
B3:Viết lệnh SQL sửa (Update) sách trong SqlDataSource_DSS tương ứng
UPDATE tb_dsS SET tens = @tens, math = @math, mau = @mau, gia @gia, ngayxhtrentt = @ngayxhtrentt, thongso = @thongso, motas @motas, hinh = @hinh, dvt = @dvt
Hình 5.12: Tham số lệnh SQL sửa (Update) sách trong SqlDataSource_DSS
B4: Viết code sửa hình: static int id = 0; protected void dgvQLS_RowEditing(object sender, GridViewEditEventArgs e)
} protected void dgvQLS_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName.Trim() == "chon")
{ if (((FileUpload)dgvQLS.Rows[id].Finsontrol("fuedithinh")).FileName != "")
{ ((TextBox)dgvQLS.Rows[id].Finsontrol( "txtHinh")).Text =
+ (FileUpload)dgvQLS.Rows[id].Finsontrol("fuedithinh")).FileName;
((FileUpload)dgvQLS.Rows[id].Finsontrol( "fuedithinh")).SaveAs
("d:\\DZHosts\\LocalUser\\vmhLTWeb\\www.LHShop112ntlhuong"
((FileUpload)dgvQLS.Rows[id].Finsontrol("fuedithinh")).FileName.Trim());
B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_DSS tương ứng
Hình 5.13: Tham số lệnh SQL xóa (Update) sách trong SqlDataSource_DSS
5.4.5 Lập trình (Codes) xử lý RBTV dữ liệu khi xóa danh mục sản phẩm sách: wfGoodsManagements.aspx
Khi xóa bản ghi trong bảng dữ liệu tb_dsS (Danh sách sách), dữ liệu trong hai bảng tb_chitietddh (Chi tiết đơn đặt hàng) và tb_hangton (Tồn kho) cũng bị ảnh hưởng Tình trạng này được mô tả trong hình minh họa trong bài viết, thể hiện mối liên quan giữa các bảng dữ liệu trong cơ sở dữ liệu.
Hình 5.14: Trích DB liên quan xử lý RBTV dữ liệu khi xóa sách
+ Mặt hàng cần xóa đang còn tồn kho: xử lý “Thanh lý” = Xóa tồn kho của mặt hàng đó: Xóa từng tồn kho hoặc xóa tất cả tồn kho của mặt hàng đó.
+ Mặt hàng cần xóa đang còn đơn đặt hàng chưa giải quyết (tb_chitietddh): xử lý đổi hàng (Xóa chi tiết đơn đặt hàng đó và chọn mua mặt hàng khác tương đương) hoặc thuyết phục khách hàng từ chối mua mặt hàng đó = Xóa chi tiết đơn đặt hàng: xóa từng chi tiết đơn đặt hàng hoặc xóa tất cả chi tiết đơn đặt hàng của mặt hàng đó.
5.4.5.2 Thiết kế 2 GridView phụ ngay trên Form quản lý wfGoodsManagements.aspx * Thiết kế 2 gridviews phụ như Hình
Hình 5.15: Các Gridviews xử lý RBTV dữ liệu khi Xóa
* Các thuộc tính GridView dgvtonkho
Caption = SÁCH ĐANG CHỌN CÒN TỒN TẠI CÁC CHI NHÁNH VỚI SỐ LƯỢNG NHƯ SAU:
Caption = SÁCH ĐANG CHỌN CÒN ĐẶT MUA TRÊN CÁC ĐƠN HÀNG SAU:
5.4.5.3 Xử lý các RBTV trên 2 GridView phụ
Thanh lý[Delete]: Chính là câu lệnh Delete sách được viết trong
WHERE (mss = @mss) AND (mschinhanh = @mschinhanh)
Với mss = dgvtonkho.SelectedValue[2] mschinhanh = dgvtonkho.SelectedValue[1]
Khách hàng từ chối[Delete]: Chính là câu lệnh Delete sách được viết trong SqlDataSource_CTHD
WHERE (msddh = @msddh) AND (mss = @mss)
Với msddh = dgvctdh.SelectedValue[1] mss = dgvctdh.SelectedValue[2] Đổi hàng[Update]:
Mã đơn hàng.ReadOnly = True
Mã hàng.ReadOnly = False (được phép đổi hàng)
Số lượng.ReadOnly = False (được phép thay đổi số lượng)
Viết câu lệnh Update sách trong SqlDataSource_CTHD
SET mss = @mss_new, sl = @sl mss = dgvQLS.SelectedValue mss_new = dgvctdh.SelectedValue[2] sl = dgvctdh.SelectedValue[3]
Trang quản lý loại sách: wfGroupManagements.aspx
5.5.1 Phân tích trang quản lý loại sách
+ Dành cho nhân viên sau khi đăng nhập thành công và chọn chức năng quản lý sách từ trang quản lý chung.
Hình 5.16: Các table liên quan đến trang quản lý loại sách
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa loại sách
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl
5.5.2 Thiết kế (Design) trang quản lý loại cụ thể thao: wfGroupManagements.aspx
Hình 5.17: Thiết kế trang quản lý sách
GridView dgvls: DataSourceID = SqlDataSource_LoaiS
GridView phụ dgvdsS có DataSourceID = SqlDataSource_DSS để xem các sách thuộc loại sách được chọn ở dgvls Dùng Button để thực hiện các thao tác thêm hoặc hủy thêm một loại sách mới Câu lệnh SQL kết nối DataBase của dgvls:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgvdsS:
SELECT * FROM [tb_dsS] WHERE ([msloais] @msloais) @msloais = dgvls.SelectedValue
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
Paging: Phân trang cho GridView dgvdsS
[GridView] Task -> tích chọn Enable Paging
Hình 5.18: Phân trang cho GridView 5.5.3 Lập trình (Codes) khởi tạo trang quản lý loại sách: wfGroupManagements.aspx static string us = "chua biet ten"; protected void Page_Load(object sender, EventArgs e)
{ us = Session["dn"] as string; lblTitle.Text = "CHÀO MỪNG " + us.ToUpper() + " ĐẾN VỚI TRANG QUẢN LÝ" +
" LOẠI SÁCH TẠI LHSHOP"; }//page_load
5.5.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý loại sách: wfGroupManagements.aspx
B1: Thiết kế nút lệnh [Thêm | Xóa | Sửa | Chọn] trên các dòng của Gridview 5.5.4.1 Thêm loại sách
B2: Viết lệnh SQL thêm sách trrong SqlDataSource_LoaiS tương ứng INSERT INTO tb_loaiS(msloais, tenloai, mota)
Với các tham số được khai báo ở phần lập trình
B3: Thiết kế các textbox cho phép người dùng thêm loại sách
Hình 5.19: Thiết kế các textbox cho phép người dùng thêm loại sách
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm loại sách mới” protected void btnthem_Click(object sender, EventArgs e)
{ lblmsloai.Visible = !lblmsloai.Visible; txtmsloai.Visible = !txtmsloai.Visible; lbltenloai.Visible = !lbltenloai.Visible; txttenloai.Visible = !txttenloai.Visible; btnhuy.Visible = !btnhuy.Visible; if (btnthem.Text.Trim() == "Thêm loại sách mới")
{ //xóa trống các textbox txtmsloai.Text = "000"; txtmsloai.ToolTip = "Không được để trống" +
" mã loại, không nhập mã đã tồn tại"; txttenloai.Text = ""; txtmota.Text = "";
//đổi nhãn thêm -> lưu btnthem.Text = "Lưu loại sách";
{ /*định nghĩa tham số cho insert_command (tham số hình có dạng:
SqlDataSource_LoaiS.InsertParameters.Add("msloais", txtmsloai.Text.Trim());
SqlDataSource_LoaiS.InsertParameters.Add("tenloai", txttenloai.Text.Trim());
SqlDataSource_LoaiS.InsertParameters.Add("mota", txtmota.Text.Trim());
//chạy lệnh insert SqlDataSource_LoaiS.Insert();
} catch (System.Exception ex) { this.Title = "Có lỗi xảy ra khi thêm dữ liệu: " + ex;
} //tải thông tin lên dgv dgvls.DataBind(); btnthem.Text = "Thêm loại sách mới";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnhuy_Click(object sender, EventArgs e)
{ //ẩn các textbox lblmsloai.Visible = false; lbltenloai.Visible = false; lblmota.Visible = false; txtmsloai.Visible = false; txttenloai.Visible = false; txtmota.Visible = false; btnhuy.Visible = false;
//đổi nhãn btnthem.Text = "Thêm loại sách mới";
B2: Viết lệnh SQL sửa (Update) sách trong
SqlDataSource_LoaiS tương ứng UPDATE tb_loaiS
SET tenloai = @tenloai, mota = @mota
Hình 5.20: Các tham số lệnh SQL sửa sách trong SqlDataSource_LoaiS
B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_LoaiS tương ứng
Hình 5.21: Các tham số lệnh SQL xóa sách trong SqlDataSource_LoaiS
5.5.5 Xử lý RBTV dữ liệu khi xóa loại sách: wfGroupManagements.aspx 5.5.5.1 Giới thiệu
Khi xóa sách (Table tb_loaiS) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng: tb_dsS (danh sách sách), như Hình
Hình 5.22: Trích DB liên quan xử lý RBTV dữ liệu khi xóa loại MH 5.5.5.2 Xử lý RBTV
Ràng buộc toàn vẹn của trường hợp này được đảm bảo bằng trigger `tg_d_xoaloai_capnhat_loaiS` tạo trong hệ quản trị cơ sở dữ liệu SQL Server Chi tiết về trigger này có thể xem trong mục 3.5.3.
5.6 Trang quản lý thương hiệu sách: wfTrademarkManagements.aspx 5.6.1 Phân tích trang quản lý thương hiệu sách
+ Dành cho nhân viên sau khi đăng nhập thành công và chọn chức năng quản lý sách từ trang quản lý chung.
Hình 5.23: Các table liên quan đến trang quản lý thương hiệu sách+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa thương hiệu sách cầu lông+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl
5.6.2 Thiết kế (Design) trang quản lý thương hiệu cụ thể thao: wfTrademarkManagements.aspx
Hình 5.24: Thiết kế trang quản lý thương hiệu sách
GridView dgvth: DataSourceID = SqlDataSource_th
GridView phụ dgvdsS có DataSourceID = SqlDataSource_DSS để xem các sách thuộc thương hiệu sách được chọn ở dgvth Dùng Button để thực hiện các thao tác thêm hoặc hủy thêm một loại sách mới Câu lệnh SQL kết nối DataBase của dgvth:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgvdsS:
SELECT * FROM [tb_dsS] WHERE ([math] @math) @math = dgvth.SelectedValue Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Paging: Phân trang cho GridView dgvdsS
[GridView] Task -> tích chọn Enable Paeging
Hình 5.25: Phân trang cho GridView
5.6.3 Lập trình (Codes) khởi tạo trang quản lý thương hiệu sách: wfTrademarkManagements.aspx static string us = "chua biet ten"; protected void Page_Load(object sender, EventArgs e)
{ us = Session["dn"] as string; lblTitle.Text = "CHÀO MỪNG " + us.ToUpper() + " ĐẾN VỚI TRANG QUẢN LÝ" +
" THƯƠNG HIỆU CỦA CỬA HÀNG SÁCH LHSHOP"; }//page_load
5.6.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý thương hiệu sách: wfTrademarkManagements.aspx
B1: Thiết kế nút lệnh [Thêm | Xóa | Sửa | Chọn] trên các dòng của Gridview 5.6.4.1 Thêm thương hiệu sách
B2: Viết lệnh SQL thêm sách trrong SqlDataSource_th tương ứng
INSERT INTO tb_thuonghieu(math, tenthuonghieu)
Với các tham số được khai báo ở phần lập trình
B3: Thiết kế các textbox cho phép người dùng thêm thương hiệu sách
Hình 5.26: Thiết kế các textbox cho phép người dùng thêm thương hiệu sách
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm thương hiệu mới” protected void btnthem_Click(object sender, EventArgs e)
{ lblms.Visible = !lblms.Visible; txtms.Visible = !txtms.Visible; lblten.Visible = !lblten.Visible; txtten.Visible = !txtten.Visible; btnhuy.Visible = !btnhuy.Visible; if (btnthem.Text.Trim() == "Thêm thương hiệu mới")
{ //xóa trống các textbox txtms.Text = "000"; txtms.ToolTip = "Không được để trống mã, " +
"không nhập mã đã tồn tại"; txtten.Text = "";
//đổi nhãn thêm -> lưu btnthem.Text = "Lưu thương hiệu";
{ /*định nghĩa tham số cho insert_command (tham số hình có dạng:
SqlDataSource_th.InsertParameters.Add("math", txtms.Text.Trim());
SqlDataSource_th.InsertParameters.Add("ten", txtten.Text.Trim());
{ this.Title = "Có lỗi xảy ra khi thêm dữ liệu: " + ex;
} //tải thông tin lên dgv dgvth.DataBind(); btnthem.Text = "Thêm thương hiệu mới";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnhuy_Click(object sender, EventArgs e)
{ lblms.Visible = false; txtms.Visible = false; lblten.Visible = false; txtten.Visible = false; btnhuy.Visible = false; btnthem.Text = "Thêm thương hiệu mới";
B2: Viết lệnh SQL sửa (Update) sách trong
SqlDataSource_th tương ứng UPDATE tb_thuonghieu
B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_th tương ứng
Hình 5.28: Tham số lệnh SQL xóa sách trong SqlDataSource_th 5.6.5 Xử lý RBTV dữ liệu khi xóa thương hiệu sách: wfTrademarkManagements.aspx
Khi xóa sách (Table tb_loaiS) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng: tb_dsS (danh sách sách), như Hình
Hình 5.29: Trích DB liên quan xử lý RBTV dữ liệu khi xóa thương hiệu MH
Ràng buộc toàn vẹn của trường hợp này sẽ được xử lý bằng trigger tg_d_xoath_capnhat_loaiS được tạo trong hệ quản trị cơ sở dữ liệu SQL server, xem chi tiết ở mục 3.5.4.
5.7 Trang quản lý nhân viên tại LHshop: wfEmployeeManagements.aspx 5.7.1 Phân tích trang quản lý nhân viên tại LHshop
+ Dành cho nhân viên sau khi đăng nhập thành công và chọn chức năng quản lý sách từ trang quản lý chung.
Hình 5.30 minh họa các bảng liên quan đến trang quản lý nhân viên tại LHshop, chủ yếu thực hiện các chức năng thêm, sửa và xóa nhân viên Chuỗi kết nối cơ sở dữ liệu của trang này là: 1G112NguyenThiLanHuongBanSachConnectionString_onl.
5.7.2 Thiết kế (Design) trang quản lý nhân viên tại LHshop: wfEmployeeManagements.aspx
GridView dgvnvcpc: DataSourceID = SqlDataSource_nv_cpc
2 GridView phụ dgvdsddh có DataSourceID = SqlDataSource_DonHang và dgv_ct có DataSourceID = SqlDataSource_ctDONDATHANG để thực hiện xử lý ràng buộc toàn vẹn khi xóa nhân viên làm việc tại LHshop
Dùng DropDownList để chọn mã khu vực, mã chuyên môn và chọn nhân viên bàn giao đơn đặt hàng khi xóa nhân viên DropDownList ddlmskv: DataSourceID = SqlDataSource_MSKV
Câu lệnh kết nối DB: SELECT * FROM [tb_khuvuc] Các thiết lập thuộc tính : + v Enable Auto Postback
DropDownList ddlmscm: DataSourceID = SqlDataSource_CM Câu lệnh kết nối DB: SELECT * FROM [tb_chuyenmon]
Các thiết lập thuộc tính : + v Enable Auto Postback + DataTextField = tencm + DataValueField = mscm DropDownList ddlmscm: DataSourceID = SqlDataSource_bangiao Câu lệnh kết nối DB: SELECT * FROM [tb_nhanvien]
@msnv) Các thiết lập thuộc tính :
+ v Enable Auto Postback + DataTextField = tennv + DataValueField = msnv
Dùng Button để thực hiện các thao tác tuyển hoặc hủy tuyển một nhân viên mới Câu lệnh SQL kết nối DataBase của dgvqlnv:
SELECT msnv, honv, tennv, sdt FROM tb_nhanvien
WHERE (mskv = @mskv) AND (macm = @macm)
@macm = ddlmath SelectedValue Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgvnvcpc:
@macm = OO Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgvdsddh:
@msnv = dgvqlnv.SelectedValue Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của dgv_ct:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Bổ sung mục chọn “Tất cả” trong DropDownList và hiển thị mskv và mscm cạnh bên
B1:Bổ sung Item mới=Dropdownlist[Task…]->Edit Item: Add [.Text = Tất cả, Value = *]
B2: Properties[Dropdownlist] AppendDataBoundItems = True: các mục chọn trong DDL sẽ bao gồm các mục Edit Items ở B1 ghép (Append) với các mục chọn có trong DB được kết vào DDL này (ddlmskv và ddlmscm).
B3: Viết bổ sung câu lệnh trong thủ tục sự kiện SelectedIndexChanged của ddlmskv và ddlmscm if (ddlmskv.SelectedValue.Trim() == "*"
{ SqlDataSource_qlnv.SelectCommand = "SELECT * FROM
[tb_nhanvien]"; btnthem.Enabled = false; ddlmskv.ToolTip = "Phải chọn mã khu vực cụ thể";
} else if (ddlmskv.SelectedValue.Trim() == "*"
&& ddlmscm.SelectedValue.Trim() != "*")//NSD CHỌN TẤT CẢ
"SELECT * FROM [tb_nhanvien] WHERE [macm] =
@macm"; btnhuy.Enabled = false; btnthem.ToolTip = ddlmskv.ToolTip = ddlmscm.ToolTip =
"Phải chọn chuyên môn cụ thể trước khi thêm mới ";//nhắc
} else if(ddlmskv.SelectedValue.Trim() != "*"
&& ddlmscm.SelectedValue.Trim() == "*")//NSD CHỌN TẤT CẢ
"SELECT * FROM [tb_nhanvien] WHERE [mskv] =
@mskv"; btnhuy.Enabled = false; btnthem.ToolTip = ddlmskv.ToolTip = ddlmscm.ToolTip =
"Phải chọn chi nhánh cụ thể trước khi thêm mới ";//nhắc
{ btnthem.Enabled = true; ddlmskv.ToolTip = "";
} //hiển thị msnhom lblmasokv.Text = ddlmskv.SelectedValue.Trim(); lblmasocm.Text = ddlmscm.SelectedValue.Trim(); lbltendgv.Text = "NHÂN VIÊN THUỘC KHU VỰC " + ddlmskv.SelectedItem.ToString().ToUpper() + " VỚI CHUYÊN MÔN
Ngoài ra, sự bổ sung mã lệnh copy vào sự kiện Page_Load để khi trang web vừa được tải đến thời điểm Dropdownlist đang ở mục "Tất cả" (vì đây là mục đầu tiên) thì ở phía dưới GridView sẽ liệt kê toàn bộ danh sách nhân viên.
Viết mã lệnh (Codes) cho nút “Phân công chuyên môn: protected void btnphancong_Click(object sender, EventArgs e)
5.7.3 Lập trình (Codes) khởi tạo trang quản lý nhân viên tại LHshop: wfEmployeeManagements.aspx static string us = "chua biet ten"; protected void Page_Load(object sender, EventArgs e)
{ us = Session["dn"] as string; lblTitle.Text = "CHÀO MỪNG " + us.ToUpper() + " ĐẾN VỚI TRANG QUẢN LÝ" +
" NHÂN VIÊN CỦA CỬA HÀNG SÁCH LHSHOP"; ddlmskv_SelectedIndexChanged(sender, e);
5.7.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý nhân viên tại LHshop: wfEmployeeManagements.aspx
B1: Thiết kế nút lệnh [Thêm | Xóa | Sửa | Chọn] trên các dòng của Gridview 5.7.4.1 Tuyển thêm nhân viên
B2: Viết lệnh SQL thêm sách trrong SqlDataSource_qlnv tương ứng INSERT INTO tb_nhanvien(msnv, honv, tennv, sdt, mskv, macm)
VALUES (@msnv, @honv, @tennv, @sdt, @mskv, @macm)
Với các tham số được khai báo ở phần lập trình
B3: Thiết kế các textbox cho phép người dùng thêm nhân viên
Hình 5.32: Thiết kế các textbox cho phép người dùng thêm nhân viên
Mã lệnh cho nút lệnh “Tuyển nhân viên mới”:- lblms.Visible = !lblms.Visible;- txtms.Visible = !txtms.Visible;- lblho.Visible = !lblho.Visible;- txtho.Visible = !txtho.Visible;- lblten.Visible = !lblten.Visible;- txtten.Visible = !txtten.Visible;- lblsdt.Visible = !lblsdt.Visible;- txtsdt.Visible = !txtsdt.Visible;- btnhuy.Visible = !btnhuy.Visible;- if (btnthem.Text.Trim() == "Tuyển nhân viên mới")
{ //xóa trống các textbox txtms.Text = "000"; txtms.ToolTip = "Không được để trống mã loại, " +
" không nhập mã đã tồn tại"; txtho.Text = ""; txtten.Text = ""; txtsdt.Text = "";
//đổi nhãn thêm -> lưu btnthem.Text = "Lưu nhân viên";
{ /*định nghĩa tham số cho insert_command (tham số hình có dạng:
SqlDataSource_qlnv.InsertParameters.Add("msnv", txtms.Text.Trim()); SqlDataSource_qlnv.InsertParameters.Add("honv", txtho.Text.Trim()); SqlDataSource_qlnv.InsertParameters.Add("tennv", txtten.Text.Trim());
SqlDataSource_qlnv.InsertParameters.Add("sdt", txtsdt.Text.Trim()); SqlDataSource_qlnv.InsertParameters.Add("mskv", ddlmskv.SelectedValue.Trim());
SqlDataSource_qlnv.InsertParameters.Add("macm", ddlmscm.SelectedValue.Trim());
//chạy lệnh insert SqlDataSource_qlnv.Insert();
} catch (System.Exception ex) { this.Title = "Có lỗi xảy ra khi thêm dữ liệu: " + ex;
} //tải thông tin lên dgv dgvqlnv.DataBind(); btnthem.Text = "Tuyển nhân viên mới";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy”
-90- protected void btnhuy_Click(object sender, EventArgs e)
{ //ẩn các textbox lblms.Visible = false; lblho.Visible = false; lblten.Visible = false; lblsdt.Visible = false; txtms.Visible = false; txtten.Visible = false; txtho.Visible = false; txtsdt.Visible = false; btnhuy.Visible = false;
//đổi nhãn btnthem.Text = "Tuyển nhân viên mới";
5.7.4.2 Chỉnh sửa thông tin nhân viên
B2: Viết lệnh SQL sửa (Update) nhân viên trong
SqlDataSource_qlnv tương ứng UPDATE tb_nhanvien
SET honv = @honv, tennv = @tennv, sdt = @sdt
Hình 5.33: Tham số lệnh SQL sửa nhân viên trong SqlDataSource_qlnv
B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_qlnv tương ứng
Hình 5.34: Tham số lệnh SQL Xóa (Delete) sách trong SqlDataSource_qlnv
B3: Code chuyển người phụ trách đơn đặt hàng ở dgvdsddh
//bắt đầu bàn giao ddh cho nv khác protected void dgvdsddh_RowEditing(object sender, GridViewEditEventArgs e) { lblbangiao.Visible = true; ddlbangiao.Visible = true;
//hoàn thành bàn giao protected void dgvdsddh_RowUpdated(object sender, GridViewUpdatedEventArgs e) { lblbangiao.Visible = false; ddlbangiao.Visible = false;
5.7.5 Lập trình (Codes) xử lý RBTV dữ liệu khi xóa nhân viên tại LHshop: wfEmployeeManagements.aspx
Khi cho thôi việc 1 nhân viên (Table tb_nhanvien) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với 2 bảng: tb_chitietddh (Chi tiết đơn hàng) và tb_dondathang (Đơn đặt hàng), như Hình
Hình 5.35: Trích DB liên quan xử lý RBTV dữ liệu khi xóa nhân viên
Xử lý RBTV dữ liệu:
+ Mặt hàng cần xóa đang còn đơn đặt hàng chưa giải quyết (tb_chitietddh): xử lý đổi hàng (Xóa chi tiết đơn đặt hàng đó và chọn mua mặt hàng khác tương đương) hoặc thuyết phục khách hàng từ chối mua mặt hàng đó = Xóa chi tiết đơn đặt hàng: xóa từng chi tiết đơn đặt hàng hoặc xóa tất cả chi tiết đơn đặt hàng của mặt hàng đó Sau khi hủy các chi tiết, hủy đơn.
5.7.5.2 Thiết kế 2 GridView phụ ngay trên Form quản lý wfGoodsManagements.aspx * Thiết kế 2 gridviews phụ như Hình
Hình 5.36: Các Gridviews xử lý RBTV dữ liệu khi Xóa
* Các thuộc tính GridView dgvdsddh
Caption = DANH SÁCH ĐƠN HÀNG ĐƯỢC GIAO CHO NHÂN VIÊN ĐƯỢC CHỌN TRONG DANH SÁCH TRÊN
Caption = CHI TIẾT CỦA ĐƠN HÀNG ĐƯỢC CHỌN Ở TRÊN * Các câu lệnh Select
SELECT * FROM [tb_dondathang] WHERE ([msnv] = @msnv)
SELECT * FROM [tb_chitietddh] WHERE ([msddh] = @msddh)
5.7.5.3 Xử lý các RBTV trên 2 GridView phụ
Hủy đơn[Delete]: Chính là câu lệnh Delete sách được viết trong
Xóa chi tiết đơn [Delete]: Chính là câu lệnh Delete sách được viết trong SqlDataSource_ctDONDATHANG
WHERE (msddh = @msddh) AND (mss = @mss)
Với msddh = dgv_ct.SelectedValue[1] mss = dgv_ct.SelectedValue[2]
5.8 Trang quản lý chi nhánh của cửa hàng bán sách LHshop: wfBranchManagements.aspx
5.8.1 Phân tích trang quản lý chi nhánh của cửa hàng bán sách LHshop
+ Dành cho nhân viên sau khi đăng nhập thành công và chọn chức năng quản lý sách từ trang quản lý chung.
Hình 5.37: Các table liên quan đến trang quản lý chi nhánh của cửa hàng bán sách LHshop
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa chi nhánh của cửa hàng bán sách LHshop
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl
5.8.2 Thiết kế (Design) trang quản lý chi nhánh của cửa hàng bán sách LHshop: wfBranchManagements.aspx
Hình 5.38: Thiết kế trang quản lý chi nhánh của cửa hàng bán sách LHshop GridView dgvchinhanh: DataSourceID = SqlDataSource_QL_ChiNhanh
DropDownList để chọn mã khu vực khi thêm chi nhánh mới
Dùng Button để thực hiện các thao tác thêm hoặc hủy thêm một loại sách mới chuyển công tác của nhân viên.
Câu lệnh SQL kết nối DataBase của dgvchinhanh: SELECT * FROM [tb_chinhanh]
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) Câu lệnh SQL kết nối DataBase của ddlmskv
SqlDataSourceID = SqlDataSource_MSKV SELECT * FROM [tb_khuvuc]
5.8.3 Lập trình (Codes) khởi tạo trang quản lý chi nhánh của cửa hàng bán sách LHshop: wfBranchManagements.aspx static string us = "chua biet ten"; protected void Page_Load(object sender, EventArgs e)
{ us = Session["dn"] as string; lblTitle.Text = "CHÀO MỪNG " + us.ToUpper() + " ĐẾN VỚI TRANG QUẢN LÝ" +
" CHI NHÁNH CỦA CỬA HÀNG SÁCH LHSHOP"; }//page_load
5.8.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý chi nhánh của cửa hàng bán sách LHshop: wfBranchManagements.aspx
B1: Thiết kế nút lệnh [Thêm | Xóa | Sửa | Chọn] trên các dòng của Gridview 5.8.4.1 Thêm chi nhánh
B2: Viết lệnh SQL thêm sách trrong SqlDataSource_QL_ChiNhanh tương ứng INSERT INTO tb_chinhanh(mschinhanh, tenchinhanh, diachi, hotline, mskv) VALUES (@ms, @ten, @s, @hl, @mskv)
Với các tham số được khai báo ở phần lập trình
B3: Thiết kế các textbox cho phép người dùng thêm thương hiệu sách
Hình 5.39: Thiết kế các textbox cho phép người dùng thêm thương hiệu sách
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm chi nhánh mới” protected void btnthem_Click(object sender, EventArgs e)