You are on page 1of 125

TRƯỜNG ĐẠI HỌC TÀI CHÍNH – MARKETING

KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN HỌC PHẦN
TÊN HỌC PHẦN: LẬP TRÌNH WEB (4 tín chỉ)

MÃ SỐ LỚP HP: 2231112005701

Tên đề tài:

LẬP TRÌNH PHÁT TRIỂN WEBAPP BÁN SÁCH ONLINE


CỦA HỆ THỐNG CỬA HÀNG LH
Họ tên sinh viên: Nguyễn Thị Lan Hương[12]

Mã số sinh viên: 1921006704

Lớp: 19DTH3 [G1]

Ngày nộp: ……./……./202…

Ký tên:

TP.HCM, ngày 26 tháng 11 năm 2021


TRƯỜNG ĐẠI HỌC TÀI CHÍNH – MARKETING
KHOA CÔNG NGHỆ THÔNG TIN

ĐỀ TÀI ĐỒ ÁN HỌC PHẦN


TÊN HỌC PHẦN: LẬP TRÌNH WEB (4 tín chỉ)
MÃ SỐ LỚP HP: 2231112005701
Tên đề tài: LẬP TRÌNH PHÁT TRIỂN WEBAPP BÁN SÁCH ONLINE CỦA HỆ
THỐNG CỬA HÀNG LH
Giảng viên giảng dạy: ThS. GVC. Võ Xuân Thể
Sinh viên thực hiện: Nguyễn Thị Lan Hương[12]
Mã số sinh viên: 1921006704
Lớp: 19DTH3 [G1]

Tên sản phẩm đề tài : G112NguyenThiLanHuongBanSachOnlineLHShop


(.Net wfamework 4.8.04084, Visual Studio 2019)
Các tài khoản quản trị webapp:
Tài khoản 1: Tên tài khoản: Admin Mật khẩu: admin@vn
Tài khoản 2: Tên tài khoản: Guest Mật khẩu: guest@vn
Tên DB SQL: 1G112NguyenThiLanHuongBanSach.bak (MS. SQL 2019)
DATABASE TRÊN LOCAL CỦA MÁY TÍNH CÁ NHÂN
Tên máy chủ DB SQL: NTLH\SQLEXPRESS
Tên đăng nhập DB SQL: sa Mật khẩu đăng nhập SQL: 1921006704
DATABASE TRÊN INTERNET VỚI HOST SOMEE
Tên máy chủ DB SQL: 1G112NguyenThiLanHuongBanSach.mssql.somee.com
Tên đăng nhập DB SQL: ntlhLTWeb_SQLLogin_1 Mật khẩu đăng nhập SQL: otuhiaezww
URL: http://LHshop112ntlhuong.somee.com OR http://www.LHshop112ntlhuong.somee.com
Nhận xét của giảng viên:
……………………………………………………
……………………………………………………
Điểm đánh giá:………….(…………………)
Ngày……./……../202…..
Giảng viên Ký tên

TP.HCM, ngày 26 tháng 11 năm 2021

- 2-
LỜI CẢM ƠN
Trong quá trình làm đồ án môn học Lập trình WEB, em đã nhận được nhiều sự giúp đỡ và
đóng góp ý kiến từ thầy, cô và bạn bè. Em xin gửi lời cảm ơn chân thành đến Giảng viên –
Thạc sĩ Võ Xuân Thể - giảng viên phụ trách học phần Lập trình WEB, Trường ĐH Tài
chính Marketing cùng các anh đã hỗ trợ và chỉ bảo em trong suốt quá trình hoàn thành đồ án
môn học này. Đây là một dịp để em tiếp cận với thực tiễn công việc cũng như kiểm chứng
và vận dụng những vấn đề lý thuyết được học trên giảng đường vào trong các ngữ cảnh hoạt
động của một số đơn vị, tổ chức. Với vốn kiến thức cũng như kinh nghiệm còn rất khiêm
tốn cũng như là bước đầu làm quen với việc kết hợp học môn học vào thực tế, thì chắc chắn
kết quả đạt được của em cũng không tránh khỏi những hạn chế nhất định. Em rất mong
được các Giảng viên, những bạn sinh viên đi trước hay bất kỳ độc giả nào quan tâm và góp
ý kiến để em hoàn thiện hơn cho các đồ án cũng như các nghiên cứu tiếp theo của mình.
Cuối cùng, xin kính chúc Giảng viên – Thạc sĩ Võ Xuân Thể cùng tất cả những người đã hỗ
trợ và đóng góp ý kiến cho em và những người thân của mình lời chúc sức khỏe, hạnh phúc
và thành đạt.

Xin chân thành cảm ơn!

- 3-
DANH MỤC CÁC TỪ VIẾT TẮT

CSDL hoặc DB Cơ sở dữ liệu: DataBase


HQTCSDL = DBMS Hệ quản trị Cơ sở dữ liệu

Người Sử Dụng = là quyền làm việc trên WebApp được đảm


NSD = Users = Account bảo bởi tối thiểu là 2 yếu tố: tên đăng nhập (Username) và mật
khẩu (Password)

Completely Automated Public Turing test to tell Computers


CAPTCHA
and Humans Apart

Digital ID Digital Identification: Chữ ký số

e-Doc e-Document: Chứng từ điện tử

MS Công ty Microsoft

OS Operating System: Hệ điều hành

PC Personal Computer: Máy tính cá nhân

PIN Personal Identification Number: Mã số nhận diện cá nhân

Ngôn ngữ vấn tin có cấu trúc: Structured Query


SQL
Language

An toàn và bảo mật hệ thống thông tin: Safety and


SSIS
Security of Information Systems

Uniform Resource Locator = địa chỉ thống nhất trên


mạng máy tính, đặc biệt là Internet, cho phép định vị các
URL
tài nguyên dịch vụ ứng dụng, đặc biệt là trang điện tử đa
phương tiện (Multimedia), ví dụ: địa chỉ web, …

VPN Virtual Private Network: mạng riêng ảo.

VMWARE Virtual Machine Software: Phần mềm máy ảo

Web Application Software: phần mềm ứng dụng dạng


WebApp
Web

- 4-
- 5-
DANH MỤC CÁC THUẬT NGỮ

Giao diện người dùng Là hệ thống các màn hình giao tiếp cho phép người sử dụng
tương tác với các thành phần hệ thống, điều khiển hệ thống
hoạt động theo yêu cầu của người dùng - tương ứng các
chức năng hiện có của phần mềm.

Mạng xã hội: Social Network Mạng xã hội là dịch vụ dựa trên nền tảng công nghệ (Công
= Social Media nghệ Web hoặc công nghệ App trên SMART Phone) cho
phép nối kết các thành viên trên mạng Internet (là các tài
khoản người làm việc trên mạng thông qua e-mail, số điện
thoại hoặc các dạng thông tin nhận diện cá nhân nào đó) lại
với nhau với nhiều mục đích khác nhau không phân biệt
không gian và thời gian. Thông thường các thành viên tham
gia vào một mạng xã hội nào đó sẽ hình thành một công
đồng mạng xã hội có gần như cơ bản các hoạt động xã hội
như công đồng dân cư thực tế, nhưng tất cả đều dựa trên
tương tác “ảo” trên Internet. Các thành viên trên một mạng
xã hội có thể gôm nhóm lại với nhau dựa trên cơ sở chung
nhau một số yếu tố nào đó, như: cùng sở thích, cùng nhóm
làm việc, cùng cộng đồng xã hội, …

Là một quyền làm việc trên hệ thống được cấp phát cho một
Người dùng (User):
cá nhân thông qua tên tài khoản (username) và mật khẩu
Tài khoản (Account)
(password).

Là các hoạt động được thực hiện từ xa thông qua các dịch
Trực tuyến = Online
vụ trên Internet, đặc biệt là dịch vụ Web

Firewall Bức tường lửa

Network Mạng máy tính

Intranet Mạng nội bộ

- 6-
Internet Mạng toàn cầu (International Network)

Extranet Mạng ngoại bộ / VPN

Là không gian lưu trữ và phát hành WebApp (Websites) trên


Host Web
mạng máy tính, đặc biệt là mạng Internet

- 7-
DANH MỤC HÌNH ẢNH
Trang
Hình 2.1: Tạo trang Master Page...........................................................................................25
Hình 2.2: Thiết kế trang master page.....................................................................................26
Hình 3.1: Diagram của DB quản lý bán sách online..............................................................31
Hình 3.2: Thiết kế bảng tb_dss..............................................................................................31
Hình 3.3: Thiết kế bảng tb_thuonghieu.................................................................................32
Hình 3.4: Thiết kế bảng tb_ loais...........................................................................................32
Hình 3.5: Thiết kế bảng tb_ chinhanh....................................................................................32
Hình 3.6: Thiết kế bảng tb_ hangton......................................................................................32
Hình 3.7: Thiết kế bảng tb_ khuvuc.......................................................................................33
Hình 3.8: Thiết kế bảng tb_ nhanvien....................................................................................33
Hình 3.9: Thiết kế bảng tb_ dondathang................................................................................33
Hình 3.10: Thiết kế bảng tb_ chitietddh................................................................................34
Hình 3.11: Thiết kế bảng tb_ khachhang...............................................................................34
Hình 4.1: Thiết kế MasterPage Giao dịch dùng chung cho cả phần quản lý.........................38
Hình 4.2: Thiết kế trang chủ HomePage................................................................................40
Hình 4.3: Thiết kế trang giỏ hàng..........................................................................................43
Hình 4.4: Các nút trên trang giỏ hàng....................................................................................45
Hình 4.5: Thiết kế phần thông tin KH của Đơn hàng............................................................47
Hình 4.6: Thiết kế phần thông tin Đơn hàng trên trang Đặt hàng.........................................48
Hình 4.7:. Tham số lệnh SQL tìm KH...................................................................................49
Hình 4.8: Tham số lệnh SQL thêm KH mới..........................................................................49
Hình 4.9: Tham số lệnh SQL chấp nhận đơn đặt hàng..........................................................50
Hình 4.10: Tham số lệnh SQL hủy đơn đặt hàng..................................................................50
Hình 5.1: Thiết kế Menu chính trên MasterPage...................................................................63
Hình 5.2: Thiết lập thuộc tính cho mục chọn (Item) của Menu.............................................63
Hình 5.3: Thiết kế trang quản lý chung.................................................................................65
- 8-
Hình 5.4: Các table liên quan đến trang quản lý danh mục sách...........................................67
Hình 5.5: Thiết kế trang quản lý danh mục sách...................................................................68
Hình 5.6: Thiết kế lại cột "Hình" trên GridView...................................................................71
Hình 5.7: Phân trang trên GridView......................................................................................72
Hình 5.8: Thiết kế textbox cho phép người dùng thêm sách.................................................73
Hình 5.9: EditItemTemplate ở cột “Mã thương hiệu”...........................................................76
Hình 5.10: EditItemTemplate ở cột “Ngày xuất hiện trên thị trường”..................................76
Hình 5.11: EditItemTemplate ở cột “Hình”...........................................................................77
Hình 5.12: Tham số lệnh SQL sửa (Update) sách trong SqlDataSource_DSS.....................77
Hình 5.13: Tham số lệnh SQL xóa (Update) sách trong SqlDataSource_DSS....................78
Hình 5.14:. Trích DB liên quan xử lý RBTV dữ liệu khi xóa sách.......................................79
Hình 5.15: Các Gridviews xử lý RBTV dữ liệu khi Xóa.......................................................79
Hình 5.16: Các table liên quan đến trang quản lý loại sách...................................................82
Hình 5.17: Thiết kế trang quản lý loại sách...........................................................................82
Hình 5.18: Phân trang cho GridView.....................................................................................83
Hình 5.19: Thiết kế các textbox cho phép người dùng thêm loại sách..................................84
Hình 5.20: Các tham số lệnh SQL sửa sách trong SqlDataSource_LoaiS.............................86
Hình 5.21: Các tham số lệnh SQL xóa sách trong SqlDataSource_LoaiS............................86
Hình 5.22: Trích DB liên quan xử lý RBTV dữ liệu khi xóa loại MH..................................87
Hình 5.23: Các table liên quan đến trang quản lý thương hiệu sách......................................87
Hình 5.24: Thiết kế trang quản lý thương hiệu cụ thể...........................................................88
Hình 5.25: Phân trang cho GridView.....................................................................................89
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.....................90
Hình 5.27: Tham số lệnh SQL sửa sách trong SqlDataSource_th........................................91
Hình 5.28: Tham số lệnh SQL xóa sách trong SqlDataSource_th........................................92
Hình 5.29: Trích DB liên quan xử lý RBTV dữ liệu khi xóa thương hiệu MH.....................92
Hình 5.30: Các table liên quan đến trang quản lý nhân viên tại LHshop..............................93
Hình 5.31: Thiết kế trang quản lý nhân viên tại LHshop.......................................................94

