Trang 1 TRƯỜNG ĐẠI HỌC TÀI CHÍNH – MARKETINGKHOA CÔNG NGHỆ THÔNG TINĐỒ ÁN HỌC PHẦNTÊN HỌC PHẦN: LẬP TRÌNH KẾ TỐNMÃ SỐ LỚP HP: 2321112002502Tên đề tài: LẬP TRÌNH PHÁT TRIỂN PHÂN HỆ KẾ TỐN
GIỚI THIỆU VỀ ĐỒ ÁN HỌC PHẦN 11 1.1 Tổng quan về Đồ án học phần kế toán bán hàng
Nội dung chuyên môn chính của Đồ án học phần kế toán bán hàng
Vận dụng kiến thức căn bản về nghiệp vụ kế toán:
+ Nguyên lý kế toán: các kiến thức căn bản về hạch toán kế toán doanh nghiệp bán hàng.
+ Kế toán chính: Nghiệp vụ hạch toán kế toán bán hàng, theo hướng dẫn của Thông tư 200/2014 [3].
+ Kế toán quản trị: Nghiệp vụ liên quan kế toán tổng hợp phục vụ hoạt động hoạch định kinh doanh tại Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea + Kế toán chi phí.
Công cụ và nền tảng kỹ thuật thực hiện Đồ án học phần kế toán bán hàng
+ NET Framework 4.8.0 trên MS Visual Studio 2022
+ Hệ quản trị CSDL MS SQL Server 2022 (16.0.1050): trên Local và trên Internet: somee.com.+ Bộ công cụ thiết lập Setup trên Visual NET 2022: VSI_Extensions
Sản phẩm của Đồ án học phần kế toán bán hàng
G211TTNgaSale_ToCo: hỗ trợ hạch toán kế toán bán hàng tại Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea
+ Bộ cài đặt Setup.exe: Cài đặt trên các máy tính cá nhận bộ phận kế toán bán hàng: G211TTN_SaleToCoSetup
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 kế toán bán hàng tại Công ty Cổ phần
Thương mại Dịch vụ Taco - ToCoToCo
Chương 2: Các cơ sở lý thuyết của HP Lập trình kế toán phục vụ việc thực hiện đề tài HP Chương 3: Thiết kế và cập nhật CSDL phục vụ cho WinApp kế toán nêu trên
Chương 4: Thiết kế và lập trình các Winforms quản lý các đối tượng liên quan đến phân hệ kế toán bán hàng tại Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea: Fr1Main.cs, Fr2QLTU_ToCo11.cs, Fr2QLTU_ToCo11RBTV.cs, …
Chương 5: Thiết kế và lập trình Winforms hỗ trợ hạch toán kế toán bán hàng tại Công ty
Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea: Fr3IBill_ToCo11.cs,
Chương 6: Thiết lập bộ cài đặt Setup cho hệ thống WinApp nêu trên.
Chương 7: Tổng kết các kết quả đạt được và 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 13 2.1 Tổng quan về nghiệp vụ kế toán bán hàng vừa và nhỏ
Một số nghiệp vụ của kế toán bán hàng
Kế toán là công việc ghi chép, tính toán bằng con số dưới hình thức giá trị, hiện vật và thời gian lao động, chủ yếu dưới hình thức giá trị để phản ánh, kiểm tra tình hình vận động của các loại tài sản, quá trình và kết quả hoạt động sản xuất kinh doanh, sử dụng vốn và kinh phí của Nhà nước, cũng như từng tổ chức, xí nghiệp.
Kế toán bán hàng (Sales Accountant) là vị trí kế toán đảm nhận toàn bộ các nghiệp vụ liên quan đến quản lý hóa đơn bán hàng, bao gồm: ghi nhận hóa đơn bán hàng, ghi chép sổ chi tiết doanh thu, thuế giá trị gia tăng, lập các báo cáo bán hàng và những báo cáo liên quan khác theo yêu của cầu doanh nghiệp.
Kế toán bán hàng có vai trò quan trọng trong việc quản lý đầu ra các thành phẩm của
Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea Cùng với đó, những thông tin và số liệu của kế toán bán hàng cung cấp giúp cho lãnh đạo doanh nghiệp nắm được tình hình doanh thu, tài chính nhằm có những kế hoạch và định hướng hiệu quả cho hoạt động kinh doanh trong thời gian tới Bên cạnh đó, những số liệu mà kế toán bán hàng cung cấp còn thấy được kết quả bán hàng, sự chênh lệch từ khâu sản xuất đến khâu bán hàng…
Kế toán tài chính
Kế toán tài chính (Financial accounting) là vị trí kế toán thực hiện các công việc liên quan đến thu thập, phân tích, đánh giá và cung cấp những dữ liệu thông tin kinh tế để lập thành báo cáo tài chính phục vụ cho đối tượng có nhu cầu sử dụng.
Trong doanh nghiệp, bộ phận tài chính kế toán thường được phân thành kế toán tổng hợp và kế toán số liệu, mỗi bên sẽ được phân chia công việc rõ ràng, minh bạch nhằm đảm bảo hiệu quả công việc Cụ thể như sau:
– Kế toán tổng hợp: Chịu trách nhiệm trong việc ghi nhận, phản ánh và thống kê, tổng hợp các số liệu, dữ liệu trên các tài khoản, sổ sách kế toán và báo cáo tài chính một cách tổng quát theo các chỉ tiêu giá trị của doanh nghiệp.
– Kế toán chi tiết: Khách với kế toán tổng hợp, kế toán chi tiết được phân công theo dõi, ghi chép, phản ánh các đối tượng kế toán cần phải hạch toán một cách chi tiết nhất theo yêu cầu quản lý của mỗi doanh nghiệp.
Các báo cáo kế toán tài chính phải thực hiện:
– Các báo cáo theo tháng: báo cáo thuế giá trị gia tăng, báo cáo thuế thu nhập cá nhân – Các báo cáo theo quý: báo cáo thuế giá trị gia tăng, báo cáo thuế thu nhập cá nhân, báo cáo tình hình sử dụng hóa đơn
– Các báo cáo theo năm: Báo cáo tài chính, quyết toán thuế thu nhập cá nhân, quyết toán thuế thu nhập doanh nghiệp, thuế môn bài.
Tổng hợp sổ nhật ký chung
Báo cáo công nợ phải thu và phải trả
Tổng hợp báo cáo hàng tồn kho
Quản lý thu chi tiền mặt, tiền gửi
Quản lý nguyên vật liệu, hàng hóa, thành phẩm
Quản lý doanh thu và chi phí doanh nghiệp
Kế toán quản trị
Nghiệp vụ liên quan kế toán tổng hợp phục vụ hoạt động hoạch định kinh doanh Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea.
Mục tiêu và vai trò của kế toán quản trị (bán hàng) ngoài việc quản trị một cách chặt chẽ, hợp lý chi phí sản xuất đối với quy mô hoạt động của cửa hàng Thì kế toán quản trị khâu bán hàng lại đóng vai trò kiểm soát, xác định kết quả hoạt động kinh doanh, thực hiện kế hoạch phát triển kinh doanh của doanh nghiệp. đạt được những chỉ số lợi nhuận hoạt động và chỉ số hiệu quả hoạt động cho thấy khả năng sinh lời.
- Vai trò của kế toán quản trị bán hàng tại Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea: Từ mục tiêu ban quản trị đưa ra cùng với kế hoạch sản xuất kinh doanh đưa ra những phương án chiến lược kinh doanh trong tương lai Theo dõi kết quả kinh doanh thu được cho chiến lược đó.
Dự toán bán hàng có ý nghĩa rất quan trọng trong việc DN tổ chức, xây dựng, quản lý.
Ngoài ra kế toán quản trị còn có nhiệm vụ lập dữ toán bán hàng chính xác và phải phù hợp với khả năng, điều kiện của cửa hàng.
Kế toán chi phí
Nghiệp vụ liên quan kế toán tổng hợp phục vụ hoạt động hoạch định kinh doanh
Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea. Ở vị trí kế toán chi phí bán hàng thì kế toán sẽ phải tổng hợp lại toàn bộ chi phí phát sinh trong quá trình tiêu thụ sản phẩm, hàng hóa, dịch vụ Chi phí bán hàng được theo dõi chi tiết theo từng nội dung chi phí như: Chi phí nhân viên, vật liệu, bao bì, dụng cụ, đồ dùng, khấu hao TSCĐ, bảo hành, dịch vụ mua ngoài, chi phí bằng tiền khác Tùy theo đặc điểm kinh doanh, yêu cầu quản lý theo từng ngành, từng doanh nghiệp, chi phí bán hàng có thể theo dõi chi tiết thêm một số nội dung chi phí. Đối với kế toán chi phí bán hàng thì có nguyên tắc kế toán là:
+ Hạch toán chi tiết từng nội dung chi phí theo quy định.
+ Cuối kỳ, kết chuyển chi phí bán hàng và chi phí quản lý doanh nghiệp vào bên Nợ
TK 911 “Xác định kết quả kinh doanh” Việc phân bổ và kết chuyển chi phí này tùy vào từng loại hình doanh nghiệp và đặc điểm sản xuất kinh doanh.
– Đối với doanh nghiệp trong kỳ không có sản phẩm, hàng hoá tiêu thụ thì toàn bộ chi phí bán hàng được kết chuyển sang theo dõi ở “chi phí trả trước”.
– Đối với các doanh nghiệp sản xuất có chu kỳ sản xuất kinh doanh dài, trong kỳ có sản phẩm tiêu thụ ít hoặc đối với các doanh nghiệp thương mại kinh doanh hàng hoá có dự trữ và luân chuyển hàng hoá lớn (tốn nhiều, xuất bán nhiều) thì cuối kỳ cần phải phân bổ chi phí bán hàng cho hàng tồn kho cuối kỳ, tức là chuyển một phần chi phí bán hàng thành “chi phí trả trước” và phần chi phí bán hàng còn lại phân bổ cho hàng đã được bán trong kỳ để xác định kết quả kinh doanh.
Phân tích tài chính
Nghiệp vụ liên quan kế toán tổng hợp phục vụ hoạt động hoạch định kinh doanh
Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea.
Dưới sự quản lý vĩ mô nền kinh tế nhà nước, trong thời đại công nghiệp hoá nên nhà quản lý doanh nghiệp cần thông tin phân tích tài chính doan nghiệp để kiểm soát, giám sát điều chỉnh tình hình hoạt động thực tế của doanh nghiệp Các thông tin này giúp họ đưa ra những quyết định về cơ cấu nguồn tài chính, đầu tư hay phân chia lợi nhuận, biện pháp điều chỉnh hoạt động phù hợp…
Có thể thấy, vai trò cơ bản của phân tích tài chính doanh nghiệp chính là cung cấp thông tin hữu ích cho tất cả những đối tượng quan tâm đến tình hình tài chính của doanh nghiệp trên nhiều khía cạnh, góc nhìn khác nhau, từ đó giúp họ đưa ra những quyết định chính xác, phù hợp với mục đích của bản thân mình.
Mục tiêu phân tích tài chính bán hàng của Công ty Cổ phần Thương mại Dịch vụ
- Đánh giá chính xác tình hình Bán hàng của doanh nghiệp trên các khía cạnh khác nhau như cơ cấu nguồn vốn, tồn kho, khả năng thanh toán, lưu chuyển tiền tệ, khả năng sinh lời, rủi ro tài chính… nhằm đáp ứng thông tin cho tất cả những đối tượng quan tâm đến doanh nghiệp như nhà đầu tư, nhà cung cấp tín dụng, cơ quan thuế, người lao động…
- Định hướng các quyết định của các đối tượng quan tâm theo chiều hướng phù hợp
Tổng quan về Lập trình Winform dùng C#.NET trên Visual Studio NET
2.2.1 Tổng quan về lập trình kế toán
Sử dụng kiến thức và kỹ năng lập trình kết hợp nghiệp vụ kế toán để phát triển các ứng dung phục vụ hoặc hỗ trợ các hoạt động hạch toán kế toán liên quan.
2.2.2 Lập trình Winform đơn giản trên NET
2.2.2.1 Bổ sung thêm Form mới vào ứng dụng WinApp (Project)
2.2.2.2 Chọn Form được chạy ban đầu (MainForm = Màn hình chính)
2.2.2.3 Cách gọi Form từ Form khác
2.2.2.4 Cách Đóng Form và Thoát chương trình
2.2.2.5 Giới thiệu đối tượng MessageBox
2.2.2.6 Bắt lỗi chạy chương trình
2.2.2.7 Toolbox WinApp DOTNET (View: Designer)
2.2.2.9 Làm quen với một số công cụ lập trình Winapp
[2] Tạo biểu tượng chương trình / vùng = khay hệ thống = System Tray: NotifyIcon / Common Controls
[3][4] Thực đơn: Menu + ContextMenu / Menu & Toolbars
[5] Thanh công cụ: Toolbar / ToolStrip : Menu & Toolbars
[6] Dòng trạng thái: Statusbar / StatusStrip : Menu & Toolbars
[7] Bắt lỗi NSD nhập dữ liệu: ErrorProvider / Component:
ErrorProvider: Bắt lỗi NSD nhập dữ liệu;
VD không được để trống, phải nhập số,…
ImageList: Sử dụng ds hình ảnh cho một số đối tượng thiết kế khác Timer
Lập trình Form màn hình chính (MainForm)
2.6 Lập trình Form màn hình Quản lý thức uống (DSTU)
2.7 Lập trình Form màn hình Xử lý RBTV dữ liệu khi “Xóa” (RBTV)2.8 Lập trình Form màn hình Xử lý Nghiệp vụ hạch toán kế toán 2.9 Đóng gói bộ cài đặt SetUp cho WinApp kế toán
Chương 3:THIẾT KẾ & CẬP NHẬT CSDL PHỤC VỤ CHO
Giới thiệu về CSDL của hệ thống kế toán bán hàng ToCoToCo Tea
Hệ thống gồm 11 Tables gồm 2 phần:
- Phần bên bán: DSTU, DSNhomTU, DSThuongHieu, DSCSDL, DSNV, HangTon
- Phần bên mua: DSKH, DS_Bill, CTBill, DSHD, CTHD
Thiết kế DB phân hệ kế toán bán hàng ToCoToCo Tea
Căn cứ vào phân tích từ phần 3.1 nêu trên, ta có Diagram có 11 Tables của DB phục vụ cho phân hệ kế toán bán hàng tại Công ty Cổ phần Thương mại Dịch vụ Taco - ToCoToCo Tea:
Hình 3.1: Diagram của DB phân hệ kế toán bán hàng ToCoToCo Tea
Thiết kế (Design) các Tables của CSDL kế toán bán hàng ToCoToCo Tea
3.3.1 Danh mục nhóm thức uống (DSNhomTU)
Hình 3.2: Danh sách nhóm thức uống Data của Nhóm thức uống (DSNhomTU)
Hình 3.3: Data nhóm thức uống
3.3.2 Danh mục Thức uống (DSThucUong)
Hình 3.4: Danh sách thức uống Data của Danh sách thức uống (DSThucUong)
Hình 3.5: Data danh sách thức uống
3.3.3 Danh sách Khách hàng (DSKH)
Hình 3.6: Danh sách khách hàng Data của Danh sách khách hàng
3.3.4 Danh sách Nhân viên (DSNV)
Hình 3.8: Danh sách nhân viên Data của Danh sách Nhân Viên
Hình 3.9: Data danh sách nhân viên
3.3.5 Danh sách Thương hiệu (DSThuongHieu)
Hình 3.10: Danh sách thương hiệuData của Danh sách Thương hiệu
Hình 3.11: Data danh sách thương hiệu
Hình 3.12: Hàng tồnData của Hàng tồn
3.3.7 Danh sách Cơ sở đại lý
Hình 3.14: Danh sách cơ sở đại lý Data của Danh sách Cơ sở đại lý
Hình 3.15: Data danh sách cơ sở đại lý
3.3.8 Danh sách Bill (DS_Bill)
Hình 3.16: Danh sách Bill Data của Danh sách Bill
Hình 3.17: Data danh sách bill
Hình 3.18: Chi tiết bill Data của Chi tiết Bill
Hình 3.19: Data chi tiết bill
3.3.10 Danh sách Hóa đơn (DSHD)
Hình 3.20: Danh sách hóa đơn
Data của Danh sách Hóa đơn
Hình 3.21: Data danh sách hóa đơn
3.3.11 Chi tiết Hóa đơn (CTHD)
Hình 3.22: Chi tiết hóa đơnData của Chi tiết Hóa đơn
Hình 3.23: Data chi tiết hóa đơn
Chuỗi kết nối DB của App: App.config
+ DB chạy cục bộ trên máy tính cá nhân [Local]
+ DB chạy Online trên Internat thông quan free host somee.com [Online somee]: dùng chung với WebApp của Học phần Lập trình Web
THIẾT KẾ VÀ LẬP TRÌNH CÁC WINFORMs QUẢN LÝ 30 4.1 Giới thiệu các Winforms quản lý của phân hệ kế toán bán hàng
Thiết kế và lập trình FrMain.cs: màn hình chính
Màn hình chính của sản phẩm như Hình 4.1
Hình 4.24: Màn hình chính Danh sách các Menus trong màn hình chính
+ “HỆ THỐNG”, Hình 4.2: Bao gồm các chức năng quản trị chung của hệ thống, như máy in, đăng nhập, tài khoản NSD, phân quyền, tham số hệ thống, backup và restore BD,
Hình 4.26: ContextMenu của Màn hình chính
4.2.2 Lập trình (Code) của Fr1Main
DialogResult ch = MessageBox.Show("Bạn có chắc là muốn thoát chương trình không (Y/N)?" "Xác nhận", ,MessageBoxButtons.YesNo,MessageBoxIcon.Question); if (ch == DialogResult.Yes)
Application.Exit();//thoát chương trình
}//private void thoátKhỏiChươngTrìnhToolStripMenuItem_Click(object sender, EventArgs e)
/// LẬP PHIẾU TÍNH TIỀN private void lậpPhiếuTínhTiềnBillToolStripMenuItem_Click(object sender, EventArgs e) {
Fr3IBill_ToCo11 fr = new Fr3IBill_ToCo11();//Khai báo biến đối tượng Form Phiếu Tính tiền fr.ShowDialog();//Form fr Phiếu Tính tiền được mở ra: Form con của Form màn hình chính
}//private void lậpPhiếuTínhTiềnBillToolStripMenuItem_Click(object sender, EventArgs e)
/// LẬP HÓA ĐƠN private void lậpHóaĐơnInvoiceToolStripMenuItem_Click(object sender, EventArgs e) {
Fr4OInvoice_ToCo11 fr = new Fr4OInvoice_ToCo11();//Khai báo biến đối tượng Form Lập Hóa đơn fr.ShowDialog();//Form fr Lập Hóa đơn được mở ra: Form con của Form màn hình chính }//private void lậpHóaĐơnInvoiceToolStripMenuItem_Click(object sender, EventArgs e)
/// GỌI FORM DANH SÁCH THỨC UỐNG private void danhSáchThứcUốngToolStripMenuItem_Click(object sender, EventArgs e) {
Fr2QLTU_ToCo11 fr = new Fr2QLTU_ToCo11(); //Khai báo biến đối tượng Form DSTU fr.ShowDialog(); //Form fr DSTU được mở ra: Form con của Form màn hình chính }//private void danhSáchThứcUốngToolStripMenuItem_Click(object sender, EventArgs e)
Gán vào nút chọn “DSTU” (Danh sách Thức uống) trong toolStripButton1
Và mục chọn “Danh sách Thức uống” trong toolStripMenuItem1 của contextMenuStrip1
Hình 4.27: Gán nút chọn Danh sách thức uống /// NHẢY ĐỒNG HỒ private void timer1_Tick(object sender, EventArgs e)
{ lbTime.Text = StatusLbTime.Text = DateTime.Now.ToLongTimeString();
}//private void timer1_Tick(object sender, EventArgs e)
/// THỦ TỤC NÀY TỰ ĐỘNG CHẠY (RUN) MỖI KHI FORM NÀY ĐƯỢC MỞ LÊN (LOAD TẢI) private void Fr1Main_Load(object sender, EventArgs e)
{ lbDate.Text = StatusLbDate.Text = "Hôm nay: "+ DateTime.Now.ToShortDateString();
}//private void Fr1Main_Load(object sender, EventArgs e)
Thiết kế & lập trình Fr2QLTU_ToCo11.cs: màn hình Quản lý Thức uống của Kế toán bán hàng ToCoToCo
Hình 4.28: Màn hình quản lý thức uống Màn hình quản lý thức uống tại ToCoToCo như Hình 4.5
// KHAI BÁO CÁC THAM SỐ TOÀN CỤC static string name = "", pass = ;//Dùng cho thủ tục đăng nhập (Login)"" string apppath System.IO.Path.GetDirectoryName(System.IO.Path.GetDirectoryName(Application.Start upPath)) + "\\Images\\"; //BIẾN TOÀN CỤC LƯU ĐƯỜNG DẪN ĐẾ THƯ MỤC LƯU APP BÀI LÀM NAY
//string apppath = "D:\\G210TTNgaSale_ToCo\\Images";
/// THỦ TỤC ĐƯỢC TỰ ĐỘNG CHAY KHI FORM QUẢN LÝ HÀNG HÓA DỊCH VỤ MỞ LÊN private void Fr2QLTU_ToCo11_Load(object sender, EventArgs e)
// TODO: This line of code loads data into the
'g211TTNSaleToCoDSNTU.DSNhomTU' table You can move, or remove it, as needed. this.dSNhomTUTableAdapter.Fill(this.g211TTNSaleToCoDSNTU.DSNhomTU);
// TODO: This line of code loads data into the
'g211TTNSaleToCoDSTH.DSThuongHieu' table You can move, or remove it, as needed. this.dSThuongHieuTableAdapter.Fill(this.g211TTNSaleToCoDSTH.DSThuongHieu); try
// TODO: This line of code loads data into the
'g211TTNgaSaleToCoDS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapter.Fill(this.g211TTNgaSaleToCoDS.DSThucUon g);
/// ĐÓNG FORM NÀY, THOÁT VỀ MÀN HÌNH CHÍNH private void btnMain_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt về MÀN HÌNH CHÍNH không (Y/N)?",
"Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ch == DialogResult.Yes)
}//private void btnMain_Click(object sender, EventArgs e)
/// THOÁT CHƯƠNG TRÌNH private void btnExit_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt thoát không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
/// GỌI FORM CHUYỂN NHÓM THỨC UỐNG private void chuyểnNhómTUToolStripMenuItem_Click_1(object sender, EventArgs e)
FrChuyenNhomTU_ToCo11 fr = new FrChuyenNhomTU_ToCo11(); fr.ShowDialog();
}//private void chuyểnNhómTUToolStripMenuItem_Click_1(object sender,
Lập trình chức năng Thêm _ Xóa _ Sửa dữ liệu trên Fr2QLTU_ToCo11.cs
4.4.1 Xử lý chọn hình ảnh cho thức uống và biến toàn cục
Khi thêm Thức uống mới Hoặc Sửa thông tin một Thức uống đã có (thay đổi hình mẫu cho thức uống):
/// CHỌN HÌNH MẪU CHO THỨC UỐNG static string oldimage = "", imagechoose = ;//Biến toàn cục Lưu tên file hình mà NSD"" đã chọn (Thêm/Sửa) đối với PictureBox private void ImageChoose(object sender, EventArgs e)
DialogResult ch = openFileDialogHinh.ShowDialog();//Mở hộp thoại cho phép
NSD chọn hình cho nhân sự if (ch == DialogResult.OK)//NSD đồng ý với hình đã chọn
//1 Lưu tên file của hình vừa copy nêu trên vào biến toàn cục để sau này
(Thêm/Sửa) sẽ cập nhật vào thuộc tính hình trong Table NS của DB imagechoose System.IO.Path.GetFileName(openFileDialogHinh.FileName); //chỉ lấy tên file ko lấy đường dẫn
//2 Copy hình vừa chọn vào thư mục hình Images của App(để sau này
Copy App đi nơi khác thư mục hình sẽ tự đi theo) try
System.IO.File.Copy(openFileDialogHinh.FileName, apppath + txtmatu.Text.Trim() + imagechoose, true); //Chồng lên hình cũ nếu có
} catch (System.Exception ex) { MessageBox.Show("Có lỗi sao chép hình vào thư mục của App" + ex.Message); }
}//private void ImageChoose(object sender, EventArgs e)
Biến toàn cục lưu giữ đường dẫn vật lý lưu trữ App mà ta đang lập trình: nhờ đó khi copy App này đi nơi khác (đường dẫn bị thay đổi) khi đó chi cần sữa chữa đường trong biến này là sẽ có hiệu lực cho toàn bộ App string apppath = "D:\\G210TTNga_SaleToCo\\Images";//BIẾN TOÀN CỤC LƯU ĐƯỜNG
DẪN ĐẾ THƯ MỤC LƯU APP BÀI LÀM NÀY
Hoặc string apppath System.IO.Path.GetDirectoryName(System.IO.Path.GetDirectoryName(Application.Start upPath)) + "\\Images\\"; //BIẾN TOÀN CỤC LƯU ĐƯỜNG DẪN ĐẾ THƯ MỤC LƯU APP
Sử dụng nút Task của dSThucUongTableAdapter viết lại câu lệnh InsertCommand như sau:
INSERT INTO DSThucUong (MaTU, TenTU, DVT, GiaBan, NgaySanXuat, HSD, MoTa, HinhDang, MaThuongHieu, MaNhomTU, ConHang, HangTrongNgay)
(@MaTU,@TenTU,@DVT,@GiaBan,@NgaySanXuat,@HSD,@MoTa,@HinhDang,@MaThuongHieu,@MaNhomTU,@ConHang,@HangTrongNgay)
//ĐÓNG _ MỞ : ĐƯỢC PHÉP HAY KHÔNG ĐƯỢC THAY ĐỔI CÁC TEXTBOX THÔNG TIN THỨC UỐNG txtmatu.Enabled = !txtmatu.Enabled; txttentu.Enabled = !txttentu.Enabled; txtgiaban.Enabled = !txtgiaban.Enabled; txtdvt.Enabled = !txtdvt.Enabled; dateTimePickernsx.Enabled = !dateTimePickernsx.Enabled; dateTimePickerhsd.Enabled = !dateTimePickerhsd.Enabled; comboBoxthuonghieu.Enabled = !comboBoxthuonghieu.Enabled; comboBoxnhomtu.Enabled = !comboBoxnhomtu.Enabled; txtmota.Enabled = !txtmota.Enabled; checkBoxconhang.Enabled = !checkBoxconhang.Enabled; checkBoxHangTN.Enabled = !checkBoxHangTN.Enabled; checkBoxALL.Enabled = !checkBoxALL.Enabled;
//khóa các nút lệnh khác (ngoại trừ được Đóng form) btsuatu.Enabled = !btsuatu.Enabled; btxoatu.Enabled = !btxoatu.Enabled; btnExit.Enabled = !btnExit.Enabled; if (btthemtu.Text == "Thêm TU mới")//CHUẨN BỊ THÊM TU
//MỞ CHẾ ĐỘ CHO NSD CHỌN HÌNH CHO SP MỚI pictureBoxHinh.ImageLocation = apppath + "ImageChoose.jpg";
//hiện hình ảnh thông báo NSD chọn hình pictureBoxHinh.Click += new EventHandler(ImageChoose);
// cho phép NSD click vào PictureBox để chọn hình (Gán Event Click vào PictureBox Hình)
//XÓA CÁC Ô TEXTBOX TRONG CHI TIẾT Ở BÊN PHẢI ĐỂ CHUẨN BỊ CHO NSD NHẬP THÔNG TIN TU MỚI txtmatu.Text = ;"" txttentu.Text = ;"" txtgiaban.Text = ;"" txtdvt.Text = ;"" txtmota.Text = ;"" checkBoxconhang.Checked = true; //mặc định thêm TU mới là còn hàng
MessageBox.Show("Mời quý vị nhập thông tin thức uống mới vào các ô dữ liệu ở phía trên trong màn hình này"); btthemtu.Text = "Lưu TU mới";//đổi nhãn Thêm => Lưu (sau khi NSD đã nhập đủ các thông tin MH mới)
} else//THÊM MH MỚI VÀO DATABASE VÀ HIỆN LÊN DATAGRIDVIEW
{ //1 THÊM SP MỚI VÀO DB try
{ dSThucUongTableAdapter.Insert(txtmatu.Text, txttentu.Text, txtdvt.Text, double.Parse(txtgiaban.Text.Trim()),
DateTime.Parse(dateTimePickerhsd.Text), txtmota.Text, apppath + txtmatu.Text.Trim() + imagechoose, comboBoxthuonghieu.SelectedValue.ToString(), comboBoxnhomtu.SelectedValue.ToString(), checkBoxconhang.Checked, checkBoxHangTN.Checked);
MessageBox.Show("THÊM XONG, XEM ĐI");
} catch (System.Exception ex) { MessageBox.Show("Lỗi thêm TU mới : " + ex.Message); }
//2 TẢI LẠI DL SAU KHI THÊM SP MỚI TỪ DB LÊN DATAGRIDWIEW ĐỂ NSD BIẾT KQ [COPY code TỪ form_load OR Combobox_selectIndexChange] try
// TODO: This line of code loads data into the
'g211TTNgaSaleToCoDS.DSThucUong' table You can move, or remove it, as needed. btthemtu.Text = "Thêm TU mới";//đổi nhãn trả lại Lưu => Thêm (thêm thêm mới MH khác)
//pictureBoxHinh.Click -= ImageChoose;//KHÔNG CHO NSD click vào
//(Xóa Event Click của PictureBox Hình)
//pictureBoxHinh.ImageLocation = ""; //GỠ BỎ hình ảnh thông báo chọn hình
}//private void btthemtu_Click(object sender, EventArgs e)
4.4.3 Sửa chữa thông tin Thức uống
Sử dụng nút Task của dSThucUongTableAdapter viết lại câu lệnh UpdateCommand như sau:
SET TenTU = @TenTU, DVT = @DVT, GiaBan = @GiaBan, NgaySanXuat = @NgaySanXuat, HSD = @HSD, MoTa = @MoTa, HinhDang = @HinhDang, MaThuongHieu = @MaThuongHieu, MaNhomTU = @MaNhomTU, ConHang = @ConHang, HangTrongNgay = @HangTrongNgay WHERE (MaTU = @MaTU))
Viết code cho nút lệnh btnsuatu
/// SỬA THỨC UỐNG private void btsuatu_Click(object sender, EventArgs e)
//B1: ĐÓNG _ MỞ : ĐƯỢC PHÉP HAY KHÔNG ĐƯỢC THAY ĐỔI CÁC TEXTBOX
THÔNG TIN THỨC UỐNG txttentu.Enabled = !txttentu.Enabled; txtgiaban.Enabled = !txtgiaban.Enabled; txtdvt.Enabled = !txtdvt.Enabled; dateTimePickernsx.Enabled = !dateTimePickernsx.Enabled; dateTimePickerhsd.Enabled = !dateTimePickerhsd.Enabled; comboBoxthuonghieu.Enabled = !comboBoxthuonghieu.Enabled; comboBoxnhomtu.Enabled = !comboBoxnhomtu.Enabled; txtmota.Enabled = !txtmota.Enabled; checkBoxconhang.Enabled = !checkBoxconhang.Enabled; checkBoxHangTN.Enabled = !checkBoxHangTN.Enabled; checkBoxALL.Enabled = !checkBoxALL.Enabled;
//khóa các nút lệnh khác (ngoại trừ được Đóng form) btthemtu.Enabled = !btthemtu.Enabled; btxoatu.Enabled = !btxoatu.Enabled; btnExit.Enabled = !btnExit.Enabled; if (btsuatu.Text == "Sửa TU")//CHUẨN BỊ SỬA TU
//MỞ CHẾ ĐỘ CHO NSD CHỌN HÌNH MỚI CHO SP oldimage = System.IO.Path.GetFileName(pictureBoxHinh.ImageLocation); pictureBoxHinh.ImageLocation = apppath + "ImageChoose.jpg";
//Hiện hình ảnh thông báo NSD chọn hình pictureBoxHinh.Click += new EventHandler(ImageChoose);
// cho phép NSD click vào PictureBox để chọn hình (Gán Event Click vào
MessageBox.Show("Mời quý vị SỬA thông tin thức uống trong các ô dữ liệu ở phía trên trong màn hình này"); btsuatu.Text = "Lưu TU";
}//đổi nhãn Sửa => Lưu (sau khi NSD đã sửa các thông tin TU) else //LƯU SAU KHI SỬA XONG
//KIỂM TRA NSD CÓ THAY ĐỔI HÌNH HAY KHÔNG: NẾU CHỌN HÌNH MỚI THÌ THAY; NẾU KHÔNG THÌ GIỮ LẠI HÌNH CŨ if (imagechoose == "") imagechoose = oldimage;// NSD không thay đổi hình (NÊN giữ lại hình cũ) else
{ if (oldimage != "") //chỉ hỏi giữ hình cũ (nếu có) = Không có sẽ không hỏi
System.IO.File.Copy(apppath + oldimage, apppath + "z\\" + oldimage, true);
MessageBox.Show("Hình cũ copy vào thư mục D:\\G210TTNgaSale_ToCo\\Images\\z nha!");
MessageBox.Show("Xóa hình cũ nha !");
System.IO.File.Delete(apppath + oldimage);
//NSD KHÔNG THAY ĐỔI HÌNH (NÊN giữa lại hình cũ) try //B3: lưu DB
{ dSThucUongTableAdapter.Update(txttentu.Text, txtdvt.Text, double.Parse(txtgiaban.Text), dateTimePickernsx.Text, dateTimePickerhsd.Text, txtmota.Text, apppath + txtmatu.Text.Trim() + imagechoose, comboBoxthuonghieu.SelectedValue.ToString(), comboBoxnhomtu.SelectedValue.ToString(), checkBoxconhang.Checked, checkBoxHangTN.Checked, txtmatu.Text);
MessageBox.Show("Sửa xong rồi, xem đi !");
MessageBox.Show("Có lỗi sửa chữa thông tin thức uống " + ex.Message); }
//KHÔNG CHO NSD click vào PictureBox hình (Xóa Event Click của PictureBox Hình)
//pictureBoxHinh.ImageLocation = ""; //GỠ BỎ hình ảnh thông báo chọn hình
//B5: Tải BD lên DataGridView sau khi xóa try
// Tai ds cac vao DataGridView ben duoi theo Nhom TU da chon trong
ComboBox phia tren this.dSThucUongTableAdapter.Fill(this.g211TTNgaSaleToCoDS.DSThucUon g);
} catch (System.Exception) { } btsuatu.Text = "Sửa TU";
}//private void btsuatu_Click(object sender, EventArgs e)
4.4.4 Xóa thức uống khỏi danh mục (CHƯA xử lý RBTV DL)
Sử dụng nút Task của dSThucUongTableAdapter viết lại câu lệnh DeleteCommand như sau:
Viết code cho nút lệnh btnxoatu
/// XÓA THỨC UỐNG private void btxoatu_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt muốn xóa: " + txtmatu.Text.Trim() +
" : " + txttentu.Text.Trim() + " đúng không (Y/N)?" "Xác nhận", ,
//B2: XÓA if (ch == DialogResult.Yes)
{ oldimage System.IO.Path.GetFileName(pictureBoxHinh.ImageLocation)
System.IO.File.Copy(pictureBoxHinh.ImageLocation, apppath + "z\\" + oldimage);
MessageBox.Show("Hình cũ copy vào thư mục D:\\G210TTNgaSale_ToCo\\Images\\z nha !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Lưu hình cũ vào thư mục z: " + ex.Message); }
MessageBox.Show("Xóa hình cũ nha !");
System.IO.File.Delete(pictureBoxHinh.ImageLocation);//Xóa hình trong thư mục Images
} catch (System.Exception ex)// KHÔNG XÓA ĐƯỢC DO CÒN RBTV DL {
MessageBox.Show("Có lỗi xóa thức uống " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa try
// TODO: This line of code loads data into the
'g211TTNgaSaleToCoDS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapter.Fill(this.g211TTNgaSaleToCoDS.DSThucUon g);
}//private void btxoatu_Click(object sender, EventArgs e)
Xử lý RBTV dữ liệu khi Xóa thức uống khỏi danh mục: Fr2QLTU_ToCo11RBTV.cs
+ Xóa tồn thức uống, chi tiết phiếu tính tiền, chi tiết hóa đơn
Thêm Form mới: Fr2QLTU_ToCo11RBTV (Xử lý RBTV DL khi Xóa)
Khi xóa mặt hàng CÒN RBTV dữ liệu sẽ có thông báo như Hình 4.6
Hình 4.29: Thông báo lỗi xóa thức uống
/// XÓA THỨC UỐNG TẠI VỊ TRÍ CHỌN / DATAGRIDVIEW private void btxoatu_Click(object sender, EventArgs e)
{ dSThucUongTableAdapter.Delete(txtmatu.Text.Trim());
MessageBox.Show("Xóa xong rồi, xem đi !");
DialogResult c = MessageBox.Show("Có xóa luôn hình không?",
"Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (c == DialogResult.No)
{ oldimage System.IO.Path.GetFileName(pictureBoxHinh.ImageLocation)
System.IO.File.Copy(pictureBoxHinh.ImageLocation, apppath + "z\\" + oldimage);
MessageBox.Show("Hình cũ copy vào thư mục D:\\G210TTNgaSale_ToCo\\Images\\z nha !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Lưu hình cũ vào thư mục z: " + ex.Message); }
MessageBox.Show("Xóa hình cũ nha !");
System.IO.File.Delete(pictureBoxHinh.ImageLocation);//Xóa hình trong thư mục Images
} catch (System.Exception ex)// KHÔNG XÓA ĐƯỢC DO CÒN RBTV DL {
MessageBox.Show("Có lỗi xóa thức uống " + ex.Message);//gọi Form xử lý RBTV trước khi Xóa
Fr2QLTU_ToCo11RBTV fr = new
Fr2QLTU_ToCo11RBTV(txtmatu.Text.Trim(), txttentu.Text.Trim());//TRUYỀN matu và tentu SANG FORM XL RBTV fr.ShowDialog();
//B3: Tải BD lên DataGridView sau khi xóa try
// TODO: This line of code loads data into the
'g211TTNgaSaleToCoDS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapter.Fill(this.g211TTNgaSaleToCoDS.DSThucUon g);
}//private void btxoatu_Click(object sender, EventArgs e)
Hình 4.30: Màn hình RBTVThuộc tính Select Command: Command Text: bổ sung mệnh đề Where
Hình 4.31: Bổ sung mệnh đề Where
WHERE (MaTU = @MaTU) namespace G211TTNgaSale_ToCo
{ public partial class Fr2QLTU_ToCo11RBTV : Form
/// HÀM THIẾT LẬP CỦA FORM RBTV = NHẬN THÔNG TIN THỨC UỐNG CẦN CHẤM DỨT/HỦY KINH DOANH static string ms, ten; public Fr2QLTU_ToCo11RBTV(string matu, string tentu)
/// HÀM FORM LOAD = TỰ ĐỘNG CHẠY KHI FORM RBTV NÀY ĐƯỢC MỞ LÊN private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e)
// TODO: This line of code loads data into the
'g211TTNSaTCdsTonRBTV.HangTon' table You can move, or remove it, as needed this.hangTonTableAdapter.Fill(this.g211TTNSaTCdsTonRBTV.HangTon, ms);
} catch (System.Exception) { } this.cTBillTableAdapter.Fill(this.g211TTNSaTCdsPTTRBTV.CTBill, ms);
} catch (System.Exception) { } ctHD_Load(); try
// TODO: This line of code loads data into the
'g211TTNSaTCdsHDRBTV.CTHD' table You can move, or remove it, as needed. this.cTHDTableAdapter.Fill(this.g211TTNSaTCdsHDRBTV.CTHD, ms);
MessageBox.Show("Quý vị muốn XÓA thức uống có mã: " + ms + " tên: " + ten + " => nhưng thức uống này còn RBTV sau cần phải xử lý trước kho Xóa."); lbTitle.Text = "G211: TRỊNH THÚY NGA: XỬ LÝ RBTV DL KHI DỪNG BÁN THỨC UỐNG: " + ms + ": " + ten; gBTon.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN TỒN TẠI CÁC CƠ SỞ ĐẠI LÝ SAU"; gBBill.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN CÁC PHIẾU TÍNH TIỀN (BILLs) SAU"; gBInvoice.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN CÁC HÓA ĐƠN (INVOICEs) SAU";
}//private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e)
===================== XỬ LÝ RBTV DL KHI XÓA THỨC UỐNG (KẾ TOÁN BÁN HÀNG[SALE])
Bước 1: Enable = False Các btn Xử lý 1 … & tooltip
Hình 4.32: Các button xử lý 1 private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e)
////////////////////////////////////// btn1Bill.Enabled = false; //khóa lại btn1Ton.Enabled = false; //khóa lại btn1Invoice.Enabled = false; //khóa lại
MessageBox.Show("Click chọn dòng ‘Tồn hàng’||'chi tiết trong danh mục trên để xác định dòng cần Hủy");
}//private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e)
Bước 2: Xác định vị trí 1 {chi tiết} để có thể Xử lý 1 {chi tiết} RBTV
///CHỌN 1 CHI TIẾT / CÁC DATAGRIDVIEW: Xác định vị trí 1 {chi tiết} để có thể Xử lý 1 {chi tiết} RBTV private void dataGridViewTon_CellContentClick(object sender,
{ vtton = e.RowIndex;//vị trí chọn macs = dataGridViewTon.Rows[vtton].Cells[0].Value.ToString().Trim(); btn1Ton.Enabled = true; //cho Hủy 1
}//private void dataGridViewTon_CellContentClick(object sender,
/// THỦ TỤC CHỌN CHI TIẾT BILL CẦN HỦY static int vtctbill = 0; //Biến toàn cục static lưu vị trí CT BILL đang chọn để Hủy static string map = "";//Biến toàn cục static mã Bill đang chọn để Hủy private void dataGridViewBill_CellContentClick(object sender,
{ vtctbill = e.RowIndex;//vị trí chọn map = dataGridViewBill.Rows[vtctbill].Cells[0].Value.ToString().Trim(); btn1Bill.Enabled = true; //cho Hủy 1
}//private void dataGridViewBill_CellContentClick(object sender,
/// THỦ TỤC CHỌN CHI TIẾT INVOICE CẦN HỦY static int vtcthd = 0; //Biến toàn cục static lưu vị trí CT HĐ đang chọn để Hủy static string mahd = ; ""//Biến toàn cục static Mã hóa đơn đang chọn để Hủy private void dataGridViewInvoice_CellContentClick(object sender, DataGridViewCellEventArgs e)
{ vtcthd = e.RowIndex; //vị trí chọn mahd = dataGridViewInvoice.Rows[vtcthd].Cells[0].Value.ToString().Trim(); btn1Invoice.Enabled = true; //cho hủy 1
}//private void dataGridViewInvoice_CellContentClick(object sender,
Bước 3: Viết lại các thủ tục Load DataGridView
///LOAD CÁC DATAGRIDVIEW = Viết lại các thủ tục Load DataGridView //////////////////////////////////////
/// LOAD TỒN HÀNG private void TonHang_Load()
// TODO: This line of code loads data into the
'g211TTNSaTCdsTonRBTV.HangTon' table You can move, or remove it, as needed. this.hangTonTableAdapter.Fill(this.g211TTNSaTCdsTonRBTV.HangTon, ms); } catch (System.Exception) { }
(dataGridViewTon.Rows.Count < 2)if //luôn có 1 dòng "chờ", nên phải từ 2 rows trở lên = xem là có dữ liệu
{ btn1Ton.Enabled = false; //khóa lại btnATon.Enabled = false;
//btn1Ton.Enabled = true; //mở ra btnATon.Enabled = true;
// TODO: This line of code loads data into the
'g211TTNSaTCdsPTTRBTV.CTBill' table You can move, or remove it, as needed. this.cTBillTableAdapter.Fill(this.g211TTNSaTCdsPTTRBTV.CTBill, ms); } catch (System.Exception) { }
{ btn1Bill.Enabled = false; //khóa lại btnABill.Enabled = false;
//btn1Bill.Enabled = true; //Mở btnABill.Enabled = true;
/// LOAD CHI TIẾT HÓA ĐƠN (INVOICE) private void ctHD_Load()
// TODO: This line of code loads data into the
'g211TTNSaTCdsHDRBTV.CTHD' table You can move, or remove it, as needed. this.cTHDTableAdapter.Fill(this.g211TTNSaTCdsHDRBTV.CTHD, ms); } catch (System.Exception) { }
{ btn1Invoice.Enabled = false; //khóa lại btnAInvoice.Enabled = false;
//btn1Invoice.Enabled = true; //Mở btnAInvoice.Enabled = true;
Gọi lại trong Fr2QLTU_ToCo11RBTV_Load private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e) {
// // TODO: This line of code loads data into the
'g211TTNSaTCdsTonRBTV.HangTon' table You can move, or remove it, as needed. // this.hangTonTableAdapter.Fill(this.g211TTNSaTCdsTonRBTV.HangTon, ms); //}
//catch (System.Exception) { } ctBill_Load();
// // TODO: This line of code loads data into the
'g211TTNSaTCdsPTTRBTV.CTBill' table You can move, or remove it, as needed. // this.cTBillTableAdapter.Fill(this.g211TTNSaTCdsPTTRBTV.CTBill, ms); //}
//catch (System.Exception) { } ctHD_Load();
MessageBox.Show("Quý vị muốn XÓA thức uống có mã: " + ms + " tên: " + ten
+ " => nhưng thức uống này còn RBTV sau cần phải xử lý trước kho Xóa."); lbTitle.Text = "G211: TRỊNH THÚY NGA: XỬ LÝ RBTV DL KHI DỪNG BÁN THỨC UỐNG: " + ms + ": " + ten; gBTon.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN TỒN
TẠI CÁC CƠ SỞ ĐẠI LÝ SAU"; gBBill.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN CÁC
PHIẾU TÍNH TIỀN (BILLs) SAU"; gBInvoice.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN
CÁC HÓA ĐƠN (INVOICEs) SAU";
////////////////////////////////////// btn1Bill.Enabled = false; //khóa lại btn1Ton.Enabled = false; //khóa lại btn1Invoice.Enabled = false; //khóa lại
MessageBox.Show("Click chọn dòng ‘Tồn hàng’||'chi tiết trong danh mục trên để xác định dòng cần Hủy");
}//private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e)
Bước 4: Viết các lệnh SQL: Delete from…./TableAdaptor tương ứng Xóa 1… & Add Query: Xóa ALL
Dừng bán một thức uống tại vị trí chọn (Xóa 1 thức uống)
WHERE (MaCSDL = @MaCSDL) AND (MaTU = @MaTU)
Hủy Tất cả Thức uống: Add Query XoaATon(@MaTU)
Hình 4.34: Kết quả Add Query XoaATon
Hủy 1 Chi tiết Bill tại vị trí chọn
WHERE (MaBill = @MaBill) AND (MaTU = @MaTU)
Hủy Tất cả Chi tiết Bill: Add Query XoaABill(@MaTU)
Hình 4.35: Kết quả Add Query XoaABill(@MaTU) ==========
Hủy 1 Chi tiết Hóa đơn tại vị trí chọn
Hình 4.33: Add Query XoaATon trong hangTonTableAdapter
Hình 4.36: Kết quả Add Query XoaAInvoice(@MaTU)
Bước 5: Viết THỦ TỤC EVENT Xóa 1…
///CÁC THỦ TỤC EVENT: Viết THỦ TỤC EVENT Xóa 1
/// HỦY 1 TỒN THỨC UỐNG TẠI CÁC CƠ SỞ ĐẠI LÝ private void btn1Ton_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy tồn kho của thức uống: " + ten + ": tại Cơ sở đại lý có mã: " + macs + ": đúng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy 1 thức uống: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa
TonHang_Load(); btn1Ton.Enabled = false; //khóa lại
}// private void btn1Ton_Click(object sender, EventArgs e)
/// HỦY 1 CHI TIẾT BILL private void btn1Bill_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy chi tiết Bill của thức uống: " + ten + ": trên Bill có mã: " + map + ": đúng không (Y/N)?" "Xác nhận", ,
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy 1 chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctBill_Load(); btn1Bill.Enabled = false; //khóa lại
}//private void btn1Bill_Click(object sender, EventArgs e)
/// HỦY 1 CHI TIẾT HÓA ĐƠN private void btn1Invoice_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy chi tiết Hóa đơn của thức uống: " + ten + ": trên Hóa đơn có mã: " + mahd + ": đúng không (Y/N)?" "Xác nhận", , cTHDTableAdapter.Delete(mahd, ms);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy 1 chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctHD_Load(); btn1Invoice.Enabled = false; //khóa lại
}//private void btn1Invoice_Click(object sender, EventArgs e)
Bước 6: Viết THỦ TỤC EVENT: Xóa ALL
///CÁC THỦ TỤC EVENT: Viết THỦ TỤC EVENT: Xóa ALL
/// HỦY ALL TỒN THỨC UỐNG private void btnATon_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy tồn kho của thức uống: " + ten + ": tại TẤT CẢ các cơ sở đại lý đúng không (Y/N)?" "Xác nhận", ,
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Thanh lý ALL tồn hàng: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa
TonHang_Load(); btn1Ton.Enabled = false; //khóa lại
}//private void btnATon_Click(object sender, EventArgs e)
/// HỦY ALL CT BILL private void btnABill_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy TẤT CẢ chi tiết Bill của thức uống: " + ten + ": đúng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy ALL chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctBill_Load(); btn1Bill.Enabled = false; //khóa lại
}//private void btnABill_Click(object sender, EventArgs e)
/// HỦY ALL CT HĐ private void btnAInvoice_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy TẤT CẢ chi tiết Hóa đơn của
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy ALL chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctHD_Load(); btn1Invoice.Enabled = false; //khóa lại
}//private void btnAInvoice_Click(object sender, EventArgs e)
FULL CODEs: XỬ LÝ RBTV DL KHI XÓA THỨC UỐNG (KẾ TOÁN BÁN HÀNG [SALE]):
/// HÀM THIẾT LẬP CỦA FORM RBTV = NHẬN THÔNG TIN THỨC UỐNG CẦN CHẤM DỨT/HỦY KINH DOANH static string ms, ten; public Fr2QLTU_ToCo11RBTV(string matu, string tentu)
/// HÀM FORM LOAD = TỰ ĐỘNG CHẠY KHI FORM RBTV NÀY ĐƯỢC MỞ LÊN private void Fr2QLTU_ToCo11RBTV_Load(object sender, EventArgs e)
// // TODO: This line of code loads data into the
'g211TTNSaTCdsTonRBTV.HangTon' table You can move, or remove it, as needed.
// this.hangTonTableAdapter.Fill(this.g211TTNSaTCdsTonRBTV.HangTon, ms);
//catch (System.Exception) { } ctBill_Load();
// // TODO: This line of code loads data into the
'g211TTNSaTCdsPTTRBTV.CTBill' table You can move, or remove it, as needed.
// this.cTBillTableAdapter.Fill(this.g211TTNSaTCdsPTTRBTV.CTBill, ms); //}
//catch (System.Exception) { } ctHD_Load();
// // TODO: This line of code loads data into the
'g211TTNSaTCdsHDRBTV.CTHD' table You can move, or remove it, as needed.
// this.cTHDTableAdapter.Fill(this.g211TTNSaTCdsHDRBTV.CTHD, ms); //}
MessageBox.Show("Quý vị muốn XÓA thức uống có mã: " + ms + " tên: " + ten + " => nhưng thức uống này còn RBTV sau cần phải xử lý trước kho Xóa."); lbTitle.Text = "G211: TRỊNH THÚY NGA: XỬ LÝ RBTV DL KHI DỪNG BÁN THỨC UỐNG: " + ms + ": " + ten; gBTon.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN TỒN TẠI CÁC CƠ SỞ ĐẠI LÝ SAU"; gBBill.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN CÁC PHIẾU TÍNH TIỀN (BILLs) SAU"; gBInvoice.Text = "THỨC UỐNG CẦN 'XOÁ':" + ms + ": " + ten + " ĐANG CÒN CÁC HÓA ĐƠN (INVOICEs) SAU";
////////////////////////////////////// btn1Bill.Enabled = false; //khóa lại private void btnClose_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt đóng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
}//private void btnClose_Click(object sender, EventArgs e)
/// THOÁT TOÀN BỘ CHƯƠNG TRÌNH private void btnExit_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt đóng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
(ch == DialogResult.Yes) { Application.Exit(); }if
}//private void btnExit_Click(object sender, EventArgs e)
///CHỌN 1 CHI TIẾT / CÁC DATAGRIDVIEW: Xác định vị trí 1 {chi tiết} để có thể Xử lý 1 {chi tiết} RBTV
/// THỦ TỤC CHỌN TỒN HÀNG CẦN THANH LÝ static int vtton = 0; //Biến toàn cục static lưu vị trí Tồn hàng đang chọn để Thanh lý static string macs = "";//Biến toàn cục static mã Cơ sở đại lý đang chọn để Thanh lý private void dataGridViewTon_CellContentClick(object sender,
{ vtton = e.RowIndex;//vị trí chọn macs = dataGridViewTon.Rows[vtton].Cells[0].Value.ToString().Trim(); btn1Ton.Enabled = true; //cho Hủy 1
}//private void dataGridViewTon_CellContentClick(object sender,
/// THỦ TỤC CHỌN CHI TIẾT BILL CẦN HỦY static int vtctbill = 0; //Biến toàn cục static lưu vị trí CT BILL đang chọn để Hủy static string map = "";//Biến toàn cục static mã Bill đang chọn để Hủy private void dataGridViewBill_CellContentClick(object sender,
{ vtctbill = e.RowIndex;//vị trí chọn map = dataGridViewBill.Rows[vtctbill].Cells[0].Value.ToString().Trim(); btn1Bill.Enabled = true; //cho Hủy 1
}//private void dataGridViewBill_CellContentClick(object sender,
/// THỦ TỤC CHỌN CHI TIẾT INVOICE CẦN HỦY static int vtcthd = 0; //Biến toàn cục static lưu vị trí CT HĐ đang chọn để Hủy static string mahd = ; ""//Biến toàn cục static Mã hóa đơn đang chọn để Hủy private void dataGridViewInvoice_CellContentClick(object sender, DataGridViewCellEventArgs e)
{ vtcthd = e.RowIndex; //vị trí chọn mahd = dataGridViewInvoice.Rows[vtcthd].Cells[0].Value.ToString().Trim(); btn1Invoice.Enabled = true; //cho hủy 1
}//private void dataGridViewInvoice_CellContentClick(object sender, DataGridViewCellEventArgs e)
///LOAD CÁC DATAGRIDVIEW = Viết lại các thủ tục Load DataGridView //////////////////////////////////////
// TODO: This line of code loads data into the
'g211TTNSaTCdsTonRBTV.HangTon' table You can move, or remove it, as needed. this.hangTonTableAdapter.Fill(this.g211TTNSaTCdsTonRBTV.HangTon, ms); } catch (System.Exception) { }
(dataGridViewTon.Rows.Count < 2)if //luôn có 1 dòng "chờ", nên phải từ 2 rows trở lên = xem là có dữ liệu
{ btn1Ton.Enabled = false; //khóa lại btnATon.Enabled = false;
//btn1Ton.Enabled = true; //mở ra btnATon.Enabled = true;
/// LOAD CHI TIẾT PHIẾU TÍNH TIỀN (BILL) private void ctBill_Load()
// TODO: This line of code loads data into the
'g211TTNSaTCdsPTTRBTV.CTBill' table You can move, or remove it, as needed. this.cTBillTableAdapter.Fill(this.g211TTNSaTCdsPTTRBTV.CTBill, ms); } catch (System.Exception) { }
{ btn1Bill.Enabled = false; //khóa lại btnABill.Enabled = false;
//btn1Bill.Enabled = true; //Mở btnABill.Enabled = true;
/// LOAD CHI TIẾT HÓA ĐƠN (INVOICE) private void ctHD_Load()
// TODO: This line of code loads data into the
'g211TTNSaTCdsHDRBTV.CTHD' table You can move, or remove it, as needed. this.cTHDTableAdapter.Fill(this.g211TTNSaTCdsHDRBTV.CTHD, ms); } catch (System.Exception) { }
{ btn1Invoice.Enabled = false; //khóa lại btnAInvoice.Enabled = false;
//btn1Invoice.Enabled = true; //Mở btnAInvoice.Enabled = true;
DialogResult ch = MessageBox.Show("Thiệt Hủy tồn kho của thức uống: " + ten + ": tại Cơ sở đại lý có mã: " + macs + ": đúng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy 1 thức uống: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa
TonHang_Load(); btn1Ton.Enabled = false; //khóa lại
}// private void btn1Ton_Click(object sender, EventArgs e)
/// HỦY 1 CHI TIẾT BILL private void btn1Bill_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy chi tiết Bill của thức uống: " + ten + ": trên Bill có mã: " + map + ": đúng không (Y/N)?" "Xác nhận", ,
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy 1 chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctBill_Load(); btn1Bill.Enabled = false; //khóa lại
}//private void btn1Bill_Click(object sender, EventArgs e)
/// HỦY 1 CHI TIẾT HÓA ĐƠN private void btn1Invoice_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy chi tiết Hóa đơn của thức uống: " + ten + ": trên Hóa đơn có mã: " + mahd + ": đúng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy 1 chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctHD_Load(); btn1Invoice.Enabled = false; //khóa lại
}//private void btn1Invoice_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy tồn kho của thức uống: " + ten + ": tại TẤT CẢ các cơ sở đại lý đúng không (Y/N)?" "Xác nhận", ,
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Thanh lý ALL tồn hàng: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa
TonHang_Load(); btn1Ton.Enabled = false; //khóa lại
}//private void btnATon_Click(object sender, EventArgs e)
/// HỦY ALL CT BILL private void btnABill_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy TẤT CẢ chi tiết Bill của thức uống: " + ten + ": đúng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy ALL chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctBill_Load(); btn1Bill.Enabled = false; //khóa lại
}//private void btnABill_Click(object sender, EventArgs e)
/// HỦY ALL CT HĐ private void btnAInvoice_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt Hủy TẤT CẢ chi tiết Hóa đơn của thức uống: " + ten + ": đúng không (Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo, MessageBoxIcon.Question);
MessageBox.Show("Xóa xong rồi, xem đi !");
} catch (System.Exception ex) { MessageBox.Show("Lỗi Hủy ALL chi tiết: " + ex.Message); }
//B3: Tải BD lên DataGridView sau khi xóa ctHD_Load(); btn1Invoice.Enabled = false; //khóa lại
}//private void btnAInvoice_Click(object sender, EventArgs e)
4.6 Xử lý chuyển Nhóm: FrChuyenNhomTU_ToCo11.cs,
4.6.1 Giới thiệu về thủ tục chuyển nhóm
Là thủ tục cho phép nhân viên thực hiện việc chuyển thức uống từ Nhóm thức uống này sang Nhóm thức uống khác và từ Thương hiệu này sang Thương hiệu khác
FrChuyenNhomTU_ToCo11.cs được gọi từ màn hình chính (Fr1Main.cs) hoặc được gọi từ màn hình quản lý thức uống (Fr2QLTU_ToCo11):
/// GỌI FORM CHUYỂN NHÓM THỨC UỐNG private void chuyểnNhómTUToolStripMenuItem_Click_1(object sender, EventArgs e)
FrChuyenNhomTU_ToCo11 fr = new FrChuyenNhomTU_ToCo11(); fr.ShowDialog();
}//private void chuyểnNhómTUToolStripMenuItem_Click_1(object sender,
FrChuyenNhomTH_ToCo11.cs được gọi từ màn hình chính (Fr1Main.cs) hoặc được gọi từ màn hình quản lý thức uống (Fr2QLTU_ToCo11):
/// GỌI FORM CHUYỂN NHÓM THƯƠNG HIỆU private void chuyểnNhómThươngHiệuToolStripMenuItem_Click(object sender,
FrChuyenNhomTH fr = new FrChuyenNhomTH(); fr.ShowDialog();
}//private void chuyểnNhómThươngHiệuToolStripMenuItem_Click(object sender, EventArgs e)
Gán thủ tục nêu trên cho mục “Chuyển Nhóm” trong contextMenuStrip1
Hình 4.37: Gán thủ tục Chuyển nhóm thức uống trong contextMenuStrip1
Hình 4.38: Gán thủ tục Chuyển nhóm thương hiệu trong contextMenuStrip1
Và nút chọn “CNTU” (Chuyển Nhóm) trên toolStripButton4
Hình 4.39: Gán thủ tục Chuyển nhóm thức uống trên toolStripButton4
Và nút chọn “CNTH” (Chuyển Nhóm) trên toolStripButton5
4.6.2 Thiết kế Form chuyển nhóm Thức uống, Thương hiệu (Design View)
[1] Thiết kế From chuyển nhóm như Hình 4.14 sử dụng
* 3 NGUỒN (SOURCE), NHÓM ĐÍCH (DESTINATION) và groupBoxN
* 2 ComboBox GroupBox: NHÓM: chọn nhóm chuyển comboBoxS [Nguồn: Source] , comboBoxD [Đích: Destination]
* 2 ListBox: listBoxS [Nguồn: Source] , listBoxD [Đích: Destination]
Hình 4.41: Thiết kế màn hình chuyển nhóm Thức uống
Hình 4.42: Thiết kế màn hình chuyển nhóm Thương hiệu
[2] Kết nối dữ liệu vào 2 ComboBox và 2 ListBox: Use DataBound Items
Viết lại SQL Select TRONG cả: dSThucUongTableAdapterS dSThucUongTableAdapterD và
SELECT MaTU, TenTU, DVT, GiaBan, NgaySanXuat, HSD, MoTa, ConHang, HangTrongNgay, HinhDang, MaThuongHieu, MaNhomTU
WHERE (MaNhomTU = @MaNhomTU) dSThucUongTableAdapterS và dSThucUongTableAdapterD
SELECT MaTU, TenTU, DVT, GiaBan, NgaySanXuat, HSD, MoTa, ConHang,
/// FORM LOAD: THỦ TỤC NÀY TỰ ĐỘNG CHẠY KHI FORM NÀY MỞ LÊN private void FrChuyenNhom_ToCo11_Load(object sender, EventArgs e)
//Tải 2 Nhóm TU lên 2 ComboBox (S, D)
// TODO: This line of code loads data into the
'g211TTNSaTCdsNTUD.DSNhomTU' table You can move, or remove it, as needed. this.dSNhomTUTableAdapterD.Fill(this.g211TTNSaTCdsNhomD.DSNhomTU); // TODO: This line of code loads data into the
'g211TTNSaTCdsNhomTu.DSNhomTU' table You can move, or remove it, as needed. this.dSNhomTUTableAdapterS.Fill(this.g211TTNSaTCdsNhomS.DSNhomTU);
//Tải 2 danh sách Thức uống lên 2 ListBox (S, D) theo Nhóm Thức uống tương ứng đã chọn try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterD.Fill(this.g211TTNSaTCdsMHD.DSThucUong, comboBoxD.SelectedValue.ToString().Trim());
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterS.Fill(this.g211TTNSaTCdsMHS.DSThucUong, comboBoxS.SelectedValue.ToString().Trim());
/// CHỌN LẠI NHÓM BÊN: NGUỒN (S) = CHỌN LẠI NHÓM BÊN NGUỒN (SOURCE) : L private void comboBoxS_SelectedIndexChanged(object sender, EventArgs e)
//Tải lại Dữ liệu trên ListBox sau khi chọn Combobox Nhóm [Bên Source: Left] try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterS.Fill(this.g211TTNSaTCdsMHS.DSThucUong, comboBoxS.SelectedValue.ToString().Trim());
}//private void comboBoxS_SelectedIndexChanged(object sender, EventArgs e) /// CHỌN LẠI NHÓM BÊN: ĐÍCH (d) (DESTINATION) : R private void comboBoxD_SelectedIndexChanged(object sender, EventArgs e) {
//Tải lại Dữ liệu trên ListBox sau khi chọn Combobox Nhóm [Bên Destination: Right] try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterD.Fill(this.g211TTNSaTCdsMHD.DSThucUong, comboBoxD.SelectedValue.ToString().Trim());
}//private void comboBoxD_SelectedIndexChanged(object sender, EventArgs e)
4.6.3 Mã lệnh lập trình Form chuyển nhóm (Codes View)
/// THOÁT VỀ MÀN HÌNH CHÍNH private void btnMain_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt về MÀN HÌNH CHÍNH không (Y/N)?",
"Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
}//private void btnMain_Click(object sender, EventArgs e)
}//private void btnExit_Click(object sender, EventArgs e)
MÃ LỆNH LẬP TRÌNH CÁC THỦ TỤC CHUYỂN NHÓM
Viết lại SQL Update cho dSThucUongTableAdapterS
Viết thủ tục nút lệnh btnLR
B1: Chuyển TU từ Nhóm S sang Nhóm D
B2: Xong, tải dữ liệu mới lên 2 ListBox
/// CHUYỂN 1 TU TỪ NHÓM S (L) => NHÓM D (R) private void btnLR_Click(object sender, EventArgs e)
//B1: Chuyển TU từ Nhóm S sang Nhóm D; try
{ dSThucUongTableAdapterS.Update(comboBoxD.SelectedValue.ToString().Trim(), listBoxS.SelectedValue.ToString().Trim());
} catch (System.Exception ex) { MessageBox.Show("Có lỗi chuyển 1 Thức uống L=>R" + ex.Message);}
//B2: Tải 2 danh sách TU lên 2 ListBox (S, D) theo Nhóm TU tương ứng đã chọn try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterD.Fill(this.g211TTNSaTCdsMHD.DSThucUong, comboBoxD.SelectedValue.ToString().Trim());
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterS.Fill(this.g211TTNSaTCdsMHS.DSThucUong, comboBoxS.SelectedValue.ToString().Trim());
}//private void btnLR_Click(object sender, EventArgs e)
Viết lại SQL Update cho dSThucUongTableAdapterD
/// CHUYỂN 1 TU TỪ NHÓM D (R) => NHÓM S (L) private void btnRL_Click(object sender, EventArgs e)
//B1: Chuyển TU từ Nhóm S sang Nhóm D; try
{ dSThucUongTableAdapterD.Update(comboBoxS.SelectedValue.ToString().Trim(), listBoxD.SelectedValue.ToString().Trim());
} catch (System.Exception ex) { MessageBox.Show("Có lỗi chuyển tất cả các
//B2: Tải 2 danh sách TU lên 2 ListBox (S, D) theo Nhóm TU tương ứng đã chọn try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterD.Fill(this.g211TTNSaTCdsMHD.DSThucUong, comboBoxD.SelectedValue.ToString().Trim());
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterS.Fill(this.g211TTNSaTCdsMHS.DSThucUong, comboBoxS.SelectedValue.ToString().Trim());
}//private void btnRL_Click(object sender, EventArgs e)
Bổ sung thêm câu lệnh SQL UpdateNhomS cho dSThucUongTableAdapterS như
Hình 4.43: Bổ sung câu lệnh SQL cho dSThucUongTableAdapterS bên trong Source (S) Với câu lệnh Update được viết như sau:
Viết thủ tục nút lệnh btnALR
B1: Chuyển Tất cả các TU từ Nhóm S sang Nhóm D;
B2: Xong, tải dữ liệu mới lên 2 ListBox
/// CHUYỂN TẤT CẢ TU TỪ NHÓM S (L) => NHÓM D (R) private void btnALR_Click(object sender, EventArgs e) dSThucUongTableAdapterS.UpdateNhomS(comboBoxD.SelectedValue.ToString().Trim(), listBoxS.SelectedValue.ToString().Trim());
} catch (System.Exception ex) { MessageBox.Show("Có lỗi chuyển 1 Thức uống
//B2: Tải 2 danh sách TU lên 2 ListBox (S, D) theo Nhóm TU tương ứng đã chọn try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterD.Fill(this.g211TTNSaTCdsMHD.DSThucUong, comboBoxD.SelectedValue.ToString().Trim());
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHS.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterS.Fill(this.g211TTNSaTCdsMHS.DSThucUong, comboBoxS.SelectedValue.ToString().Trim());
}//private void btnALR_Click(object sender, EventArgs e)
Bổ sung thêm câu lệnh SQL UpdateNhomD cho dSThucUongTableAdapterD tương tự 4.6.3.3
Với câu lệnh Update được viết như sau:
Viết thủ tục nút lệnh btnARL
B1: Chuyển Tất cả các TU từ Nhóm D sang Nhóm S;
B2: Xong, tải dữ liệu mới lên 2 ListBox
/// CHUYỂN TẤT CẢ TU TỪ NHÓM D (R) => NHÓM S (L) private void btnARL_Click(object sender, EventArgs e)
//B1: Chuyển TU từ Nhóm S sang Nhóm D; try
{ dSThucUongTableAdapterD.UpdateNhomD(comboBoxS.SelectedValue.ToString().Trim(), listBoxD.SelectedValue.ToString().Trim());
} catch (System.Exception ex) { MessageBox.Show("Có lỗi chuyển tất cả các Thức uống R=>L" + ex.Message); }
//B2: Tải 2 danh sách TU lên 2 ListBox (S, D) theo Nhóm TU tương ứng đã chọn try
// TODO: This line of code loads data into the
'g211TTNSaTCdsMHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapterD.Fill(this.g211TTNSaTCdsMHD.DSThucUong, comboBoxD.SelectedValue.ToString().Trim());
}//private void btnARL_Click(object sender, EventArgs e)
4.6.4 Các xử lý khác trong Form chuyển nhóm
Bổ sung công cụ ToolTip từ ToolBox vào App: toolTip1
4.6.4.1 Ẩn các nút trong các trường hợp không chuyển được
* Không chọn được [.Enable = False] các nút chuyển( > < >> chờ đến khi KH chính thức thanh toán (tính tiền) BILL đó thì mới lậpInvoice và xóa (hủy = quyết toán) mục công nợ tương ứng Ngoài ra, từ BILL có thể phải lập ra phiếu thu (Receipt) trong trường hợp tra góp hoặc tạm thu (thu chưa đủ hoặc chính xác); thực hiện trên hệ thống Quản lý công nợ (không thực hiện trong phân hệ bán hàng).
+ Khi lập BILL thì thông tin của BILL được lưu TẠM trên bộ nhớ RAM của máy tính (dùng DataTable) và chỉ khi chuyển sang Invoice [table: HD] hoặc hạng mục công nợ thì các thông tin tiếp theo (từ BILL) mới sẽ được lưu trên DB của MS SQL (trong Tables) Sale: BILL = Phiếu tính tiền {Chọn [thức uống] vào BILL & số lượng}
“Lập Hóa đơn” “Chuyển công nợ (phải thu)” “Đóng form, về màn hình chính”
Hình 5.44: Màn hình lập phiếu tính tiền
5.2.2 Lập trình (Code) namespace G211TTNgaSale_ToCo
{ public partial class Fr3IBill_ToCo11 : Form
{ static DataTable b = new DataTable(); //BIẾN TOÀN CỤC = LƯU THÔNG TIN CHI
TIẾT CỦA BILL => S.D ALL THỦ TỤC (System.Data) public Fr3IBill_ToCo11()
/// private void Fr3IBill_ToCo11_Load(object sender, EventArgs e)
// TODO: This line of code loads data into the
'g211TTNSaTCdsTUBill.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapter.Fill(this.g211TTNSaTCdsTUBill.DSThucUong); } catch(System.Exception) { }
// TODO: This line of code loads data into the
'g211TTNSaTCdsNhomTUB.DSNhomTU' table You can move, or remove it, as needed. this.dSNhomTUTableAdapter.Fill(this.g211TTNSaTCdsNhomTUB.DSNhomTU); // TODO: This line of code loads data into the
'g211TTNSaTCdsTHB.DSThuongHieu' table You can move, or remove it, as needed. this.dSThuongHieuTableAdapter.Fill(this.g211TTNSaTCdsTHB.DSThuongHieu); // TODO: This line of code loads data into the 'g211TTNSaTCdsBill.DS_Bill' table. You can move, or remove it, as needed. this.dS_BillTableAdapter.Fill(this.g211TTNSaTCdsBill.DS_Bill);
//ĐỊNH NGHĨA các cột DL của BIẾN TOÀN CỤC DataTable (nêu trên)
Form_Load(…) b.Rows.Clear();//Xóa ALL dòng rác b.Columns.Clear();//Xóa ALL cột rác b.Columns.Add("msmh", typeof(string)); b.Columns.Add("tenmh", typeof(string)); b.Columns.Add("giaban", typeof(float)); b.Columns.Add("dvt", typeof(string)); b.Columns.Add("sl", typeof(float)); //chủ yếu các đề tài of sv là int b.Columns.Add("tien", typeof(float), "sl * giaban");//CỘT NÀY LUÔN ĐƯỢC DataTable TỰ TÍNH => KHÔNG NHẬP (DB: 3NF)
//CHO LẬP HÓA ĐƠN OR CHUYỂN CÔNG NƠ (PHẢI THU) NẾU NHƯ BILL CÓ ÍT NHẤT 1 MỘT MH
}//private void Fr3IBill_ToCo11_Load(object sender, EventArgs e)
/// THỦ TỤC CHỌN NHÓM THỨC UỐNG MỚI
/// private void comboBoxntu_SelectedIndexChanged(object sender, EventArgs e) { try
// TODO: This line of code loads data into the
'g211TTNSaTCdsTUBill.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapter.Fill(this.g211TTNSaTCdsTUBill.DSThucUong); } catch (System.Exception) { } txtsoluong.Text = "1";
}//private void comboBoxntu_SelectedIndexChanged(object sender, EventArgs e)
/// XÁC ĐỊNH VỊ TRÍ THƯC UỐNG ĐƯỢC CHỌN => CHUYỂN BILL TÍNH TIỀN ///
/// static int vt = 0;//biến toàn cục Lưu vị trí của thức uống được chọn để đưa vào phiếu tính tiền (BILL), mặc định vị trí 0 = đầu tiên = không chọn -> tự hiểu là món đàu tiên private void dataGridViewNTU_CellContentClick(object sender,
/// CHỌN THỨC UỐNG VÀO PHIẾU TÍNH TIỀN
/// private void btnchon_Click(object sender, EventArgs e)
{//B1: KIỂM TRA: CÓ HÀNG TRONG DS TU HAY KHÔNG (Phải có ít nhất 1 Thức uống thì mới có thể chọn vào phiếu tính tiền)
(dataGridViewNTU.Rows.Count > 1)if //có TU trong ds sách TU; trong dataGridView của Winform luôn có 1 dòng "chờ"; nên có item thì count từ 2 trở lên {
//B2: lấy thức uống đã chọn trong ds để chuẩn bị nạp vào phiếu tính tiền (BILL)-> nếu ko chọn (or mặc định) là thức uống đầu tiên
//B3: XỬ LÝ trùng thức uống đã có sẵn trong BILL -> CHỈ TĂNG SỐ LƯỢNG (không thêm thức uống mới) foreach (DataRow r b.Rows)in
(r[if "matu"].ToString().Trim() = h.Cells[0].Value.ToString().Trim())//Thức uống đang chọn đã có trong BILL
{ r["sl"] = (float)r["sl"] + float.Parse(txtsoluong.Text.Trim()); goto kt; //khi phát hiện thức uống đã có trong BILL => ko chạy for này nữa -> đến kt (dừng for)
}//chạy hết vòng lặp for mà không có if nào đc thực hiện => thức uống đang chọn chưa có trong BLL
//B4: Thêm thức uống mới đã chọn trong ds nạp vào phiếu tính tiền
(BILL): nếu trong BILL chưa có TU này(matu,tentu, giaban:float, dvt,sl, tien) b.Rows.Add(h.Cells[0].Value.ToString().Trim(), h.Cells[1].Value.ToString(), float.Parse(h.Cells[2].Value.ToString().Trim()), h.Cells[3].Value.ToString(), float.Parse(txtsoluong.Text.Trim()));
//B5: Tính TỔNG SỐ thức uống & TỔNG TIỀN TRÊN BILL: XUẤT RA lbSUM kt: lbsum.Text = "PHIẾU TÍNH TIỀN HIỆN CÓ :" + b.Compute("Count(matu)",
"").ToString() + " THỨC UỐNG, TỔNG TIỀN = " + b.Compute("Sum(tien)" "", ).ToString() + " đ"; dataGridViewBill.DataSource = b;//Tải DataTable b (đã cập nhật chi tiết thức uống) lên dataGridViewBill
//NHỚ PHẢI ĐỊNH NGHĨA CÁC CỘT CỦA dataGridViewBill THEO ĐÚNG THỨ TỰ, KIỂU DL ĐÃ Đ / N b TRONG Form_Load(phải đúng tên trong DataPropertyName)
//CHO LẬP HÓA ĐƠN OR CHUYỂN CÔNG NỢ (PHẢI THU) NẾU NHƯ BILL CÓ ÍT NHẤT 1 MỘT TU
}//private void btnchon_Click(object sender, EventArgs e)
/// KIỂM TRA BILL: CÓ THỨC UỐNG NÀO KHÔNG: NẾU KHÔNG THÌ ẨN CÁC NÚT LỆNH : Xóa chi tiết, Sửa sl, Lập hóa đơn, chuyên công nờ
{ //CHO LẬP HÓA ĐƠN OR CHUYỂN CÔNG NỢ (PHẢI THU): KHI BILL CÓ ÍT NHẤT 1 MỘT TU
{ btnlaphoadonBill.Visible = true; btncongno.Visible = true; btndelete.Visible = true; btndelete.Visible = false; btnsl.Visible = false;
/// ĐÓNG FORM VỀ MÀN HÌNH CHÍNH
/// private void btnMain_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Bạn có muốn đóng Form này về màn hình chính không(Y/N)?" "Xác nhận", , MessageBoxButtons.YesNo,
(ch == DialogResult.Yes) if // Người dùng chọn 'Yes' là đồng ý đóng Form về màn hình chính
}//private void button1_Click(object sender, EventArgs e)
/// XÁC ĐỊNH VỊ TRÍ thức uống CẦN XÓA KHỎI BILL
/// static int pos = 0; private void dataGridViewBill_CellContentClick(object sender,
}//private void dataGridViewBill_CellContentClick(object sender,
/// XÓA MỘT CHI TIẾT THỨC UỐNG KHỎI BILL
/// private void btndelete_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt muốn hủy thức uống :" + b.Rows[pos]["tenTU"].ToString() + " khỏi BILL (Y/N)?" "Xác nhận", ,
{ b.Rows.RemoveAt(pos); //xóa món ăn tại vị trí pos =nsd đã chọn CellClick( ) //TÍNH LẠI TỒNG SỐ MÓN & TỔNG SỐ TIỀN CỦA BILL lbsum.Text = "PHIẾU TÍNH TIỀN HIỆN CÓ :" + b.Compute("Count(matu)",
"").ToString() + " THỨC UỐNG, TỔNG TIỀN = " + b.Compute("Sum(tien)" "", ).ToString() + " đ"; dataGridViewBill.DataSource = b;//Tải DataTable b (đã cập nhật chi tiết thức uống) lên dataGridViewBILL
//CHO LẬP HÓA ĐƠN OR CHUYỂN CÔNG NỢ (PHẢI THU) NẾU NHƯ BILL CÓ ÍT NHẤT 1 MỘT TU
}//private void btndelete_Click(object sender, EventArgs e)
}//public partial class Fr3IBill_ToCo11 : Form
Thiết kế và lập trình HÓA ĐƠN (INVOICE) Fr4OInvoice_ToCo11
Hình 5.45: Màn hình lập hóa đơn
5.3.2 Lập trình (Code) namespace G211TTNgaSale_ToCo
{ public partial class Fr4OInvoice_ToCo11 : Form
{ static DataTable b = new DataTable(); //BIẾN TOÀN CỤC = LƯU THÔNG TIN CHI TIẾT CỦA BILL => S.D ALL THỦ TỤC (System.Data) static Boolean kh = false, nv = false;// bắt đầu lập hoá đơn public Fr4OInvoice_ToCo11()
} private void Fr4OInvoice_ToCo11_Load(object sender, EventArgs e)
(b != if null)//ĐÃ CÓ PHIẾU TÍNH TIỀN (BILL) KHÔNG RỔNG => LẬP INVOICE (Đã Định nghĩa đúng DataPropertiesNaem)
{ lbsum.Text = "CHI TIẾT HÓA ĐƠN: HIỆN CÓ :" + b.Compute("Count(matu)",
"").ToString() + " THỨC UỐNG, TỔNG TIỀN = " + b.Compute("Sum(tien)" "", ).ToString() + " đ"; dataGridViewBill.DataSource = b;//Tải DataTable b (đã cập nhật chi tiết món ăn) lên dataGridViewBILL
} else// BILL rổng => chắc chắn ko xảy ra (bỏ if else vẫn đúng)
// TODO: This line of code loads data into the
'g211TTNSaTCdsTUHD.DSThucUong' table You can move, or remove it, as needed. this.dSThucUongTableAdapter.Fill(this.g211TTNSaTCdsTUHD.DSThucUong); // TODO: This line of code loads data into the 'g211TTNSaTCdsNV.DSNV' table You can move, or remove it, as needed. this.dSNVTableAdapter.Fill(this.g211TTNSaTCdsNV.DSNV);
// TODO: This line of code loads data into the 'g211TTNSaTCdsKH.DSKH' table You can move, or remove it, as needed. this.dSKHTableAdapter.Fill(this.g211TTNSaTCdsKH.DSKH);
}//private void Fr4OInvoice_ToCo11_Load(object sender, EventArgs e)
/// ĐÓNG FORM INVOICE VỀ FORM MAIN: CLOSE => MAIN
/// private void btndong_Click(object sender, EventArgs e)
DialogResult ch = MessageBox.Show("Thiệt đóng không (Y/N)?" "Xác nhận", , private void Invoice()
(!kh || !nv)if //THÊM DẤU ! CHỖ KH
{ groupBoxthongtinhoadon.Visible = false; lbmshd.Text = ;"" lbngaylap.Text = ;"" btnlaphoadon.Enabled = true; btnhuyhd.Visible = false;
DateTime t = System.DateTime.Now; lbngaylap.Text = System.DateTime.Now.ToShortDateString(); lbmshd.Text = txtTimKh.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();
} lbTBmahd.Visible = true; lbmshd.Visible = true; lbTBngaylap.Visible = true; lbngaylap.Visible = true; lbloaihd.Visible = true; lbmaloai.Visible = true; lbmsloai.Visible = true; comboBoxloai.Visible = true; lbCTHD.Visible = true; dataGridViewBill.Visible = true; lbsum.Visible = true; lbngaylap.Text = System.DateTime.Now.ToShortDateString(); lbmshd.Text = txtTimKh.Text.Trim();
/// private void btnchonnv_Click(object sender, EventArgs e) { btnhuychonnv.Visible = true; comboBoxchonnv.Enabled = false; btnchonnv.Enabled = false; lbngay.Text = System.DateTime.Now.ToShortDateString(); lbgio.Text = lbtime.Text.Trim(); nv = true;
}//private void btnchonnv_Click(object sender, EventArgs e)
/// private void btnhuychonnv_Click(object sender, EventArgs e) { btnhuychonnv.Visible = false; comboBoxchonnv.Enabled = true; btnchonnv.Enabled = true; lbngay.Text = System.DateTime.Now.ToShortDateString(); lbgio.Text = lbtime.Text.Trim(); lbgio.Text = "Chưa bắt đầu"; nv = false;//
/// private void btnTimKH_Click(object sender, EventArgs e)
{ btnhuytim.Visible = true;//huỷ tìm bất kỳ lúc nào
(btnTimKH.Text.Trim() == if "Tìm KH") // tìm đơn vị
{ this.dSKHTableAdapter.Fill(this.g211TTNSaTCdsKH.DSKH);
//Tìm không có KH nên cho KH nhập tên KH mới (hiện nội dung thêm KH mới, ẩn datagridview)
{ btnTimKH.Text = "Thêm Khách"; dataGridViewKH.Visible = false;
{ btnTimKH.Text = "Chọn KH"; dataGridViewKH.Visible = true;
} else if (btnTimKH.Text.Trim() == "Thêm Khách")
// hiện các textbox nhập thông tin lbmakh.Visible = true; lbhoten.Visible = true; lbgioitinh.Visible = true; txtmakh.Visible = true; txthoten.Visible = true; txtGT.Visible = true; txthoten.Enabled = true; txtGT.Enabled = true; txtmakh.Enabled = true;
// Xoá trống các textbox để nhập mới txtmakh.Text = txtTimKh.Text.Trim(); txthoten.Text = ;"" txtGT.Text = ;""
// đổi nhãn nút lệnh -> "Lưu KH" mới nhập btnTimKH.Text = "Lưu khách";
} else if (btnTimKH.Text.Trim() == "Lưu khách")
// dSKHTableAdapter.Insert(txtmakh.Text, txthoten.Text, datetimePickerNgaySinh, txtGT.Text, txtsdt.Text, txtmst.Text, txtdiemtv.Text); MessageBox.Show("Đã thêm khách hàng mới"); txtTimKh.Text = txtmakh.Text.Trim(); btnTimKH.Text = "Chọn KH"; txtmakh.Enabled = false; txthoten.Enabled = false; txtGT.Enabled = false;
MessageBox.Show("Có lỗi thêm khách hàng mới =" + ex.Message); btnTimKH.Text = "Thêm Khách";
} else if (btnTimKH.Text.Trim() == "Chọn KH")
// ẩn dataGridViewKH dataGridViewKH.Visible = false;
// khoá các ô text box txtmakh.Enabled = false; txthoten.Enabled = false; txtGT.Enabled = false; lbmakh.Visible = true; lbhoten.Visible = true; lbgioitinh.Visible = true; txtmakh.Visible = true; txthoten.Visible = true; txtGT.Visible = true;
// khoá không cho tìm nữa btnTimKH.Enabled = false; txtTimKh.Enabled = false;
// các xử lý liên quan đến hoá đơn kh = true;
}//private void btnTimKH_Click(object sender, EventArgs e) //xác định vị trí chọn của khách hàng static int vt = 0; private void dataGridViewKH_CellContentClick(object sender, DataGridViewCellEventArgs e)
{ vt = e.RowIndex; txtmakh.Text = txtTimKh.Text dataGridViewKH.Rows[vt].Cells[0].Value.ToString().Trim(); txthoten.Text = dataGridViewKH.Rows[vt].Cells[1].Value.ToString(); txtGT.Text = dataGridViewKH.Rows[vt].Cells[4].Value.ToString(); }//private void dataGridViewKH_CellContentClick(object sender, DataGridViewCellEventArgs e)
/// private void btnhuytim_Click(object sender, EventArgs e)
{ btnTimKH.Enabled = true; txtTimKh.Enabled = true; txtTimKh.Text = ;"" btnTimKH.Text = "Tìm KH"; lbmakh.Visible = false; lbhoten.Visible = false; lbgioitinh.Visible = false; txtmakh.Visible = false; txthoten.Visible = false; txtGT.Visible = false; txtmakh.Text = ;"" txthoten.Text = ;"" txtGT.Text = ;"" dataGridViewKH.Visible = false; btnhuytim.Visible = false; kh = false;
}//private void btnhuytim_Click(object sender, EventArgs e)
/// private void btnlaphoadon_Click(object sender, EventArgs e)
// hoaDonTableAdapter.Insert(lbmshd.Text.Trim(),
DateTime.Parse(lbngaylap.Text.Trim()), txtTimKh.Text.Trim(), lbmsnv.Text.Trim(), "", comboBoxloai.SelectedIndex);
MessageBox.Show("Thêm hoá đơn thành công"); foreach (DataRow r b.Rows)in
// chiTietHDTableAdapter.Insert(r["mshh"].ToString().Trim(), lbmshd.Text.Trim());/*, r["mshh"].ToString().Trim()*///, double.Parse(r["sl"].ToString().Trim()));
//MessageBox.Show("Thêm CTHD xong");
MessageBox.Show("Thêm CTHD xong");
} catch (System.Exception ex) { MessageBox.Show("Có lỗi thêm HD và CTHD" + ex.Message); } btnchonnv.Visible = false; btnhuytim.Visible = false;
}//private void btnlaphoadon_Click(object sender, EventArgs e)
/// private void comboBoxchonnv_SelectedIndexChanged(object sender, EventArgs e)
{ this.dSNVTableAdapter.Fill(this.g211TTNSaTCdsNV.DSNV); lbmsnv.Text = comboBoxchonnv.SelectedValue.ToString().Trim();
}//private void comboBoxchonnv_SelectedIndexChanged(object sender, EventArgs e)
/// private void btnhuyhd_Click(object sender, EventArgs e)
// chiTietHDTableAdapter.Delete(r["mshh"].ToString().Trim(), lbmshd.Text.Trim() /*r["mshh"].ToString().Trim()*/);
//MessageBox.Show("Xoá CTHD xong");
MessageBox.Show("Xoá hoá đơn thành công");
// hoaDonTableAdapter.Delete(lbmshd.Text.Trim());
}//private void btnhuyhd_Click(object sender, EventArgs e)
/// private void timer1_Tick(object sender, EventArgs e) { lbtime.Text = System.DateTime.Now.ToLongTimeString(); }//private void timer1_Tick(object sender, EventArgs e) }//public partial class Fr4OInvoice_ToCo11 : Form
THIẾT LẬP BỘ CÀI ĐẶT SETUP CHO PHÂN HỆ KẾ TOÁN 106 6.1 Giới thiệu chung
Công cụ sử dụng thiết lập bộ cài đặt Setup cho App
Bộ công cụ hỗ trợ lập bộ cài đặt (Setup/Install) của các phần mềm WinApp:
[1] VSI_bundle.exe (Visual Studio Insataller): Gói dịch vụ cài đặt bổ sung vào MS Visual Để bộ công công cụ MS Visual Studio NET có chức năng đóng gói (Package) bộ cài đặt (Setup/Install) thì phải cài đặt bổ sung bộ hỗ trợ kèm theo (nêu trên) với phiên bản phù hợp (Ví dụ: 2015, 2017, )
Thiết lập bộ cài đặt Setup cho App
Phài mở source winapp trên Visual Studio NET, đản bảo chạy được: không lỗi.
Bước 1: THÊM PROJECT MỚI VÀO SOLUTION HIỆN TẠI, Như
+ Phải[tên Solution]->Add->New Project: G211TTN_SaleToCoSetup
Hình 6.46: Lập Project bộ cài đặt Setup + Installed: Other Project Types : Visual Studio Installer (Lập bộ cài đặt đơn giản): + Setup Project
Hình 6.47: Thiết lập các thông tin cho Project Setup
Bước 2: THIẾT LẬP CÁC THÀNH PHẦN KẾT QUẢ CÀI ĐẶT
+ Application Folder : Thư mục của phần mềm trong %OS%\ Program Files … + User’s Desktop : trên nền Desktop
+ User’s Program Menu: mục chọn trong [Start]->Programs->…
Phải[mục tương ứng nêu trên]->Add->Project Output: Primary Output (Active)
Hình 6.49: Thiết lập biên dịch bộ Setup
Bước 4: BIÊN DỊCH BỘ CÀI ĐẶT
[Build]->(Re)Build Solution: trên dòng trạng thái (dưới, trái) Successful
Sản phẩm bộ cài trong thư mục:
D:\G210TTNgaSale_ToCo\G211TTNga_SaleToCoSetup\Release\setup.exe : vì đã lực chọn trong Bước 3 là Release;
D:\G210TTNgaSale_ToCo\G211TTN_SaleToCoSetup\Debug
CHUYỂN GIAO BỘ CÀI ĐẶT : SETUP CHO NSD
Khi cần thảo gỡ (Uninstall) phần mềm thì phải thực hiện trong:
+ Control Panel: Programs and Features
+ Không được Xóa thư mục phần mềm %OS%\Program Files…
C:\Program Files (x86)\TRINH THUY NGA\G211TTN_SaleToCoSetup
Vì nếu “Xóa” sẽ không cài đặt lại được (khi cài đặt sẽ bị báo là đã có => chỉ có thể khắc phục bằng cách Xóa các Key trong Registry)
Bước 5: THIẾT LẬP THÊM CÁC ĐẶC TÍNH KHÁC CỦA BỘ CÀI ĐẶT Đặt chọn vào vị trí Project Setup / Solution Explorer:
Sử dụng thanh công cụ ngày trên Solution Explorer
+ File System Editor: Thiết lập các kết quả cài đặt / máy tính NSD
+ Registry Editor: thiết lập các Key bảo mật và tự động / Registry của máy tính NSD + User’s Interface Editor: Thiết kế các màn hình chờ trong quá trình cài đặt PM
Start: Bắt đầu cài đặt
Progress: Trong quá trình cài đặt
End : kết thúc việc cài đặt
Có thể: thêm / xóa bớt (Thay đổi thứ tự) các cửa sổ màn hình chờ cài đặt
Thay đổi = thiết kế lại (VD: Việt hóa) : sử dụng của sổ Properties
+ Custom Action: Thiết kế các các thành phần hỗ trợ khác của bộ cài đặt ;
VD bộ tháo gỡ (Uninstall, Rolback, )
+ Launch Conditional Editor: Thiết lệp kênh giao tiếp trên Inrternet giữa NSD và công ty sản xuất phần mềm để hỗ trợ NSD phần mềm có bản quyền (VD: khi xảy ra lỗi, gửi lổi về công ty sản xuất -> hỗ trợ trực tuyến được).
+ File Types Editor: thiếp lập các “đuôi” = phần mở rộng của tên các tập tin liên quan PM (VD: PM Word có các “đuôi” khi double click sẽ mở PM Word, doc docx …
BIÊN DỊCH LẠI -> CÀI ĐẶT LẠI: ĐỂ CÓ TÁC DỤNG
GHI CHÚ: CÁC THUỘC TÍNH KHÁC CỦA PM
[Solution Explorer]: Properties->AssemblyInfo.cs
+ Phải cài đặt DB riêng -> khai báo lại chuỗi kết nối trong file XML kèm theo sau khi cài đặt
Cài đặt Setup App vào máy tính NSD
Hình 6.50: Màn hình khi đã setup xong