Phát triển ứng dụng phân nhóm khách hàng - Ngân hàng Á Châu

Luận văn tốt nghiệp: Phát triển ứng dụng phân nhóm khách hàng -Ngân hàng Á Châu CHƯƠNG 1: CƠ SỞ LÝ LUẬN VÀ GIỚI THIỆU NGÂN HÀNG Á CHÂU 3 1.1. Cơ sở lý luận 3 1.1.1. Marketing: 3 1.1.1.1. Hiểu khách hàng: 3 1.1.1.2. Thu thập thông tin về khách hàng: 4 1.1.2. Các phương thức của Marketing: 5 1.1.2.1. POSM: Point of sales material, Point of sales merchandise, product of sales material: truyền thông tại điểm bán hàng. 5 1.1.2.2. Khuyến mại hay khuyến mãi là hoạt động xúc tiến thương mại của thương nhân nhằm xúc tiến việc mua bán hàng hoá, cung ứng dịch vụ bằng cách dành cho khách hàng những lợi ích nhất định. 5 1.1.2.3. Quảng cáo là hình thức tuyên truyền, giới thiệu thông tin về sản phẩm, dịch vụ, công ty hay ý tưởng, quảng cáo là hoạt động truyền thông phi trực tiếp giữa người với người mà trong đó người muốn truyền thông phải trả tiền cho các phương tiện truyền thông đại chúng để đưa thông tin đến thuyết phục hay tác động đến người nhận thông tin 6 1.1.2.4. Marketing trực tiếp: 7 1.1.2.4.1. Khái niệm và bản chất 7 1.1.2.4.2. Chức năng 8 1.1.2.4.3. Vai trò 8 1.1.2.4.4. Các phương thức 9 1.1.2.4.5. Các yếu tố quyết định sự thành công 9 1.1.3. Những khó khăn trong xây dựng, triển khai chiến lược marketing và cách khắc phục: 9 1.1.3.1. Kế hoạch triển khai tài liệu thương hiệu được quản lí kém sẽ là một túi tiền không đáy. 9 1.1.3.2. Cần xây dựng kế hoạch triển khai dự án 9 1.1.3.3. Thu thập thông tin cụ thể, tránh những thông tin mập mờ 10 1.1.3.4. Thiết kế là công đoạn ít tốn kém nhất nhưng tốn nhiều công sức nhất 10 1.1.3.5. Tính trọn vẹn của những mẫu thiết kế phải được giữ nguyên 10 1.1.3.6. Đưa những mẫu thiết kế căn bản lên nhiều phương tiện khác nhau như đèn, phương tiện giao thông, văn phòng phẩm và trang phục. 10 1.1.3.7. Thực hiện truyền thông nội bộ về dự án 10 1.1.3.8. Đừng quên kế hoạch truyền thông nhằm thông báo cho khách hàng, giới truyền thông và cổ đông 11 1.2. Tổng quan về ngân hàng thương mại cổ phần Á Châu 11 1.2.1. Giới thiệu về ngân hàng Á Châu 11 1.2.1.1. Quá trình hình thành và phát triển 11 1.2.1.2. Mạng lưới hoạt động 11 1.2.1.3. Định hướng phát triển 12 1.2.1.4. Cơ cấu tổ chức: Hình 1.1: Cơ cấu tổ chức 13 1.2.1.5. Thành tựu: 16 1.2.1.6. Ngành nghề kinh doanh 17 1.2.1.7. Tình hình hoạt động 17 1.2.2. Giới thiệu bộ phận kinh doanh khối Khách Hàng Cá Nhân 19 1.2.2.1. Đối tượng phục vụ của khối Khách Hàng Cá Nhân 20 1.2.2.2. Sản phẩm, dịch vụ Ngân hàng phục vụ cho khách hàng cá nhân 20 1.2.2.3. Kênh phân phối cung cấp sản phẩm cho khách hàng cá nhân 20 1.2.2.4. Chức năng 20 1.2.2.4.1. Xây dựng và phát triển: 20 1.2.2.4.2. Tham gia vào đào tạo và phát triển đội ngũ nhân sự phục vụ khách hàng cá nhân. 20 1.2.2.5. Cơ cấu tổ chức của khối 20 1.2.2.6. Nhiệm vụ 22 1.2.2.6.1. Xây dựng kế hoạch: 22 1.2.2.6.2. Theo dõi, quản lý và đánh giá hiệu quả kinh doanh: 22 1.2.2.7. Tổ chức 23 1.2.2.7.1. Bộ phận/Tổ kế hoạch: 23 1.2.2.7.2. Bộ phận/Tổ quản lý kinh doanh: 23 1.2.2.8. Mô tả công việc của nhân viên kê hoạch 23 1.2.2.8.1. Thu thập và phân tích thị trường: 23 1.2.2.8.2. Phân tích dữ liệu khách hàng cá nhân (KHCN) 24 1.2.2.8.3. Đề xuất, phối hợp và quản lý thực hiện hoạt động nghiên cứu thị trường (NCTT) 24 1.2.2.8.4. Xây dựng kế hoạch marketing SP/Dịch Vụ KHCN: 24 1.2.2.8.5. Phối hợp quản lý thực hiện vá đánh giá hiệu quả hoạt động marketing SP/Dịch Vụ KHCN 24 CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ CƠ SỞ DỮ LIỆU 24 2.1. Khái niệm 24 2.2. Phân tích và thiết kế cơ sở dữ liệu 25 2.2.1. Các khái niệm thông tin 25 2.2.2. Yêu cầu đặt ra 26 2.2.2.1. Yêu cầu lưu trữ, quản trị 26 2.2.2.2. Yêu cầu xử lý: 26 2.2.2.3. Yêu cầu phân tích, đánh giá 26 2.2.2.4. Yêu cầu dự báo 27 2.2.3. Mô hình thực thể và mối kết hợp 27 2.2.4. Mô hình Codd 28 2.2.5. Ràng buộc toàn vẹn 29 2.2.6.1. Tân từ: 29 2.2.6.2. Đặc tả hình thức: 30 2.2.6.3. Bảng tầm ảnh hưởng: 30 2.2.6. Các phụ thuộc hàm và chuẩn hóa dữ liệu 31 CHƯƠNG 3: GIẢI PHÁP 33 3.1. Giới thiệu SQL SERVER 2005: 34 3.2. Giới thiệu Visual Studio 2005 35 3.3. Giới thiệu phần mềm phân nhóm khách hàng: 36 3.4. Hướng dẫn sử dụng: 36 3.5. Lợi ích khi sử dụng chương trình: 74 3.5.1. Lợi ích về thời gian: 74 3.5.2. Lợi ích về cài đặt: 75 3.5.3. Lợi ích về sử dụng: 75 3.6. Yêu cầu về các phần mềm hỗ trợ khi cài đặt chương trình: 75 3.6.1. Yêu cầu cài đặt Microsoft SQL Server 2005: 75 3.6.2. Yêu cầu cài đặt phần mềm XlsToSql chuyển đổi dữ liệu từ file excel sang database của SQL Server: 75 Chương 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 79 4.1. Thu thập dữ liệu ở các khu vực khác: 80 4.2. Điền đầy đủ các giá trị muốn thống kê trong combobox 80 4.3. Thiết kế form cho Import dữ liệu: 80 Sử dụng phần mềm khác để Import dữ liệu đôi khi gây bất tiện cho người sử dụng, vì vậy cần thiết kế giao diện cho phép Import dữ liệu từ file excel trong phần mềm. Các giao diện thì tương tự như các giao diện của phần mềm XlsToSql. 80 4.4. Bên cạnh thống kê bằng các con số, nên có những mô hình cho thấy cơ cấu khách hàng được phân nhóm theo từng tiêu chí. 80 4.5. Kết hợp bái toán phân nhóm khách hàng với phương pháp datamining: 80 Mục đích đi tìm luật, giúp nhận diện được thói quen, sở thích của khách hàng 80