- 9-
Hình 5.32: Thiết kế các textbox cho phép người dùng thêm nhân viên................................98
Hình 5.33: Tham số lệnh SQL sửa nhân viên trong SqlDataSource_qlnv..........................100
Hình 5.34: Tham số lệnh SQL Xóa (Delete) sách trong SqlDataSource_qlnv...................101
Hình 5.35:. Trích DB liên quan xử lý RBTV dữ liệu khi xóa nhân viên.............................102
Hình 5.36: Các Gridviews xử lý RBTV dữ liệu khi Xóa.....................................................103
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
..............................................................................................................................................105
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.....................105
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...................107
Hình 5.40: Tham số lệnh SQL sửa sách trong SqlDataSource_QL_ChiNhanh..................109
Hình 5.41: Tham số lệnh SQL xóa sách trong SqlDataSource_QL_ChiNhanh..................109
Hình 5.42: Trích DB liên quan xử lý RBTV dữ liệu khi xóa chi nhánh..............................110
Hình 5.43: Các table liên quan đến trang quản lý chuyên môn nhân viên của cửa hàng bán
sách LHshop.........................................................................................................................111
Hình 5.44: Thiết kế trang quản lý chuyên môn nhân viên của cửa hàng bán sách LHshop 111
Hình 5.45: Thiết kế các textbox cho phép người dùng thêm chuyên môn..........................112
Hình 5.46: Tham số lệnh SQL sửa sách trong SqlDataSource_cm....................................114
Hình 5.47: Tham số lệnh SQL xóa sách trong SqlDataSource_cm....................................114
Hình 5.48: Trích DB liên quan xử lý RBTV dữ liệu khi xóa chuyên môn..........................115
Hình 5.49: Các table liên quan đến trang phân công nhân viên phụ trách các đơn hàng chưa
có người phụ trách................................................................................................................116
Hình 5.50: Thiết kế trang phân công nhân viên phụ trách đơn đặt hàng.............................117
Hình 5.51: Tham số câu lệnh kết nối DB SqlDataSource_nv..............................................118
Hình 5.52: Các table liên quan đến trang phân công chuyên môn cho nhân viên chưa được
phân công.............................................................................................................................119
Hình 5.53: Thiết kế trang phân công chuyên môn cho nhân viên chưa được phân công....120
Hình 5.54: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_nvcpc.............120
Hình 5.55: Các table liên quan đến trang chuyển một sách từ loại sách này sang loại sách
khác......................................................................................................................................121

- 10 -
Hình 5.56: Thiết kế trang đổi loại sách................................................................................122
Hình 5.57: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_loaicu.........123
Hình 5.58: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_loaimoi.......123
Hình 5.58: Các table liên quan đến trang đổi thương hiệu sách..........................................125
Hình 5.59: Thiết kế trang đổi thương hiệu sách...................................................................126
Hình 5.60: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_thcu............127
Hình 5.61: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_ thmoi.........127
Hình 6.1: Trang chủ Host Web somee.................................................................................129
Hình 6.2: Trang thông tin Host somee đã đăng ký.............................................................131
Hình 6.3: Trang chủ HomePage...........................................................................................133
Hình 6.4: Trang giỏ hàng.....................................................................................................134
Hình 6.5: Trang đặt hàng 1..................................................................................................134
Hình 6.6: Trang đặt hàng 2..................................................................................................135

- 11 -
MỤC LỤC
LỜI CẢM ƠN.........................................................................................................................3
DANH MỤC CÁC TỪ VIẾT TẮT.......................................................................................4
DANH MỤC CÁC THUẬT NGỮ........................................................................................5
DANH MỤC HÌNH ẢNH......................................................................................................7
MỤC LỤC ...........................................................................................................................11
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN HỌC PHẦN.............................................................21
Chương 1: GIỚI THIỆU ĐỒ ÁN CỦA HP......................................................................22
1.1. Tổng quan về ĐỒ ÁN HỌC PHẦN...................................................................22

1.2. Nội dung chuyên môn chính của ĐỒ ÁN HỌC PHẦN.....................................22

1.3. Công cụ và nền tảng kỹ thuật thực hiện ĐỒ ÁN HỌC PHẦN..........................22

1.4. Sản phẩm của ĐỒ ÁN HỌC PHẦN..................................................................22

1.5. Bố cục của báo cáo.............................................................................................23

Chương 2: CƠ SỞ LÝ THUYẾT CỦA HỌC PHẦN......................................................24


2.1. Giới thiệu về lập trình WebApp trên ASP.NET.................................................24

2.2. Phát triển WebApp ASP.NET đơn giản có CSDL dùng ADO.NET.................24

2.3. Master Page = Mẫu trang web...........................................................................24

2.3.1. Căn bản về MASTER PAGE.............................................................................24

2.3.1.1. Khái niệm Master Page (mẫu trang web)...........................................................24

2.3.1.1.1. Master Page?......................................................................................................24

2.3.1.1.2. Số lượng Master Page trong 1 Websites............................................................25

2.3.1.1.3. Các thành phần trên Masterpage........................................................................25

2.3.1.2. Các bước thực hiện............................................................................................25

2.3.1.3. Xây dựng Mẫu trang (Master Page)...................................................................26

2.3.1.3.1. Thiết kế Master Page..........................................................................................26

- 12 -
2.3.1.3.2. Viết thủ tục ẩn/hiện login...................................................................................26

2.4. Phát triển các chức năng GIAO DỊCH trên WebApp ASP.NET.......................27

2.4.1. Trưng bày sản phẩm (dịch vụ) trên DataList.....................................................27


2.4.2. Session và giỏ hàng...........................................................................................27
2.4.3. Đặt hàng và thanh toán......................................................................................28
2.5. Phát triển các chức năng QUẢN LÝ trên WebApp ASP.NET..........................28

2.5.1. Quản lý đăng nhập và bảo mật..........................................................................28


2.5.2. Quản lý sản phẩm..............................................................................................28
2.5.3. Các chức năng thao tác dữ liệu: Thêm _ Sửa _ Xóa..........................................28
2.6. Xử lý Ràng buộc toàn vẹn dữ liệu (RBTV) trên CSDL trong ASP.NET..........28

2.6.1. Giới thiệu về lập trình xử lý RBTV dữ liệu trên CSDL trong ASP.NET..........28
2.6.1.1. Giới thiệu về RBTV.......................................................................................28
2.6.1.2. Cách thực hiện:...............................................................................................28
2.6.1.3. Các bước thực hiện.........................................................................................28
2.6.2. Thiết kế hệ thống xử lý RBTV dữ liệu..............................................................28
2.6.3. Lập trình hệ thống xử lý RBTV dữ liệu.............................................................28
2.7. Lập trình thủ tục Chuyển nhóm dữ liệu trong ASP.NET...................................28

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.......28
2.7.2. Thiết kế hệ thống xử lý Chuyển nhóm dữ liệu..................................................28
2.7.3. Lập trình hệ thống xử lý Chuyển nhóm dữ liệu.................................................28
2.8. Lập trình thủ tục giao dịch Đặt hàng (Order).....................................................28

2.8.1. Giới thiệu về lập trình xử lý giao dịch đặt hàng trong ASP.NET......................28
2.8.2. Chức năng khách hàng.......................................................................................28
2.8.3. Chức năng đơn đặt hàng....................................................................................28
2.8.4. Chức năng chi tiết đơn hàng..............................................................................28
2.8.5. Xử lý lưu trữ vào DB.........................................................................................28
2.9. Triển khai phát hành WebApp ASP.NET trên Internet (hoặc Intranet).............28

- 13 -
Chương 3: THIẾT KẾ VÀ CẬP NHẬT CSDL PHỤC VỤ WEBAPP..........................29
3.1. Phân tích và thiết kế DB....................................................................................29

3.2. Diagram của DB bán sách online.......................................................................30

3.3. Thiết kế Tables dữ liệu.......................................................................................31

3.3.1. Thiết kế Table tb_dss.........................................................................................31

3.3.2. Thiết kế Table tb_thuonghieu............................................................................32

3.3.3. Thiết kế Table tb_loaiS......................................................................................32

3.3.4. Thiết kế Table tb_chinhanh................................................................................32

3.3.5. Thiết kế Table tb_hangton.................................................................................32

3.3.6. Thiết kế Table tb_khuvuc...................................................................................33

3.3.7. Thiết kế Table tb_nhanvien................................................................................33

3.3.8. Thiết kế Table tb_dondathang............................................................................33

3.3.9. Thiết kế Table tb_chitietddh..............................................................................34

3.3.10. Thiết kế Table tb_khachhang.............................................................................34

3.4. Cập nhật dữ liệu DB thực nghiệm cho WebApp bán sách LHshop Online.......34

3.5. Giới thiệu một số View, SP và Trigger trong DB quản lý bán sách online.......35

3.5.1. View xem thông tin đơn giản của nhân viên..................................................35
3.5.2. 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: 35
3.5.3. Trigger thực hiện hủy đơn đặt hàng khi thực hiện xóa một khách hàng:.......35
3.5.4. 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”:....................................................35
3.5.5. 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”: 36
3.5.6. 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: 36
- 14 -
3.6 . Tổ chức hệ thống DB thực nghiệm..................................................................36

Chương 4: THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN GIAO DỊCH....................37


4.1. Giới thiệu về WebApp bán sách LHshop online................................................37

4.2. MasterPage giao dịch : Transaction.Master.......................................................37

4.2.1. Thiết kế Masterpage giao dịch...........................................................................37

4.2.2. Lập trình (Codes) Masterpage giao dịch............................................................38

4.3. Trang chủ trưng bày các sách: HomePage.aspx.................................................39

4.3.1. Thiết kế (Design) WebApp giao dịch bán sách online......................................39

4.3.2. Lập trình (Codes) WebApp giao dịch bán sách online: wfHomePage.aspx......41

4.4. Trang “Giỏ hàng” của khách hàng khi thực hiện mua sách tại cửa hàng:
wfCart.aspx 43

4.4.1. Thiết kế (Design) WebPage “Giỏ hàng”............................................................43

4.4.2. Mã lệnh (Codes) WebPage “Giỏ hàng”.............................................................44

4.5. Đơn đặt hàng của khách hàng: wfOrder.aspx....................................................45

4.5.1. Giới thiệu...........................................................................................................45

4.5.2. Thiết kế trang Đặt hàng: wfOrder.aspx..............................................................46

4.5.3. Lập trình mã lệnh (Codes) của trang Đặt hàng: wfOrder.aspx..........................48

Chương 5: THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN QUẢN LÝ........................62


5.1. Giới thiệu về WebApp quản lý hệ thống bán sách LHshop online....................62

5.2. Masterpage quản lý hệ thống bán sách online...................................................62

5.2.1. Thiết kế Masterpage quản lý..............................................................................62

5.2.2. Lập trình bổ sung Masterpage quản lý...............................................................63

5.3. Trang chính của hệ thống quản lý hệ thống bán sách LHshop..........................65

5.3.1. Thiết kế (Design) trang quản lý chung (chính): wfTrangQLChung.aspx..........65

5.3.2. Lập trình (Codes) trang quản lý chung (chính): wfTrangQLChung.aspx..........65

5.4. Trang quản lý danh mục sách: wfGoodsManagements.aspx.............................67


- 15 -
5.4.1. Phân tích trang quản lý danh mục sách..............................................................67

5.4.2. Thiết kế (Design) trang quản lý danh mục sách: wfGoodsManagements.aspx. 68

5.4.3. Lập trình (Codes) khởi tạo trang quản lý danh mục sách:
wfGoodsManagements.aspx...................................................................................................72

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...................................................................................................72

5.4.4.1. Thêm sách..........................................................................................................72

5.4.4.2. Sửa sách.............................................................................................................75

5.4.4.3. Xóa sách.............................................................................................................78

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...................................................................................................78

5.4.5.1. Giới thiệu........................................................................................................78


