Cơ sở dữ liệu nâng cao Báo cáo đồ án xây dựng hệ thống website bán bánh ngọt bằng ASP.NET gồm 2 phần: Giao dịch mua bánh ngọt của khách hàng trực tuyến và Mẫu trang giao dịch kiêm quản lý bán bánh ngọt
GIỚI THIỆU ĐỒ ÁN CỦA HP 16 1.1 Tổng quan về ĐỒ ÁN HỌC PHẦN
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ốngWebsites bán bánh ngọt trực tuyến.
Công cụ và nền tảng kỹ thuật thực hiện ĐỒ ÁN HỌC PHẦN
+ ASP.NET 4.7.2 trên MS Visual Studio NET 2019
+ Hệ quản trị CSDL MS SQL Server 2019 trên Local
+ Free Host Web: some.com
Sản phẩm của ĐỒ ÁN HỌC PHẦN
+ Hệ thống WebApp bán bánh ngọt trực tuyến (online) dạng Local trên PC:
+ Hệ thống WebApp bán bánh ngọt trực tuyến (online) dạng Online trên somee: http://G4BanBanhOnline.somee.com http://www.G4BanBanhOnline.somee.com
GIỚI THIỆU CHUNG VỀ HỆ THỐNG
App = Sys [Giao dịch: Transaction || DB/Ms.SQL||Quản lý: Management]: Local + some
(Chương 4: Item/Cart/RAM + Save/DB|| Chương 3: DB|| Chương 5: Login + QLHH:T,S,X,RBTV,CN: Chương 6: Cute.FTP9)
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 bánh ngọt Online (trực tuyến 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 bánh ngọt online (trực tuyến)
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 bánh ngọt trực tuyến
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 bánh ngọt
Chương 6 Triển khai và phát hành WebApp bán bánh ngọt online (trực tuyến) trên Host: somee
Chương 7 Tổng kết các kết quả đạt được và còn hạn chế của đồ án, đồng thời đề xuất hướng khắc phục hạn chế và phát triển Đồ án.
CƠ SỞ LÝ THUYẾT CỦA HỌC PHẦN 18 2.1 Giới thiệu về lập trình WebApp trên ASP.NET
Phát triển WebApp ASP.NET đơn giản có CSDL dùng ADO.NET
2.3.1 Căn bản về MASTER PAGE
2.3.1.1 Khái niệm Masterpage (mẫu trang web)
2.3.1.1.2.Số lượng Masterpage trong 1 Websites
2.3.1.1.3.Các thành phần trên Masterpage
2.3.1.3 Xây dựng Mẫu trang (Masterpage)
2.3.1.3.2.VIẾT THỦ TỤC ẨN / HIỆN Login
2.4 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
2.4.3 Đặt hàng và thanh toán
2.5 Phát triển các chức năng QUẢN LÝ trên WebApp ASP.NET
2.5.1 Quản lý đăng nhập và bảo mật
2.5.3 Các chức năng thao tác dữ liệu: Thêm _ Sửa _ Xóa
2.6 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
Master Page = Mẫu trang web
2.3.1 Căn bản về MASTER PAGE
2.3.1.1 Khái niệm Masterpage (mẫu trang web)
2.3.1.1.2.Số lượng Masterpage trong 1 Websites
2.3.1.1.3.Các thành phần trên Masterpage
2.3.1.3 Xây dựng Mẫu trang (Masterpage)
2.3.1.3.2.VIẾT THỦ TỤC ẨN / HIỆN Login
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
2.4.3 Đặt hàng và thanh toán
Phát triển các chức năng QUẢN LÝ trên WebApp ASP.NET
2.5.1 Quản lý đăng nhập và bảo mật
2.5.3 Các chức năng thao tác dữ liệu: Thêm _ Sửa _ Xóa
Xử lý Ràng buộc toàn vẹn dữ liệu (RBTV) trên CSDL trong ASP.NET
2.6.1 Giới thiệu về lập trình xử lý RBTV dữ liệu trên CSDL trong ASP.NET
2.6.2 Thiết kế hệ thống xử lý RBTV dữ liệu
2.6.3 Lập trình hệ thống xử lý RBTV dữ liệu
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
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.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
THIẾT KẾ VÀ CẬP NHẬT CSDL PHỤC VỤ WEBAPP 20 3.1 Phân tích và thiết kế DB
Diagram của DB bán bánh ngọt 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 Bánh Ngọt Online như Error:
Thiết kế các Tables dữ liệu
Các tables cơ sở dữ liệu được thiết kế thuộc phận hệ và có ảnh hưởng chặt chẽ đến table danh mục sản phẩm và table đơn đặt hàng như sau:
3.3.1 Thiết kế các Table MH
3.3.2 Thiết kế các Table DDH:
Cập nhật dữ liệu DB thực nghiệm cho WebApp bán bánh ngọt online
Đã nhập dữ liệu thực nghiệm cho các table sau:
Giới thiệu một số SP và Trigger trong DB quản lý bán bánh ngọt online
3.5.1 Phân hệ quản trị mua và bán hàng:
RBTV1: Giá trị thuộc tính MaCH trong quan hệ
Mô tả: Mỗi cửa hàng phải có một mã số riêng biệt
RBTV1: Miền giá trị thuộc tính GioiTinh
Mô tả: [GioiTinh] € {“Nam”, “Nữ”}
+ Giới tính của nhân viên chỉ có thể là Nam hoặc Nữ
RBTV2: Liên bộ dữ liệu trong một quan hệ
+ Mỗi đơn hàng sẽ có nhiều loại bánh khác nhau
+ Mỗi loại bánh sẽ nằm trong nhiều đơn hàng khác nhau
RBTV2: Giá trị thuộc tính slton trong quan hệ
+ Số lượng tồn phải lớn hơn hoặc bằng 0
RBTV1: Miền giá trị thuộc tính MaKH trong quan hệ
Mô tả: Mỗi khách hàng có mỗi mã số khách nhau để phân biệt
THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN GIAO DỊCH 29 4.1 Giới thiệu về WebApp Bán bánh ngọt online
MasterPage giao dịch : Master.Master
4.2.1 Thiết kế Masterpage giao dịch
THIẾT KẾ MASTERPAGE (Design View)
Trong thiết kế MasterPage như Error: Reference source not found bao gồm:
+ Thiết kế Table có 1 cột và nhiều dòng tạo thuận lợi cho việc kết cấu vị trí các thành phần thiết kế trên các WebPage thừa kế MasterPage này.
+ Banner giới thiệu về cơ sở kinh doanh bánh ngọt 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) public partial class ThuyHang : System.Web.UI.MasterPage
/// Thủ tục tự động chạy khi 1 web page thừa kế masterpage này được tải lên trình duyệt ///
/// protected void Page_Load(object sender, EventArgs e)
LoginQL.Visible = false;//Ngay từ đầu tải webpage lên trình duyệt ẩn loginQL[ có thể bỏ qua designer đã gán visible
/// Khi NSD (NV QL) chọn một mục Menu Items trên Menu Main
/// NSD (NV QL) chọn: Mục thực đơn Quản lý hoặc đăng nhập => hiện lên LoginQL.visible ///
/// protected void Menu1_MenuItemClick(object sender, MenuEventArgs e)
{ if(e.Item.Value == "ql" || e.Item.Value == "dn")// NSD (NV QL) đã chọn mục "Quản Lý" có Values = "ql" or đăng nhập có values
LoginQL.Visible = true; //Hiên login
LoginQL.Visible = false;// Ẩn login
/// Xử lí đăng nhập của nv quản lý
/// Giiuwx giá trị xác thực đăng nhập thành công hay không protected void LoginQL_Authenticate(object sender, AuthenticateEventArgs e)
{//Nếu NSD đăng nhập vs tên admin và ml admin if ((LoginQL.UserName == "Admin" && LoginQL.Password == "admin@vn") ||
(LoginQL.UserName == "Guess" && LoginQL.Password == "guess@vn"))
{ e.Authenticated = true; //Đăng nhạp thành công, tự động chuyển đến trang loginQl.destinationpage url
Session["usern"] = LoginQL.UserName; // Gửi username sang trang quản lý;
{ e.Authenticated = false;// Đăng nhập không thành công
Trang chủ trưng bày các loại bánh ngọt: HomePage.aspx
4.3.1 Thiết kế (Design) WebApp giao dịch bán bánh online
* Hệ Websites hỗ trợ chức năng giao dịch bán bánh trực tuyến 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)
Trong thiết kế trang chủ HomePage như Error: Reference source not found 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 loại bánh ngọt cho phép khách hàng chọn mua trực tuyến. + Dùng các Label để thông báo câu chào mừng, thông tin giỏ hàng cho khách hàng.
+ Dùng button để cho khách hàng tiện vào xem tình trạng giỏ hàng của mình.
4.3.2 Lập trình (Codes) WebApp giao dịch bán bánh ngọt online: FrHomepage.aspx
MÃ LỆNH LẬP TRÌNH CỦA HOMEPAGE (Code View)
B1: Khai báo đường dẫn thư viện NameSpace using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data;
B2: Khai báo biến toàn cục cart thuộc kiểu DataTable để lưu giữa “giỏ hàng”: static DataTable Cart = new DataTable();
B3: Khởi tạo “giỏ hàng” trong Page_Load()
//Thử tục được chạy mỗi khi trang web được load lên protected void Page_Load(object sender, EventArgs e)
{ if (Session["cart"] != null) // Đã có giỏ hàng
//Lấy giỏ hàng từ Session lưu vào biến cart Cart = Session["Cart"] as DataTable;
} else// Chưa có giỏ hàng => khởi tạo giỏ hàng mới
// Xóa các dòng và cột rác nếu có trong giỏ hàng Cart.Rows.Clear();
// Định nghĩa các cột dữ liệu cần lưu trong giỏ hàng Cart.Columns.Add("MaSoBanh", typeof(string));
Cart.Columns.Add("TenLoaiBanh", typeof(string));
Cart.Columns.Add("DonViTinh", typeof(string));
Cart.Columns.Add("GiaBan", typeof(float));
Cart.Columns.Add("SoLuong", typeof(float));
Cart.Columns.Add("ThanhTien", typeof(float), "SoLuong*GiaBan");//Tự tính = số lượng * đơn giá
4.4 Trang “Giỏ hàng” của khách hàng: FrCart.aspx
4.4.1 Thiết kế (Design) WebPage “Giỏ hàng”
* Webpage “giỏ hàng” của khách hàng trực tuyến thừa kế Masterpage nên trên, gồm các thành phần như sau:
+ Có Label thông báo khi trang giỏ hàng rỗng hoặc có sản phậm đã chọn mua.
+ Có button Mua để khách hàng quay lại HomePage.aspx để mua hàng khi giỏ rỗng. + Có bảng GridviewGioHang để chiếu những thông tin sản phẩm mà khách hàng đã chọn bên HomePage.aspx.
+ Có lableTongTien để tính tổng tiền cho những sản phẩm đã chọn.
+ Có button đặt mua để khách hàng thanh toán.
+ Có button về trang chủ để khách hàng quay lại trang HomePage.aspx.
+ Có button hủy giỏ hàng để khách hàng bỏ những sản phẩm đã chọn.
4.4.2 Mã lệnh (Codes) WebPage “Giỏ hàng” public partial class Cart : System.Web.UI.Page
{ static DataTable cart = new DataTable();//biến toàn cục cart = sẽ dùng lưu giữ giỏ hàng protected void Page_Load(object sender, EventArgs e)
{ if (Session["cart"] == null) // Giỏ hàng rỗng
// Hiển thị thông báo giỏ hàng rỗng lên trang web lbTitle.Text = "HIỆN TẠI, GIỎ HÀNG CỦA QUÝ KHÁCH ĐANG TRỐNG, XIN MỜI SANG TRANG DANH MỤC HÀNG HÓA ĐỂ CHỌN MUA"; btnMua.Text = "Chọn Mua";
GridViewCart.DataSource = null; lbSum.Text = "";
// Ẩn 2 nút đặt hàng và xóa giỏ hàng btnOrder.Visible = false; btnCancel.Visible = false;
} else // Đã có giỏ hàng
{ lbTitle.Text = "Giỏ hàng hiện tại của quý vị như sau:"; btnMua.Text = "Chọn mua tiếp!";
//Lấy giỏ hàng từ session xuống cart cart = Session["cart"] as DataTable;
//Gán giỏ hàng cart vào gridviewcart: Quan trọng nhất
//Tải dữ liệu từ tlb lên Gridview
//Tính toán só lượng + món tiền lbSum.Text = "Giỏ hàng hiện có " + cart.Compute("count(MaSoBanh)", "").ToString() +
"Mặt Hàng, Tổng Tiền = " + cart.Compute("sum(ThanhTien)", "").ToString() + "Đồng";
// Hiển thị nút xóa giỏ hàng và đặt hàng btnOrder.Visible = true;//Vì có giỏ nên đặt mua được btnCancel.Visible = true;
// về trang chủ để chọn mua hàng hoặc mua tiếp protected void btnMua_Click(object sender, EventArgs e)
//Mua hàng protected void btnMua_click(object sender, EventArgs e)
//Hủy Đơn Hàng protected void btnCancel_Click(object sender, EventArgs e)
Response.Redirect("~\\HomePage.aspx");// về trang chủ
Đơn đặt hàng: FrOrder.aspx
* Trang này FrOrder.aspx được gọi từ trang “Giỏ hàng” [Cart.aspx] không rổng: protected void Page_Load(object sender, EventArgs e)
{ lblTitle.Text = "HIỆN TẠI, GIỎ HÀNG CỦA QUÝ KHÁCH ĐANG TRỐNG, XIN MỜI SANG TRANG DANH MỤC HÀNG HÓA ĐỂ CHỌN MUA"; btnMua.Text = "Chọn Mua";
GridViewCart.DataSource = null; lblSum.Text = ""; btnOrder.Visible = false; btnCancel.Visible = false;
{ lblTitle.Text = "Giỏ hàng hiện tại của quý vị như sau:"; btnMua.Text = "Chọn mua tiếp!";
//Lấy giỏ hàng từ session xuống cart cart = Session["cart"] as DataTable;
//Gán giỏ hàng cart vào gridviewcart: Quan trọng nhất
//Tải dữ liệu từ tlb lên Gridview
//Tính toán só lượng + món tiền lblSum.Text = "Giỏ hàng hiện có " + cart.Compute("count(MaSoBanh)", "").ToString() +
"Mặt Hàng, Tổng Tiền = " + cart.Compute("sum(ThanhTien)", "").ToString() + "Đồng"; btnOrder.Visible = true;//Vì có giỏ nên đặt mua được btnOrder.ToolTip = "Bấm vào để đặt hàng, hân hạnh được phục vụ"; btnCancel.Visible = true;
* Nếu giỏ hàng đã có thì có thể gọi được trang đặt hàng: FrOrder.aspx
//Gọi trang đặt hàng protected void btnOrder_Click(object sender, EventArgs e)
* Để thực hiện được trang đặt hàng: FrOrder.aspx thì cần phải “chạy” từ trang chủ (HomePage.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ừ FrHomePage.aspx
* ĐẶT HÀNG PHẢI XÁC ĐỊNH 3 NỘI DUNG:
+ Thông tin đơn hàng: msddh, ngày lập,… Table [DDH]
+ Đơn này đặt mua những mặt hàng nào Table [CTDDH]
Sau khi đặt hàng => Giao hàng ở đâu, cho ai, số điện thoại người nhận, hạn giao
=> Phương thức thanh toán, số tiền ?
4.5.2 Thiết kế trang Đặt hàng: FrOrder.aspx
Thiết kế FORM “Đặt hàng”: có 3 phần
* Thông tin : Tìm (MSKhachHang, TenKhachHang, Diachi,…); nếu tìm ko có thì cho Thêm mới
* Thông tin (xem table DDH trong DB): MSDDH, NgayLap (ngày giờ hiện tại), MSKhachHang, MSNhanVien, MSKhuVuc, NguoiNhan, DiaChiGiao, SDTNhan, ThoiHan, TinhTrang, GhiChu.
* Thông tin “giỏ hàng”: lấy từ Trang “giỏ hàng” sang, để KH xem và kiểm tra các MH đã đặt, tổng tiền, : không Thêm / Xóa /Sửa (việc này thực hiện trên trang “giỏ hàng”).
PHẦN THÔNG TIN KHÁCH 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), được thiết kế như Error: Reference source not found
+ Nếu tìm có KH thì phần thông tin KH mới sẽ bị ẩn; 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 DDH đã có trong DB:
+ Thông tin đơn hàng chỉ hiển thi khi đã có thông tin KH, tức là trong phần thông tin KH đã
“Chọn KH”, 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à Label, TextBox và Calendar, như Error: Reference source not foundError: Reference source not found
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: FrOrder.aspx
PHẦN THÔNG TIN KHÁC HÀNG
* Tìm khách hàng, nếu chưa có thì thêm mới, nếu đã có thì chọn KH; vì có thể tìm thấy nhiều KH:
SELECT MSKhachHang, TenKhachHang, DiaChi, SDT, Diem
WHERE (MSKhachHang LIKE '%' + @MSKhachHang + '%') OR (TenKhachHang LIKE '%' + @TenKhachHang + '%') OR (DiaChi LIKE '%' + @DiaChi + '%') OR (SDT LIKE '%' + @SDT + '%') OR (Diem LIKE '%' + @Diem + '%')
Với tham số như Error: Reference source not found
+ Lệnh SQL thêm KH mới: Insert KH: SqlDataSourceKH
INSERT INTO KH (mskh, hokh, tenkh, dc, sodt, diem)VALUES (@mskh,@hokh,@tenkh,@dc,@sodt,@diem) Với tham số như Error: Reference source not found
+ MÃ LỆNH NÚT TÌM KH
* Viết lại mã lệnh (codes) “Tìm KH”:
[1] Chỉ cho phép tìm khách hàng khi đã nhập thông tin vào ô Textbox tìm
[2] 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 GRIDVIEW)
[3] Hủy kết quả tìm và tìm lại KH khác
// HỦY : TÌM LẠI KH KHÁC
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)
//TỰ ĐỘNG CHAY KHI TRANG ĐẶT HÀNG ĐƯỢC TẢI LÊN protected void btnTimKh_Click(object sender, EventArgs e)
{ btnHuyTimKH.Visible = true;//Cho phép hủy tìm lại bất cứ lúc nào if (btnTimKh.Text.Trim() == "Tìm khách hàng")//1 Tìm Khách Hàng
GridViewKH.DataBind();//Tải DL lên theo đk if (GridViewKH.Rows.Count < 1)//Ko tìm thấy KH như v
{ btnTimKh.Text = "Thêm khách hàng mới";
} else//Tìm ít nhất 1 KH
{ btnTimKh.Text = "Chọn KH";//Được chọn sẽ xử lý ở dưới txtMSKH.Text = GridViewKH.Rows[0].Cells[1].Text.Trim();//tạm gán Mã KH đầu tiên tìm thấy Row(0) vào txtMSKH mới
} else if (btnTimKh.Text.Trim() == "Thêm khách hàng mới")//2 Nhâp thông tin khách hàng mới
//2.1: Hiển thị nhập Thông tin Kh mới lbNhapKHMoi.Visible = true; lbMSKH.Visible = true; lbTenKH.Visible = true; lbDCKH.Visible = true; lbSdtKH.Visible = true; txtMSKH.Visible = true; txtTenKH.Visible = true; txtDCKH.Visible = true; txtSdtKH.Visible = true;
//2.2 Xóa các ô textbox để cbi nhập KH mới txtMSKH.Text = "0000"; txtMSKH.ToolTip = "Không để trống mã KH"; txtTenKH.Text = ""; txtDCKH.Text = ""; txtSdtKH.Text = "";
//2.3 Đổi nhãn nút lệnh Lưu thông tin KH btnTimKh.Text = "Lưu thông tin khách hàng mới";
} else if (btnTimKh.Text.Trim() == "Lưu thông tin khách hàng mới")//3 Lưu thông tin KH mới
{//3.1 Lưu thông tin KH mới try
SqlDataSourceKH.Insert(); txtTimKH.Text = txtMSKH.Text.Trim(); this.Title = "Thêm KH mới";
} catch (System.Exception ex) { this.Title = "Lỗi thêm KH mới = " + ex.Message; } //3.2
//3.3 lbNhapKHMoi.Visible = false; lbMSKH.Visible = false; lbTenKH.Visible = false; lbDCKH.Visible = false; lbSdtKH.Visible = false; txtMSKH.Visible = false; txtTenKH.Visible = false; txtDCKH.Visible = false; txtSdtKH.Visible = false;
//3.4 Đổi nhãn chọn KH btnTimKh.Text = "Chọn KH";
} else if (btnTimKh.Text.Trim() == "Chọn KH")
//4.1 Gán mã KH vào ô textbox txtTimKH.Text = txtMSKH.Text.Trim();
//4.2 Không cho chọn lại btnTimKh.Enabled = false;
//4.3 Xử lý thông tin đơn hàng
//4.3.1 hiện thông tin đơn hàng lbTTDH.Visible = true; lbmsdh.Visible = true; lbNgaylap.Visible = true; lbNguoiNhan.Visible = true; lbDiachigiao.Visible = true; lbDTGiao.Visible = true; lbGhichu.Visible = true; lbHangiao.Visible = true; txtGhichu.Visible = true;
CalendarHangiao.Visible = true; txtDCGiao.Visible = true;//Gán DC KH vào đây = mặc định địa chỉ giao hàng là DC khách Hàng txtNguoinhan.Visible = true;//Gán tên KH vào đây = mặc định ngươi nhận là KH txtDTGiao.Visible = true;//Gán sdt KH vào đây = mặc định sdt là KH txtDTGiao.Text = GridViewKH.Rows[0].Cells[4].Text.Trim();
Ngaylap.Visible = true; lbNgaylap.Text = t.ToShortDateString().Trim();
MSDH.Visible = true; lbmsdh.Visible = true; lbmsdh.Text = txtTimKH.Text + t.Year.ToString().Substring(2, 2) + t.Month.ToString() + t.Day.ToString() + t.Hour.ToString() + t.Minute.ToString() + t.Second.ToString();
// btnAccept.Visible = true; btnHuyDH.Visible = true;
//4.3.2 thông tin CTDDH lbCTDDH.Visible = true; lbSum.Visible = true;
//Lấy giỏ hàng từ session xuống cart cart = Session["cart"] as DataTable;
//Gán giỏ hàng cart vào gridviewcart: Quan trọng nhất
//Tải dữ liệu từ tlb lên Gridview
//Tính toán só lượng + món tiền lbSum.Text = "Tổng Tiền = " + cart.Compute("sum(ThanhTien)", "").ToString() +
/// protected void btnHuyTimKH_Click(object sender, EventArgs e)
{//1 Cho tìm lại btnTimKh.Text = "Tìm khách hàng"; btnTimKh.Enabled = true;
// 2 Ẩn các ô nhập thông tin mới lbNhapKHMoi.Visible = false; lbMSKH.Visible = false; lbTenKH.Visible = false; lbDCKH.Visible = false; lbSdtKH.Visible = false; txtMSKH.Visible = false; txtTenKH.Visible = false; txtDCKH.Visible = false; txtSdtKH.Visible = false;
//3 Xóa trông textbox txtTimKH.Text = "";
//4.3 Xử lý thông tin đơn hàng
//4.3.1 hiện thông tin đơn hàng lbTTDH.Visible = false; lbmsdh.Visible = false; lbNgaylap.Visible = false; lbNguoiNhan.Visible = false; lbDiachigiao.Visible = false; lbDTGiao.Visible = false; lbGhichu.Visible = false; lbHangiao.Visible = false; txtGhichu.Visible = false;
CalendarHangiao.Visible = false; txtDCGiao.Visible = false;//Gán DC KH vào đây = mặc định địa chỉ giao hàng là DC khách Hàng txtNguoinhan.Visible = false;//Gán tên KH vào đây = mặc định ngươi nhận là KH txtDTGiao.Visible = false;//Gán sdt KH vào đây = mặc định sdt là KH
MSDH.Visible = false; lbmsdh.Visible = false;
// btnAccept.Visible = false; btnHuyDH.Visible = false;
//4.3.2 thông tin CTDDH lbCTDDH.Visible = false; lbSum.Visible = false;
THIẾT KẾ VÀ LẬP TRÌNH WEBAPP PHẦN QUẢN LÝ 46 5.1 Giới thiệu về WebApp quản lý hệ thống bán bánh ngọt online
Masterpage quản lý hệ thống bán bánh ngọt online
5.2.1 Thiết kế Masterpage quản lý
Sử dung lại Masterpage giao dịch ThuyHang.master bằng cách thiết kế và lập trình bổ sung thực đơn (Menu quản lý) như Error: Reference source not found
THIẾT KẾ: Designing (Master.Master):
[Task]->Edit menu item || Properties: Item …: định nghĩa các mục chọn menu
Item : Text Value NavigateURL : như Error: Reference source not found
Your login attempt was not successful Please try again!”: Quý vị đã đăng nhập không thành công Vui lòng đăng nhập lại!
Remember me next time.: Ghi nhớ cho lần đăng nhập sau.
User Name: Tên đăng nhập
Password is required.: Không để trống mật khẩu
User Name is required.: Không để trống tên đăng nhập
+ [Login.Task]->Convert to template: tự thiết kế lại (bổ sung) những thứ cần thiết cho Login
Login : đăng nhập (bình thường : Ẩn [.Visible = False ]; chỉ khi NSD chọn: thực đơn QUẢN LÝ / ĐĂNG NHẬP => hiện lên: Visible = True)
MÃ LỆNH (CODE): chỉ khi NSD chọn: thực đơn QUẢN LÝ / ĐĂNG NHẬP => hiện lên: Visible = True) public partial class Master : System.Web.UI.MasterPage
{ protected void Page_Load(object sender, EventArgs e)
/// Thủ được thực hiện khi người dùng chọn một mục trên menu
/// protected void MenuMain_MenuItemClick(object sender, MenuEventArgs e)
// Khi người dùng nhấn vào mục "Quản Lý" hoặc "Đăng Nhập" trên thanh menu
// thì sẽ hiển thị form Login cho người dùng nhập thông tin
// để đăng nhập vào trang quản lý if (e.Item.Value == "ql" || e.Item.Value == "dn")
Khi dùng công cụ Login (nêu trên) có thể có lỗi sau:
"WebForms UnobtrusiveValidationMode requires a ScriptResourceMapping for 'jquery' Please add a ScriptResourceMapping named jquery(case-sensitive)." Để khắc phục lỗi này, trong file Web.config chúng ta thêm đoạn mã lệnh sau:
[1] Ở đây là đăng nhập cho chức năng quản trị của Nhân viên đơn vị kinh doanh: Thêm, xóa, Sửa hàng, Giá, : KHÔNG Đăng ký thành viên (account) mới, mà Account do người quản trị hệ thống (sa= System Administrator) cấp
[2] Khách hàng có thể đăng ký thành viên mới [Sign Up = Create New Account] = Khách hàng thân thiết KHI đặt mua hàng (KHÔNG THUỘC PHẦN NÀY)
Lập Trang : Quản lý và gán vào LoginQL.DestinationPageURL = ~/Managerment.aspx => Chỉ Khi đăng nhập thành công thì mới được phép chuyển đến trang:
~/Managerment.aspx (chỉ có NV QL của đơn vị mới vào được trang này)
Vì vậy: trong Menu / Master.master: Không chọn
CÓ 2 PHƯƠNG ÁN XỬ LÝ ĐĂNG NHẬP:
+ 2 Phương án sau KHÔNG được sử dụng đồng thời,
+ Nếu dùng đồng thời thì PA 1 KHÔNG có tác dụng
PA 1: Sử dụng thư viện ASP.NET có sẵn: có thể dùng Digital ID
[Login.Task]Administer Website {Phải mua bản quyền và cài đặt bổ sung}
PA 2: Code thủ công: Event: Authenticate của Login:
KHÔNG DÙNG Digital ID, có thể dùng DB / MS SQL Server
Accounts quản lý: Admin với password: admin@vn VÀ Guest với password: guest@vn
CODES: public partial class Master : System.Web.UI.MasterPage
{ protected void Page_Load(object sender, EventArgs e)
/// Thủ được thực hiện khi người dùng chọn một mục trên menu
/// protected void MenuMain_MenuItemClick(object sender, MenuEventArgs e)
// Khi người dùng nhấn vào mục "Quản Lý" hoặc "Đăng Nhập" trên thanh menu
// thì sẽ hiển thị form Login cho người dùng nhập thông tin
// để đăng nhập vào trang quản lý if (e.Item.Value == "ql" || e.Item.Value == "dn")
/// protected void LoginQL_Authenticate(object sender, AuthenticateEventArgs e)
{ if ((LoginQL.UserName == "Admin" && LoginQL.Password == "admin@vn") || (LoginQL.UserName == "Guest" && LoginQL.Password == "guest@vn"))
// Đăng nhập thành công e.Authenticated = true;
// Đăng nhập thất bại e.Authenticated = false;
CODES TRÊN Managerment.aspx public partial class Managerment : System.Web.UI.Page
{ static String us; protected void Page_Load(object sender, EventArgs e)
// Người dùng đã đăng nhập us = Session["name"] as String; lblTitle.Text = "Chào mừng " + us + " đến với trang quản lý website bán bánh ngọt"; }
1 Code trên chỉ là tượng trưng; thực tế là Username và Password : lưu trữ và kiểm tra từ một Table trong DB
2 Bảo mật khi NSD nhớ (copy) Link url
5.2.2 Lập trình bổ sung Masterpage quản lý
MÃ LỆNH LẬP TRÌNH: Coding (MasterMaster):
//CHẠY KHI TRANG WEB ĐƯỢC TẢI LÊN TRÌNH DUYỆT
//KIỂM TRA ĐĂNG NHẬP protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
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 16
Trang chính của hệ thống quản lý hệ thống bán bánh ngọt
Thừa kế MasterPage nêu trên, dùng Table để bố cục trang và ít nhất phải thực hiện các yêu cầu sau:
Quản lý có nhiều chức năng; VD: QL HH, Phân công giao hàng, quản lý Nhóm MH, Ql NV,
QL kho và Tồn kho, QL KH, … Tìm kiếm, thống kê, báo cáo tổng hợp … Kết xuất ra bản in (Report…): =vậy tk trang QL chính (đang nhập nhập thành công vào trang nay, từ đây chọn các chức năng ql để sang các trang ql cụ thể khác)
5.3.1 Thiết kế (Design) trang quản lý chung (chính): Managerment.aspx
THIẾT KẾ TRÊN TRANG: Managerment.aspx:
5.3.2 Lập trình (Codes) trang quản lý chung (chính): GoodManagerment.aspx
// Gọi trang quản lý hàng hóa protected void btnQLHH_Click(object sender, EventArgs e)
Trang quản lý danh mục bánh ngọt: FrQLBanhManagements.aspx
5.4.1 Phân tích trang Quản lý danh mục bánh ngọt
+ 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ý danh mục bánh từ trang quản lý chung.
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong LoaiBanhNgot + Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.4.2 Thiết kế (Design) trang quản lý danh mục bánh ngọt:
[2] Từ trang Quản lý chung (GoodManagerment.aspx )= gọi == Trang quản lý hàng hóa (GoodManagerment.aspx )
// Gọi trang quản lý hàng hóa protected void btnQLHH_Click(object sender, EventArgs e)
- Dùng DropdownList: liệt kê và cho phép NV QL chọn nhóm mặt hàng cần quản lý (có mục chọn "tất cả")
- Dùng GridView: Liệt kê danh sách các mặt hàng thuộc nhóm đã chọn trong DropDownList (chú ý sử dụng phân trang Paging cho GridView)
Câu lệnh kết nối DB: SELECT * FROM [DMBanhNgot]
Các thiết lập thuộc tính :
[2] GridView: liệt kê các MH thuộc nhóm (dùng Where )
SELECT * FROM [DMBanhNgot] WHERE ([MaLoaiBanh] = @MaLoaiBanh)
Câu lệnh SQL kết nối DataBase:
SELECT DISTINCT * FROM [DMBanhNgot] WHERE ([MaLoaiBanh] @MaLoaiBanh)
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
[Gridview: Task] -> Edit Column // Selected Fields
DataField : cột dữ liệu (trong DB) được dùng
[4] Đối với thuộc tính HÌNH
+ Convert this field to a TemplateField (góc dưới phải của Properties của Field)
+ Đối với các Field là Template (Field tự thiết kế // không dùng mặc định): PHẢI THIẾT
[Gridview: Task] -> Edit Template (chỉ làm khi ít nhất có 1 field Template trong
Chú ý: Có thể có nhiều cột TemplateFields: phải chọn từng cột để thiết kế
Một cột có thể phải thiết kế nhiều trạng thái: ItemTeplate : mặc định,…
Field: “Hinh”: Xóa Label =đổi=> Image [Task]->Edit DataBinding
CheckBoxHinh: Cho NSD chọn có/không hiển thị hình ảnh
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 ảnh
Checked = False (ban đầu “không” chọn)
CheckBoxHinh.Text = Hiển thị hình ảnh
Checked = False (ban đầu “không chọn”)
// Ẩn hoặc hiện cột hình mẫu trong GridView (Ban đầu ẩn -> tránh trang web bị chậm do phải tải quá nhiều hình ảnh) protected void cbHA_CheckedChanged(object sender, EventArgs e)
GridViewMH.Columns[7].Visible = !GridViewMH.Columns[7].Visible;
Bổ sung mục chọn “Tất cả” trong DropDownList và hiển thị msnhom kế 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 (NhomMH)
B3: Viết bổ sung câu lệnh trong thủ tục sự kiện SelectedIndexChanged của DropDownListNhomMH
//THỦ TỤC NÀY CHẠY KHI NSD THAY ĐỔI LỰA CHỌN TRONG DropDownList
/// Tự động chạy mỗi khi người sử dụng (nhân viên) thay đổi lựa chọn nhóm trong
/// protected void DropDownListNhomMH_SelectedIndexChanged(object sender, EventArgs e) {
// 1 Kiểm tra NSD chọn * để liệt kê if (DropDownListNhomMH.SelectedValue.Trim() == "*")// NSD chọn Tất cả, có Value {
SqlDataSourceMH.SelectCommand = "SELECT * FROM [DMBanhNgot]";// Viết lại lệnh Select from Không Where cho sqldtatasourceMH btnThem.Enabled = false;
DropDownListNhomMH.ToolTip = "Chọn một loại thôi, chọn tất cả không thêm đc nha"; } else
{ btnThem.Enabled = true;//cho phép thêm nếu chọn một laoji riêng biệt btnThem.ToolTip = DropDownListNhomMH.ToolTip = " ";//Không nhắc nữa
// 2 hiển thị MSNhom kế bên DropDownList lbLoaiBanh lblLoaiBanh.Text = DropDownListNhomMH.SelectedValue;
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ả cả các MH: protected void Page_Load(object sender, EventArgs e)
// 1 Lời chào us = Session["name"] as String; lblTitle.Text = "Chào mừng " + us + " đến với trang quản lý hàng hóa";
//2 Gọi thủ tục DropDownListNhomMH_SelectedIndexChanged
Checkbox cho hiển thị / không hiển thị Hình ảnh của … 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” B2: Thiết kế lại cột hình ảnh trong GridView: [GridView]Task->Edite Templates
Hình 5 1: 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)
//THAY ĐỔI LỰA CHỌN : HIỂN || HAY KHÔNG HIỂN THỊ HÌNH ẢNH CỦA TRONG GRIDVIEW protected void cbHA_CheckedChanged(object sender, EventArgs e)
GridViewMH.Columns[7].Visible = !GridViewMH.Columns[7].Visible;
.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
5.4.3 Lập trình (Codes)trang quản lý danh mục quản lý bánh ngọt:
GoodManagerment.aspx protected void Page_Load(object sender, EventArgs e) protected void Page_Load(object sender, EventArgs e)
// 1 Lời chào us = Session["name"] as String; lblTitle.Text = "Chào mừng " + us + " đến với trang quản lý hàng hóa";
//2 Gọi thủ tục DropDownListNhomMH_SelectedIndexChanged
5.4.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục bánh ngọt:
+ Việc xóa, sửa, chọn … được thực hiện ngay trên Gridview danh mục bánh ngọt
+ Khi thực hiện các thao tác “Thêm”, “Xóa” và “Sửa” …….cần quan tâm các vấn đề:
Không sửa “MaSoBanh” CHUYỂN nhóm (chuyển MH từ Nhóm này sanh nhóm khác)
=> làm bằng trang web khác [không làm trên trang Quản lý HH này]
Không sửa “Hinh” ; Vì DB lưu đường dẫn đến file hình => Sử dụng chức năng riêng “cập nhật hình”
Không sửa MaLoaiBanh (vì khóa chính) và chú ý một vấn đề tương tự “Thêm mới”
Khi Xóa sẽ liên quan RBTV DL (xử lý trong phần sau)
MaSoBanh ko nhập mà sẽ là MaSoBanh đã chọn trong Dropdownlist =vì vậy=> khi chọn
“Tất cả” trong Dropdownlist (mã số bánh *) thì phải Ẩn nút “Thêm mới” (không cho thêm mới trong trường hợp này; cần có ToolTip để nhắc NSD chọn nhóm MH cụ thể trước khi thêm)
Các RBTV giá >= 0 (=0 : khuyến mãi): dùng Validator (tạm thời chưa làm)
- hình : chọn từ trong PC (ko nhập, vì là path lưu trong DB): FileUpload
MaSoBanh: khóa chính -> ko nên cho tự nhập (hệ thống tự tăng lên theo qui luật nào đó; ko nên tăng dần-> mã càng lớn và ko liên tục do xóa: VD: năm + nhóm + thứ tự trong năm 18
03 12345); tùy nhiên tạm thời bài làm này ta cho nsd (NV) tự nhập, phải xl trùng khóa.
Cách thực hiện thủ tục thêm, có phương án:
PA1: Khi nsd bấm nút “Thêm”: thì sẽ thêm 1 dòng trống mới trong Gridview để NSD nhập thông tin MH mới; có 3 phương án: dòng đầu trong Gridview, dòng cuối, tại vị trí đang chọn: thường là dòng cuối Khi nhập: phải chuyển các Field này thành TemplateField
PA2: Trong bài làm này tạm dùng các Textbox để nhập thông tin MH mới:
Chỉ khi nsd bấm “thêm mới” thì các Textbox hiện ra cho nsd nhập thông tin MH mới, đổi nhãn “Thêm mới” => “Lưu”;
NSD sau khi nhập xong thông tin MH mới, sẽ bấm nút “Lưu” : lưu MH mới vào BD đồng thời ẩn các TextBox và đổi nhãn nhút “Lưu” => “Thêm mới”
Khi Paging thì thao tác thêm sẽ bị ảnh hưởng
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
+ Available fields: CommandField: Add = Edit (Sửa) Delete (Xóa), Select (Chọn)
5.4.4.1 Thêm sản phẩm bánh ngọt:
B2: Viết lệnh SQL thêm bánh ngọt trrong SqlDataSourceMH tương ứng
INSERT INTO DMBanhNgot(MaLoaiBanh, TenLoaiBanh, Msth, DonViTinh, GiaBan, Hinh, MaSoBanh, HanSD)
VALUES (@MaLoaiBanh, @TenLoaiBanh, @Msth, @DonViTinh, @GiaBan, @Hinh,
B3: Thiết kế các textbox cho phép NSD thêm loại bánh ngọt
B4: Không cho phép “Thêm Mặt hàng mới” khi NSD chọn “Tất cả” trong
DropDownListNhomMH; Vì khi thêm mới, được hiểu là thêm mới vào “nhóm….” Đã chọn trong DropDownListNhomMH protected void DropDownListNhomMH_SelectedIndexChanged(object sender, EventArgs e) {
// 1 Kiểm tra NSD chọn * để liệt kê if (DropDownListNhomMH.SelectedValue.Trim() == "*")// NSD chọn Tất cả, có Value {
SqlDataSourceMH.SelectCommand = "SELECT * FROM [DMBanhNgot]";// Viết lại lệnh Select from Không Where cho sqldtatasourceMH btnThem.Enabled = false;
DropDownListNhomMH.ToolTip = "Chọn một loại thôi, chọn tất cả không thêm đc nha"; } else
{ btnThem.Enabled = true;//cho phép thêm nếu chọn một laoji riêng biệt btnThem.ToolTip = DropDownListNhomMH.ToolTip = " ";//Không nhắc nữa
// 2 hiển thị MSNhom kế bên DropDownList lbLoaiBanh lblLoaiBanh.Text = DropDownListNhomMH.SelectedValue;
} ĐIỀU CHỈNH LẠI THỨ TỰ CỘT CỦA HÌNH MẪU protected void cbHA_CheckedChanged(object sender, EventArgs e)
GridViewMH.Columns[7].Visible = !GridViewMH.Columns[7].Visible;
CHỌN HẠN SỬ DỤNG protected void btnHanSD_Click(object sender, EventArgs e)
} protected void CalendarHanSD_SelectionChanged(object sender, EventArgs e)
{ btnHanSD.Text = CalendarHanSD.SelectedDate.ToShortDateString();
B5: Viết mã lệnh (Codes) cho nút lênh “Thêm Mặt hàng mới”
/// protected void btnThem_Click(object sender, EventArgs e)
//B1: ẩn hiện các ô textbox để NSD (NV) chuẩn bị thêm thông tin món mới lbMsBanh.Visible = !lbMsBanh.Visible; lblLoaiBanh.Visible = !lblLoaiBanh.Visible; lbTenBanh.Visible = !lbTenBanh.Visible; lbDVT.Visible = !lbDVT.Visible; lbGiaBan.Visible = !lbGiaBan.Visible; lbHinh.Visible = !lbHinh.Visible; txtMaBanh.Visible = !txtMaBanh.Visible; txtTenBanh.Visible = !txtTenBanh.Visible; txtDVT.Visible = !txtDVT.Visible; txtGiaban.Visible = !txtGiaban.Visible; lbThuongHieu.Visible = !lbThuongHieu.Visible;
FileUploadHinh.Visible = !FileUploadHinh.Visible; btnHanSD.Visible = !btnHanSD.Visible; btnHuy.Visible = !btnHuy.Visible;
//B2 Đổi nhãn button Thêm thành lưu và ngược lại if (btnThem.Text == "Thêm món mới")// Thêm món mới => lưu
{//Xóa trống các ô textbox để NV cbi nhập thông tin món ăn mới txtMaBanh.Text = ""; txtTenBanh.Text = ""; txtDVT.Text = ""; txtGiaban.Text = ""; txtGiaban.ToolTip = "Nhập giá phải >0"; btnHanSD.Text = "Chọn ngày";
//Thêm thành lưu btnThem.Text = "Lưu món mới";
{//Lưu thông tin món ăn mới vào database try
{// Nếu ko chọn hạn sử dụng = thì hạn sử dụng là ngày hiện tại if (btnHanSD.Text == "Chọn ngày") btnHanSD.Text System.DateTime.Now.ToShortDateString();
} catch (System.Exception ex) { this.Title = "Có lỗi khi thêm món mới =" + ex.Message; } //Xóa các tham số cũ của insert
SqlDataSourceMH.InsertParameters.Add("MaSoBanh", txtMaBanh.Text.Trim());
SqlDataSourceMH.InsertParameters.Add("TenLoaiBanh", txtTenBanh.Text.Trim()); SqlDataSourceMH.InsertParameters.Add("Msth",
SqlDataSourceMH.InsertParameters.Add("DonViTinh", txtDVT.Text.Trim());
SqlDataSourceMH.InsertParameters.Add("GiaBan", System.Data.DbType.Double, txtGiaban.Text.Trim());
SqlDataSourceMH.InsertParameters.Add("HanSD", System.Data.DbType.DateTime, btnHanSD.Text.Trim());
SqlDataSourceMH.InsertParameters.Add("Hinh", "~\\Media\\" +
//Insert vs các tham số nêu trên DB
//System.IO.File.Copy(FileUploadHinh.FileName, "C:\\Users\\NK
System.IO.Path.GetFileName(FileUploadHinh.FileName), true);
FileUploadHinh.SaveAs(Server.MapPath("~\\Media\\" + FileUploadHinh.FileName)); GridViewMH.DataBind(); this.Title = "Đã thêm xong!";
//Lưu thành thêm btnThem.Text = "Thêm món mới";
B6: Viết mã lệnh (Codes) cho nút lênh “Hủy”
/// Hủy của thêm món ăn mới
/// protected void btnHuy_Click(object sender, EventArgs e)
//B1: ẩn hiện các ô textbox thêm thông tin món mới lbMsBanh.Visible = false; lblLoaiBanh.Visible = false; lbTenBanh.Visible = false; lbDVT.Visible = false; lbGiaBan.Visible = false; lbHinh.Visible = false; txtMaBanh.Visible = false; txtTenBanh.Visible = false;
DropDownListTH.Visible = false; txtDVT.Visible = false; txtGiaban.Visible = false;
FileUploadHinh.Visible = false; btnHanSD.Visible = false; btnHuy.Visible = false;
//B2 Đổi nhãn button Thêm ; btnThem.Text = "Thêm món mới"; // Thêm món mới => lưu
5.4.4.2 Sửa các loại bánh ngọt:
B2: Viết lệnh SQL Sửa (Update) bánh ngọt trong SqlDataSourceMH tương ứng
UPDATE DMBanhNgot SET TenLoaiBanh = @TenLoaiBanh, DonViTinh = @DonViTinh, GiaBan = @GiaBan, HanSD = @HanSD, Hinh = @Hinh
5.4.4.3 Xóa các loại bánh ngọt:
B2: Viết lệnh SQL Xóa (Delete) …… trong SqlDataSourceMH tương ứng
DELETE FROM DMBanhNgot WHERE (MaSoBanh = @MaSoBanh)
5.4.5 Lập trình (Codes) xử lý RBTV dữ liệu khi Xóa danh mục sản phẩm bánh ngọt:
Khi xóa “DMBanhNgot”: (Table Danh Mục Bánh Ngọt) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với 2 bảng: ChiTietDH (Chi tiết đơn đặt hàng) và HANGTON (Hàng tồn), như
Có 2 trường hợp xử lý RBTV dữ liệu:
+ MH cần xóa đang còn Hang tồn: xử lý “Thanh lý” = Xóa Hàng tồn của MH đó: Xóa từng tồn kho OR xóa tất cả tồn kho của MH đó.
+ MH cần xóa đang còn đơn đặt hàng chưa giải quyết (ChiTietDH): xử lý đổi hàng (Xóa ChiTietDH đó và chọn mua MH khác tương đương) HOẶC thuyết phục KH từ chối mua
MH đó = Xóa CTDDH: Xóa từng ChiTietDH OR xóa tất cả ChiTietDH của MH đó.
5.4.5.2 Thiết kế 2 GridView phụ ngay trên Form quản lý FrGoodsManagements.aspx
* Thiết kế 2 gridviews phụ Hàng Tồn và Chi Tiết đơn đặt hàng
Caption = BÁNH ĐANG ĐƯỢC CHỌN HÀNG TỒN TRONG CÁC CHI NHÁNH VỚI SỐ LƯỢNG NHƯ SAU:
Caption = BÁNH ĐANG ĐƯỢC CHỌN CÒN ĐẶT MUA TRÊN CÁC ĐƠN HÀNG SAU *
SELECT * FROM [HangTon] WHERE ([MaSoBanh] = @MaSoBanh)
SELECT * FROM [ChiTietDH] WHERE ([MaSoBanh] = @MaSoBanh)
5.4.5.3 Xử lý các RBTV trên 2 GridView phụ
Thanh lý[Delete]: Chính là câu lệnh Delete … được viết trong SqlDataSourceTONKHO
DELETE FROM HangTon WHERE (MSCuaHang = @MSCuaHang) AND (MaSoBanh
KH từ chối[Delete]: Chính là câu lệnh Delete … được viết trong SqlDataSourceCTDDH
DELETE FROM ChiTietDH WHERE (MSDDH = @MSDDH) AND (MaSoBanh @MaSoBanh)
MaSoBanh = GridViewCTDDH.SelectedValue[2] Đổi hàng[Update]:
Mã đơn hàng.ReadOnly = True
Mã hàng.ReadOnly = False (được phép đổi hàng)
Số lượng.ReadOnly = False (được phép thay đổi số lượng)
Viết câu lệnh Update … trong SqlDataSourceCTDDH
SET MaSoBanh = @MaSoBanh, SL = @SL
WHERE (MaSoBanh = @MaSoBanh) AND (SL = @SL)
Chuyển Nhóm: Chuyển một mặt hàng từ nhóm này sang nhóm khác
NỘI DUNG CHÍNH: WEBFORM CHUYỂN MH TỪ NHÓM NÀY SANG NHÓM KHÁC 5.5.1 Thiết kế WebForm Chuyển Nhóm
Bổ sung trang mới: ChuyenNhom.aspx và : THIẾT KẾ
- Thiết kế trang chuyển nhóm mặt hàng:
- Dùng DropDownList: liệt kê và cho phép Nhân Viên Quản Lý chọn hãng sản xuất cần quản lý (có mục chọn "tất cả")
- Dùng ListBox: Liệt kê danh sách các mặt hàng thuộc nhóm đã chọn trong DropDownList (chú ý sử dụng phân trang Paging cho GridView)
- Dùng các Button để chuyển mặt hàng từ nhóm hãng này qua nhóm hãng kia
ListBox Nguồn ListBox Đích x Enable AutoPosBack
5.5.2 Gọi WebForm Chuyển Nhóm từ WebForm quản lý Managements
Management.aspx : Gọi ChuyenNhom.aspx từ tran Quản lý: Management.aspx protected void Button4_Click(object sender, EventArgs e)//Chuyển Nhóm
5.5.3 Xử lý kết nối và cài đặt DL trên WebForm Chuyển Nhóm
5.5.4 Mã lệnh lập trình (chỉ mang tính gợi ý) trên WebForm Chuyển Nhóm
Mã lệnh ChuyenNhom.aspx protected void btnChuyenNhom_Click(object sender, EventArgs e)
// CHUYỂN 1 MH TỪ NHÓM "NGUỒN" SANG NHÓM "ĐÍCH": LEFT to RIGHT protected void btnLR_Click(object sender, EventArgs e)
// gọi Update() bên Nguồn (S) đề chuyển
//Tải DL sau Update lên Source
//Tải DL sau Update lên Destination
// CHUYỂN 1 MH TỪ NHÓM "ĐÍCH" SANG NHÓM "NGUỒN": RIGHT to LEFT protected void btnRL_Click(object sender, EventArgs e)
// gọi Update() bên Nguồn (D) đề chuyển
//Tải DL sau Update lên Source
//Tải DL sau Update lên Destination
TỰ LÀM CHO 2 NÚT CHUYỂN TẤT CẢ
// >>: CHUYỂN ALL MH TỪ BÊN SOURCE => DESTINATION (L -> R) protected void btnLAR_Click(object sender, EventArgs e)
// Viết lại lệnh Update không Where
SqlDataSourceMH_S.UpdateCommand = "UPDATE DMBanhNgot SET MaLoaiBanh @MaLoaiBanhS WHERE (MaLoaiBanh = @MaLoaiBanhD)";
// Xóa các tham số cũ
// Khai báo lại tham số cho Update
// gọi Update() bên Nguồn (S) đề chuyển
//Tải DL sau Update lên Source
//Tải DL sau Update lên Destination
// >>: CHUYỂN ALL MH TỪ BÊN DESTINATION => SOURCE (R -> L) protected void btnRAL_Click(object sender, EventArgs e)
// Viết lại lệnh Update không Where
SqlDataSourceMH_D.UpdateCommand = "UPDATE DMBanhNgot SET MaLoaiBanh @MaLoaiBanhS WHERE (MaLoaiBanh = @MaLoaiBanhD)";
// Xóa các tham số cũ
// Khai báo lại tham số cho Update
// gọi Update() bên Nguồn (D) đề chuyển
//Tải DL sau Update lên Source
//Tải DL sau Update lên Destination
5.5.5 Các mã lệnh lập trình (chỉ mang tính gợi ý) xứ lý “mờ” các nút không phù hợp trên WebForm Chuyển Nhóm:
Xử lý “Mờ” các nút không phù hợp: Enable = False FrChuyenNhom.aspx
TRƯỜNG HỢP 1: 2 BÊN DROPDOWNLIST ĐÃ CHỌN GIỐNG NHAU protected void DropDownListNhomMH_S_SelectedIndexChanged(object sender, EventArgs e)
// KIỂM TRA: NẾU 2 BÊN Dropdownlist CỦA S VÀ D GIỐNG NHAU => KHÔNG CHO CHUYỂN [MỞ CÁC NÚT LỆNH] if (DropDownListNhomMH_S.SelectedValue =DropDownListNhomMH_D.SelectedValue)
// 2 Bên đã chọn giống nhau btnLR.Enabled = false; btnRL.Enabled = false; btnLAR.Enabled = false; btnRAL.Enabled = false;
DropDownListNhomMH_S.ToolTip = DropDownListNhomMH_D.ToolTip = "Vui lòng chọn nhóm nguồn khác với nhóm đích thì mới chuyển được";
// 2 bên đã chọn khác nhau btnLR.Enabled = true; btnRL.Enabled = true; btnLAR.Enabled = true; btnRAL.Enabled = true;
TRƯỜNG HỢP 2: NẾU CHƯA CHỌN ITEM NÀO TRONG LISTBOX THÌ KHÔNGCHUYỂN > HOẶC 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 2 DropDownList và hiển thị MaKV và MaCV kế 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.
B3: Viết bổ sung câu lệnh trong thủ tục sự kiện SelectedIndexChanged của DropDownListKV
5.6.3 Lập trình (Codes)trang quản lý danh mục Nhân viên: FrQLNV.aspx
{ if(DropDownListKV.SelectedValue == "*" && DropDownListCM.SelectedValue == "*") {
SqlDataSourceNV.SelectCommand = "SELECT * FROM [NhanVien]"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn khu vực và chuyên môn cụ thể để thêm nhân viên mới";
SqlDataSourceNV.SelectCommand = "SELECT * FROM [NhanVien] WHERE ([MSChuyenMon] = @MSChuyenMon)"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn khu vực cụ thể để thêm nhân viên mới";
SqlDataSourceNV.SelectCommand = "SELECT * FROM [NhanVien] WHERE ([MSKhuVuc] = @MSKhuVuc)"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn chuyên môn cụ thể để thêm nhân viên mới"; } else
{ btnThem.Enabled = true; btnThem.ToolTip = "";
} lbmskv.Text = DropDownListKV.SelectedValue; lbmscm.Text = DropDownListCM.SelectedValue;
* Gán sự kiện DropDownListKV_SelectedIndexChanged DropdownlistCM
5.6.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục Nhân viên:
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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceNV tương ứng
INSERT INTO NhanVien(MSNhanVien, TenNhanVien, GioiTinh, SDT, MSKhuVuc, MSChuyenMon)
VALUES (@MSNhanVien, @TenNhanVien, @GioiTinh, @SDT, @MSKhuVuc,
B3: Thiết kế các textbox, calendar, fileupload cho phép NSD thêm sản phẩm mới
B4: Không cho phép “Thêm nhân viên” khi NSD chọn “Tất cả” trong DropDownListKV và DropDownListCV ; Vì khi thêm mới, được hiểu là thêm mới vào “khu vực và chuyên môn….” Đã chọn trong DropDownListKV và DropDownListCM
B5: Viết mã lệnh (Codes) cho nút lênh “Thêm nhân viên mới” protected void btnThem_Click(object sender, EventArgs e)
{ if(btnThem.Text == "Thêm nhân viên")
{ pnThem.Visible = true; btnHuy.Visible = true; btnThem.Text = "Lưu nhân viên";
SqlDataSourceNV.InsertParameters.Add("MSNhanVien", txtMaNV.Text);
SqlDataSourceNV.InsertParameters.Add("TenNhanVien", txtTenNV.Text);
SqlDataSourceNV.InsertParameters.Add("GioiTinh", txtGT.Text);
SqlDataSourceNV.InsertParameters.Add("SDT", txtDT.Text);
SqlDataSourceNV.Insert(); pnThem.Visible = false; btnHuy.Visible = false; btnThem.Text = "Thêm nhân viên";
B6: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ pnThem.Visible = false; btnHuy.Visible = false; btnThem.Text = "Thêm nhân viên";
Trang quản lý cửa hàng
5.7.1 Phân tích trang Quản lý danh mục Cửa Hà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ý Cửa Hàng từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong CuaHang + Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.7.2 Thiết kế (Design) trang quản lý Cửa Hàng: FrQLCH.aspx
Câu lệnh kết nối DB: SELECT * FROM [KhuVuc]
Các thiết lập thuộc tính :
Câu lệnh SQL kết nối DataBase:
SELECT MSCuaHang, TenCuaHang, DiaChi, SDT, SucChua, ConTrong, MSKhuVuc FROM CuaHang WHERE (MSKhuVuc = @MSKhuVuc)
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng) 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ả cả các Sản Phẩm
5.7.3 Lập trình (Codes)trang quản lý danh mục Cửa Hàng: FrQLCH.aspx protected void Page_Load(object sender, EventArgs e)
} protected void DropDownListKV_SelectedIndexChanged(object sender, EventArgs e) {
// Nếu người dùng chọn tất cả if (DropDownListKV.SelectedValue == "*")
SqlDataSourceCH.SelectCommand = "SELECT * FROM [CuaHang]"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn mã khu vực cụ thể để thêm cửa hàng mới";
{ btnThem.Enabled = true; btnThem.ToolTip = "";
// Hiển thị mã hãng sản xuất lbMaKV.Text = DropDownListKV.SelectedValue;
5.7.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục Cửa Hàng: FrQLCH.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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceCH tương ứng
INSERT INTO CuaHang(MSCuaHang, TenCuaHang, DiaChi, SDT, SucChua, ConTrong, MSKhuVuc)
VALUES (@MSCuaHang, @TenCuaHang, @DiaChi, @SDT, @SucChua, @ConTrong,
B3: Thiết kế các textbox, button, label cho phép NSD thêm cửa hàng mới
B4: Không cho phép “Thêm CuaHang” khi NSD chọn “Tất cả” trong DropDownListKV; Vì khi thêm mới, được hiểu là thêm mới vào “khu vực” Đã chọn trong DropDownListKV B5: Viết mã lệnh (Codes) cho nút lênh “Thêm cửa hàng mới” protected void btnThem_Click(object sender, EventArgs e)
{ if (btnThem.Text == "Thêm cửa hàng")
{ txtMaCH.Text = ""; txtTenCH.Text = ""; txtDiaChi.Text = ""; txtSDT.Text = ""; txtSC.Text = ""; txtCT.Text = ""; txtMKVuc.Text = ""; btnThem.Visible = true; btnHuy.Visible = true; btnThem.Text = "Lưu cửa hàng";
SqlDataSourceCH.Insert(); btnThem.Visible = false; btnHuy.Visible = false; btnThem.Text = "Thêm cửa hàng";
B6: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ btnThem.Visible = false; btnHuy.Visible = false; btnThem.Text = "Thêm cửa hàng";
+Viết lệnh SQL Xóa (delete) CuaHang trong SqlDataSourceCH tương ứng
DELETE FROM CuaHang WHERE (MSCuaHang = @MSCuaHang)
+Viết lệnh SQL sửa (Update) CuaHang trong SqlDataSourceCH tương ứng
UPDATE CuaHang SET TenCuaHang = @TenCuaHang, DiaChi = @DiaChi, SDT @SDT, SucChua = @SucChua, ConTrong = @ConTrong, MSKhuVuc = @MSKhuVuc WHERE (MSCuaHang = @MSCuaHang)
5.7.5 Lập trình Codes xử lý RBTV dữ liệu khi xóa danh mục Cửa Hang: FrQLCH.aspx 5.7.5.1 Giới thiệu
Khi xóa CuaHang (Table CuaHang) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng
5.7.5.2 Thiết kế các GridView phụ ngay trên Form Quản lý cửa Hàng
SELECT MSCuaHang, TenCuaHang, DiaChi, SDT, SucChua, ConTrong, MSKhuVuc FROM CuaHang
SELECT HangTon.MSCuaHang, HangTon.MaSoBanh, HangTon.SLTon,
DMBanhNgot.TenLoaiBanh, CuaHang.TenCuaHang FROM HangTon INNER JOIN DMBanhNgot ON HangTon.MaSoBanh = DMBanhNgot.MaSoBanh INNER JOIN CuaHang ON HangTon.MSCuaHang = CuaHang.MSCuaHang
WHERE (HangTon.MSCuaHang = @MSCuaHang) AND (HangTon.MaSoBanh @MaSoBanh)
5.7.5.3 Xử lí RBTV trên các GridView phụ
Xóa đó chính là câu lệnh trong SQLDataSourceCH
DELETE FROM CuaHang WHERE (MSCuaHang = @MSCuaHang)
Update(Chuyển CuaHang) thay vì xóa đơn hàng ta chuyển sang CuaHang
UPDATE CuaHang SET TenCuaHang = @TenCuaHang, DiaChi = @DiaChi, SDT @SDT, SucChua = @SucChua, ConTrong = @ConTrong, MSKhuVuc = @MSKhuVuc WHERE (MSCuaHang = @MSCuaHang)
Xóa đó chính là câu lệnh trong SQLDataSourceHangTon
WHERE (MaSoBanh = @MaSoBanh) AND (MSCuaHang = @MSCuaHang)
Trang quản lý khu vực
5.8.1 Phân tích trang Quản lý danh mục Khu Vực
+ 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ý Khu Vực từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong KhuVuc
+ Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.8.2 Thiết kế (Design) trang quản lý Khu Vực: FrQLKV.aspx
Câu lệnh SQL kết nối DataBase:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
5.8.3 Lập trình (Codes)trang quản lý danh mục Khu Vực: FrQLKV.aspx protected void Page_Load(object sender, EventArgs e)
5.8.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục Khu Vực: FrQLKV.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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceKVtương ứng
INSERT INTO KhuVuc(MSKhuVuc, TenKhuVuc)
B3: Thiết kế các textbox, button, label cho phép NSD thêm cửa hàng mới
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm khu vực mới” protected void btnThemKV_Click(object sender, EventArgs e)
{ if (btnThemKV.Text == "Thêm khu vực")
{ txtMaKV.Text = ""; txtTenKV.Text = ""; btnThemKV.Visible = true; btnHuy.Visible = true; btnThemKV.Text = "Lưu khu vực";
SqlDataSourceKV.Insert(); btnThemKV.Visible = false; btnHuy.Visible = false; btnThemKV.Text = "Thêm khu vực";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ btnThemKV.Visible = false; btnHuy.Visible = false; btnThemKV.Text = "Thêm khu vực";
Viết lệnh SQL xóa (Delete) Khu Vực trong SqlDataSourceKV tương ứng DELETE FROM KhuVuc WHERE (MSKhuVuc = @MSKhuVuc)
Viết lệnh SQL Sửa (Update) Khu vực trong SqlDataSourceKV tương ứng
UPDATE KhuVuc SET TenKhuVuc = @TenKhuVuc WHERE (MSKhuVuc @MSKhuVuc)
5.8.5 Lập trình (Codes) xử lý RBTV dữ liệu khi Xóa danh mục Khu vực: Khu vực
Khi xóa Khu Vực (table) sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng KhuVuc
5.8.5.2 Thiết kế các Gridview phụ ngay trên FrQLKV.aspx
Các GridView xử lý RBTV dữ liêu khi xóa khu vực
SELECT MSCuaHang, TenCuaHang, DiaChi, SDT, SucChua, ConTrong, MSKhuVuc FROM CuaHang WHERE (MSKhuVuc = @MSKhuVuc)
SELECT * FROM [NhanVien] WHERE (([MSKhuVuc] = @MSKhuVuc) AND ([MSChuyenMon] = @MSChuyenMon))
5.8.5.3 Xử lý RBTV trên các GridView phụ.
*Xóa câu lệnh trong SQLDataSourceKV
DELETE FROM KhuVuc WHERE (MSKhuVuc = @MSKhuVuc)
*Xóa câu lệnh trong SQLDataSourceCH
DELETE FROM CuaHang WHERE (MSCuaHang = @MSCuaHang)
*Xóa câu lệnh trong SQLDataSourceNV
DELETE FROM NhanVien WHERE (MSNhanVien = @MSNhanVien)
*Xóa câu lệnh trong SQLDataSourceDDH
DELETE FROM DDH WHERE (MSDDH = @MSDDH)
Trang quản lý chuyên môn
5.9.1 Phân tích trang Quản lý Chuyên Môn
+ 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ý Chuyên Môn từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong ChuyenMon+ Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.9.2 Thiết kế (Design) trang quản lý Chuyên Môn: FrQLCM.aspx
Câu lệnh SQL kết nối DataBase:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
5.9.3 Lập trình (Codes)trang quản lý Chuyên Môn: FrQLCM.aspx protected void Page_Load(object sender, EventArgs e)
5.9.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục Chuyên Môn: FrQLCM.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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceKVtương ứng
INSERT INTO ChuyenMon(MSChuyenMon, TenChuyenMon)
B3: Thiết kế các textbox, button, label cho phép NSD thêm cửa hàng mới
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm chuyên môn mới” protected void btnThemCM_Click(object sender, EventArgs e)
{ if (btnThemCM.Text == "Thêm chuyên môn")
{ txtMaCM.Text = ""; txtTenCM.Text = ""; btnThemCM.Visible = true; btnHuy.Visible = true; btnThemCM.Text = "Lưu chuyên môn";
SqlDataSourceCM.Insert(); btnThemCM.Visible = false; btnHuy.Visible = false; btnThemCM.Text = "Thêm chuyên môn";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ btnThemCM.Visible = false; btnHuy.Visible = false; btnThemCM.Text = "Thêm chuyên môn";
B2: Viết lệnh SQL Xóa (Delete) Chuyen môn trong SqlDataSourceCM tương ứng DELETE FROM ChuyenMon WHERE (MSChuyenMon = @MSChuyenMon)
Viết lệnh SQL Sửa (Update) ChuyenMon trong SqlDataSourceCM tương ứng
UPDATE ChuyenMon SET MSChuyenMon =, TenChuyenMon = @TenChuyenMon WHERE (MSChuyenMon = @MSChuyenMon)
5.9.5 Lập trình Codes xử lý RBTV dữ liệu khi xóa ChuyenMon: FrQLCM.aspcx
+ Khi xóa Khu vực (Table KhuVuc) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng KhuVuc
5.9.5.2 Thiết kế các GridView phụ ngay trên Form quản lý Chuyên Môn: FrQLCM.aspx
Các Gridview xử lý RBTV dữ liệu khi xóa CM
WHERE (([MSKhuVuc] = @MSKhuVuc) AND ([MSChuyenMon] = @MSChuyenMon))
5.9.5.3 Xử lý RBTV trên các GridView phụ
Xóa đó chính là câu lệnh trong SQLDataSourceCM
DELETE FROM ChuyenMon WHERE (MSChuyenMon = @MSChuyenMon)
Update (ChuyenMon) thay vì xóa ChuyenMon
UPDATE ChuyenMon SET MSChuyenMon =, TenChuyenMon = @TenChuyenMon WHERE (MSChuyenMon = @MSChuyenMon)
Xóa đó chính là câu lệnh trong SQLDataSourceNV
DELETE FROM NhanVien WHERE (MSNhanVien = @MSNhanVien)
Trang quản lý thương hiệu
5.10.1 Phân tích trang Quản lý Thương Hiệu
+ 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ý Thương Hiệu từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong ThuongHieu
+ Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.10.2 Thiết kế (Design) trang quản lý Thương Hiệu: FrQLTH.aspx
Câu lệnh SQL kết nối DataBase:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
5.10.3 Lập trình (Codes)trang quản lý Thương Hiệu: FrQLTH.aspx protected void Page_Load(object sender, EventArgs e)
5.10.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý Thương Hiệu:
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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceTH tương ứng
INSERT INTO ThuongHieu(Msth, Tenth)
B3: Thiết kế các textbox, button, label cho phép NSD thêm thương hiệu mới
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm thương hiệu” protected void btnThemTH_Click(object sender, EventArgs e)
{ if (btnThemTH.Text == "Thêm thương hiệu")
{ txtMaTH.Text = ""; txtTenTH.Text = ""; btnThemTH.Visible = true; btnHuy.Visible = true; btnThemTH.Text = "Lưu thương hiệu";
SqlDataSourceTH.Visible = false; btnHuy.Visible = false; btnThemTH.Text = "Thêm thương hiệu";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ btnThemTH.Visible = false; btnHuy.Visible = false; btnThemTH.Text = "Thêm thương hiệu";
B2: Viết lệnh SQL Xóa (Delete) Thương Hiệu trong SqlDataSourceTH tương ứng DELETE FROM ThuongHieu WHERE (Msth = @Msth)
B3: Viết lệnh SQL Sửa (Update) Thương Hiệu trong SqlDataSourceTH tương ứngUPDATE ThuongHieu SET Tenth = @Tenth WHERE (Msth = @Msth)
5.10.5 Lập trình (Codes) xử lý RBTV dữ liệu khi Xóa Thương Hiệu: FrQLTH.aspx 5.10.5.1 Giới thiệu
Khi xóa ThuongHieu (Table ThuongHieu) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng ThuongHieu
5.10.5.2 Thiết kế các GridView phụ ngay trên Form Quản lý Thương Hiệu
Các GridView xử lý RBTV dữ liệu khi xóa Thương Hiệu
SELECT * FROM [DMBanhNgot] WHERE ([MaLoaiBanh] = @MaLoaiBanh)
5.10.5.3 Xử lí RBTV trên các GridView phụ
DELETE FROM ThuongHieu WHERE (Msth = @Msth)
UPDATE ThuongHieu SET Tenth = @Tenth WHERE (Msth = @Msth)
DELETE FROM ThuongHieu WHERE (Msth = @Msth)
Trang quản lý nhóm loại bánh
5.11.1 Phân tích trang Quản lý danh mục Nhóm Loại Bánh
+ 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ý Loại Bánh ngọt từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong LoaiBanhNgot+ Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.11.2 Thiết kế (Design) trang quản lý Nhóm Loại Bánh: FrQLNhom.aspx
Câu lệnh SQL kết nối DataBase:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
5.11.3 Lập trình (Codes)trang quản lý Nhóm Loại Bán: FrQLNhom.aspx protected void Page_Load(object sender, EventArgs e)
5.11.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý Nhóm Loại Bánh:
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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceNhom tương ứng
INSERT INTO LoaiBanhNgot(MaLoaiBanh, TenLoaiBanh, MoTa)
B3: Thiết kế các textbox, button, label cho phép NSD thêm cửa hàng mới
B4: Viết mã lệnh (Codes) cho nút lênh “Thêm loại bánh” protected void btnThemLoai_Click(object sender, EventArgs e)
{ if (btnThemLoai.Text == "Thêm loại bánh")
{ txtMLBanh.Text = ""; txtTLBanh.Text = ""; txtMoTa.Text = ""; btnThemLoai.Visible = true; btnHuy.Visible = true; btnThemLoai.Text = "Lưu loại bánh";
SqlDataSourceNhom.Insert(); btnThemLoai.Visible = false; btnHuy.Visible = false; btnThemLoai.Text = "Thêm loại bánh";
B5: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ btnThemLoai.Visible = false; btnHuy.Visible = false; btnThemLoai.Text = "Thêm loại bánh";
B2: Viết lệnh SQL Xóa (Delete) MaLoaiBanh trong SqlDataSourceNhom tương ứng DELETE FROM KhuVuc WHERE (mskv = @mskv)
B3: Viết lệnh SQL Sửa (Update) MaLoaiBanh trong SqlDataSourceNhom tương ứng
UPDATE LoaiBanhNgot SET TenLoaiBanh = @TenLoaiBanh, MoTa = @MoTa WHERE (MaLoaiBanh = @MaLoaiBanh)
5.11.5 Lập trình (Codes) xử lý RBTV dữ liệu khi Xóa MaLoaiBanh:
Khi xóa Khu vực (Table KhuVuc) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng KhuVuc
Trích DB liên quan xử lý RBTV dữ liệu khi xóa
5.11.5.2 Thiết kế các GridView phụ ngay trên FrQLNhom.aspx
UPDATE LoaiBanhNgot SET TenLoaiBanh = @TenLoaiBanh, MoTa = @MoTa WHERE (MaLoaiBanh = @MaLoaiBanh)
DELETE FROM LoaiBanhNgot WHERE (MaLoaiBanh = @MaLoaiBanh)
SELECT * FROM [DMBanhNgot] WHERE ([MaLoaiBanh] = @MaLoaiBanh)
Trang quản lý khách hàng
5.12.1 Phân tích trang Quản lý Khách Hà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ý Khách Hàng từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong KhachHang
+ Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.12.2 Thiết kế (Design) trang quản lý Khách Hàng: FrQLKH.aspx
Câu lệnh SQL kết nối DataBase:
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
5.12.3 Lập trình (Codes)trang quản lý Khách Hàng: FrQLKH.aspx protected void Page_Load(object sender, EventArgs e)
5.12.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý Khách Hàng:
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
B2: Viết lệnh SQL thêm khách hàng trong SqlDataSourceKH tương ứng
INSERT INTO KhachHang(MSKhachHang, TenKhachHang, DiaChi, SDT, Diem)
VALUES (@MSKhachHang, @TenKhachHang, @DiaChi, @SDT, @Diem)
B3: Viết lệnh SQL xóa khách hàng trong SqlDataSourceKH tương ứng\
DELETE FROM KhachHang WHERE (MSKhachHang = @MSKhachHang)
B4: Viết lệnh SQL Cập nhật trong SqlDataSourceKH tương ứng
UPDATE KhachHang SET TenKhachHang = @TenKhachHang, DiaChi = @DiaChi, SDT @SDT, Diem = @Diem WHERE (MSKhachHang = MSKhachHang)
Trang quản lý hàng tồn
5.13.1 Phân tích trang Quản lý Hàng Tồn
+ 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ý Hàng Tồn từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong HangTon
+ Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.13.2 Thiết kế (Design) trang quản lý Hàng Tồn: FrQLHangTon.aspx
Câu lệnh kết nối DB: SELECT * FROM [CuaHang]
Các thiết lập thuộc tính :
Câu lệnh kết nối DB: SELECT * FROM [DMBanhNgot]
Các thiết lập thuộc tính :
Câu lệnh SQL kết nối DataBase:
SELECT HangTon.MSCuaHang, HangTon.MaSoBanh, HangTon.SLTon,
FROM HangTon INNER JOIN DMBanhNgot ON HangTon.MaSoBanh DMBanhNgot.MaSoBanh INNER JOIN CuaHang ON HangTon.MSCuaHang CuaHang.MSCuaHang
WHERE (HangTon.MSCuaHang = @MSCuaHang) AND (HangTon.MaSoBanh
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 2 DropDownList và hiển thị MaCH và MaSoBanh kế 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.
5.13.3 Lập trình (Codes)trang quản lý Hàng Tồn: FrQLHangTon.aspx protected void Page_Load(object sender, EventArgs e)
} protected void DropDownListCH_SelectedIndexChanged(object sender, EventArgs e)
{ if (DropDownListCH.SelectedValue == "*" && DropDownListMSBanh.SelectedValue ="*")
// Cửa hàng và mã số bánh chọn tất cả
SqlDataSourceHangTon.SelectCommand = "SELECT HangTon.MSCuaHang,
HangTon.MaSoBanh, HangTon.SLTon, DMBanhNgot.TenLoaiBanh, CuaHang.TenCuaHang FROM HangTon INNER JOIN DMBanhNgot ON HangTon.MaSoBanh DMBanhNgot.MaSoBanh INNER JOIN CuaHang ON HangTon.MSCuaHang CuaHang.MSCuaHang"; btnNhapkho.Enabled = false; btnNhapkho.ToolTip = "Vui lòng chọn cửa hàng và mã số bánh cụ thể để nhập hàng"; } if (DropDownListCH.SelectedValue == "*" && DropDownListMSBanh.SelectedValue !"*")
// Cửa hàng chọn tất cả
SqlDataSourceHangTon.SelectCommand = "SELECT HangTon.MSCuaHang,
HangTon.MaSoBanh, HangTon.SLTon, DMBanhNgot.TenLoaiBanh, CuaHang.TenCuaHang FROM HangTon INNER JOIN DMBanhNgot ON HangTon.MaSoBanh DMBanhNgot.MaSoBanh INNER JOIN CuaHang ON HangTon.MSCuaHang CuaHang.MSCuaHang WHERE (HangTon.MaSoBanh = @MaSoBanh)"; btnNhapkho.Enabled = false; btnNhapkho.ToolTip = "Vui lòng chọn cửa hàng cụ thể để nhập hàng";
} if (DropDownListCH.SelectedValue != "*" && DropDownListMSBanh.SelectedValue ="*")
// Mã số bánh chọn tất cả
SqlDataSourceHangTon.SelectCommand = "SELECT HangTon.MSCuaHang,
HangTon.MaSoBanh, HangTon.SLTon, DMBanhNgot.TenLoaiBanh, CuaHang.TenCuaHang FROM HangTon INNER JOIN DMBanhNgot ON HangTon.MaSoBanh DMBanhNgot.MaSoBanh INNER JOIN CuaHang ON HangTon.MSCuaHang CuaHang.MSCuaHang WHERE (HangTon.MSCuaHang = @MSCuaHang)"; btnNhapkho.Enabled = false; btnNhapkho.ToolTip = "Vui lòng chọn mã số bánh cụ thể để nhập hàng";
} if (DropDownListCH.SelectedValue != "*" && DropDownListMSBanh.SelectedValue !"*")
GridViewHT.DataBind(); if (GridViewHT.Rows.Count == 0)
// Hàng chưa có trong kho => cho phép nhập btnNhapkho.Enabled = true; btnNhapkho.ToolTip = "";
// Hàng đã có trong kho => chỉ cho phép cập nhật số lượng btnNhapkho.Enabled = false; btnNhapkho.ToolTip = "Hàng đã có sẵn trong kho Vui lòng cập nhật số lượng"; }
} lbMaCH.Text = DropDownListCH.SelectedValue; lbMSBanh.Text = DropDownListMSBanh.SelectedValue;
5.13.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý Hàng Tồn:
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
B2: Viết lệnh SQL thêm sản phẩm trrong SqlDataSourceHangTon tương ứng
INSERT INTO HangTon(MSCuaHang, MaSoBanh, SLTon)
B3: Thiết kế các textbox, button, label cho phép NSD thêm sản phẩm tồn mới
B4: Không cho phép “Nhập kho” khi NSD chọn “Tất cả” trong DropDownListCH và DropDownListMSBanh ; Vì khi thêm mới, được hiểu là thêm mới vào “Cửa hàng và Loại Bánh Đã chọn trong DropDownListCH và DropDownListMSBanh
B5: Viết mã lệnh (Codes) cho nút lênh “Nhập kho” protected void btnNhapKho_Click(object sender, EventArgs e)
{ if (btnNhapkho.Text == "Nhập kho")
// Xóa dữ liệu ô textbox nhập số lượng txtSLT.Text = "";
// Hiển thị textbox để nhập số lượng lbSLT.Visible = true; txtSLT.Visible = true; btnHuy.Visible = true; btnNhapkho.Text = "Lưu";
// Hàng đã có trong kho => chỉ cho phép cập nhật số lượng btnNhapkho.Enabled = false; btnNhapkho.ToolTip = "Hàng đã có sẵn trong kho Vui lòng cập nhật số lượng"; this.Title = "Lưu thành công";
{ this.Title = "Lưu thất bại";
} lbSLT.Visible = false; txtSLT.Visible = false; btnHuy.Visible = false; btnNhapkho.Text = "Nhập kho";
B6: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ lbSLT.Visible = false; txtSLT.Visible = false; btnHuy.Visible = false; btnNhapkho.Text = "Nhập kho";
5.13.5 Lập trình Codes xử lý RBTV dữ liệu khi xóa Hàng Tồn: FrHangTon.aspx 5.13.5.1 Giới thiệu
Khi xóa HangTon (Table HangTon) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảng HangTon
Trích DB liên quan xử lý RBTV dữ liệu khi xóa
5.13.5.2 Thiết kế các GridView phụ ngay trên Form Quản Lý Hàng Tồn:
Các GridView xử lý RBTV dữ liệu khi xóa Khu Vực
SELECT MSCuaHang, TenCuaHang, DiaChi, SDT, SucChua, ConTrong, MSKhuVuc FROM CuaHang WHERE (MSKhuVuc = @MSKhuVuc)
SELECT * FROM [DMBanhNgot] WHERE ([MaLoaiBanh] = @MaLoaiBanh)
SELECT HangTon.MSCuaHang, HangTon.MaSoBanh, HangTon.SLTon,
DMBanhNgot.TenLoaiBanh, CuaHang.TenCuaHang FROM HangTon INNER JOIN
DMBanhNgot ON HangTon.MaSoBanh = DMBanhNgot.MaSoBanh INNER JOIN
CuaHang ON HangTon.MSCuaHang = CuaHang.MSCuaHang
WHERE (HangTon.MSCuaHang = @MSCuaHang) AND (HangTon.MaSoBanh @MaSoBanh)
UPDATE HangTon SET SLTon = @SLTon WHERE (MSCuaHang = @MSCuaHang) AND (MaSoBanh = @MaSoBanh)
DELETE FROM HangTon WHERE (MaSoBanh = @MaSoBanh) AND (MSCuaHang @MSCuaHang)
Trang quản lý đơn đặt hàng
5.14.1 Phân tích trang Quản lý danh mục Đơn Đặt Hà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ý Đơn đặt hàng từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa MH … trong Đơn đặt hàng + Chuỗi kết nối DB: 1G406NTTHangBanhOnlineConnectionString
5.14.2 Thiết kế (Design) trang quản lý Đơn Đặt Hàng: FrDDH.aspx
Câu lệnh SQL kết nối DataBase:
Câu lệnh SQL kết nối DataBase:
SELECT * FROM [ChiTietDH] WHERE ([MSDDH] = @MSDDH)
Task->Edit Columns: HeaderText, DataField (Tự động gán cột dữ liệu tương ứng)
5.14.3 Lập trình (Codes)trang quản lý danh mục Đơn Đặt Hàng: FrDDH.aspx protected void Page_Load(object sender, EventArgs e)
5.14.4 Lập trình Codes THÊM _ SỬA _ XÓA trang quản lý danh mục DonDatHang:
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
B3: Viết lệnh Delete SQL xóa đơn đặt hàng trong SqlDataSourceDDH
DELETE FROM DDH WHERE (MSDDH = @MSDDH)
5.14.4.3 Cập nhật đơn đặt hàng
B4; Viết lệnh Update SQL cập nhật đơn đặt hàng trong SqlDataSourceDDH
UPDATE DDH SET NgayLap = @NgayLap, MSKhachHang = @MSKhachHang,
MSNhanVien = @MSNhanVien, MSKhuVuc = @MSKhuVuc, NguoiNhan @NguoiNhan, DiaChiGiao = @DiaChiGiao, SDTNhan = @SDTNhan, ThoiHan @ThoiHan, TinhTrang = @TinhTrang, GhiChu = @GhiChu
Trang quản lý chi tiết đơn đặt hàng
5.15.1 Phân tích trang Quản lý danh mục Chi Tiết Đơn Đặt Hà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ý CT Đơn đặt hàng từ trang quản lý chung
+ Chủ yếu: thực hiện các chức năng: Thêm _ Sửa _ Xóa các khu vực liên quan trong Khu vực
5.15.2 Thiết kế (Design) trang quản lý Chi Tiết Đơn Đặt Hàng: FrCTDDH.aspx
Câu lệnh kết nối DB: SELECT * FROM DDH
Các thiết lập thuộc tính :
Câu lệnh kết nối DB: SELECT * FROM DMBanhNgot
Các thiết lập thuộc tính :
Câu lệnh SQL kết nối DataBase:
SELECT SL, MSDDH, MaSoBanh FROM ChiTietDH WHERE (MSDDH @MSDDH) AND (MaSoBanh = @MaSoBanh)
WHERE (HangTon.MSCuaHang = @MSCuaHang) AND (HangTon.MaSoBanh
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 2 DropDownList và hiển thị MSDDH và MaSoBanh kế 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.
5.15.3 Lập trình (Codes)trang quản lý danh mục Chi Tiết Đơn Đặt Hàng:
FrCTDDH.aspx protected void Page_Load(object sender, EventArgs e)
} protected void DropDownListDH_SelectedIndexChanged(object sender, EventArgs e)
{ if (DropDownListDH.SelectedValue == "*" && DropDownListBN.SelectedValue == "*") {
SqlDataSourceCTDH.SelectCommand = "SELECT SL, MSDDH, MaSoBanh FROM ChiTietDH"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn đơn hàng và loại bánh cụ thể để thêm chi tiết";
} if (DropDownListDH.SelectedValue != "*" && DropDownListBN.SelectedValue == "*") {
SqlDataSourceCTDH.SelectCommand = "SELECT SL, MSDDH, MaSoBanh FROM ChiTietDH WHERE (MSDDH = @MSDDH)"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn loại bánh cụ thể để thêm chi tiết";
} if (DropDownListDH.SelectedValue == "*" && DropDownListBN.SelectedValue != "*") {
SqlDataSourceCTDH.SelectCommand = "SELECT SL, MSDDH, MaSoBanh FROM ChiTietDH WHERE (MaSoBanh = @MaSoBanh)"; btnThem.Enabled = false; btnThem.ToolTip = "Vui lòng chọn đơn hàng cụ thể để thêm chi tiết";
} if (DropDownListDH.SelectedValue != "*" && DropDownListBN.SelectedValue != "*") {
GridViewCTDH.DataBind(); if (GridViewCTDH.Rows.Count == 0)
// Đơn hàng chưa có loại bánh đang chọn => cho phép thêm btnThem.Enabled = true; btnThem.ToolTip = "";
// Đơn hàng đã có loại bánh đang chọn => chỉ cho cập nhật số lượng btnThem.Enabled = false; btnThem.ToolTip = "Đơn hàng đã có loại bánh đang chọn vui lòng cập nhật số lượng"; }
} lbmsddh.Text = DropDownListDH.SelectedValue; lbMaBanh.Text = DropDownListBN.SelectedValue;
5.15.4 Lập trình (Codes) THÊM _ SỬA _ XÓA trang quản lý danh mục Chi Tiết Đơn Đặt Hàng: FrCTDDH.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
B2: Viết lệnh SQL thêm khu vực trrong SqlDataSourceCTDH tương ứng
INSERT INTO ChiTietDH(MSDDH, MaSoBanh, SL) VALUES (@MSDDH, @MaSoBanh,
B3: Thiết kế các textbox cho phép NSD thêm khu vực mới
B4: Không cho phép “Thêm chi tiết” khi NSD chọn “Tất cả” trong DropDownListDH và DropDownListBN ; Vì khi thêm mới, được hiểu là thêm mới vào “Cửa hàng và Loại Bánh Đã chọn trong DropDownListDH và DropDownListBN
B5: Viết mã lệnh (Codes) cho nút lênh “Thêm chi tiết đơn hàng” protected void btnThem_Click(object sender, EventArgs e)
{ if (btnThem.Text == "Thêm chi tiết")
// Xóa thông tin các ô textbox txtSL.Text = "";
// Hiển thị các textbox để nhập thông tin lbSL.Visible = true; txtSL.Visible = true; btnHuy.Visible = true; btnThem.Text = "Lưu chi tiết";
SqlDataSourceCTDH.Insert(); this.Title = "Lưu thành công";
// Đơn hàng đã có loại bánh đang chọn => chỉ cho cập nhật số lượng btnThem.Enabled = false; btnThem.ToolTip = "Đơn hàng đã có loại bánh đang chọn vui lòng cập nhật số lượng"; } catch (Exception ex)
{ this.Title = "Lưu thất bại: " + ex.Message;
} lbSL.Visible = false; txtSL.Visible = false; btnHuy.Visible = false; btnThem.Text = "Thêm chi tiết";
B6: Viết mã lệnh (Codes) cho nút lênh “Hủy” protected void btnHuy_Click(object sender, EventArgs e)
{ lbSL.Visible = false; txtSL.Visible = false; btnHuy.Visible = false; btnThem.Text = "Thêm chi tiết";
B2: Viết lệnh SQL Xóa (Delete) ChiTietDonDatHang trong SqlDataSourceKV tương ứng
DELETE FROM ChiTietDH WHERE (MaSoBanh = @MaSoBanh) AND (MSDDH @MSDDH)
Viết lệnh SQL Sửa (Update) ChiTietDonDatHang trong SqlDataSourceCTDH tương ứng
UPDATE ChiTietDH SET SL = @SL WHERE (MSDDH = @MSDDH) AND (MaSoBanh
5.15.5 Lập trình (Codes) xử lý RBTV dữ liệu khi Xóa ChiTietDonDatHang :
Khi xóa ChiTietDH (Table CTDDH) thì sẽ bị ảnh hưởng RBTV dữ liệu đối với bảngCTDDH
5.15.5.2 Xóa CT đơn đặt hàng
B3: Viết lệnh Delete SQL xóa CT đơn đặt hàng trong SqlDataSourceCTDH
DELETE FROM ChiTietDH WHERE (MaSoBanh = @MaSoBanh) AND (MSDDH @MSDDH)
5.14.4.3 Cập nhật đơn đặt hàng
B4; Viết lệnh Update SQL cập nhật đơn đặt hàng trong SqlDataSourceDDH
UPDATE ChiTietDH SET SL = @SL
WHERE (MSDDH = @MSDDH) AND (MaSoBanh = @MaSoBanh)
TRIỂN KHAI PHÁT HÀNH WEBAPP 124 6.1 Giới thiệu về Host miễn phí somee
Đăng ký tài khoản somee
BƯỚC 1: Đăng ký tài khoản host somee & Đăng nhập vào host đó
First name: G4 Last name: ntthang
User ID: gfourntthang Pass: 1234@abcd
URL http://G4BanBanhOnline.somee.com http://www.G4BanBanhOnline.somee.com
Email address: ngothithuyhang276gmail.com
Addresses ftp://G4BanBanhOnline.somee.com/www.G4BanBanhOnline.somee.com ftp://198.37.116.29/www.G4BanBanhOnline.somee.com
Thông tin địa chỉ vật lý lưu trữ Web trên Host
Website local path: d:\DZHosts\LocalUser\gfourntthang\www.G4BanBanhOnline.somee.com Protected local path: d:\DZHosts\LocalUser\gfourntthang\Protected.G4BanBanhOnline.somee.com
KHÔNG GIAN HOST ĐĂNG KÝ ĐƯỢC:
Hình 6 2: Trang thông tin Host somee đã đăng ký
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
THÔNG TIN KẾT NỐI DB
MS SQL Server version: MS SQL 2019 Express
MS SQL Server address: 1G406NTTHangBanhOnline.mssql.somee.com
Connection string: workstation id=1G406NTTHangBanhOnline.mssql.somee.com;packet size@96;user id=gfourntthang_SQLLogin_1;pwdjqb1tr8b4;data source=1G406NTTHangBanhOnline.mssql.somee.com;persist security infose;initial catalog=1G406NTTHangBanhOnline
Address: ftp://1G406NTTHangBanhOnline.backup.somee.com/1G406NTTHangBanhOnline_MSSql _Database_Backup
Password: * Use the password from this control panel * 1234@abcd
Hosting plan: MS SQL Plan "Novice"
Data file: Size, Max/Used/Usage: 30MB / 8.00MB / 26.67%
Log file: Size, Max/Used/Usage: 30MB / 8.00MB / 26.67%
Browse for local backup (50MB max): chọn file bak từ PC : 1G406NTTHangBanBanhOnline.bak chọn : Upload and Restore
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: TRONG Web.config
BƯỚC 4: Điều chỉnh Web.Config: TRONG Web.config
Connection string: connectionString="workstation id=1G406NTTHangBanhOnline.mssql.somee.com;packet size@96;user id=gfourntthang_SQLLogin_1;pwdjqb1tr8b4;data source=1G406NTTHangBanhOnline.mssql.somee.com;persist security infose;initial catalog=1G406NTTHangBanhOnline"
BƯỚC 5: Upload và đăng tải phát hành WebApp bán bánh ngọtrực tuyến trên somee
1 nén các file trong thư mục Web thành file zip
Trong Host: Manage Product->Websites->http://g4banbanhonline.somee.com ->File Manager
Upload // chọn file zip nêu trên // Upload and unzip
Giới thiệu sản phẩm WebApp quản lý bán bánh ngọt online trên somee
Url: http://G4BanBanhOnline.somee.com http://www.G4BanBanhOnline.somee.com
Trang chủ HomePage: HomePage.aspx
Hình 6 3: Trang chủ Giỏ hàng: Cart.aspx
Chương 7: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN CỦA ĐỒ ÁN
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:
+ Giao dịch mua bán trà sữa trên hệ thống cửa hàng bán bánh ngọt trực tuyến
Master.master: Mẫu trang giao dịch kiêm quản lý của hệ thống cửa hàng bán bánh ngọt trực tuyến
HomePage.aspx: Trang chủ, trưng bày các loại bánh ngọt đang bán tại cửa hàng;
Cart.aspx: Giỏ hàng các sản phẩm bánh ngọt mà khách hàng đang chọn mua Đối tượng
“giỏ hàng” ở trên bộ nhớ trong (RAM) của máy tính = NSD đang chọn mua (chưa mua).
FrOrder.aspx: Đặt mua các loại bánh ngọt đang có trong giỏ hàng NSD điền thông tin đơn hàng và xác nhận đặt hàng.
Managerment.aspx: xủ lý đăng nhập Login và quản lý chung các danh mục của bên mua và bên bán.
Quản lý các danh mục “Chi nhánh”, “Tồn kho”, “Sản phẩm”, “Nhân viên”, “Khu vực”,
“Công việc” với các chức năng Thêm, Xóa, Sửa, RBTV;
ChuyenNhom.aspx: Chuyển các sản phẩm từ loại này sang loại khác
+ Phát hành WebApp lên Host miễm phí: somee.com
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 đủ:+ Chuyển nhóm
+ Trang đặt hàng: chưa thực hiện đầy đủ phần thông tin đơn hàng, chi tiết đơn hàng và lưu trữ vào DB.
Hướng phát triển
7.2.1 Hướng khắc phục các hạn chế
+ 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.
+ Thực hiện trang chuyển nhóm: cho phép chuyển đồng hồ từ Thương hiệu này sang Thương hiệu khác.
+ Tiếp tục hoàn thiện sản phẩm minh họa (Demo) và báo cáo đề tài.
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,
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] htpp://……… : Trang thông tin điện tử của ……, được sử dụng để tham khảo chuyên môn thực hiện đề tài này.