doc81 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2188 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Phát triển ứng dụng phân nhóm khách hàng - Ngân hàng Á Châu, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
) R3 Thêm Xóa Sửa NV + - +(IDKH, MaKH) R4 Thêm Xóa Sửa CT_BV + - +(MaGD) NV + + +(IDKH) R5 Thêm Xóa Sửa NV + - +(Gioitinh) R6 Thêm Xóa Sửa NV + - +(NCCCHN, NHHCCHN, NCDDK, NHHDDK) R7 Thêm Xóa Sửa CT_BV + - +(MaBV) BV - + R8 Thêm Xóa Sửa NV + - +(ID) CT_BV - + 2.2.6. Các phụ thuộc hàm và chuẩn hóa dữ liệu BV MaBV TenBV Đặt: A: MaBV B: TenBV Q(AB) Ta có phụ thuộc hàm: F={A→B} Đạt chuẩn 1 vì không có thuộc tính đa trị. Đạt chuẩn 2 vì các thuộc tính không khóa đều phụ thuộc đầy đủ vào khóa A. Đạt chuẩn 3 vì không có phụ thuộc bắc cầu. Đạt chuẩn 4 vì A là siêu khóa. CT_BV ID MaCTBV MaBV TenCTBV Diachi MaGD Đặt : A: ID B: MaCTBV C: MaBV D: TenCTBV E: Diachi F: MaGD Q{ABCDEF} Ta có phụ thuộc hàm: F={A→BCDEF} Đạt chuẩn 1 vì không có thuộc tính đa trị Đạt chuẩn 2 vì các thuộc tính không khóa đều phụ thuộc vào khóa A Đạt chuẩn 3 vì không có phụ thuộc bắc cầu. Đạt chuẩn 4 vì A là thuộc tính siêu khóa Quan hệ NV (IDKH, MaKH, SCCHN, NCCCHN, NHHCCHN, SODDK, NCDDK, NHHDDK, HO, TEN, LOAIHINHHN, NSINH, SONHA, DUONG, PHUONG, QUAN, ID, ThuNhap, GioiTinh) NV IDKH MaKH SCCHN NCCCHN NHHCCHN SODDK NCDDK NHHDDK HO TEN LOAIHINHHN NSINH SONHA DUONG PHUONG QUAN ID THUNHAP GIOITINH Đặt: A: IDKH B: MaKH C: SOCCHN D: NCCCHN E: NHHCCHN F: SODDK G: NCDDK H: NHHDDK I: HO J: TEN K: LOAIHINHHN L: NSINH M: SONHA N: DUONG O: PHUONG P: QUAN Q: ID R: THUNHAP S: GIOITINH Q{ABCDEFGHIJKLMNOPQRS} Ta có phụ thuộc hàm: F={A→BCDEFGHIJKLMNOPQRS} Đạt chuẩn 1 vì không có thuộc tính đa trị Đạt chuẩn 2 vì các thuộc tính không khóa đều phụ thuộc vào khóa A Đạt chuẩn 3 vì không có phụ thuộc bắc cầu Đạt chuẩn 4 vì A là thuộc tính siêu khóa CHƯƠNG 3: GIẢI PHÁP Giới thiệu SQL SERVER 2005: SQL Server 2000 là một hệ thống quản lý cơ sở dữ liệu (Relational Database Management System (RDBMS) ) sử dụng Transact-SQL để trao đổi dữ liệu giữa Client computer và SQL Server computer. Một RDBMS bao gồm databases, database engine và các ứng dụng dùng để quản lý dữ liệu và các bộ phận khác nhau trong RDBMS. SQL Server 2000 được tối ưu để có thể chạy trên môi trường cơ sở dữ liệu rất lớn (Very Large Database Environment) lên đến Tera-Byte và có thể phục vụ cùng lúc cho hàng ngàn user. SQL Server 2000 có thể kết hợp "ăn ý" với các server khác như Microsoft Internet Information Server (IIS), E-Commerce Server, Proxy Server.... SQL Server có 7 editions: Enterprise : Chứa đầy đủ các đặc trưng của SQL Server và có thể chạy tốt trên hệ thống lên đến 32 CPUs và 64 GB RAM. Thêm vào đó nó có các dịch vụ giúp cho việc phân tích dữ liệu rất hiệu quả (Analysis Services) Standard : Rất thích hợp cho các công ty vừa và nhỏ vì giá thành rẻ hơn nhiều so với Enterprise Edition, nhưng lại bị giới hạn một số chức năng cao cấp (advanced features) khác, edition này có thể chạy tốt trên hệ thống lên đến 4 CPU và 2 GB RAM. Personal: được tối ưu hóa để chạy trên PC nên có thể cài đặt trên hầu hết các phiên bản windows kể cả Windows 98. Developer : Có đầy đủ các tính năng của Enterprise Edition nhưng được chế tạo đặc biệt như giới hạn số lượng người kết nối vào Server cùng một lúc.... Edition này có thể cài trên Windows 2000 Professional hay Win NT Workstation. Desktop Engine (MSDE): Ðây chỉ là một engine chạy trên desktop và không có user interface (giao diện). Thích hợp cho việc triển khai ứng dụng ở máy client. Kích thước database bị giới hạn khoảng 2 GB. Win CE : Dùng cho các ứng dụng chạy trên Windows CE Trial: Có các tính năng của Enterprise Edition, download free, nhưng giới hạn thời gian sử dụng. Giới thiệu Visual Studio 2005 Phiên bản Visual Studio 2005 cũng hỗ trợ các ngôn ngữ lập trình hướng đối tượng mới như: C# , VB.Net, J# và ngôn ngữ lập trình "siêu mạnh" là C++.Net, tích hợp mạnh mẽ với các tính năng hấp dẫn: Thiết kế giao diện, hỗ trợ viết mã (coding) không những giúp viết mã nhanh hơn, đúng hơn mà còn giúp những lập trình viên mới làm quen với .Net nhanh chóng hơn. Đặc biệt, VS 2005 còn có khả năng sử dụng lại các đoạn mã mẫu. Không những thế, VS 2005 cho phép tạo ứng dụng với giao diện giống với giao diện của Outlook. Xây dựng ứng dụng Web nhanh hơn: VS 2005 đã đưa vào công cụ phát triển Web mới là Visual Web Developer. Công cụ này cho phép tạo ra các ứng dụng Web được viết bằng ASP.NET 2.0. Với Visual Web Developer, có khoảng 50 điều khiển Web mới được tích hợp giúp phát triển ứng dụng Web nhanh và đơn giản hơn. Cải tiến lớn trong ASP.NET 2.0 là hỗ trợ tạo Master Page và cho phép các trang khác kế thừa lại Master Page. Một ưu điểm lớn nữa của Visual Web Developer là dễ dàng tạo một dự án ứng dụng Web (Web project) rất đơn giản như tạo một ứng dụng trên Windows bình thường. Hỗ trợ phát triển ứng dụng cho thiết bị di động: Microsoft đã xây dựng môi trường phát triển ứng dụng .Net Compact Framework vừa nhỏ gọn như J2 ME mà lại đơn giản, dễ sử dụng như .Net. Môi trường phát triển ứng dụng này có thể hoạt động trên các điện thoại di động, các thiết bị có sử dụng HĐH Windows CE, Windows Mobile... Đóng gói và triển khai ứng dụng: Visual Studio 2005 cho phép đóng gói và triển khai ứng dụng đơn giản và dễ dàng hơn. Nhờ công nghệ đóng gói và triển khai ứng dụng ClickOne mới, sẽ dễ dàng triển khai các ứng dụng đó trên máy chủ Web, hoặc các mạng chia sẻ tập tin. Hỗ trợ ứng dụng 64 bit: Xu hướng bộ xử lý 64 bit và bộ xử lý đa nhân đang ngày càng phát triển mạnh mẽ và cũng gây khó cho các nhà phát triển phần mềm. NetFramework 2.0 cũng như Visual Studio 2005 hỗ trợ tốt và tối ưu cho tính toán 64 bit. Đa dạng sản phẩm: Visual Studio 2005 được phát hành không chỉ là vài bản như: Standard, Pro, Premium... giống các phiên bản trước. Microsoft phát hành không chỉ nhiều hạng mục mà đa dạng sản phẩm khác nhau phục vụ cho những mục đích khác nhau của người dùng. Nhưng đáng chú ý nhất là 2 bản: Visual Studio Express và Visual Studio Team System. Giới thiệu phần mềm phân nhóm khách hàng: Phần mềm phân nhóm khách hàng cá nhân được xây dựng dựa trên nhu cầu phân nhóm khách hàng phục vụ cho việc nhận diện và khoanh vùng các đối tượng cần tiếp cận, nâng cao hiệu quả bán hàng. Đồng thời, bổ sung những đặc điểm khác biệt giữa khách hàng tín dụng tại từng khu vực và những yếu tố ảnh hưởng đến quyết định của khách hàng để có phương pháp tiếp cận phù hợp. Phần mềm được viết trên Window Form của phần mềm Visual Studio 2005 và cơ sở dữ liệu SQL Server 2005. Hướng dẫn sử dụng: Button để chuyển sang form thống kê chung Nhập vào tên database về khách hàng của ACB Nhập vào data source của máy cài SQL SERVER Hình 3.1: Form đầu tiên Formketnoicosodulieu: yêu cầu nhập thông tin để kết nối cơ sở dữ liệu hiện có ở nơi cài đặt chương trình. Khi mở chương trình, form đầu tiên hiện lên. Trên hình mô tả là những thông tin này đã được mặc định sẵn. Data source là (local)SQLEXPRESS, khi cài chương trình vào bất kì máy nào cũng có thể kết nối được, không cần phải sửa lại cho đúng với tên data source của từng máy khác nhau. Cơ sở dữ liệu ở đây là KH_TONGHOP, khi attach cơ sở dữ liệu về khách hàng của ACB vào SQL SERVER, thì đã có tên mặc định là như vậy, trong trường hợp database được người quản trị thay đổi thì lúc này mới phải nhập lại. Click vào button bên dưới để chuyển sang form thống kê thông tin chung. Code cho button Chuyển sang form thông tin chung: private void button1_Click(object sender, EventArgs e) { Formthongtin_chung f = new Formthongtin_chung(); f.CNS = "Data Source=" + textBox1.Text + ";Initial Catalog=" + textBox2.Text + ";Integrated Security=True"; this.Hide(); f.Show(); string s = textBox1.Text; string s1 = textBox2.Text; f.textbox1 = s; f.textbox2 = s1; } 5 khu vực chính phân nhóm KH Khung thể hiện KQ thống kê chung theo quận Các tiêu chuẩn tìm kiếm theo khu vực sống của KH, trong từng tiêu chuẩn lại có những tiêu chuẩn nhỏ hơn là quận Hình 3.2: Form thongtin_chung Formthongtinhung khi hiện lên ban đầu sẽ có giao diện như hình vẽ. Các combobox hỗ trợ người sử dụng chọn lựa các giá trị mặc định có sẵn. Có 5 khu vực chính tương ứng với từng combobox Miền Bắc Miền Trung Miền Đông Nam Bộ Miền Tây Nam Bộ Thành Phố Hồ Chí Minh Trong từng combobox chứa thông tin các quận có trong khu vực đó. Các giá trị theo quận trong khu vực Click chuột vào combobox để chọn giá trị Form 3.3: Form thongtin_chung và các giá trị trong combobox TPHCM Người sử dụng click chuột vào đúng giá trị quận muốn thống kê, và giá trị quận này sẽ là tiêu chuẩn chung cho các thống kê bên dưới. Trên hình vẽ đã chọn khu vực thống kê là TPHCM. Hiển thị kết quả theo chọn lựa khu vực theo % Click vào button để thống kê Form 3.4: Form thongtin_chung và hiển thị kết quả ở button KQ Sau khi đã click chọn giá trị là quận 1 trong khu vực TPHCM, người sử dụng click vào buton KQ ngay bên dưới để cho hiển thị kết quả ở textbox ngay bên cạnh. Kết quả của textbox được tính dựa trên tổng số khách hàng ở khu vực quận được chọn lựa trên tổng khách hàng thống kê được theo phần trăm. Người sử dụng dễ dàng nhận diện được khách hàng ưa thích sống ở khu vực quận nào trong TP dựa trên tỉ lệ phần trăm. Kết quả được tính theo câu lệnh SQL trong SQLCommand cm_khuvuc SELECT left(round(Q1.dk * 1.0 / Q2.tong * 1.0,3)*100,5) AS kq FROM (SELECT COUNT(IDNV) AS dk FROM NV WHERE (QUAN = @X)) AS Q1 CROSS JOIN (SELECT COUNT(IDNV) AS tong FROM NV AS NV_1) AS Q2 Code cho button KQ: private void button1_Click(object sender, EventArgs e) { try { if (cb_khuvuc.CanSelect == true) { string s; cm_khuvuc.Parameters["@X"].Value = cb_khuvuc.SelectedItem; sqlConnection1.Open(); s = cm_khuvuc.ExecuteScalar().ToString(); txt_khuvuc.Text = s; sqlConnection1.Close(); } else { MessageBox.Show("Hãy chọn giá trị trong combobox khu vực muốn thống kê"); } } catch (Exception eloi) { MessageBox.Show("Hãy chọn giá trị trong combobox khu vực muốn thống kê"); } } 5 tiêu chí con Button hiện lên các tiêu chí con Hình 3.5: Form thongtin_chung và kết quả hiển thị cho button Hiện thông tin chi tiết Sau khi có được thống kê chung về khu vực sống của khách hàng theo quận. Người sử dụng tiếp tục thống kê theo nhiều tiêu chí khác như tuổi, thu nhập, đủ điều kiện hành nghề, trình độ chuyên môn, hiện đang công tác ở bệnh viện nằm ở khu vực quận nào … Tất cả những tiêu chí con này đều dược cho ẩn đi, mục đích là người sử dụng có thể tùy ý lựa chọn cho hiện lên, tránh việc cùng một lúc quá nhiều tiêu chí hiện lên khiến cho việc sử dụng phần mềm phức tạp. Người sử dụng click vào button Hiện thông tin chi tiết để cho hiện lên 5 tiêu chí con Code cho button Hiện thông tin chi tiết: private void button17_Click(object sender, EventArgs e) { groupBox10.Visible = true; groupBox11.Visible = true; groupBox12.Visible = true; groupBox15.Visible = true; groupBox16.Visible = true; comboBox7.Visible = true; comboBox8.Visible = true; comboBox9.Visible = true; comboBox12.Visible = true; comboBox13.Visible = true; button2.Visible = true; button3.Visible = true; button4.Visible = true; button7.Visible = true; button8.Visible = true; } MessageBox hiện cảnh báo chãy nhập giá trị trong combobox Hình 3.6: Form thongtin_chung và message cảnh báo hãy nhập giá trị cho combobox Khi người sử dụng không chọn giá trị trong combobox, mà đã click vào button KQ để xuất ra kết quả, thì chương trình sẽ hiện lên thông báo cảnh báo nên click chọn giá trị cho combobox trước, sau đó click vào button cho hiện kết quả. Người sử dụng click OK, và chọn giá trị trong combobox như bình thường. Code cho button KQ: private void button2_Click(object sender, EventArgs e) { try { textBox2.Visible = true; textBox3.Visible = true; textBox4.Visible = true; label42.Visible = true; label43.Visible = true; label44.Visible = true; label45.Visible = true; label46.Visible = true; int[] mang = new int[5]; mang[0] = 0; mang[1] = 30; mang[2] = 40; mang[3] = 50; mang[4] = 60; if (comboBox7.SelectedIndex == 0) { datakhuvuc.SelectCommand.Parameters["@Y"].Value = mang[0]; datakhuvuc.SelectCommand.Parameters["@Z"].Value = mang[1]; } if (comboBox7.SelectedIndex == 1) { datakhuvuc.SelectCommand.Parameters["@Y"].Value = mang[1]; datakhuvuc.SelectCommand.Parameters["@Z"].Value = mang[2]; } if (comboBox7.SelectedIndex == 2) { datakhuvuc.SelectCommand.Parameters["@Y"].Value = mang[2]; datakhuvuc.SelectCommand.Parameters["@Z"].Value = mang[3]; } if (comboBox7.SelectedIndex == 3) { datakhuvuc.SelectCommand.Parameters["@Y"].Value = mang[3]; datakhuvuc.SelectCommand.Parameters["@Z"].Value = mang[4]; } datakhuvuc.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; datakhuvuc.Fill(myset.thunhap_quan); textBox2.Text = myset.thunhap_quan.Rows[0].ItemArray[0].ToString(); textBox3.Text = myset.thunhap_quan.Rows[0].ItemArray[1].ToString(); double b = double.Parse(textBox3.Text); double a = (100 - b); textBox4.Text = a.ToString(); } catch (Exception eloi1) { MessageBox.Show("Hãy chọn giá trị trong combobox"); return; } } Kết quả Hình 3.7: Form thongtin_chung và hiển thị kết quả cho button KQ trong groupbox TUỔI Người sử dụng click vào combobox trong tiêu chí tuổi để thống kê theo tiêu chí lớn là khu vực quận và tiêu chí con là tuổi khách hàng. Trong đó tuổi được phân ra thành 4 nhóm: Dưới 30 Từ 30-40 Từ 40-50 Từ 50-60 Kết quả hiện ngay bên dưới button KQ, và thống kê theo nam, nữ bên dưới được tính theo câu truy vấn SQL trong SQLdataAdapter datakhuvuc: SELECT LEFT(ROUND(Q3.dk3 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_thunhap_quan, LEFT(ROUND(Q3_3.dk3_3 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_nu_tuoi_quan FROM (SELECT COUNT(IDNV) AS dk2 FROM NV AS NV_1 WHERE (QUAN = @X)) AS Q2 CROSS JOIN (SELECT COUNT(IDNV) AS dk3 FROM NV WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @Y AND @Z) AND (QUAN = @X)) AS Q3 CROSS JOIN (SELECT COUNT(IDNV) AS dk3_3 FROM NV AS NV_2 WHERE (GioiTinh = '1') AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @Y AND @Z) AND (QUAN = @X)) AS Q3_3 Kết quả Hình 3.8: Form thongtin_chung và hiển thị kết quả của button KQ trong groupbox THU NHẬP Người sử dụng click vào combobox trong tiêu chí thu nhập để thống kê theo tiêu chí lớn là khu vực quận và tiêu chí con là thu nhập khách hàng. Trong đó thu nhập được phân ra thành 6 nhóm: Dưới 5 triệu Từ 5-10 triệu Từ 10-20 triệu Từ 20-30 triệu Từ 30-50 triệu Trên 50 triệu Việc bắt lỗi tương tự như button KQ ở groupbox TUỔI Kết quả được tính theo câu lệnh SQL trong dataSQLAdapter datakhuvuc_thunhap: SELECT LEFT(ROUND(Q1.dk1 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_thunhap_quan, LEFT(ROUND(Q1_1.dk1_1 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_nu_thunhap_quan FROM (SELECT COUNT(IDNV) AS dk1 FROM NV WHERE (ThuNhap BETWEEN @A AND @B) AND (QUAN = @X)) AS Q1 CROSS JOIN (SELECT COUNT(IDNV) AS dk2 FROM NV WHERE (QUAN = @X)) AS Q2 CROSS JOIN (SELECT COUNT(IDNV) AS dk1_1 FROM NV WHERE (GioiTinh = '1') AND (ThuNhap BETWEEN @A AND @B) AND (QUAN = @X)) AS Q1_1 Code cho button KQ trong groupbox THU NHẬP: private void button3_Click(object sender, EventArgs e) { try { textBox7.Visible = true; textBox8.Visible = true; textBox9.Visible = true; label10.Visible = true; label11.Visible = true; label12.Visible = true; label13.Visible = true; label14.Visible = true; int[] mang = new int[7]; mang[0] = 0; mang[1] = 5000000; mang[2] = 10000000; mang[3] = 20000000; mang[4] = 30000000; mang[5] = 40000000; mang[6] = 50000000; if (comboBox8.CanSelect == true) { if (comboBox8.SelectedIndex == 0) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[0]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = mang[1]; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } else if (comboBox8.SelectedIndex == 1) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[1]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = mang[2]; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } else if (comboBox8.SelectedIndex == 2) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[2]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = mang[3]; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } else if (comboBox8.SelectedIndex == 3) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[3]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = mang[4]; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } else if (comboBox8.SelectedIndex == 4) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[4]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = mang[5]; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } else if (comboBox8.SelectedIndex == 5) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[5]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = mang[6]; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } else if (comboBox8.SelectedIndex == 6) { datakhuvuc_thunhap.SelectCommand.Parameters["@A"].Value = mang[6]; datakhuvuc_thunhap.SelectCommand.Parameters["@B"].Value = 100000000; datakhuvuc_thunhap.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; } datakhuvuc_thunhap.Fill(myset.khuvuc_thunhap); textBox7.Text = myset.khuvuc_thunhap.Rows[0].ItemArray[0].ToString(); textBox8.Text = myset.khuvuc_thunhap.Rows[0].ItemArray[1].ToString(); double b = double.Parse(textBox8.Text); double a = (100 - b); textBox9.Text = a.ToString(); } else { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } catch (Exception eloi3) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Kết quả Hình 3.9: Form thongtin_chung và hiển thị kết quả của button KQ trong groupbox ĐỦ ĐK HÀNH NGHỀ Người sử dụng click vào combobox trong tiêu chí đủ điều kiện hành nghề để thống kê theo tiêu chí lớn là khu vực quận và tiêu chí con là đủ điều kiện hành nghề. Trong đó đủ điều kiện hành nghề bao gồm còn hạn sử dụng của chứng chỉ hành nghề và đủ điều kiện. Kết quả được tính theo câu lệnh SQL trong SQLdataAdapter datakhuvuc_dudk: SELECT LEFT(ROUND(Q4.dk4 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_dudk_quan, LEFT(ROUND(Q4_4.dk4_4 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_nu_dudk_quan FROM (SELECT COUNT(IDNV) AS dk2 FROM NV WHERE (QUAN = @X)) AS Q2 CROSS JOIN (SELECT COUNT(IDNV) AS dk4 FROM NV AS NV_2 WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHCCHN, 109), 8, 4)) > 0) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHCCHN, 109), 8, 4)) IS NOT NULL) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHDDK, 109), 8, 4)) > 0) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHDDK, 109), 8, 4)) IS NOT NULL) AND (QUAN = @X)) AS Q4 CROSS JOIN (SELECT COUNT(IDNV) AS dk4_4 FROM NV AS NV_1 WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHCCHN, 109), 8, 4)) > 0) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHCCHN, 109), 8, 4)) IS NOT NULL) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHDDK, 109), 8, 4)) > 0) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), NHHDDK, 109), 8, 4)) IS NOT NULL) AND (QUAN = @X) AND (GioiTinh = '1')) AS Q4_4 Code cho button KQ trong groupbox Đủ điều kiện hành nghề: private void button4_Click(object sender, EventArgs e) { try { textBox10.Visible = true; textBox11.Visible = true; textBox12.Visible = true; label15.Visible = true; label16.Visible = true; label17.Visible = true; label18.Visible = true; label19.Visible = true; if (comboBox9.CanSelect == true) { if (comboBox9.SelectedIndex == 0) { datakhuvuc_dudk.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; datakhuvuc_dudk.Fill(myset.khuvuc_dudk); textBox10.Text = myset.khuvuc_dudk.Rows[0].ItemArray[0].ToString(); textBox11.Text = myset.khuvuc_dudk.Rows[0].ItemArray[1].ToString(); double b = double.Parse(textBox11.Text); double a = (100 - b); textBox12.Text = a.ToString(); } if (comboBox9.SelectedIndex == 1) { datakhuvuc_dudk.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; datakhuvuc_dudk.Fill(myset.khuvuc_dudk); double a1 = double.Parse(myset.khuvuc_dudk.Rows[0].ItemArray[0].ToString()); double a2 = 100 - a1; textBox10.Text = a2.ToString(); double b1 = double.Parse(myset.khuvuc_dudk.Rows[0].ItemArray[1].ToString()); double b2 = 100 - b1; textBox11.Text = b2.ToString(); double b = double.Parse(textBox11.Text); double a = (100 - b); textBox12.Text = a.ToString(); } } else { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } catch (Exception eloi4) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Kết quả Hình 3.10: Form thongtin_chung và hiển thị kết quả của button KQ trong groupbox CHUYÊN MÔN Người sử dụng click vào combobox trong tiêu chí chuyên môn để thống kê theo tiêu chí lớn là khu vực quận và tiêu chí con là chuyên môn của khách hàng. Trong đó chuyên môn được chia thành 3 nhóm: Y Dược Y Học Cổ Truyền Do trong giới hạn về dữ liệu thu thập được nên phần chuyên môn chỉ tập trung chủ yếu là khách hàng hoạt động trong lĩnh vực Y, Dược. Kết quả được tính theo câu lệnh SQL trong SQLdataAdapter datakhuvuc_cm: SELECT LEFT(ROUND(Q5.dk5 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_chuyenmon_quan, LEFT(ROUND(Q5_5.dk5_5 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_nu_chuyenmon_quan FROM (SELECT COUNT(IDNV) AS dk2 FROM NV WHERE (QUAN = @X)) AS Q2 CROSS JOIN (SELECT COUNT(IDNV) AS dk5 FROM NV AS NV_2 WHERE (SUBSTRING(MaNV, 1, 1) = @E) AND (QUAN = @X)) AS Q5 CROSS JOIN (SELECT COUNT(IDNV) AS dk5_5 FROM NV AS NV_1 WHERE (SUBSTRING(MaNV, 1, 1) = @E) AND (QUAN = @X) AND (GioiTinh = '1')) AS Q5_5 Code cho button KQ trong groupbox Chuyên môn: private void button7_Click(object sender, EventArgs e) { try { textBox13.Visible = true; textBox14.Visible = true; textBox15.Visible = true; label20.Visible = true; label21.Visible = true; label22.Visible = true; label23.Visible = true; label24.Visible = true; string a = comboBox12.SelectedItem.ToString(); a = a.Substring(0, 1); datakhuvuc_cm.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; datakhuvuc_cm.SelectCommand.Parameters["@E"].Value = a; datakhuvuc_cm.Fill(myset.khuvuc_cm); textBox13.Text = myset.khuvuc_cm.Rows[0].ItemArray[0].ToString(); textBox14.Text = myset.khuvuc_cm.Rows[0].ItemArray[1].ToString(); double b = double.Parse(textBox14.Text); double a1 = (100 - b); textBox15.Text = a1.ToString(); } catch (Exception eloi5) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Kết quả Hình 3.11: Form thongtin_chung và hiển thị kết quả của button KQ trong groupbox LÀM VIỆC TẠI Người sử dụng click vào combobox trong tiêu chí “làm việc tại” để thống kê theo tiêu chí lớn là khu vực quận và tiêu chí con là khu vực bệnh viện mà khách hàng đang công tác. Tương tự như tiêu chí quận thì tiêu chí “làm việc tại” cũng được chia thành các quận. Kết quả được tính theo câu lệnh SQL trong SQPdataAdapter datakhuvuc_lamviec: SELECT LEFT(ROUND(Q6.dk6 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_noilamviec_quan, LEFT(ROUND(Q6_6.dk6_6 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS kq_nu_noilamviec_quan FROM (SELECT COUNT(IDNV) AS dk2 FROM NV WHERE (QUAN = @X)) AS Q2 CROSS JOIN (SELECT COUNT(NV_2.IDNV) AS dk6 FROM NV AS NV_2 INNER JOIN CTBV ON NV_2.ID = CTBV.ID WHERE (CHARINDEX(@F, CTBV.DiaChi) > 0) AND (NV_2.QUAN = @X)) AS Q6 CROSS JOIN (SELECT COUNT(NV_1.IDNV) AS dk6_6 FROM NV AS NV_1 INNER JOIN CTBV AS CTBV_1 ON NV_1.ID = CTBV_1.ID WHERE (CHARINDEX(@F, CTBV_1.DiaChi) > 0) AND (NV_1.QUAN = @X) AND (NV_1.GioiTinh = '1')) AS Q6_6 Code cho button KQ trong groupbox Làm việc tại: private void button8_Click(object sender, EventArgs e) { try { textBox16.Visible = true; textBox17.Visible = true; textBox18.Visible = true; label25.Visible = true; label26.Visible = true; label27.Visible = true; label28.Visible = true; label29.Visible = true; datakhuvuc_lamviec.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem.ToString(); datakhuvuc_lamviec.SelectCommand.Parameters["@F"].Value = comboBox13.SelectedItem.ToString(); datakhuvuc_lamviec.Fill(myset.khuvuc_lamviec); textBox16.Text = myset.khuvuc_lamviec.Rows[0].ItemArray[0].ToString(); textBox17.Text = myset.khuvuc_lamviec.Rows[0].ItemArray[1].ToString(); double b = double.Parse(textBox17.Text); double a1 = (100 - b); textBox18.Text = a1.ToString(); } catch (Exception eloi6) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Kết quả Điều kiện Button hiện KQ thống kê KH giữ chức vụ giám đốc trong quận đã chọn trong combobox thuộc groupbox TPHCM Hình 3.12: Form thongtin_chung và hiển thị kết quả của button HIỆN THÔNG TIN KH LÀ GĐ Người sử dụng click vào button Hiện thông tin KH là GĐ, để hiện groupbox KH giữ chức vụ cao cấp, cùng với kết quả thống kê theo nam và nữ với điều kiện là quận được chọn trong combobox thuộc groupbox TPHCM. Kết quả được tính theo câu lệnh SQL trong SQLdataAdapter datakhuvuc_gd: SELECT LEFT(ROUND(Q6_7.dk6_7 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS NuGiamDoc, LEFT(ROUND(Q6_8.dk6_8 * 1.0 / Q2.dk2 * 1.0 * 100, 2), 5) AS NamGiamDoc FROM (SELECT COUNT(IDNV) AS dk2 FROM NV WHERE (QUAN = @X)) AS Q2 CROSS JOIN (SELECT COUNT(IDNV) AS dk6_7 FROM NV WHERE (LOAIHINHHN = N'Giám đốc') AND (QUAN = @X) AND (GioiTinh = '1')) AS Q6_7 CROSS JOIN (SELECT COUNT(IDNV) AS dk6_8 FROM NV WHERE (LOAIHINHHN = N'Giám đốc') AND (QUAN = @X) AND (GioiTinh = '0')) AS Q6_8 Code cho button Hiện thông tin KH là GĐ: private void button18_Click(object sender, EventArgs e) { try { groupBox17.Visible = true; label30.Visible = true; label31.Visible = true; label32.Visible = true; label33.Visible = true; textBox19.Visible = true; textBox20.Visible = true; datakhuvuc_gd.SelectCommand.Parameters["@X"].Value = cb_khuvuc.SelectedItem; datakhuvuc_gd.Fill(myset.khuvuc_gd); textBox19.Text = myset.khuvuc_gd.Rows[0].ItemArray[0].ToString(); textBox20.Text = myset.khuvuc_gd.Rows[0].ItemArray[1].ToString(); } catch (Exception eloi7) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Button hiện KQ thống kê theo lựa chọn tuổi và hiện groupbox Thu nhập Hình 3.13: Form thôngtin_chung và kết quả của button KQ trong groupbox TÌM KIẾM THEO TUỔI Người sử dụng click vào button KQ trong groupbox Tìm kiếm theo tuổi để hiện kết quả ra textbox bên cạnh, đồng thời hiện groupbox Thu nhập cùng với các control. Kết quả được tính theo câu lệnh SQL trong SQLdataAdapter datatuoi: SELECT LEFT(ROUND(tongtuoi.dktongtuoi * 1.0 / tongkhuvuc.dktongkhuvuc * 1.0 * 100, 2), 5) AS kqtuoi FROM (SELECT COUNT(IDNV) AS dktongkhuvuc FROM NV) AS tongkhuvuc CROSS JOIN (SELECT COUNT(IDNV) AS dktongtuoi FROM NV WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @X AND @Y)) AS tongtuoi Code cho button KQ trong groupbox Tìm kiếm theo tuổi: private void button9_Click(object sender, EventArgs e) { try { textBox21.Visible = true; label35.Visible = true; groupBox18.Visible = true; comboBox15.Visible = true; button10.Visible = true; int[] mang = new int[5]; mang[0] = 0; mang[1] = 30; mang[2] = 40; mang[3] = 50; mang[4] = 60; if (comboBox14.SelectedIndex == 0) { datatuoi.SelectCommand.Parameters["@X"].Value = mang[0]; datatuoi.SelectCommand.Parameters["@Y"].Value = mang[1]; } if (comboBox14.SelectedIndex == 1) { datatuoi.SelectCommand.Parameters["@X"].Value = mang[1]; datatuoi.SelectCommand.Parameters["@Y"].Value = mang[2]; } if (comboBox14.SelectedIndex == 2) { datatuoi.SelectCommand.Parameters["@X"].Value = mang[2]; datatuoi.SelectCommand.Parameters["@Y"].Value = mang[3]; } if (comboBox14.SelectedIndex == 3) { datatuoi.SelectCommand.Parameters["@X"].Value = mang[3]; datatuoi.SelectCommand.Parameters["@Y"].Value = mang[4]; } datatuoi.Fill(myset.tuoi); textBox21.Text = myset.tuoi.Rows[0].ItemArray[0].ToString(); } catch (Exception eloi8) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Button hiện kết quả thống kê theo tuổi ở combobox trên và thu nhập trong combobox thu nhập, và hiện các control trong groupbox Thông tin khác Hình 3.14: Form thongtin_chung và hiển thị kết quả của button KQ trong groupbox THU NHẬP Người sử dụng click vào button KQ trong groupbox Thu nhập để hiện kết quả thống kê theo 2 điều kiện tuổi được chọn ở trên và thu nhập trong combobox trong groupbox Thu nhập, và hiện ra textbox bên cạnh, đồng thời hiện các control trong groupbox . Kết quả được tính theo câu lệnh SQL trong SQLdataAdapter datatuoi_thunhap: SELECT LEFT(ROUND(tuoi_thunhap.dktuoi_thunhap * 1.0 / tongtuoi.dktongtuoi * 1.0 * 100, 2), 5) AS kqtuoi_thunhap FROM (SELECT COUNT(IDNV) AS dktongtuoi FROM NV WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @X AND @Y)) AS tongtuoi CROSS JOIN (SELECT COUNT(IDNV) AS dktuoi_thunhap FROM NV WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @X AND @Y) AND (ThuNhap BETWEEN @K AND @H)) AS tuoi_thunhap Code cho button KQ trong groupbox Thu nhập private void button10_Click(object sender, EventArgs e) { try { textBox22.Visible = true; label36.Visible = true; groupBox19.Visible = true; groupBox20.Visible = true; groupBox21.Visible = true; groupBox22.Visible = true; groupBox23.Visible = true; groupBox25.Visible = true; comboBox16.Visible = true; comboBox17.Visible = true; comboBox18.Visible = true; comboBox19.Visible = true; comboBox21.Visible = true; button11.Visible = true; button12.Visible = true; button13.Visible = true; button14.Visible = true; button15.Visible = true; mangtuoi[0] = 0; mangtuoi[1] = 30; mangtuoi[2] = 40; mangtuoi[3] = 50; mangtuoi[4] = 60; mangthunhap[0] = 0; mangthunhap[1] = 5000000; mangthunhap[2] = 10000000; mangthunhap[3] = 20000000; mangthunhap[4] = 30000000; mangthunhap[5] = 40000000; mangthunhap[6] = 50000000; mangthunhap[7] = 100000000; if (comboBox14.CanSelect == true && comboBox15.CanSelect == true) { for (int i = 0; i < mangtuoi.Length - 1; i++) { for (int j = 0; j < mangthunhap.Length - 1; j++) { if (comboBox14.SelectedIndex.Equals(i) == true && comboBox15.SelectedIndex.Equals(j) == true) { datatuoi_thunhap.SelectCommand.Parameters["@X"].Value = mangtuoi[i]; datatuoi_thunhap.SelectCommand.Parameters["@Y"].Value = mangtuoi[i + 1]; datatuoi_thunhap.SelectCommand.Parameters["@K"].Value = mangthunhap[j]; datatuoi_thunhap.SelectCommand.Parameters["@H"].Value = mangthunhap[j + 1]; break; } } } datatuoi_thunhap.Fill(myset.tuoi_thunhap); textBox22.Text = myset.tuoi_thunhap.Rows[0].ItemArray[0].ToString(); } } catch (Exception eloi9) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Hiện thống kê trên 3 điều kiện Hình 3.15: Form thongtin_chung và hiển thị kết quả của button KQ trong groupbox TPHCM Button KQ hiện kết quả thống kê dựa trên 3 điều kiện: tuổi và thu nhập ở trên và khu vực quận trong TPHCM, và hiện kết quả trong textbox bên cạnh. Kết quả được tính dựa trên câu lệnh SQL trong SQLdataAdapter datatuoi_thunhap_quan: SELECT LEFT(ROUND(tuoi_thunhap_quan.dktuoi_thunhap_quan * 1.0 / tongtuoi.dktongtuoi * 1.0 * 100, 2), 5) AS kqtuoi_thunhap_quan FROM (SELECT COUNT(IDNV) AS dktongtuoi FROM NV WHERE (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @X AND @Y)) AS tongtuoi CROSS JOIN (SELECT COUNT(IDNV) AS dktuoi_thunhap_quan FROM NV WHERE (QUAN = @A) AND (CONVERT(numeric(4), SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4)) - NSINH BETWEEN @X AND @Y) AND (ThuNhap BETWEEN @K AND @H)) AS tuoi_thunhap_quan Code cho button KQ trong groupbox Thông tin khác private void button15_Click(object sender, EventArgs e) { try { textBox27.Visible = true; label41.Visible = true; if (comboBox14.CanSelect == true && comboBox15.CanSelect == true) { for (int i = 0; i < mangtuoi.Length - 1; i++) { for (int j = 0; j < mangthunhap.Length - 1; j++) { if (comboBox14.SelectedIndex.Equals(i) == true && comboBox15.SelectedIndex.Equals(j) == true) { datatuoi_thunhap_quan.SelectCommand.Parameters["@X"].Value = mangtuoi[i]; datatuoi_thunhap_quan.SelectCommand.Parameters["@Y"].Value = mangtuoi[i + 1]; datatuoi_thunhap_quan.SelectCommand.Parameters["@K"].Value = mangthunhap[j]; datatuoi_thunhap_quan.SelectCommand.Parameters["@H"].Value = mangthunhap[j + 1]; datatuoi_thunhap_quan.SelectCommand.Parameters["@A"].Value = comboBox21.SelectedItem; break; } } } datatuoi_thunhap_quan.Fill(myset.tuoi_thunhap_quan); textBox27.Text = myset.tuoi_thunhap_quan.Rows[0].ItemArray[0].ToString(); } } catch (Exception eloi10) { MessageBox.Show("Hãy chọn giá trị trong combobox"); } } Code cho button Chuyển sang form tìm kiếm theo chọn lựa: private void button16_Click(object sender, EventArgs e) { Formkiemtheochonlua f = new Formkiemtheochonlua(); f.CNS1 = "Data Source=" + textbox1 + ";Initial Catalog=" + textbox2 + ";Integrated Security=True"; this.Hide(); f.Show(); } MessageBox hiện cảnh báo hãy nhập đầy đủ giá trị trong combobox Hình 3.16: Form Formkiemtheochonlua và message cảnh báo nhập giá trị trong tất cả combobox Form yêu cầu người sử dụng click chọn giá trị cho các combobox, nếu bất kì combobox nào không được chọn thì 1 messagebox hiện lên như hình. Người sử dụng click OK và click chọn thông tin còn thiếu. Code khi form Formkiemtheochonlua hiện lên sẽ được truyền datasource và database. public string CNS1; private void Formkiemtheochonlua_Load(object sender, EventArgs e) { sqlConnection1.ConnectionString = CNS1; try { } catch (Exception ee) { MessageBox.Show("Tên server hoặc database không đúng !"); return; } } Button hiện thống kê chi tiết các khách hàng thỏa 5 điều kiện ra file excel Button hiện thống kê theo 5 điều kiện và hiện kết quả trên label trong groupbox Hình 3.17: Form Formkiemtheochonlua và kết quả của button KQ, Xuất KQ ra file excel Sau khi chọn tất cả các điều kiện trong combobox, người sử dụng click vào button KQ và kết quả sẽ hiện lên trên label trong groupbox KQ tìm kiếm. Kết quả được tính dựa trên câu lệnh SQL trong SQLdataAdapter data_chonlua: SELECT LEFT(ROUND(Q1.dk * 1.0 / Q2.tong * 1.0 * 100, 2), 5) AS kq FROM (SELECT COUNT(IDNV) AS dk FROM NV WHERE (SUBSTRING(MaNV, 1, 1) = @E) AND (SUBSTRING(CONVERT(varchar(50), GETDATE(), 109), 8, 4) - NSINH BETWEEN @X AND @Y) AND (GioiTinh = @A) AND (QUAN = @B) AND (ThuNhap BETWEEN @C AND @D)) AS Q1 CROSS JOIN (SELECT COUNT(IDNV) AS tong FROM NV AS NV_1) AS Q2 Code cho button KQ: public int[] mangtuoi = new int[5]; public int[] mangthunhap = new int[8]; private void button1_Click(object sender, EventArgs e) { try { if (comboBox1.CanSelect == true && comboBox2.CanSelect == true && comboBox3.CanSelect == true && comboBox4.CanSelect == true && comboBox8.CanSelect == true) { string a = comboBox1.SelectedItem.ToString(); a = a.Substring(0, 1); int b; if (comboBox3.SelectedIndex == 0) b = 0; else b = 1; mangtuoi[0] = 0; mangtuoi[1] = 30; mangtuoi[2] = 40; mangtuoi[3] = 50; mangtuoi[4] = 60; mangthunhap[0] = 0; mangthunhap[1] = 5000000; mangthunhap[2] = 10000000; mangthunhap[3] = 20000000; mangthunhap[4] = 30000000; mangthunhap[5] = 40000000; mangthunhap[6] = 50000000; mangthunhap[7] = 100000000; if (comboBox2.CanSelect == true && comboBox8.CanSelect == true) { for (int i = 0; i < mangtuoi.Length - 1; i++) { for (int j = 0; j < mangthunhap.Length - 1; j++) { if (comboBox2.SelectedIndex.Equals(i) == true && comboBox8.SelectedIndex.Equals(j) == true) { data_chonlua.SelectCommand.Parameters["@X"].Value = mangtuoi[i]; data_chonlua.SelectCommand.Parameters["@Y"].Value = mangtuoi[i + 1]; data_chonlua.SelectCommand.Parameters["@C"].Value = mangthunhap[j]; data_chonlua.SelectCommand.Parameters["@D"].Value = mangthunhap[j + 1]; break; } } } data_chonlua.SelectCommand.Parameters["@A"].Value = b; data_chonlua.SelectCommand.Parameters["@B"].Value = comboBox4.SelectedItem; data_chonlua.SelectCommand.Parameters["@E"].Value = a; data_chonlua.Fill(myset.chonlua); label8.Text = "Với chuyên môn: " + comboBox1.SelectedItem.ToString() + ", tuổi từ: " + comboBox2.SelectedItem.ToString() + " giới tính: " + comboBox3.SelectedItem.ToString() + ", khu vực sống: " + comboBox4.SelectedItem.ToString() + ", thu nhập từ: " + comboBox8.SelectedItem.ToString() + " thì kết quả thống kê được là: " + myset.chonlua.Rows[0].ItemArray[0].ToString() + "%"; //textBox22.Text = myset.tuoi_thunhap.Rows[0].ItemArray[0].ToString(); } } else { MessageBox.Show("Chọn giá trị trong combobox"); } } catch { MessageBox.Show("Chọn giá trị trong combobox"); } } Đây là file excel thể hiện chi tiết danh sách khách hàng thỏa 5 điều kiện làm tiêu chí. Hình 3.18: File excel kết quả từ button Xuất KQ ra file excel Đoạn code trong button Xuất kết quả ra file excel: private void button2_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Excel.Application t = new Microsoft.Office.Interop.Excel.Application(); t.Visible = true; Microsoft.Office.Interop.Excel.Workbook x; x = t.Workbooks.Add(true); Microsoft.Office.Interop.Excel.Worksheet s; s = (Microsoft.Office.Interop.Excel.Worksheet)x.Worksheets[1]; data_chonlua.SelectCommand.Parameters["@A"].Value = d.ToString(); data_chonlua.SelectCommand.Parameters["@B"].Value = k; data_chonlua.SelectCommand.Parameters["@E"].Value = c; data_chonlua.SelectCommand.Parameters["@X"].Value = e1.ToString(); data_chonlua.SelectCommand.Parameters["@Y"].Value = f.ToString(); data_chonlua.SelectCommand.Parameters["@C"].Value = g.ToString(); data_chonlua.SelectCommand.Parameters["@D"].Value = h.ToString(); data_chonlua.Fill(myset.chonlua); data_excel.SelectCommand.Parameters["@A"].Value = d.ToString(); data_excel.SelectCommand.Parameters["@B"].Value = k; data_excel.SelectCommand.Parameters["@E"].Value = c; data_excel.SelectCommand.Parameters["@X"].Value = e1.ToString(); data_excel.SelectCommand.Parameters["@Y"].Value = f.ToString(); data_excel.SelectCommand.Parameters["@C"].Value = g.ToString(); data_excel.SelectCommand.Parameters["@D"].Value = h.ToString(); data_excel.Fill(myset.excel); int a1 = 0; for (int i = 0; i < myset.excel.Rows.Count; i++) { //17 string hoten,loaihinhhn,sonha,duong,phuong,quan,tenctbv,diachi; int a; decimal thunhap, nsinh, gioitinh, socchn, soddk; DateTime nccchn,nhhcchn,ncddk,nhhddk; a1=i+1; hoten=(string)myset.excel.Rows[i].ItemArray[0]; socchn=(decimal)myset.excel.Rows[i].ItemArray[1]; nccchn=(DateTime)myset.excel.Rows[i].ItemArray[2]; nhhcchn=(DateTime)myset.excel.Rows[i].ItemArray[3]; soddk=(decimal)myset.excel.Rows[i].ItemArray[4]; ncddk=(DateTime)myset.excel.Rows[i].ItemArray[5]; nhhddk=(DateTime)myset.excel.Rows[i].ItemArray[6]; nsinh=(decimal)myset.excel.Rows[i].ItemArray[7]; loaihinhhn=(string)myset.excel.Rows[i].ItemArray[8]; sonha=(string)myset.excel.Rows[i].ItemArray[9]; duong=(string)myset.excel.Rows[i].ItemArray[10]; phuong=(string)myset.excel.Rows[i].ItemArray[11]; quan=(string)myset.excel.Rows[i].ItemArray[12]; thunhap=(decimal)myset.excel.Rows[i].ItemArray[13]; gioitinh=(decimal)myset.excel.Rows[i].ItemArray[14]; tenctbv=(string)myset.excel.Rows[i].ItemArray[15]; diachi=(string)myset.excel.Rows[i].ItemArray[16]; s.get_Range("A" + (1).ToString(), "A" + (1).ToString()).Value2 = "Số thứ tự"; s.get_Range("B" + (1).ToString(), "B" + (1).ToString()).Value2 = "Họ và tên"; s.get_Range("C" + (1).ToString(), "C" + (1).ToString()).Value2 = "Số chứng chỉ hành nghề"; s.get_Range("D" + (1).ToString(), "D" + (1).ToString()).Value2 = "Ngày cấp chứng chỉ hành nghề"; s.get_Range("E" + (1).ToString(), "E" + (1).ToString()).Value2 = "Ngày hết hạn chứng chỉ hành nghề"; s.get_Range("F" + (1).ToString(), "F" + (1).ToString()).Value2 = "Số đủ điều kiện"; s.get_Range("G" + (1).ToString(), "G" + (1).ToString()).Value2 = "Ngày cấp đủ điều kiện"; s.get_Range("H" + (1).ToString(), "H" + (1).ToString()).Value2 = "Ngày hết hạn đủ diều kiện"; s.get_Range("I" + (1).ToString(), "I" + (1).ToString()).Value2 = "Năm sinh"; s.get_Range("J" + (1).ToString(), "J" + (1).ToString()).Value2 = "Loại hình hành nghề"; s.get_Range("K" + (1).ToString(), "K" + (1).ToString()).Value2 = "Số nhà"; s.get_Range("L" + (1).ToString(), "L" + (1).ToString()).Value2 = "Đường"; s.get_Range("M" + (1).ToString(), "M" + (1).ToString()).Value2 = "Phường"; s.get_Range("N" + (1).ToString(), "N" + (1).ToString()).Value2 = "Quận"; s.get_Range("O" + (1).ToString(), "O" + (1).ToString()).Value2 = "Thu nhập"; s.get_Range("P" + (1).ToString(), "P" + (1).ToString()).Value2 = "Giới tính"; s.get_Range("Q" + (1).ToString(), "Q" + (1).ToString()).Value2 = "Tên bệnh viện công tác"; s.get_Range("R" + (1).ToString(), "R" + (1).ToString()).Value2 = "Địa chỉ bệnh viện"; s.get_Range("A" + (i + 2).ToString(), "A" + (i + 2).ToString()).Value2 = a1; s.get_Range("B" + (i + 2).ToString(), "B" + (i + 2).ToString()).Value2 = hoten; s.get_Range("C" + (i + 2).ToString(), "C" + (i + 2).ToString()).Value2 = socchn; s.get_Range("D" + (i + 2).ToString(), "D" + (i + 2).ToString()).Value2 = nccchn; s.get_Range("E" + (i + 2).ToString(), "E" + (i + 2).ToString()).Value2 = nhhcchn; s.get_Range("F" + (i + 2).ToString(), "F" + (i + 2).ToString()).Value2 = soddk; s.get_Range("G" + (i + 2).ToString(), "G" + (i + 2).ToString()).Value2 = ncddk; s.get_Range("H" + (i + 2).ToString(), "H" + (i + 2).ToString()).Value2 = nhhddk; s.get_Range("I" + (i + 2).ToString(), "I" + (i + 2).ToString()).Value2 = nsinh; s.get_Range("J" + (i + 2).ToString(), "J" + (i + 2).ToString()).Value2 = loaihinhhn; s.get_Range("K" + (i + 2).ToString(), "K" + (i + 2).ToString()).Value2 = sonha; s.get_Range("L" + (i + 2).ToString(), "L" + (i + 2).ToString()).Value2 = duong; s.get_Range("M" + (i + 2).ToString(), "M" + (i + 2).ToString()).Value2 = phuong; s.get_Range("N" + (i + 2).ToString(), "N" + (i + 2).ToString()).Value2 = quan; s.get_Range("O" + (i + 2).ToString(), "O" + (i + 2).ToString()).Value2 = thunhap; s.get_Range("P" + (i + 2).ToString(), "P" + (i + 2).ToString()).Value2 = gioitinh; s.get_Range("Q" + (i + 2).ToString(), "Q" + (i + 2).ToString()).Value2 = tenctbv; s.get_Range("R" + (i + 2).ToString(), "R" + (i + 2).ToString()).Value2 = diachi; } } Lợi ích khi sử dụng chương trình: Việc sử dụng chương trình mang lại nhiều lợi ích cho người sử dụng về mặt thời gian, chi phí … Cụ thể là : Lợi ích về thời gian: Trước đây những thong tin khách hàng được lưu trữ trong các file excel, và khi muốn thực hiện thống kê thì người sử dụng phải dùng các hàm thống kê trong excel để tính toán, việc thống kê chỉ dễ dàng cho các thống kê với lượng dữ liệu tương đối ít. Khi lượng dữ liệu nhiều lên đến vài nghìn dòng, thì việc thống kê càng phức tạp và lâu hơn. Việc tính toán đã được tích hợp sẵn trong chương trình nên thời gian có được kết quả nhanh và chính xác. Lợi ích về cài đặt: Như đã đề cập ở trên về các lợi ích của VS2005, thì việc cài đặt chương trình cũng rất dễ dàng. Sau khi publish phần mềm, thì tiến hành cài đặt chỉ trong vòng 5 phút. Lợi ích về sử dụng: Với chương trình này, người sử dụng chỉ cần ngồi một chỗ, mở chương trình lên và click vào các button theo ý thích. Chương trình được thiết kế với các giao diện thân thiện vói người dung, dễ sử dụng với mọi trình độ khác nhau. Yêu cầu về các phần mềm hỗ trợ khi cài đặt chương trình: Yêu cầu cài đặt Microsoft SQL Server 2005: Người sử dụng import (attach) file .mdf vào SQL Server. Yêu cầu cài đặt phần mềm XlsToSql chuyển đổi dữ liệu từ file excel sang database của SQL Server: Chỉ khi nào có dữ liệu khách hàng mới cần import vào database, thì người sử dụng mới append dữ liệu thêm vào. Việc append dữ liệu vào không ảnh hưởng gì đến dữ liệu đã được lưu trữ trước đây và phần mềm cũng rất dễ sử dụng. Yêu cầu file excel khi import thêm vào database phải có cấu trúc cột trong bảng và data type tương tự như cột của các bảng và data type trong database KH_TONGHOP của SQL Server 2005. Nếu không thì không thể import dữ liệu được. Hướng dẫn load dữ liệu từ file excel vào cơ sở dữ liệu KH_TONGHOP: Hình 3.19: Giao diện hiện lên ban đầu Khi người sử dụng double-click vào biểu tượng shortcut của Xls To Sql Server thì màn hình 3.19 hiện lên đầu tiên và yêu cầu người sử dụng nhập vào Server và Database. Nhập vào tên server của SQL Server và tên Database Hình 3.20: Giao diện yêu cầu nhập tên Server và Database Người sử dụng nhập vào những thông tin về tên Server và Database, sau đó click vào button Connect. Click vào link để mở giao diện import dữ liệu Hình 3.21: Giao diện sau khi connect thành công Khi connect thành công được với cơ sở dữ liệu KH_TONGHOP, thì giao diện hình 3.21 sẽ hiện lên yêu cầu những bước tiếp theo. Trong trường hợp này, người sử dụng muốn import dữ liệu nên chỉ cần click vào link Open Import Wizard Check khi muốn bỏ dòng đầu Khi nhập sheet thì tự động hiện các cột và dòng đầu tiên trong sheet đó Nhập sheet để cần import Nhập nơi để file excel Hình 3.22: Giao diện nhập thông tin file excel cần import Hình 3.23: Giao diện thể hiện các cột trong sheet được chọn Khi các giá trị trong cột Load được check thì click OK và quay trở về giao diện hình 3.22, tiếp tục click Next để chuyển sang giao diện 2 Kết quả của bảng được chọn Nhập tên bảng trong database KH_TONGHOP Hình 3.24: Giao diện nhập tên bảng trong cơ sở dữ liệu tương ứng với sheet được chọn Sau khi chọn bảng tương ứng sheet đã chọn ban đầu, click Next Xem kết quả tương ứng sheet với bảng Hình 3.25: Giao diện kiểm tra lại kết quả muốn import Người sử dụng check vào lựa chọn Append (chèn thêm vào) hay Replace (thay thế dữ liệu đang tồn tại), sau đó click vào Import để tiến hành Import. Lưu ý rằng chỉ có giới hạn 1000 dòng cho mỗi lần Import. Hình 3.26: Giao diện quá trình Import Sau khi chạy hết thì Import thành công. Mở cơ sở dữ liệu KH_TONGHOP lên để kiểm tra kết quả. Chương 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Do thời gian viết chương trình không nhiều, nên không thể thiếu sai sót và hoàn chỉnh đến mức cao nhất. Nhìn chung thì phần mềm đáp ứng được nhu cầu thống kê cơ bản cho người sử dụng, muốn thống kê theo tiêu chí linh động (tùy chọn tiêu chí trong form Formkiemtheochonlua) và tiêu chí theo tuổi và khu vực sống của khách hàng. Nhưng phần mềm chưa có những thống kê về hình vẽ, đồ thị để thấy được cơ cấu khách hàng theo từng tiêu chí khác nhau. Dữ liệu của chương trình chỉ giới hạn trong khu vực thành phố Hồ Chí Minh, cần mở rộng phạm vi thống kê đến 4 khu vực còn lại. Các gái trị trong combobox chỉ thể hiện 1 phần giá trị thống kê thực tế. Hướng phát triển: 4.1. Thu thập dữ liệu ở các khu vực khác: Tiến hành thu thập dữ liệu trên 5 khu vực chính mà ngân hàng Á Châu đã phân nhóm là miền Bắc, miền Trung, Đông nam Bộ, Tây Nam Bộ, TP HCM. 4.2. Điền đầy đủ các giá trị muốn thống kê trong combobox 4.3. Thiết kế form cho Import dữ liệu: Sử dụng phần mềm khác để Import dữ liệu đôi khi gây bất tiện cho người sử dụng, vì vậy cần thiết kế giao diện cho phép Import dữ liệu từ file excel trong phần mềm. Các giao diện thì tương tự như các giao diện của phần mềm XlsToSql. 4.4. Bên cạnh thống kê bằng các con số, nên có những mô hình cho thấy cơ cấu khách hàng được phân nhóm theo từng tiêu chí. Cụ thể là tiêu chí khu vực TP HCM, có các tiêu chí con như là thu nhập, tuổi, nơi làm việc, chuyên môn … trong từng tiêu chí con đó lập mô hình thống kê theo các giá trị phân chia, giúp người sử dụng dễ dàng thấy được cơ cấu phân nhóm khách hàng theo những tiêu chí khác nhau. Đòi hỏi người lập trình có khả năng phân tích, xây dựng tiêu chí phù hợp để phân nhóm khách hàng, tránh những tiêu chí trùng lặp, không quan trọng … 4.5. Kết hợp bái toán phân nhóm khách hàng với phương pháp datamining: Mục đích đi tìm luật, giúp nhận diện được thói quen, sở thích của khách hàng … Bài toán thống kê là một phần trong phương pháp datamining, để phân nhóm khách hàng trước khi đi vào phân tích và đi tìm quy luật. Cũng có thể dựa trên số liệu khách hàng tiềm năng này để làm dữ liệu test chương trình, sau khi đi tìm những quy luật, ta tiến hành áp dụng các quy luật này trên dữ liệu mới để xem dộ tin cậy cao hay thấp … Tài liệu tham khảo: [1] ThS Nguyễn Duy Nhất, Giáo trình nhập môn cơ sở dữ liệu [2] [3] Báo cáo thường niên 2008 – Ngân hàng thương mại cổ phần Á Châu [4] [5]

Các file đính kèm theo tài liệu này:

  • docPhát triển ứng dụng phân nhóm khách hàng - Ngân hàng Á Châu (Điểm cao DH QGTPHCM).doc