5.4.5.2. Thiết kế 2 GridView phụ ngay trên Form quản lý
wfGoodsManagements.aspx...........................................................................................79
5.4.5.3. Xử lý các RBTV trên 2 GridView phụ...........................................................80
5.5. Trang quản lý loại sách: wfGroupManagements.aspx.......................................81

5.5.1. Phân tích trang quản lý loại sách........................................................................81

5.5.2. Thiết kế (Design) trang quản lý loại cụ thể thao: wfGroupManagements.aspx.82

5.5.3. Lập trình (Codes) khởi tạo trang quản lý loại sách: wfGroupManagements.aspx
83

5.5.4. Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý loại sách:
wfGroupManagements.aspx...................................................................................................84

5.5.4.1. Thêm loại sách...................................................................................................84

5.5.4.2. Sửa loại sách......................................................................................................85

5.5.4.3. Xóa loại sách......................................................................................................86

5.5.5. Xử lý RBTV dữ liệu khi xóa loại sách: wfGroupManagements.aspx...............86

5.5.5.1. Giới thiệu........................................................................................................86


- 16 -
5.5.5.2. Xử lý RBTV...................................................................................................87
5.6. Trang quản lý thương hiệu sách: wfTrademarkManagements.aspx..................87

5.6.1. Phân tích trang quản lý thương hiệu sách..........................................................87

5.6.2. Thiết kế (Design) trang quản lý thương hiệu cụ thể thao:


wfTrademarkManagements.aspx...........................................................................................88

5.6.3. Lập trình (Codes) khởi tạo trang quản lý thương hiệu sách:
wfTrademarkManagements.aspx...........................................................................................89

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...........................................................................................89

5.6.4.1. Thêm thương hiệu sách......................................................................................89

5.6.4.2. Sửa thương hiệu sách.........................................................................................91

5.6.4.3. Xóa thương hiệu sách.........................................................................................91

5.6.5. Xử lý RBTV dữ liệu khi xóa thương hiệu sách:


wfTrademarkManagements.aspx...........................................................................................92

5.6.5.1. Giới thiệu........................................................................................................92


5.6.5.2. Xử lý RBTV...................................................................................................92
5.7. Trang quản lý nhân viên tại LHshop: wfEmployeeManagements.aspx............93

5.7.1. Phân tích trang quản lý nhân viên tại LHshop...................................................93

5.7.2. Thiết kế (Design) trang quản lý nhân viên tại LHshop:


wfEmployeeManagements.aspx.............................................................................................94

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.............................................................................................98

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.............................................................................................98

5.7.4.1. Tuyển thêm nhân viên........................................................................................98

5.7.4.2. Chỉnh sửa thông tin nhân viên.........................................................................100

5.7.4.3. Thôi việc nhân viên..........................................................................................100

- 17 -
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...........................................................................................101

5.7.5.1. Giới thiệu......................................................................................................101


5.7.5.2. Thiết kế 2 GridView phụ ngay trên Form quản lý
wfGoodsManagements.aspx.........................................................................................102
5.7.5.3. Xử lý các RBTV trên 2 GridView phụ.........................................................104
5.8. Trang quản lý chi nhánh của cửa hàng bán sách LHshop:
wfBranchManagements.aspx...............................................................................................104

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.......................
104

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...............................................................................................105

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................................................................................106

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..................................................................106

5.8.4.1. Thêm chi nhánh................................................................................................106

5.8.4.2. Sửa chi nhánh...................................................................................................108

5.8.4.3. Xóa chi nhánh..................................................................................................109

5.8.5. Xử lý RBTV dữ liệu khi xóa chi nhánh của cửa hàng bán sách LHshop:
wfBranchManagements.aspx...............................................................................................109

5.8.5.1. Giới thiệu......................................................................................................109


5.8.5.2. Xử lý RBTV.................................................................................................110
5.9. Trang quản lý chuyên môn nhân viên của cửa hàng bán sách LHshop:
wfProfessionalManagement.aspx.........................................................................................110

5.9.1. Phân tích trang quản lý chuyên môn nhân viên của cửa hàng bán sách LHshop
110

- 18 -
5.9.2. Thiết kế (Design) trang quản lý chuyên môn nhân viên của cửa hàng bán sách
LHshop: wfProfessionalManagement.aspx..........................................................................111

5.9.3. Lập trình (Codes) khởi tạo trang quản lý chuyên môn nhân viên của cửa hàng
bán sách LHshop: wfProfessionalManagement.aspx...........................................................111

5.9.4. Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản chuyên môn nhân viên của
cửa hàng bán sách LHshop: wfProfessionalManagement.aspx...........................................112

5.9.4.1. Thêm chuyên môn............................................................................................112

5.9.4.2. Sửa chuyên môn...............................................................................................113

5.9.4.3. Xóa chuyên môn..............................................................................................114

5.9.5. Xử lý RBTV dữ liệu khi chuyên môn nhân viên của cửa hàng bán sách
LHshop: wfProfessionalManagements.aspx........................................................................114

5.9.5.1. Giới thiệu......................................................................................................114


5.9.5.2. Xử lý RBTV.................................................................................................115
5.10. Phân công: Phân công nhân viên phụ trách các đơn hàng chưa có người phụ
trách ..........................................................................................................................115

5.10.1. Phân tích trang phân công nhân viên phụ trách các đơn hàng chưa có người phụ
trách ..........................................................................................................................115

5.10.2. Thiết kế (Design) trang phân công nhân viên phụ trách đơn đặt hàng:
wfPhanCong.aspx.................................................................................................................117

5.10.3. Lập trình (Codes) khởi tạo trang phân công nhân viên phụ trách đơn đặt hàng:
wfPhanCong.aspx.................................................................................................................118

5.10.4. Lập trình (Codes) chức năng phân công: wfPhanCong.aspx...........................119

5.11. Phân công: Phân công chuyên môn cho nhân viên chưa được phân công.......119

5.11.1. Phân tích trang phân công chuyên môn cho nhân viên chưa được phân công.119

5.11.2. Thiết kế (Design) trang phân công chuyên môn cho nhân viên chưa được phân
công: wfPhanCongChuyenMon.aspx...................................................................................120

- 19 -
5.11.3. Lập trình (Codes) khởi tạo trang phân công chuyên môn cho nhân viên chưa
được phân công: wfPhanCongChuyenMon.aspx.................................................................121

5.11.4. Lập trình (Codes) chức năng phân công chuyên môn cho nhân viên chưa được
phân công: wfPhanCongChuyenMon.aspx..........................................................................121

5.12. Chuyển loại: Chuyển một sách từ loại sách này sang loại sách khác....................
121

5.12.1. Phân tích trang đổi loại sách............................................................................121

5.12.2. Thiết kế (Design) trang đổi loại sách: wfChangeGroupManagement.aspx...........


122

5.12.3. Lập trình (Codes) khởi tạo trang đổi loại sách:
wfChangeGroupManagement.aspx......................................................................................123

5.12.4. Lập trình (Codes) chức năng trang đổi loại sách:
wfChangeGroupManagement.aspx......................................................................................124

5.13. Chuyển thương hiệu: Chuyển một sách từ thương hiệu sách này sang thương
hiệu sách khác......................................................................................................................125

5.13.1. Phân tích trang đổi thương hiệu sách...............................................................125

5.13.2. Thiết kế (Design) trang đổi thương hiệu sách:


wfChangeTrademarkManagements.aspx.............................................................................126

5.13.3. Lập trình (Codes) khởi tạo trang đổi thương hiệu sách:
wfChangeTrademarkManagements.aspx.............................................................................127

5.13.4. Lập trình (Codes) chức năng chuyển hàng:


wfChangeTrademarkManagements.aspx.............................................................................128

Chương 6: TRIỂN KHAI PHÁT HÀNH WEBAPP......................................................129


6.1. Giới thiệu về Host miễn phí somee..................................................................129

6.2. Đăng ký tài khoản somee.................................................................................130

6.3. Restore BD lên host somee..............................................................................131

6.4. Upload đăng tải Source WebApp lên host somee để phát hành......................132

- 20 -
6.5. Giới thiệu sản phẩm WebApp quản lý bán sách online trên somee......................
133

Chương 7: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỒ ÁN............................136


7.1. Kết luận............................................................................................................136

7.1.1. Những kết quả đạt được...................................................................................136

7.1.2. Hạn chế............................................................................................................136

7.2. Hướng phát triển..............................................................................................136

7.2.1. Hướng khắc phục các hạn chế..........................................................................136

7.2.2. Hướng mở rộng ĐỒ ÁN HỌC PHẦN.............................................................136

DANH MỤC TÀI LIỆU THAM KHẢO..........................................................................138


CÁC PHỤ LỤC..................................................................................................................139

- 21 -
TRƯỜNG ĐẠI HỌC TÀI CHÍNH - MARKETING
KHOA CÔNG NGHỆ THÔNG TIN
PHIẾU GIAO NHIỆM VỤ ĐỒ ÁN HỌC PHẦN

Giảng viên: ThS. GVC. Võ Xuân Thể

Tên học phần: Lập trình web (4 tín chỉ); Mã lớp HP: 2231112005701

Tên đề tài: LẬP TRÌNH PHÁT TRIỂN WEBAPP BÁN SÁCH ONLINE CỦA HỆ THỐNG CỬA
HÀNG LH

Sinh viên thực hiện: Nguyễn Thị Lan Hương, 1921006704.

Thời gian thực hiện: 30/08/2021 đến 26/11/2021

Yêu cầu của ĐỒ ÁN HỌC PHẦN & Cơ cấu điểm

Lý thuyết: Cơ sở lý thuyết HP Lập trình Web (4 tín chỉ) bao gồm lập trình Web giao dịch và lập trình
Web quản lý trên nền tảng Công nghệ ASP.NET

Thực hành:
LẬP TRÌNH PHÁT TRIỂN WEBAPP BÁN SÁCH ONLINE CỦA HỆ THỐNG CỬA HÀNG
LH, bao gồm 2 phần:
+ Giao dịch dành cho khách hàng online mua sách
. MauTrang.Master: Mẫu trang giao dịch kiêm quản lý sách.
. wfHomePage.aspx: Trang chủ, trưng bày các mẫu sách;
. wfCart.aspx: Giỏ hàng để khách hàng online chọn sách để thực hiện mua;
. Order.aspx: Đặt mua các loại sách;
+ Quản lý MauTrang.Master: Sử dụng Master Giao dịch (nêu trên)
. Quản lý chung: có xử lý đăng nhập Login
. Quản lý các chức năng trên các sách và nhân viên: Thêm, Xóa, Sửa, RBTV;
. Chuyển loại sách, thương hiệu của sách và chuyên môn của nhân viên
+ Phát hành WebApp lên Host miễm phí: somee.com

GIẢNG VIÊN Ngày 31 tháng 08 năm 2021


SV Thực hiện

- 22 -
Chương 1: GIỚI THIỆU ĐỒ ÁN CỦA HP
1.1. 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)

1.2. Nội dung chuyên môn chính của ĐỒ ÁN HỌC PHẦN

Vận dụng kiến thức về thiết kế và lập trình WebApp 1 lớp trên nền tảng công nghệ
ASP.NET vào việc phát triển một WebApp đơn giản sử dụng trong thực tiễn là: Hệ thống
Websites bán sách trực tuyến.

1.3. 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 Local trên PC:
G112_1921006704_NguyenThiLanHuong_BanSachOnlineLHShop

- 23 -
+ 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.

- 24 -
Chương 2: CƠ SỞ LÝ THUYẾT CỦA HỌC PHẦN
2.1. Quy trình nghiệp vụ

2.2. Giới thiệu về lập trình WebApp trên ASP.NET

ASP.NET là một nền tảng ứng dụng web (web application wfamework) được phát triển
và cung cấp bởi Microsoft, cho phép những người lập trình tạo ra những trang web động,
những ứng dụng web và những dịch vụ web. Lần đầu tiên được đưa ra thị trường vào tháng
1 năm 2002 cùng với phiên bản 1.0 của.NET wfamework, là công nghệ nối tiếp của
Microsoft's Active Server Pages(ASP). ASP.NET được biên dịch dưới dạng Common
Language Runtime (CLR), cho phép những người lập trình viết mã ASP.NET với bất kỳ
ngôn ngữ nào được hỗ trợ bởi.NET language.

Web Application (Web App) là một trình ứng dụng web được lưu trữ trên một server từ
xa. Được phân phối qua Internet thông qua giao diện trình duyệt.

Lập trình WebApp trên ASP.NET là thao tác để xây dựng và thiết kế một trang web
hoàn chỉnh có tương tác với CSDL và tương tác với người dùng dựa trên ngôn ngữ
ASP.NET. Người làm công việc lập trình web được gọi là chuyên viên lập trình website
(Web Developer).

2.3. Phát triển WebApp ASP.NET đơn giản có CSDL dùng ADO.NET

ADO.NET (ActiveX Data Object) là tập hợp các thư viện lớp qua đó cho phép ứng dụng
tương tác (lấy về, cập nhật, xóa) với các nguồn dữ liệu (Như SQLServer, XML, MySQL,
Oracle Database ...).

2.4. Master Page = Mẫu trang web

2.4.1. Căn bản về MASTER PAGE

2.4.1.1. Khái niệm Master Page (mẫu trang web)

2.4.1.1.1. Master Page?

Master Page là một trang dùng để tạo ra cấu trúc giao diện chung cho các trang web
trong hệ thống, những trang thừa kế từ Master Page sẽ áp dụng lại giao diện mẫu của nó.
Nhờ đó tất cả các page cùng “thừa kế” 1 mẫu trang Master Page sẽ có những hình thức và

- 25 -
nội dung cơ bản giống nhau, như: tiêu đề (header = banner, logo, …), footer (số điện thoại
liên lạc, người chịu trách nhiệm, …).

2.4.1.1.2. Số lượng Master Page trong 1 Websites

Trong một website của thể có 1 hoặc nhiều Master Page, tùy từng trường hợp cụ thể, vd:
Master Page tổng công ty; và một số Master Page dùng cho từng chi nhánh, vì mỗi chi
nhánh có logo, số điện thoại, địa chỉ,… khác nhau. Chú ý: một Master Page có thể “thừa kế”
Master Page khác.

2.4.1.1.3. Các thành phần trên Masterpage

Trong Master Page được chia thành 2 phần:

o Phần chung: Đây là giao diện chung áp dụng cho những trang con kế thừa từ nó

o Phần riêng (Content Place Holder): Đây là nơi chứa nội dung riêng của từng
trang.

Chú ý trong khi thiết kế Master Page phải được thiết kế ngoài Content Place Holder hay
phần riêng của Master Page.

2.4.1.2. Các bước thực hiện

Bước 1: Nháy phải chuột vào project của bạn ở Solution Explorer > Add > New Item …
hoặc bấm tổ hợp phím ctrl + shift + A.

Bước 2: Ở cây chọn Installer > Visual C# > Web > Web Forms sau đó chọn Web Forms
Master Page.

- 26 -
Hình 2.1: Tạo trang Master Page

Bước 3: Đặt tên cho Master Page.

Bước 4: Chọn Add

2.4.1.3. Xây dựng Mẫu trang (Master Page)

2.4.1.3.1. Thiết kế Master Page

MauTrang.Master bao gồm header với logo của cửa hàng và dòng chữ thể hiện rõ mặt
hàng mà cửa hàng bán “CỬA HÀNG SÁCH LH SHOP”. Sau đó là một menu chức năng
của webapp và phần cuối cùng là phần đăng nhập.

Hình 2.2: Thiết kế trang master page

2.4.1.3.2. Viết thủ tục ẩn/hiện login

Khởi tạo giao diện:

Sự kiện nháy chọn vào menu:

- 27 -
2.5. Phát triển các chức năng GIAO DỊCH trên WebApp ASP.NET

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.

2.4.2. Session và giỏ hàng

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.

- 28 -
2.4.3. Đặt hàng và thanh toán

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.2. Quản lý sản phẩm
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.1.1. Giới thiệu về RBTV
2.6.1.2. Cách thực hiện:
2.6.1.3. Các bước thực hiện
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)

- 29 -
Chương 3: THIẾT KẾ VÀ CẬP NHẬT CSDL PHỤC VỤ WEBAPP
3.1. 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ọ.
Quản lý sách:

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 đặt hàng (dondathang), khách hàng có thể chọn một địa chỉ giao hàng khác địa chỉ của
bản thân, chỉ định tên và số điện thoại của người khác để nhận hàng thay. Sản phẩm và số
lượng mua của khách hàng sẽ được lưu vào danh sách chi tiết (ctdonhang).
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.
- 30 -
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”.
Thiết kế DB:
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)

3.2. Diagram của DB bán sách online

Căn cứ vào phân tích, thiết kế thành phần CSDL từ mục 3.1 nêu trên, ta có Diagram của
CSDL phục vụ cho hoạt động của WebApp bán sách LHshop online như hình 3.1

- 31 -
Hình 3.1: Diagram của DB quản lý bán sách online

3.3. 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

- 32 -
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

Hình 3.6: Thiết kế bảng tb_ hangton

- 33 -
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

- 34 -
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

Hình 3.11: Thiết kế bảng tb_ khachhang

3.4. 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:

1. tb_thuonghieu

2. tb_loais

3. tb_khuvuc

4. tb_nhanvien

5. tb_dss

6. tb_chinhanh

- 35 -
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.

3.5. 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)
- 36 -
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

Duy trì 2 DB:

Chạy local = nhập dl nhiều + hình = thực nghiệm app

Nhập ít dữ liệu hơn

- 37 -
Chương 4: THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN GIAO
DỊCH
4.1. 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).

4.2. 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.

- 38 -
+ 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:

/// <summary>
/// Chạy khi nhân viên nháy chọn vào mục chọn trên menu
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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;
}
else //nếu ngược lại
{
//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 ==
"guest@vn")
{
e.Authenticated = true;//DN THÀNH CÔNG
}
else
- 39 -
{
e.Authenticated = false;//DN KHÔNG THÀNH CÔNG
}
}

4.3. 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,

- 40 -
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();
//Định các cột
cart.Columns.Add("msS", typeof(string));
cart.Columns.Add("tenS", typeof(string));
cart.Columns.Add("giaban", typeof(int));
cart.Columns.Add("dvt", typeof(string));
cart.Columns.Add("sl", typeof(int));
cart.Columns.Add("tien", typeof(int), "giaban * sl");/*tự tính theo
công thức*/
}
}
}//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
kt:
Session["cart"] = cart;
//Thông báo kết quả chọn mua

- 41 -
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)


{
Response.Redirect("~\\wfCart.aspx");
}

4.4. Trang “Giỏ hàng” của khách hàng khi thực hiện mua sách tại cửa hàng: wfCart.aspx

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ỏ. Thêm vào đó, nếu giỏ
trống Label còn báo cho khách hàng giỏ trống và “hãy mua hàng nào!”.

4.4.2. Mã lệnh (Codes) WebPage “Giỏ hàng”

MÃ LỆNH LẬP TRÌNH CỦA CART (Code View)

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:

- 42 -
protected void Page_Load(object sender, EventArgs e)
{
if (Session["cart"] == null)
{
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;
}
else
{
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)


{
Response.Redirect("~\\wfHomePage.aspx");
}
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);
}

4.5. Đơn đặt hàng của khách hàng: wfOrder.aspx

4.5.1. Giới thiệu

* 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)
{
if (Session["cart"] == null) //Nếu giỏ hàng rỗng
{

- 43 -
btndat.Visible = false;

}
else //nếu giỏ hàng không rỗng
{

btndat.Visible = true;

}
}

* 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)
{
Response.Redirect("~\\wfOrder.aspx");
}

* Để 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

- 44 -
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 <năm><tháng><ngày><giờ><phút><giây> 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”: lấy từ trang “giỏ hàng” (wfCart) sang, để khách hàng xem và kiểm
tra các mặt hàng đã đặt, tổng tiền, …: không thực hiện thêm/xóa/sửa (việc này thực hiện
trên trang “giỏ hàng”).
Vì vậy,
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

PHẦN THÔNG TIN ĐƠN HÀNG

+ 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 kế trong phần
thông tin đơn hàng sẽ có Visible = False.
+ Các nội dung thiết kế cơ bản là Gridview, Lable, TextBox và Calendar, như Hình

- 45 -
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:
+ Lệnh SQL tìm KH
SELECT mskh, tenkh, diachi, sdt
WFOM tb_khachhang
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

- 46 -
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
[1] Insert DDH
INSERT INTO tb_dondathang(msddh, ngaylap, mskh, nguoinhan, sgiao, thoihangiao,
sdtnguoinhan, tinhtrang, ghichu)
VALUES (@msddh, @ngaylap, @mskh, @nguoinhan, @sgiao, @thoihangiao,
@sdtnguoinhan, @tinhtrang, @ghichu)
Với các tham số

Hình 4.9: Tham số lệnh SQL chấp nhận đơn đặt hàng

[2] Insert ctDDH


INSERT INTO tb_chitietddh(msddh, mss, sl)
VALUES (@msddh, @mss, @sl)
Với các tham số được khai báo ở code:
SqlDataSource_CTDDH.InsertParameters.Clear();

SqlDataSource_CTDDH.InsertParameters.Add("msddh", lblmaddh.Text.Trim());
SqlDataSource_CTDDH.InsertParameters.Add("mss",

- 47 -
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

DELETE WFOM tb_dondathang

WHERE (msddh = @msddh)

Với các tham số:

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")
{
//hiện vùng thêm kh

- 48 -
lblthemkh.Visible = true;
lblms.Visible = true;
lblhoten.Visible = true;
lbls.Visible = true;
lblsdt.Visible = true;

txtms.Visible = true;
txthoten.Visible = true;
txts.Visible = true;
txtsdt.Visible = true;

//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();
}
catch (System.Exception ex)
{
//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;

//đổi nhãn
btntimkiem.Text = "Chọn khách hàng";
}
//nếu text của nút tìm là "Chọn khách hàng"

- 49 -
else if (btntimkiem.Text.Trim() == "Chọn khách hàng")
{
//hiển thị vùng tạo đơn đặt hàng
txttimkiem.Text = txtms.Text.Trim();
dgvkhachhang.DataBind();
btntimkiem.Enabled = false;

lblthongtindon.Visible = true;
lblmadon.Visible = true;
lblmaddh.Visible = true;
lblngay.Visible = true;
lblngaylap.Visible = true;
lblsgiao.Visible = true;
lblnguoinhan.Visible = true;
lblhangiao.Visible = true;
lblghichu.Visible = true;
lblsdtnhan.Visible = true;

txtsgiao.Visible = true;
txtnguoinhan.Visible = true;
txtghichu.Visible = true;
cldhangiao.Visible = true;
txtsdtnhan.Visible = true;

//tạo tự động mã khách hàng và ngày lập là ngày hiện hành


DateTime t = System.DateTime.Now;
lblmaddh.Text = txttimkiem.Text.Trim() +
t.Year.ToString().Substring(2, 2) + t.Month.ToString().Trim() +
t.Day.ToString().Trim() + t.Hour.ToString().Trim() +
t.Minute.ToString().Trim() + t.Second.ToString().Trim();
lblngaylap.Text = t.ToShortDateString().Trim();

//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

- 50 -
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;

//hủy thông tin chi tiết đơn hàng


lblthongtinctdon.Visible = false;
lblSum.Text = "";

- 51 -
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)
//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;

+ NÚT LỆNH CHẤP NHẬN ĐƠN HÀNG


[1] Chấp nhận đơn
protected void btnchapnhan_Click(object sender, EventArgs e)
{
try
{
//thêm thông tin đơn đặt hàng
SqlDataSource_DDH.Insert();
//Thêm thông tin chi tiết đơn hàng
foreach (DataRow r in cart.Rows)
{
SqlDataSource_CTDDH.InsertParameters.Clear();
SqlDataSource_CTDDH.InsertParameters.Add("msddh",
lblmaddh.Text.Trim());
SqlDataSource_CTDDH.InsertParameters.Add("mss",
r["msS"].ToString().Trim());
SqlDataSource_CTDDH.InsertParameters.Add("sl", DbType.Int32,
r["sl"].ToString().Trim());

SqlDataSource_CTDDH.Insert();
}
this.Title = "Thêm DDH và CTDDH thành công";
}
catch(System.Exception ex)
{
this.Title = "Lỗi: " + ex.Message;
}

Session["cart"] = null;

- 52 -
//khóa thông tin đơn hàng
txtsgiao.Enabled = false;
txtnguoinhan.Enabled = false;
txtghichu.Enabled = false;
cldhangiao.Enabled = false;
txtsdtnhan.Enabled = false;
//khóa tìm kiếm
btnhuy.Enabled = false;
btnchapnhan.Enabled = false;
}
[2] Hủy đơn đặt hàng
protected void btnhuydon_Click(object sender, EventArgs e)
{
try
{
SqlDataSource_DDH.Delete();
}
catch (System.Exception ex)
{
this.Title = "Lỗi: " + ex;
}

lblthongtindon.Visible = false;
lblmadon.Visible = false;
lblmaddh.Visible = false;
lblngay.Visible = false;
lblngaylap.Visible = false;
lblsgiao.Visible = false;
lblnguoinhan.Visible = false;
lblhangiao.Visible = false;
lblghichu.Visible = false;
lblsdtnhan.Visible = false;
lblthongtinctdon.Visible = false;
lblSum.Visible = false;

txtsgiao.Visible = false;
txtnguoinhan.Visible = false;
txtghichu.Visible = false;
cldhangiao.Visible = false;
txtsdtnhan.Visible = false;

dgvgiohang.Visible = false;

btnchapnhan.Visible = false;
btnhuydon.Visible = false;
btntimkiem.Text = "Tìm";
btntimkiem.Enabled = true;
btnhuy.Enabled = true;

Session["cart"] = null;
}

- 53 -
FULL CODES
//TỰ ĐỘNG CHAY KHI TRANG ĐẶT HÀNG ĐƯỢC TẢI LÊN
public partial class wfOrder : System.Web.UI.Page
{
static DataTable cart = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{

}
static int vt = 0;
protected void dgvkhachhang_SelectedIndexChanged(object sender,EventArgs e)
{
vt = dgvkhachhang.SelectedIndex;
txttimkiem.Text = dgvkhachhang.Rows[vt].Cells[1].Text.Trim();
}

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")
{
//hiện vùng thêm kh
lblthemkh.Visible = true;
lblms.Visible = true;
lblhoten.Visible = true;
lbls.Visible = true;
lblsdt.Visible = true;

txtms.Visible = true;
txthoten.Visible = true;
txts.Visible = true;
txtsdt.Visible = true;

//xóa trắng các txt

- 54 -
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();
}
catch (System.Exception ex)
{
//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;

//đổi nhãn
btntimkiem.Text = "Chọn khách hàng";
}
//nếu text của nút tìm là "Chọn khách hàng"
else if (btntimkiem.Text.Trim() == "Chọn khách hàng")
{
//hiển thị vùng tạo đơn đặt hàng
txttimkiem.Text = txtms.Text.Trim();
dgvkhachhang.DataBind();
btntimkiem.Enabled = false;

lblthongtindon.Visible = true;
lblmadon.Visible = true;
lblmaddh.Visible = true;
lblngay.Visible = true;
lblngaylap.Visible = true;

- 55 -
lblsgiao.Visible = true;
lblnguoinhan.Visible = true;
lblhangiao.Visible = true;
lblghichu.Visible = true;
lblsdtnhan.Visible = true;

txtsgiao.Visible = true;
txtnguoinhan.Visible = true;
txtghichu.Visible = true;
cldhangiao.Visible = true;
txtsdtnhan.Visible = true;

//tạo tự động mã khách hàng và ngày lập là ngày hiện hành


DateTime t = System.DateTime.Now;
lblmaddh.Text = txttimkiem.Text.Trim() +
t.Year.ToString().Substring(2, 2) + t.Month.ToString().Trim() +
t.Day.ToString().Trim() + t.Hour.ToString().Trim() +
t.Minute.ToString().Trim() + t.Second.ToString().Trim();
lblngaylap.Text = t.ToShortDateString().Trim();

//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;
}
}
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;

- 56 -
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;

//hủy thông tin chi tiết đơn hàng


lblthongtinctdon.Visible = false;
lblSum.Text = "";
dgvgiohang.Visible = false;
lblSum.Visible = false;
}
protected void btnchapnhan_Click(object sender, EventArgs e)
{
try
{
//thêm thông tin đơn đặt hàng
SqlDataSource_DDH.Insert();
//Thêm thông tin chi tiết đơn hàng
foreach (DataRow r in cart.Rows)
{
SqlDataSource_CTDDH.InsertParameters.Clear();
SqlDataSource_CTDDH.InsertParameters.Add("msddh",

- 57 -
lblmaddh.Text.Trim());
SqlDataSource_CTDDH.InsertParameters.Add("mss",
r["msS"].ToString().Trim());
SqlDataSource_CTDDH.InsertParameters.Add("sl", DbType.Int32,
r["sl"].ToString().Trim());

SqlDataSource_CTDDH.Insert();
}
this.Title = "Thêm DDH và CTDDH thành công";
}
catch(System.Exception ex)
{
this.Title = "Lỗi: " + ex.Message;
}

Session["cart"] = null;

//khóa thông tin đơn hàng


txtsgiao.Enabled = false;
txtnguoinhan.Enabled = false;
txtghichu.Enabled = false;
cldhangiao.Enabled = false;
txtsdtnhan.Enabled = false;
//khóa tìm kiếm
btnhuy.Enabled = false;
btnchapnhan.Enabled = false;
}
protected void btnhuydon_Click(object sender, EventArgs e)
{
try
{
SqlDataSource_DDH.Delete();
}
catch (System.Exception ex)
{
this.Title = "Lỗi: " + ex;
}

lblthongtindon.Visible = false;
lblmadon.Visible = false;
lblmaddh.Visible = false;
lblngay.Visible = false;
lblngaylap.Visible = false;
lblsgiao.Visible = false;
lblnguoinhan.Visible = false;
lblhangiao.Visible = false;
lblghichu.Visible = false;
lblsdtnhan.Visible = false;
lblthongtinctdon.Visible = false;
lblSum.Visible = false;

txtsgiao.Visible = false;
txtnguoinhan.Visible = false;

- 58 -
txtghichu.Visible = false;
cldhangiao.Visible = false;
txtsdtnhan.Visible = false;

dgvgiohang.Visible = false;

btnchapnhan.Visible = false;
btnhuydon.Visible = false;
btntimkiem.Text = "Tìm";
btntimkiem.Enabled = true;
btnhuy.Enabled = true;

Session["cart"] = null;
}
}

- 59 -
Chương 5: THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN QUẢN LÝ
5.1. 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,…..

* Vì vậy, các chức năng quản lý này chỉ cho phép nhân viên của đơn vị kinh doanh thực
hiện nên cần phải thực hiện thủ tục đăng nhập thành công trước khi thực hiện các nghiệp vụ
quản lý và thực hiện các chức năng thêm xóa sửa thông tin của mỗi nghiê 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

PHÂN TÍCH:

* 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

Username2: Guest Password2: guest@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.

* …phần quyền …

5.2. 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 61

THIẾT KẾ: Designing (MauTrang.Master):

- 60 -
Hình 5.1: Thiết kế Menu chính trên MasterPage

Menu / Navigation : Menu1

.Orientation = Horizontal

. [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)


{
//Mặc định khi giao diện được khởi tạo phần login sẽ ẩn
lgnhanvien.Visible = false;

- 61 -
}

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;
}
else
{
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
25

5.3. 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)
{
Response.Redirect("~\\wfGoodsManagements.aspx");
}

//gọi trang quản lý loại S


protected void btnloaiS_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfGroupManagements.aspx");
}

//gọi trang quản lý chi nhánh S

- 62 -
protected void btnQLCN_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfBranchManagements.aspx");
}

//gọi trang quản lý nhân viên


protected void btnQLnv_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfEmployeeManagers.aspx");
}

//gọi trang quản lý chi tiết đơn đặt hàng


protected void btnQLctdh_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfOrderDetailsMNG.aspx");
}

//gọi trang quản lý khách hàng


protected void btnQLkh_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfCustomerManagerments.aspx");
}

//gọi trang quản lý đơn đặt hàng


protected void btnQLdh_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfTheOrderManagerment.aspx");
}

//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)
{

- 63 -
//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)
{
Response.Redirect("~\\wfHomePage.aspx");
}

//gọi trang quản lý phân công phụ trách DDH


protected void btnQLpcgh_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfPhanCong.aspx");
}

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.
+ Liên quan 2 tables sau:

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

- 64 -
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
+ DataTextField = tenloai
+ DataValueField = msloais
 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)
@msloais = LS00
@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] = @mss)
@mss = dgvQLS. SelectedValue
. Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)

- 65 -
 . Câu lệnh SQL kết nối DataBase của dgvctdh:
SELECT * FROM [tb_chitietddh] WHERE ([mss] = @mss)
@mss = dgvQLS. SelectedValue
. 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ể";
}
else
{
btnthem.Enabled = true;
ddlLoaiS.ToolTip = "";
}
//hiển thị msnhom
lblmanhom.Text = ddlLoaiS.SelectedValue.Trim();
}//ddlLoaiS_SelectedIndexChanged

Ngoài ra, copy codes trên bổ sung vào Page_Load để khi WebPage vừa được tải lên
đúng lúc trong Dropdownlist là “Tất cả” (vì nó là mục đầu tiên) thì GridView bên đưới sẽ
liệt kê tất cả các sách:
- 66 -
protected void Page_Load(object sender, EventArgs e)
{

ddlLoaiS_SelectedIndexChanged(sender, 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)
{
//đảo trạng thái ẩn hiện
dgvQLS.Columns[10].Visible = !dgvQLS.Columns[10].Visible;
//nếu table có thay đổi số cột thì số [n] có thể sẽ thay đổi
}//cbxhienhinh_Checkeshanged
- 67 -
CHÚ GIẢI:

.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

Hình 5.7: Phân trang trên GridView

5.4.3. Lập trình (Codes) khởi tạo trang quản lý danh mục sách: wfGoodsManagements.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Ý 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)

- 68 -
VALUES (@mss, @tens, @gia, @dvt, @mau, @thongso, @motas, @ngayxhtrentt, @hinh,
@msloais, @math)

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
txtdvt.Text = "";
txtgia.Text = "1"; txtgia.ToolTip = "Giá phải lớn hơn 0";
txtmau.Text = "";
txtmota.Text = "";

- 69 -
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";
}
else //Lưu vào dtb
{
try
{
/*định nghĩa tham số cho insert_command (tham số hình có dạng:
~\\HinhvaAmThanh\\Tên_file)*/
SqlDataSource_DSS.InsertParameters.Clear();
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",
"~\\HinhVaAmThanh\\" + fuHinh.FileName);
//chạy lệnh insert
SqlDataSource_DSS.Insert();
//lưu hình
fuHinh.SaveAs("d:\\DZHosts\\LocalUser\\vmhLTWeb\\" +
"www.LHShop112ntlhuong.somee.com\\HinhVaAmThanh\\"
+ fuHinh.FileName.Trim());
}
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
dgvQLS.DataBind();
btnthem.Text = "Thêm sách mới";
}
}//btnthem_Click
- 70 -
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";
}//btnhuy_Click

5.4.4.2. Sửa sách

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”

[GridView] Task -> EditItemTemplate ở cột “Ngày xuất hiện trên thị trường” và thay thế
TextBox thành một Calendar

- 71 -
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

Hình 5.11: EditItemTemplate ở cột “Hình”

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

WHERE (mss = @mss)

Với các tham số

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)
{
id = e.NewEditIndex;
}

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 =
"~\\HinhVaAmThanh\\"
+ (FileUpload)dgvQLS.Rows[id].Finsontrol("fuedithinh")).FileName;
((FileUpload)dgvQLS.Rows[id].Finsontrol("fuedithinh")).SaveAs
("d:\\DZHosts\\LocalUser\\vmhLTWeb\\www.LHShop112ntlhuong"
+ ".somee.com\\HinhVaAmThanh\\" +
((FileUpload)dgvQLS.Rows[id].Finsontrol("fuedithinh")).FileName.Trim());
}
}
}

- 72 -
5.4.4.3. Xóa sách

B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_DSS tương ứng

DELETE FROM tb_dsS


WHERE (mss = @mss)

Với các tham số

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

5.4.5.1. Giới thiệu


Khi xóa sách (Table tb_dsS) 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_hangton (Tồn kho), như Hình

Hình 5.14:. Trích DB liên quan xử lý RBTV dữ liệu khi xóa sách

Có 2 trường hợp xử lý RBTV dữ liệu:

- 73 -
+ 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:

GridView dgvctdh

. Caption = SÁCH ĐANG CHỌN CÒN ĐẶT MUA TRÊN CÁC ĐƠN HÀNG SAU:

* Các câu lệnh Select

SqlDataSource_TONKHO

SELECT * FROM [tb_hangton]

WHERE ([mss] = @mss)

Với @mss = dgvQLS.SelectedValue

SqlDataSource_CTHD

SELECT * FROM [tb_chitietddh]

WHERE ([mss] = @mss)

Với @mss = dgvQLS.SelectedValue

- 74 -
5.4.5.3. Xử lý các RBTV trên 2 GridView phụ

* GridView dgvtonkho

Thanh lý[Delete]: Chính là câu lệnh Delete sách được viết trong
SqlDataSource_TONKHO

DELETE FROM tb_hangton

WHERE (mss = @mss) AND (mschinhanh = @mschinhanh)

Với mss = dgvtonkho.SelectedValue[2]

mschinhanh = dgvtonkho.SelectedValue[1]

* GridView dgvctdh

Khách hàng từ chối[Delete]: Chính là câu lệnh Delete sách được viết trong
SqlDataSource_CTHD

DELETE FROM tb_chitietddh

WHERE (msddh = @msddh) AND (mss = @mss)

Với msddh = dgvctdh.SelectedValue[1]

mss = dgvctdh.SelectedValue[2]

Đổi hàng[Update]:

GridViewCTDDH[Task]->Edit Columns…:

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

UPDATE tb_chitietddh

SET mss = @mss_new, sl = @sl

WHERE (msddh = @msddh) AND (msddh = @msddh)

Với msddh = dgvctdh.SelectedValue[1]


- 75 -
mss = dgvQLS.SelectedValue

mss_new = dgvctdh.SelectedValue[2]

sl = dgvctdh.SelectedValue[3]

5.5. 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.
+ Liên quan table sau:

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:
SELECT * FROM [tb_loaiS]
. 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)
- 76 -
 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)

VALUES (@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;
lblmota.Visible = !lblmota.Visible;
txtmota.Visible = !txtmota.Visible;

- 77 -
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";
}
else //Lưu vào dtb
{
try
{
/*định nghĩa tham số cho insert_command (tham số hình có dạng:
~\\HinhvaAmThanh\\Tên_file)*/
SqlDataSource_LoaiS.InsertParameters.Clear();
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;
- 78 -
//đổi nhãn
btnthem.Text = "Thêm loại sách mới";
}

5.5.4.2. Sửa loại sách

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

WHERE (msloais = @msloais)

Với các tham số

Hình 5.20: Các tham số lệnh SQL sửa sách trong SqlDataSource_LoaiS

5.5.4.3. Xóa loại sách

B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_LoaiS tương ứng

DELETE FROM tb_loaiS


WHERE (msloais = @msloais)

Với các tham số

Hình 5.21: Các tham số lệnh SQL xóa sách trong SqlDataSource_LoaiS

- 79 -
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 sẽ được xử lý bằng trigger
tg_d_xoaloai_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.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.
+ Liên quan table sau:

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

- 80 -
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:
SELECT * FROM [tb_thuonghieu]
. 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

- 81 -
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)

VALUES (@math, @ten)

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";
}
else //Lưu vào dtb
{
try
{
/*định nghĩa tham số cho insert_command (tham số hình có dạng:
~\\HinhvaAmThanh\\Tên_file)*/
SqlDataSource_th.InsertParameters.Clear();
SqlDataSource_th.InsertParameters.Add("math", txtms.Text.Trim());

- 82 -
SqlDataSource_th.InsertParameters.Add("ten", txtten.Text.Trim());

//chạy lệnh insert


SqlDataSource_th.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
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";


}

5.6.4.2. Sửa thương hiệu sách

B2: Viết lệnh SQL sửa (Update) sách trong SqlDataSource_th tương ứng

UPDATE tb_thuonghieu

SET tenthuonghieu = @tenthuonghieu

WHERE (math = @math)

Với các tham số

Hình 5.27: Tham số lệnh SQL sửa sách trong SqlDataSource_th

- 83 -
5.6.4.3. Xóa thương hiệu sách

B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_th tương ứng

DELETE FROM tb_thuonghieu


WHERE (math = @math)

Với các tham số

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

5.6.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.29: Trích DB liên quan xử lý RBTV dữ liệu khi xóa thương hiệu MH

- 84 -
5.6.5.2. Xử lý RBTV
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.
+ Liên quan 3 tables sau:

Hình 5.30: Các table 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 _ Xóa nhân viên làm việc tại LHshop
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl

5.7.2. Thiết kế (Design) trang quản lý nhân viên tại LHshop:


wfEmployeeManagements.aspx

Hình 5.31: Thiết kế trang quản lý nhân viên tại LHshop

 GridView dgvqlnv: DataSourceID = SqlDataSource_qlnv

- 85 -
 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
+ DataTextField = tenkv
+ DataValueField = mskv
. 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]
WHERE ([msnv] <> @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

- 86 -
WHERE (mskv = @mskv) AND (macm = @macm)
@mskv = ddlmskv.SelectedValue
@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:
SELECT * FROM [tb_nhanvien]
WHERE ([macm] = @macm)
@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:
SELECT * FROM [tb_dondathang]
WHERE ([msnv] = @msnv)
@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:
SELECT * FROM [tb_chitietddh]
WHERE ([msddh] = @msddh)
@msddh = dgvdsddh.SelectedValue
. 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

protected void ddlmskv_SelectedIndexChanged(object sender, EventArgs e)


{
//xử lý chọn tất cả
- 87 -
if (ddlmskv.SelectedValue.Trim() == "*"
&& ddlmscm.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Ả
{
//VIẾT LẠI LỆNH SELECT
SqlDataSource_qlnv.SelectCommand =
"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Ả
{
//VIẾT LẠI LỆNH SELECT
SqlDataSource_qlnv.SelectCommand =
"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
}
else
{
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 " +
ddlmscm.SelectedItem.ToString().ToUpper();
}

Ngoài ra, copy codes trên bổ sung vào Page_Load để khi WebPage vừa được tải lên
đúng lúc trong Dropdownlist là “Tất cả” (vì nó là mục đầu tiên) thì GridView bên đưới sẽ
liệt kê tất cả nhân viên:

protected void Page_Load(object sender, EventArgs e)


{

ddlmskv_SelectedIndexChanged (sender, e);
}

- 88 -
 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)


{
Response.Redirect("~\\wfProfessionalManagement");
}

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);
}//page_load

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

B4: Viết mã lệnh (Codes) cho nút lênh “Tuyển nhân viên mới”

protected void btnthem_Click(object sender, EventArgs e)


{

- 89 -
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";
}
else //Lưu vào dtb
{
try
{
/*định nghĩa tham số cho insert_command (tham số hình có dạng:
~\\HinhvaAmThanh\\Tên_file)*/
SqlDataSource_qlnv.InsertParameters.Clear();
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

WHERE (msnv = @msnv)

Với các tham số

Hình 5.33: Tham số lệnh SQL sửa nhân viên trong SqlDataSource_qlnv

5.7.4.3. Thôi việc nhân viên

B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_qlnv tương ứng

DELETE FROM tb_nhanvien


WHERE (msnv = @manv)

- 91 -
Với các tham số

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

5.7.5.1. Giới thiệu


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

- 92 -
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

- 93 -
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

GridView dgv_ct

. Caption = CHI TIẾT CỦA ĐƠN HÀNG ĐƯỢC CHỌN Ở TRÊN

* Các câu lệnh Select

SqlDataSource_DonHang

SELECT * FROM [tb_dondathang] WHERE ([msnv] = @msnv)

Với @msnv = dgvqlnv.SelectedValue

SqlDataSource_ctDONDATHANG

SELECT * FROM [tb_chitietddh] WHERE ([msddh] = @msddh)

Với @msddh = dgvdsddh.SelectedValue

- 94 -
5.7.5.3. Xử lý các RBTV trên 2 GridView phụ

* GridView dgvtonkho

Hủy đơn[Delete]: Chính là câu lệnh Delete sách được viết trong SqlDataSource_
DonHang

DELETE FROM tb_dondathang

WHERE (msddh = @msddh)

Với msddh = dgvdsddh.SelectedValue

* GridView dgvctdh

Xóa chi tiết đơn [Delete]: Chính là câu lệnh Delete sách được viết trong
SqlDataSource_ctDONDATHANG

DELETE FROM tb_chitietddh

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.
+ Liên quan table sau:

- 95 -
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]
. Enable AutoPostBack = false

- 96 -
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)


{
lblms.Visible = !lblms.Visible;
txtms.Visible = !txtms.Visible;
lbltencn.Visible = !lbltencn.Visible;
txttencn.Visible = !txttencn.Visible;
lbldiachi.Visible = !lbldiachi.Visible;
txtdiachi.Visible = !txtdiachi.Visible;
- 97 -
lblhotline.Visible = !lblhotline.Visible;
txthotline.Visible = !txthotline.Visible;
lblmskv.Visible = !lblmskv.Visible;
ddlmskv.Visible = !ddlmskv.Visible;

btnhuy.Visible = !btnhuy.Visible;
if (btnthem.Text.Trim() == "Thêm chi nhánh 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";
txttencn.Text = "";
txtdiachi.Text = "";
txthotline.Text = "";

//đổi nhãn thêm -> lưu


btnthem.Text = "Lưu chi nhánh";
}
else //Lưu vào dtb
{
try
{
/*định nghĩa tham số cho insert_command (tham số hình có dạng:
~\\HinhvaAmThanh\\Tên_file)*/
SqlDataSource_QL_ChiNhanh.InsertParameters.Clear();
SqlDataSource_QL_ChiNhanh.InsertParameters.Add("ms",
txtms.Text.Trim());
SqlDataSource_QL_ChiNhanh.InsertParameters.Add("ten",
txttencn.Text.Trim());
SqlDataSource_QL_ChiNhanh.InsertParameters.Add("s",
txtdiachi.Text.Trim());
SqlDataSource_QL_ChiNhanh.InsertParameters.Add("hl",
txthotline.Text.Trim());
SqlDataSource_QL_ChiNhanh.InsertParameters.Add("mskv",
ddlmskv.SelectedValue.Trim());
//chạy lệnh insert
SqlDataSource_QL_ChiNhanh.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
dgvchinhanh.DataBind();
btnthem.Text = "Thêm chi nhánh 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;
- 98 -
lbltencn.Visible = false;
lbldiachi.Visible = false;
lblhotline.Visible = false;
lblmskv.Visible = false;

txtms.Visible = false;
txttencn.Visible = false;
txtdiachi.Visible = false;
txthotline.Visible = false;
ddlmskv.Visible = false;

btnhuy.Visible = false;

//đổi nhãn
btnthem.Text = "Thêm chi nhánh mới";
}

5.8.4.2. Sửa chi nhánh

B2: Viết lệnh SQL sửa (Update) sách trong SqlDataSource_QL_ChiNhanh tương ứng

UPDATE tb_chinhanh

SET tenchinhanh = @tenchinhanh, diachi = @diachi, hotline = @hotline, mskv = @mskv

WHERE (mschinhanh = @mschinhanh)

Với các tham số

Hình 5.40: Tham số lệnh SQL sửa sách trong SqlDataSource_QL_ChiNhanh

5.8.4.3. Xóa chi nhánh

B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_QL_ChiNhanh tương ứng

DELETE FROM tb_chinhanh

WHERE (mschinhanh = @mschinhanh)

- 99 -
Với các tham số

Hình 5.41: Tham số lệnh SQL xóa sách trong SqlDataSource_QL_ChiNhanh

5.8.5. Xử lý RBTV dữ liệu khi xóa chi nhánh của cửa hàng bán sách LHshop:
wfBranchManagements.aspx

5.8.5.1. Giới thiệu


Khi xóa chi nhánh (Table tb_chinhanh) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với
bảng: tb_hangton (hàng tồn)

Hình 5.42: Trích DB liên quan xử lý RBTV dữ liệu khi xóa chi nhánh

5.8.5.2. Xử lý RBTV
Ràng buộc toàn vẹn của trường hợp này sẽ được xử lý bằng các chuyển tất cả từ kho ở chi
nhánh này sang kho của chi nhánh khác khi nháy vào nút chuyển hàng.
Code nút chuyển hàng:
protected void btnchuyen_Click(object sender, EventArgs e)
{
Response.Redirect("~\\wfChuyenKho.aspx");
- 100 -
}

5.9. Trang quản lý chuyên môn nhân viên của cửa hàng bán sách LHshop:
wfProfessionalManagement.aspx

5.9.1. Phân tích trang quản lý chuyên môn nhân viên 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.
+ Liên quan table sau:

Hình 5.43: Các table liên quan đến trang quản lý chuyên môn nhân viên 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 chuyên môn của cửa hàng bán sách
LHshop
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl

5.9.2. Thiết kế (Design) trang quản lý chuyên môn nhân viên của cửa hàng bán sách
LHshop: wfProfessionalManagement.aspx

Hình 5.44: Thiết kế trang quản lý chuyên môn nhân viên của cửa hàng bán sách LHshop

 GridView dgvcm: DataSourceID = SqlDataSource_cm


 Dùng Button để thực hiện các thao tác thêm hoặc hủy thêm một chuyên môn.
 . Câu lệnh SQL kết nối DataBase của dgvcm:
SELECT * FROM [tb_chuyenmon]
. Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)

- 101 -
5.9.3. Lập trình (Codes) khởi tạo trang quản lý chuyên môn nhân viên của cửa hàng bán
sách LHshop: wfProfessionalManagement.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Ý" +
" CHUYÊN MÔN NHÂN VIÊN CỦA CỬA HÀNG SÁCH LHSHOP";
}//page_load

5.9.4. Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản chuyên môn nhân viên của cửa
hàng bán sách LHshop: wfProfessionalManagement.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.9.4.1. Thêm chuyên môn

B2: Viết lệnh SQL thêm sách trrong SqlDataSource_cm tương ứng

INSERT INTO tb_chuyenmon(macm, tencm)

VALUES (@macm, @tencm)

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 chuyên môn

Hình 5.45: Thiết kế các textbox cho phép người dùng thêm chuyên môn

B4: Viết mã lệnh (Codes) cho nút lênh “Thêm chuyên môn mới”

protected void btnthem_Click(object sender, EventArgs e)


{
lblms.Visible = !lblms.Visible;
txtms.Visible = !txtms.Visible;
lbltencm.Visible = !lbltencm.Visible;
txttencm.Visible = !txttencm.Visible;

btnhuy.Visible = !btnhuy.Visible;
if (btnthem.Text.Trim() == "Thêm chuyên môn mới")
{
//xóa trống các textbox
- 102 -
txtms.Text = "000"; txtms.ToolTip = "Không được để trống mã loại, " +
" không nhập mã đã tồn tại";
txttencm.Text = "";

//đổi nhãn thêm -> lưu


btnthem.Text = "Lưu chuyên môn";
}
else //Lưu vào dtb
{
try
{
/*định nghĩa tham số cho insert_command (tham số hình có dạng:
~\\HinhvaAmThanh\\Tên_file)*/
SqlDataSource_cm.InsertParameters.Clear();
SqlDataSource_cm.InsertParameters.Add("macm", txtms.Text.Trim());
SqlDataSource_cm.InsertParameters.Add("tencm",
txttencm.Text.Trim());
//chạy lệnh insert
SqlDataSource_cm.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
dgvcm.DataBind();
btnthem.Text = "Thêm chuyên môn 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;
lbltencm.Visible = false;

txtms.Visible = false;
txttencm.Visible = false;

btnhuy.Visible = false;

//đổi nhãn
btnthem.Text = "Thêm chuyên môn mới";
}

5.9.4.2. Sửa chuyên môn

B2: Viết lệnh SQL sửa (Update) sách trong SqlDataSource_cm tương ứng

UPDATE tb_chuyenmon

- 103 -
SET tencm = @tencm

WHERE (macm = @macm)

Với các tham số

Hình 5.46: Tham số lệnh SQL sửa sách trong SqlDataSource_cm

5.9.4.3. Xóa chuyên môn

B2: Viết lệnh SQL Xóa (Delete) sách trong SqlDataSource_cm tương ứng

DELETE FROM tb_chuyenmon

WHERE (macm = @macm)

Với các tham số

Hình 5.47: Tham số lệnh SQL xóa sách trong SqlDataSource_cm

5.9.5. Xử lý RBTV dữ liệu khi chuyên môn nhân viên của cửa hàng bán sách LHshop:
wfProfessionalManagements.aspx

5.9.5.1. Giới thiệu


Khi xóa chuyên môn (Table tb_chuyenmon) thì sẽ bị ảnh hưởng RBTV dữ liệu đối
với bảng: tb_nhanvien (tb_nhanvien)

- 104 -
Hình 5.48: Trích DB liên quan xử lý RBTV dữ liệu khi xóa chuyên môn

5.9.5.2. Xử lý RBTV
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_xoacm_capnhat_nv được tạo trong hệ quản trị cơ sở dữ liệu SQL server.

5.10. Phân công: Phân công nhân viên phụ trách các đơn hàng chưa có người phụ trách

5.10.1.Phân tích trang phân công nhân viên phụ trách các đơn hàng chưa có người phụ trá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.
+ Liên quan table sau:

- 105 -
Hình 5.49: Các table liên quan đến trang phân công nhân viên phụ trách các đơn hàng chưa có người
phụ trách

+ Chủ yếu: thực hiện chức năng: phân công nhân viên phụ trách giao hàng cho các đơn đặt
hàng.
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl

- 106 -
5.10.2.Thiết kế (Design) trang phân công nhân viên phụ trách đơn đặt hàng:
wfPhanCong.aspx

Hình 5.50: Thiết kế trang phân công nhân viên phụ trách đơn đặt hàng

 Dùng DropDownList để chọn khu vực và nhân viên phân công cho đơn hàng
. DropDownList ddlkv: DataSourceID = SqlDataSource_kv
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
+ DataTextField = tenkv
+ DataValueField = mskv
. DropDownList ddlnv: DataSourceID = SqlDataSource_nv

- 107 -
Câu lệnh kết nối DB: SELECT * FROM [v_thongtin_nhanvien] WHERE
(([macm] = @macm) AND ([mskv] = @mskv))
Với cá tham số:

Hình 5.51: Tham số câu lệnh kết nối DB SqlDataSource_nv

Các thiết lập thuộc tính :


+ v Enable Auto Postback
+ DataTextField = tenloai
+ DataValueField = msloaiS
 2 GridView dùng để hiển thị các đơn chưa được phân công và các chi tiết đơn của
đơn hàng đó
. GridView dgvddhcpc: DataSourceID = SqlDataSource_DDH
Câu lệnh kết nối DB: SELECT * FROM [tb_dondathang]
WHERE ([msnv] IS NULL)
. GridView dgvctddh: DataSourceID = SqlDataSource_CTDDH
Câu lệnh kết nối DB: SELECT * FROM [tb_chitietddh]
WHERE ([msddh] = @msddh)
 Dùng Button để thực hiện thao tác chấp nhận phân công đơn hàng

5.10.3.Lập trình (Codes) khởi tạo trang phân công nhân viên phụ trách đơn đặt hàng:
wfPhanCong.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 PHÂN CÔNG"
+ " NHÂN VIÊN PHỤ TRÁCH ĐƠN ĐẶT HÀNG";
}//page_load

- 108 -
5.10.4.Lập trình (Codes) chức năng phân công: wfPhanCong.aspx

protected void btnchapnhan_Click(object sender, EventArgs e)


{
SqlDataSource_DDH.Update();
dgvddhcpc.DataBind();
}

5.11. Phân công: Phân công chuyên môn cho nhân viên chưa được phân công

5.11.1.Phân tích trang phân công chuyên môn cho nhân viên chưa được phân công

+ 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.
+ Liên quan table sau:

Hình 5.52: Các table liên quan đến trang phân công chuyên môn cho nhân viên chưa được phân công

+ Chủ yếu: thực hiện chức năng: phân công chuyên môn cho các nhân viên mới chưa được
phân công công việc.
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl

- 109 -
5.11.2.Thiết kế (Design) trang phân công chuyên môn cho nhân viên chưa được phân công:
wfPhanCongChuyenMon.aspx

Hình 5.53: Thiết kế trang phân công chuyên môn cho nhân viên chưa được phân công

 Dùng DropDownList để chọn chuyên môn phân công cho nhân viên
. DropDownList ddlcv: DataSourceID = SqlDataSource_cv
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 = macm
 GridView dùng để hiển thị các nhân viên chưa được phân công chuyên môn
. GridView dgvnvcpc: DataSourceID = SqlDataSource_nvcpc
Câu lệnh kết nối DB: SELECT * FROM [tb_nhanvien]
WHERE ([macm] = @macm)

Với các tham số:

Hình 5.54: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_nvcpc

- 110 -
 Dùng Button để thực hiện thao tác chấp nhận phân công chuyên môn

5.11.3.Lập trình (Codes) khởi tạo trang phân công chuyên môn cho nhân viên chưa được
phân công: wfPhanCongChuyenMon.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 PHÂN CÔNG"
+ " CHUYÊN MÔN CHO NHÂN VIÊN";
}//page_load

5.11.4.Lập trình (Codes) chức năng phân công chuyên môn cho nhân viên chưa được phân
công: wfPhanCongChuyenMon.aspx

protected void btnchapnhan_Click(object sender, EventArgs e)


{
SqlDataSource_nvcpc.Update();
dgvnvcpc.DataBind();
}

5.12. Chuyển loại: Chuyển một sách từ loại sách này sang loại sách khác

5.12.1.Phân tích trang đổi 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.
+ Liên quan table sau:

Hình 5.55: Các table liên quan đến trang chuyển một sách từ loại sách này sang loại sách khác

+ Chủ yếu: thực hiện chức năng: chuyển một hoặc tất cả sách từ một loại này sang một loại
khác
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl

5.12.2.Thiết kế (Design) trang đổi loại sách: wfChangeGroupManagement.aspx

Hình 5.56: Thiết kế trang đổi loại sách

- 111 -
 Dùng DropDownList để chọn loại sách cần chuyển và loại chuyển đến
. DropDownList ddlmaloaicu: DataSourceID = SqlDataSource_loaicu
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
+ DataTextField = tenloai
+ DataValueField = msS
. DropDownList ddlmaloaimoi: DataSourceID = SqlDataSource_loaimoi
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
+ DataTextField = tenloai
+ DataValueField = msloaiS
 2 ListBox dùng để hiển thị các sách
. ListBox lbsloaicu: DataSourceID = SqlDataSource_s_loaicu
Câu lệnh kết nối DB: SELECT * FROM [tb_dsS]
WHERE ([msloais] = @msloais)
Với các tham số:

Hình 5.57: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_loaicu

Các thiết lập thuộc tính:


+ DataTextField = tens
+ DataValueField = mss
. ListBox lbsloaimoi: DataSourceID = SqlDataSource_s_loaimoi
Câu lệnh kết nối DB: SELECT * FROM [tb_dsS]
WHERE ([msloais] = @msloais)
Với các tham số:
- 112 -
Hình 5.58: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_loaimoi

Các thiết lập thuộc tính:


+ DataTextField = tens
+ DataValueField = mss
 Dùng Button để thực hiện các thao tác chuyển sách từ loại này sang loại khách

5.12.3.Lập trình (Codes) khởi tạo trang đổi loại sách: wfChangeGroupManagement.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 CHUYỂN LOẠI"
+ " SÁCH CỦA CỬA HÀNG SÁCH LHSHOP";
}//page_load

5.12.4.Lập trình (Codes) chức năng trang đổi loại sách: wfChangeGroupManagement.aspx

protected void btnlondon_Click(object sender, EventArgs e)


{
SqlDataSource_s_loaicu.Update();
lbsloaicu.DataBind();
lbsloaimoi.DataBind();
}

protected void btnnhodon_Click(object sender, EventArgs e)


{
SqlDataSource_s_loaimoi.Update();
lbsloaicu.DataBind();
lbsloaimoi.DataBind();
}

protected void btnlonkep_Click(object sender, EventArgs e)


{
SqlDataSource_s_loaicu.UpdateCommand = "UPDATE tb_dsS SET msloais" +
" = @msloaimoi WHERE (msloais = @msloaicu)";
SqlDataSource_s_loaicu.UpdateParameters.Clear();
SqlDataSource_s_loaicu.UpdateParameters.Add("msloaimoi",
ddlmaloaimoi.SelectedValue.Trim());
SqlDataSource_s_loaicu.UpdateParameters.Add("msloaicu",
ddlmaloaicu.SelectedValue.Trim());

- 113 -
SqlDataSource_s_loaicu.Update();
lbsloaicu.DataBind();
lbsloaimoi.DataBind();
}

protected void btnnhokep_Click(object sender, EventArgs e)


{
SqlDataSource_s_loaimoi.UpdateCommand = "UPDATE tb_dsS SET msloais" +
" = @msloaimoi WHERE (msloais = @msloaicu)";
SqlDataSource_s_loaimoi.UpdateParameters.Clear();
SqlDataSource_s_loaimoi.UpdateParameters.Add("msloaicu",
ddlmaloaimoi.SelectedValue.Trim());
SqlDataSource_s_loaimoi.UpdateParameters.Add("msloaimoi",
ddlmaloaicu.SelectedValue.Trim());
SqlDataSource_s_loaimoi.Update();
lbsloaicu.DataBind();
lbsloaimoi.DataBind();
}

5.13. Chuyển thương hiệu: Chuyển một sách từ thương hiệu sách này sang thương hiệu sách
khác

5.13.1.Phân tích trang đổi 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.
+ Liên quan table sau:

Hình 5.58: Các table liên quan đến trang đổi thương hiệu sách

+ Chủ yếu: thực hiện chức năng: chuyển một hoặc tất cả sách từ một thương hiệu này sang
một thương hiệu khác
+ Chuỗi kết nối DB: 1G112NguyenThiLanHuongBanSachConnectionString_onl

5.13.2.Thiết kế (Design) trang đổi thương hiệu sách:


wfChangeTrademarkManagements.aspx

Hình 5.59: Thiết kế trang đổi thương hiệu sách

 Dùng DropDownList để chọn loại sách cần chuyển và loại chuyển đến

- 114 -
. DropDownList ddlmathcu: DataSourceID = SqlDataSource_ th_ cu
Câu lệnh kết nối DB: SELECT * FROM [tb_thuonghieu]
Các thiết lập thuộc tính :
+ v Enable Auto Postback
+ DataTextField = tenthuonghieu
+ DataValueField = math
. DropDownList ddlmathmoi: DataSourceID = SqlDataSource_ th_ moi
Câu lệnh kết nối DB: SELECT * FROM [tb_thuonghieu]
Các thiết lập thuộc tính :
+ v Enable Auto Postback
+ DataTextField = tenthuonghieu
+ DataValueField = math
 2 ListBox dùng để hiển thị các sách
. ListBox lbsthcu: DataSourceID = SqlDataSource_s_thcu
Câu lệnh kết nối DB: SELECT * FROM [tb_dsS]
WHERE ([math] = @math)
Với các thuộc tính:

Hình 5.60: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_thcu

Các thiết lập thuộc tính:


+ DataTextField = tens
+ DataValueField = mss
. ListBox lbsthmoi: DataSourceID = SqlDataSource_s_thmoi
Câu lệnh kết nối DB: SELECT * FROM [tb_dsS]
WHERE ([math] = @math)

- 115 -
Hình 5.61: Tham số câu lệnh kết nối DB DataSourceID = SqlDataSource_s_ thmoi

Các thiết lập thuộc tính:


+ DataTextField = tens
+ DataValueField = mss
 Dùng Button để thực hiện các thao tác chuyển sách từ loại này sang loại khách

5.13.3.Lập trình (Codes) khởi tạo trang đổi thương hiệu sách:
wfChangeTrademarkManagements.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 CHUYỂN "
+ "THƯƠNG HIỆU SÁCH CỦA CỬA HÀNG SÁCH LHSHOP";
}//page_load

5.13.4.Lập trình (Codes) chức năng chuyển hàng: wfChangeTrademarkManagements.aspx

protected void btnlondon_Click(object sender, EventArgs e)


{
SqlDataSource_s_thcu.Update();
lbsthcu.DataBind();
lbsthmoi.DataBind();
}

protected void btnnhodon_Click(object sender, EventArgs e)


{
SqlDataSource_s_thmoi.Update();
lbsthcu.DataBind();
lbsthmoi.DataBind();
}

protected void btnlonkep_Click(object sender, EventArgs e)


{
SqlDataSource_s_thcu.UpdateCommand = "UPDATE tb_dsS SET math" +
" = @mathmoi WHERE (math = @mathcu)";
SqlDataSource_s_thcu.UpdateParameters.Clear();
SqlDataSource_s_thcu.UpdateParameters.Add("mathmoi",
ddlmathmoi.SelectedValue.Trim());
SqlDataSource_s_thcu.UpdateParameters.Add("mathcu",
ddlmathcu.SelectedValue.Trim());

- 116 -
SqlDataSource_s_thcu.Update();
lbsthcu.DataBind();
lbsthmoi.DataBind();
}

protected void btnnhokep_Click(object sender, EventArgs e)


{
SqlDataSource_s_thmoi.UpdateCommand = "UPDATE tb_dsS SET math" +
" = @mathmoi WHERE (math = @mathcu)";
SqlDataSource_s_thmoi.UpdateParameters.Clear();
SqlDataSource_s_thmoi.UpdateParameters.Add("mathmoi",
ddlmathcu.SelectedValue.Trim());
SqlDataSource_s_thmoi.UpdateParameters.Add("mathcu",
ddlmathmoi.SelectedValue.Trim());
SqlDataSource_s_thmoi.Update();
lbsthcu.DataBind();
lbsthmoi.DataBind();
}

- 117 -
Chương 6: TRIỂN KHAI PHÁT HÀNH WEBAPP
6.1. Giới thiệu về Host miễn phí somee

+ Các host web phải đảm bảo phù hợp với nền tảng công nghệ mà WebApp đang lập trình
phát triển sử dụng: Sản phản WebApp trong đề tài này là ASP.NET 4.6.1.
Vì vậy, Host Web được chọn để triển khai phát hành WebApp của đề tài này phải hỗ trợ
AS.NET 4.6.1.
+ Có nhiều Host Web miễn phí, trong đề tài này sử dụng Wfee Host Web: somee như Hình
www.somee.com

Hình 6.1: Trang chủ Host Web somee

+ Đặc điểm cơ bản của Wfee .Net Hosting:

. Dung lượng 150 MB


. Hỗ trợ ASP.NET từ 2.0 – 4.8 nền sử dụng được cho sản phẩm của đề tài là ASP.NET 4.6.1
. Dung lượng DB 30 MB MS. SQL Server 2014/2016/2019 nên sử dụng cho sản phẩm của
đề tài nảy là MS.SQL 2014.

6.2. Đăng ký tài khoản somee

BƯỚC 1: Đăng ký tài khoản host somee & Đăng nhập vào host đó

- 118 -
First name: lh Last name: 1501

User ID: ntlhLTWeb Pass: 15012001ntlh

Email: lanhuonglh15@gmail.com

URL:

o http://LHShop112ntlhuong.somee.com

o http://www.LHShop112ntlhuong.somee.com

Profile:

User ID: ntlhLTWeb

First name: lh

Last name: 1501

Email address: lanhuonglh15@gmail.com

FTP:

Addresses:

o ftp://LHShop112ntlhuong.somee.com/www.LHShop112ntlhuong.somee.com

o ftp://198.37.116.30/www.LHShop112ntlhuong.somee.com

Username: ntlhLTWeb

Password: * Use the password wfom this control panel *

ASP.Net version: 4.0 – 4.8

Thông tin địa chỉ vật lý lưu trữ Web trên Host

Website local path:

d:\DZHosts\LocalUser\ntlhLTWeb\www.LHShop112ntlhuong.somee.com

Protected local path:

d:\DZHosts\LocalUser\ntlhLTWeb\Protected.LHShop112ntlhuong.somee.com

KHÔNG GIAN HOST ĐĂNG KÝ ĐƯỢC:

- 119 -
6.3. Restore BD lên host somee

BƯỚC 2: Tạo mới database trùng tên với DataBase của Web; Restore hoặc Attach
DB
Datebase name: 1G112NguyenThiLanHuongBanSach
THÔNG TIN KẾT NỐI DB
MS SQL Server version: MS SQL 2019 Express
MS SQL Server address: 1G112NguyenThiLanHuongBanSach.mssql.somee.com
Login name: vmhLTWeb_SQLLogin_1
Login password: otuhiaezww
Connection string: workstation
id=1G112NguyenThiLanHuongBanSach.mssql.somee.com;packet
size=4096;user id=vmhLTWeb_SQLLogin_1;pwd=otuhiaezww;data
source=1G112NguyenThiLanHuongBanSach.mssql.somee.com;persist
security info=False;initial
catalog=1G112NguyenThiLanHuongBanSach

BACKUP DB
Address:
ftp://5g2vominhhoangbanvot.backup.somee.com/5G2VoMinhHoangBanVot_MSSql_Database_Ba
ckup

Username: vmhLTWeb
Password: * Use the password wfom this control panel *
Hosting plan: MS SQL Plan "Novice"
Supplied package ID: SPID1076082
Managed product ID: MPID3928342
Data file: Size, Max/Used/Usage: 30MB / 8.00MB / 26.67%
Log file: Size, Max/Used/Usage: 30MB / 8.00MB / 26.67%

- 120 -
Backup file Manager => Restore
Browse for local backup (50MB max): chọn file .bak từ PC : LHshop.bak
chọn : Upload and Restore

6.4. Upload đăng tải Source WebApp lên host somee để phát hành

BƯỚC 3: Điều chỉnh nội dung Web.Config:


<system.web>
<customErrors mode="Off" defaultRedirect="HomePage.aspx"/>
</system.web>
<system.webServer>
<defaultDocument>
<files>
<add value="Homepage.aspx" />
</files>
</defaultDocument>
<directoryBrowse enabled="false" />

</system.webServer>

BƯỚC 4: Điều chỉnh Web.Config: TRONG Web.config

BƯỚC 5: Upload và đăng tải phát hành WebApp bán sách online trên somee

6.5. Giới thiệu sản phẩm WebApp quản lý bán sách online trên somee

- 121 -
Chương 7: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỒ ÁN
7.1. Kết luận

7.1.1. Những kết quả đạt được

Vận dụng các cơ sở lý thuyết lập trình Web, thiết kết và lập trình được:
+ Phần giao dịch:
. MaeterPage dùng chung cho cả giao dịch và quản lý
. HomePage: Trưng bày sách tại LHshop
. Giỏ hàng : Lưu trữ các sách mà khách hàng muốn mua
. Một phần của trang đặt hàng (Order) : phần khách hàng
+ Phần Quản lý
. Quản lý chung bao gồm cả chức năng đăng nhập (Login) dùng Codes; trang này bao gồm
tất cả các chức năng quản lý, cho phép <nhân viên> chọn các chức năng quản lý cụ thể đến
các trang khác.
. Quản lý sách, nhân viên, các chi nhánh và tồn kho: Thêm, Xóa, Sửa và xử lý TBTV khi
xóa.

7.1.2. Hạn chế

Do hạn chế thời gian, một sô chức năng sau chưa thực hiện hoặc thực hiện chưa đầy đủ:
+ Giao diện còn chưa được trực quan, chưa dễ dùng và chưa đảm bảo tính thẩm mĩ
+ Chưa thực hiện được nghiệp vụ xuất nhập kho

7.2. Hướng phát triển

7.2.1. Hướng khắc phục các hạn chế

+ Chỉnh sửa giao diện phần mềm trực quan hơn


+ Sẽ tiếp tục hoàn thiện trang đặt hàng với chức năng đơn hàng và chi tiết đơn để lưu vào
DB.
+ Tiếp tục hoàn thiện sản phẩm minh họa (Demo) và báo cáo đề tài.

- 122 -
7.2.2. Hướng mở rộng ĐỒ ÁN HỌC PHẦN

+ Tiếp tục phát triển sản phẩm với các công nghệ mới, như: MVC, SP, . . .
+ Phát triển sản phẩm với nghiệp vụ thanh toán online

- 123 -
DANH MỤC TÀI LIỆU THAM KHẢO
[1]. Võ Xuân Thể (2021), Bài giảng học phần Lập trình Web (4 Tín chỉ), Trường Đại học
Tài chính – Marketing (lưu hành nội bộ).
[2]. https://shopLH.com/: Trang thông tin điện tử của cửa hàng sách chính hãng LHshop,
được sử dụng để tham khảo chuyên môn thực hiện đề tài này.

- 124 -
CÁC PHỤ LỤC
Mẫu trang web chủ được tham khảo để lập trình sản phẩm của đề tài này theo [2]:

- 125 -

You might also like