Bài giảng Lập trình ứng dụng kinh tế (Phần 1)

pdf 73 trang ngocly 1210
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình ứng dụng kinh tế (Phần 1)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_ung_dung_kinh_te_phan_1.pdf

Nội dung text: Bài giảng Lập trình ứng dụng kinh tế (Phần 1)

  1. TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG KHOA HỆ THỐNG THÔNG TIN KINH TẾ NGUYỄN VĂN HUÂN VŨ XUÂN NAM LÊ ANH TÚ BÀI GIẢNG LẬP TRÌNH ỨNG DỤNG KINH TẾ THÁI NGUYÊN, NĂM 2012 1
  2. MỤC LỤC Lời mở đầu 4 Chương 1: Tổng quan về lập trình ứng dụng kinh tế 4 1.1. Giới thiệu chung về lập trình ứng dụng kinh tế 5 1.2. Những vấn đề cơ bản trong lập trình ứng dụng kinh tế 5 Chương 2: Ngôn ngữ lập trình Visual Basic 11 2.1. Biểu mẫu và một số điều khiển thông dụng 11 2.1.1. Các khái niệm 11 2.1.2 Biểu mẫu (Form) 13 2.1.3. Nhãn (Label) 14 2.1.4. Khung (Frame) 15 2.1.5. Nút lệnh (Command Button) 16 2.1.6. Ô nhập liệu (TextBox) 18 2.2. Lập trình cấu trúc trong Visual Basic 20 2.2.1. Môi trường lập trình 20 2.2.2. Kiểu dữ liệu 22 2.2.3. Hằng số 23 2.2.4 Biến 24 2.2.5. Biểu thức 25 2.2.6. Câu lệnh 26 2.2.7. Chương trình con 33 2.2.8. Truy xuất dữ liệu trong Visual Basic 38 2.2.9. Bẫy lỗi trong Visual Basic 41 2.3 Các kiểu dữ liệu có cấu trúc 42 2.3.1. Khai báo 42 2.3.2. Các hàm xử lý chuỗi 42 2
  3. 2.3.3. Kiểu ngày tháng (Date) 45 2.2.4. Các loại số 46 2.2.5.Kiểu Object 46 2.2.6. Kiểu Variant 47 2.2.7. Kiểu Mảng 49 2.4. Truy xuất cơ sở dữ liệu trong Visual Basic 52 2.4.1. Dùng Visual Basic để tạo một cơ sở dữ liệu 53 2.4.2. Sử dụng cửa sổ xem dữ liệu (Data View) 56 2.4.3. Sử dụng điều khiển dữ liệu để tạo giao diện người sử dụng 58 2.4.4. Các đối tượng truy cập cơ sở dữ liệu 62 Chương 3: Lập trình ứng dụng kinh tế 74 3.1. Hệ hỗ trợ quyết định 74 3.1.1. Khái niệm hệ hỗ trợ quyết định 74 3.1.2. Bài toán phục vụ công cộng 74 3.1.3. Bài toán dự trữ 106 3.2. Bài toán phân tích dự báo kinh tế 120 3.2.1. Giới thiệu về phân tích và dự báo kinh tế 120 3.2.2. Các phương pháp phân tích và dự báo 121 Tài liệu tham khảo 140 3
  4. LỜI MỞ ĐẦU Lập trình ứng dụng kinh tế là môn học rất quan trọng đối với sinh viên ngành Hệ thống thông tin quản lý. Hiện nay có rất nhiều các ngôn ngữ lập trình chuyên nghiệp có thể sử dụng tốt để lập trình các bài toán ứng dụng kinh tế như: Microsoft.NET, C++ Builder, Delphi, v.v. Nhưng Visual Basic 6.0(VB6) có thể coi là một trong những ngôn ngữ dễ đọc nhất. Bài giảng này viết ra phục vụ nhu cầu học môn Lập trình ứng dụng kinh tế cho các sinh viên học ngành Hệ thống thông tin quản lý. Sau những nội dung về lập trình VB căn bản, bài giảng sẽ hướng dẫn sinh viên cách giải các bài toán ứng dụng kinh tế trên môi trường VB6. Kết quả cuối cùng là tạo ra các chương trình ứng dụng giải quyết các bài toán kinh tế tiêu biểu như bài toán dự trữ, bài toán phục vụ công cộng, bài toán phân tích dự báo, bài toán phân tích hoạt động kinh doanh, bài toán lãi suất Nội dung bài giảng gồm 3 chương: Chương 1: Tổng quan về lập trình ứng dụng kinh tế Ở chương này sẽ đi trình bày khái quát tầm quan trọng của việc ứng dụng công nghệ thông tin vào giải quyết các bài toán kinh tế. Qua đó cũng giới thiệu nội dung chính của một số bài toán sẽ được giải quyết trong bài giảng. Chương 2: Ngôn ngữ lập trình Visual Basic Ở chương này, bài giảng sẽ đi trình bày chi tiết những kiến thức tổng quan nhất về ngôn ngữ lập trình Visual Basic. Qua đó sinh viên sẽ nắm chắc những kiến thức của phần này để ứng dụng giải quyết các bài toán kinh tế ở chương sau. Chương 3: Lập trình ứng dụng kinh tế Ở chương này, bài giảng sẽ trình bày nội dung các bài toán kinh tế, sau đó đưa ra các quy trình xử lý, lưu đồ thuật toán cùng cách lập trình các bài toán này. Chương này sẽ cho sinh viên cái nhìn tổng thể cũng như cách thức để sinh viên có thể nắm được phương pháp giải các bài toán kinh tế từ đó có thể ứng dụng các ngôn ngữ lập trình hiện nay để giải quyết các bài toán kinh tế. Phần cuối của giáo trình sẽ cung cấp cho sinh viên các cuốn tài liệu tham khảo để bổ sung thêm lượng kiến thức phục vụ cho bài giảng này. Thái nguyên, tháng 1 năm 2012 4
  5. Chương 1 TỔNG QUAN VỀ LẬP TRÌNH ỨNG DỤNG KINH TẾ 1.1. Giới thiệu chung về lập trình ứng dụng kinh tế Tin học kinh tế là một ngành khoa học nghiên cứu, thiết kế, phát triển và ứng dụng công nghệ thông tin và hệ thống truyền thông trong các doanh nghiệp. Với danh nghĩa một ngành khoa học hỗn hợp, tin học kinh tế đặt nền tảng trên kinh tế học cùng với ngành công nghệ thông tin. Ngoài ra, trong nghiên cứu, giảng dạy cũng như ứng dụng thực tế, tin học kinh tế còn liên quan tới lý thuyết cũng như phương thức của các ngành khoa học xã hội, cũng như các lý thuyết điều khiển học, lý thuyết hệ thống và điện tử viễn thông. Mặc dù có nhiều đặc điểm của một ngành giao thoa, tin học kinh tế vẫn có một phạm vi nghiên cứu riêng biệt, đó là hướng vào lý thuyết, phương cách, công cụ và kiến thức về hệ thống công nghệ thông tin cũng như điện tử viễn thông. Nhiệm vụ của ngành là tạo ra những hệ thống ngày càng phức hợp hơn, đồng thời phát triển và vận hành chúng. Ngoài việc khai thác những hệ thống công nghệ thông tin và điện tử viễn thông, tin học kinh tế còn hướng vào phát triển trên thực tế những hệ thống kinh tế và xã hội để qua đó xác định những hệ thống công nghệ thông tin thiết yếu, đồng thời tạo ra những mô hình công nghệ thông tin mới. Để giải quyết những vấn đề đặt ra trong lĩnh vực tin học kinh tế, môn học lập trình ứng dụng kinh tế sử dụng ngôn ngữ lập trình để giải quyết các bài toán về kinh tế. Học phần này cung cấp các kiến thức về ngôn ngữ lập trình Visual Basic 6.0 qua đó ứng dụng để giải quyết các bài toán kinh tế: phân tích dữ liệu và dự báo kinh tế, phân tích hoạt động kinh doanh, hệ hỗ trợ quyết định, bài toán lãi suất 1.2. Những vấn đề cơ bản trong lập trình ứng dụng kinh tế Lập trình ứng dụng kinh tế nhằm giải quyết các vấn đề cơ bản sau: - Lập trình ứng dụng trong hệ hỗ trợ quyết định + Hệ thống phục vụ công cộng + Hệ thống phục vụ công cộng từ chối cổ điển (Hệ thống EcLang): Một trong những hệ thống phục vụ công cộng đơn giản nhất được mô hình hóa đầu tiên là hệ thống từ chối cổ điển. Hệ thống mang tên người đề xuất bài toán tương ứng: Hệ thống Eclang, nó bắt đầu từ bài toán phân tích một trạm điện thoại thông thường, với vài giả thiết đơn giản. Nhưng cũng chính từ bài toán này, từ hệ thống này người ta đã vận dụng phân tích những hệ thống rất lớn, chẳng hạn hệ thống phòng thủ, hệ 5
  6. thống kiểm dịch, hệ thống săn tin, Sau đây nghiên cứu hệ thống Eclang đơn giản. + Hệ thống chờ với độ dài hàng chờ hạn chế và thời gian chờ không hạn chế: Một lớp các hệ thống phục vụ công cộng khác cũng khá phổ biến, đó là hệ thống có chờ. Đối với hệ thống này, với mỗi yêu cầu tuỳ thuộc vào chế độ tiếp nhận của hệ thống phục vụ và đặc điểm của các yêu cầu có thể được phục vụ trong điều kiện nào đó (thời gian, số chỗ chờ) nhưng phải xếp hàng chờ khi hệ thống có tất cả các kênh bận. Trong thực tế, tình huống phổ biến là độ dài hàng chờ và cả thời gian chờ đều hạn chế, tuy vậy nếu độ dài hàng chờ hạn chế thì cũng có thể xem thời gian chờ của một yêu cầu hầu như là hạn chế. Để đơn giản cho việc nghiên cứu, chúng tôi nghiên cứu mô hình phục vụ công cộng với độ dài hàng chờ hạn chế hay còn gọi là hệ thống chờ với độ dài hàng chờ hạn chế. + Hệ thống chờ thuần nhất: Trong điều kiện hệ thống chờ với độ dài hàng chờ và thời gian chờ đủ lớn, việc một yêu cầu đến hệ thống được phục vụ là một biến cố hầu như chắc chắn. Nói cách khác, người ta không cần quan tâm đến việc còn chỗ chờ hay không và cũng không quan tâm đến thời gian chờ dài hay ngắn. Với mục đích thuận lợi cho việc phân tích hệ thống, chúng ta xét hệ thống phục vụ công cộng chờ với độ dài hàng chờ và thời gian chờ không hạn chế: Hệ thống chờ thuần nhất. + Bài toán dự trữ + Mô hình dự trữ với việc tiêu thụ đều, bổ sung tức thời Mô tả bài toán: Giả sử nhu cầu một loại hàng trong thời kỳ T là Q đơn vị. Việc tiêu thụ hàng là đều đặn và thời gian bổ sung hàng vào kho không đáng kể (tức thời). Chi phí cho mỗi lần đặt hàng là A, giá đơn vị hàng là C, hệ số chi phí dự trữ là I, Thời gian đặt hàng là T0. Hãy xác định số lần đặt hàng và lượng hàng đặt mỗi lần sao cho tổng chi phí bé nhất. + Mô hình dự trữ tiêu thụ đều, bổ sung dần dần Mô tả bài toán: Giả sử nhu cầu một loại hàng trong thời kỳ T là Q đơn vị. Việc tiêu thụ hàng là đều đặn và thời gian bổ sung hàng vào kho được tiến hành với cường độ không đổi K đơn vị trong thời gian T. Ta giả thiết rằng K>>Q vì nếu K Q thì không cần đặt vấn đề dự trữ. Chi phí cho mỗi lần đặt hàng là A, giá đơn vị hàng là C, hệ số chi phí dự trữ là I, Thời gian đặt hàng là T0 . Hãy xác định số lần đặt hàng và lượng hàng đặt mỗi lần sao cho tổng chi phí bé nhất. + Mô hình dữ liệu nhiều mức giá ( giá hàng thay đổi theo số lượng đặt mua mỗi lần). 6
  7. Mô tả bài toán: Trong các mô hình trên, ta giả thiết giá của mỗi đơn vị hàng không đổi. Thực tế do nhiều lý do khác nhau, giá hàng có thể thay đổi theo qui mô của lô hàng mua mỗi lần, chẳng hạn người ta có thể chia các mức giá thành: giá bán lẻ, giá bán buôn cấp 1, cấp 2, hay giá theo đơn đặt hàng có ứng vốn. Nói cách tổng quát là giá mỗi đơn vị hàng có thể thay đổi theo số lượng hàng đặt mỗi lần. - Lập trình ứng dụng trong phân tích và dự báo kinh tế + Phương pháp hồi quy đơn: Còn gọi là hồi quy đơn biến, dùng xét mối quan hệ tuyến tính giữa 1 biến kết quả và 1 biến giải thích hay là biến nguyên nhân (nếu giữa chúng có mối quan hệ nhân quả). Trong phương trình hồi quy tuyến tính, một biến gọi là: biến phụ thuộc; một biến kia là tác nhân gây ra sự biến đổi, gọi là biến độc lập. + Phương pháp hồi quy bội : Còn gọi là phương pháp hồi quy đa biến, dùng phân tích mối quan hệ giữa nhiều biến số độc lập (tức biến giải thích hay biến nguyên nhân) ảnh hưởng đến 1 biến phụ thuộc (tức biến phân tích hay biến kết quả). + Phương pháp thống kê hồi quy: Còn gọi là thống kê hồi quy đơn giản (simple regression statistical) dùng phương pháp thống kê toán để tính các hệ số a, b của phương trình hồi quy dựa trên toàn bộ quan sát của tập dữ liệu. Đây là phương pháp đáng tin cậy nhất và vì vậy đòi hỏi công phu hơn. + Phương pháp dãy số thời gian: Mặt lượng của hiện tượng thường xuyên biến động qua thời gian. Trong thống kê để nghiên cứu sự biến động này ta thường dựa vào dãy số thời gian. Dãy số thời gian là dãy số các trị số của chỉ tiêu thống kê được sắp xếp theo thứ tự thời gian. - Bài toán phân tích hoạt động kinh doanh + Phương pháp thay thế liên hoàn: Là phương pháp mà ở đó các nhân tố lần lượt được thay thế theo một trình tự nhất định để xác định chính xác mức độ ảnh hưởng của chúng đến chỉ tiêu cần phân tích (đối tượng phân tích) bằng cách cố định các nhân tố khác trong mỗi lần thay thế + Phương pháp số chênh lệch: Thực chất của phương pháp này là trường hợp đặc biệt của phương pháp thay thế liên hoàn. Phương pháp này cũng thực hiện đầy đủ các bước như vậy, tuy chỉ khác điểm sau: Khi xác định nhân tố ảnh hưởng đến chỉ tiêu phân tích, thay vì ta tiến hành thay thế số liệu mà sẽ dùng số chênh lệch của từng nhân tố để tính ảnh hưởng của từng nhân tố. 7
  8. + Phương pháp liên hệ cân đối: Cũng là phương pháp dùng để phân tích mức độ ảnh hưởng của các nhân tố mà giữa chúng có sẵn mối liên hệ cân đối và chúng là nhân tố độc lập. Một lượng thay đổi trong mỗi nhân tố sẽ làm thay đổi trong chỉ tiêu phân tích đúng một lượng tương ứng. Những liên hệ cân đối thường gặp trong phân tích: Tài sản và nguồn vốn; cân đối hàng tồn kho; đẳng thức quá trình kinh doanh; nhu cầu vốn và sử dụng vốn v.v - Phân tích chi phí và giá thành: Dùng phương pháp so sánh, phân tích chung các chỉ tiêu chủ yếu dựa vào các chỉ tiêu gốc: chỉ tiêu kế hoạch, kỳ trước, bình quân ngành hoặc thị trường. - Phân tích các khoản mục chi phí chủ yếu + Phân tích khoản mục chi phí nguyên vật liệu trực tiếp: Để sản xuất ra sản phẩm, các doanh nghiệp phần lớn phải sử dụng nhiều loại nguyện vật liệu. Do vậy tổng mức chi phí nguyên vật liệu cho sản xuất sản phẩm phụ thuộc vào các nhân tố: Khối lượng sản phẩm hoàn thành (quantity of finished products - Mq); Kết cấu về khối lượng sản phẩm (Density of finished products - Md) Định mức tiêu hao nguyên vật liệu cho một đơn vị sản phẩm (material norm of product - Mn); Đơn giá của nguyên vật liệu (material unit price - ký hiệu: Mu). Vậy, tổng mức chi phí nguyên vật liệu cho sản xuất sản phẩm được xác định bằng công thức: M= ∑q×n×u Để phân tích trình độ hoàn thành kế hoạch về tổng mức chi phí nguyên vật liệu, trước hết phải xác định đối tượng phân tích: ΔM = M1- M0 = ∑q1×n1×u1 - ∑q0×n0×u0 + Phân tích khoản mục chi phí nhân công trực tiếp: Phân tích tổng chi phí nhân công trực tiếp được thực hiện chủ yếu qua hai cách tính toán mức độ ảnh hưởng của các nhân tố, việc áp dụng cách tính nào tuỳ thuộc vào dữ liệu thu thập tại doanh nghiệp mà chính xác nhất. Cách 1: Dựa trên các nhân tố như: số lượng sản phẩm sản xuất, tiêu hao giờ công để sản xuất ra một đơn vị sản phẩm, đơn giá tiền công lao động cho một giờ công. Theo phương pháp thay thế liên hoàn hay số chênh lệch ta có thể xác định được mức độ ảnh hưởng của 03 nhân tố này đến tổng chi phí nhân công của doanh nghiệp. 8
  9. Cách 2: Giả sử tổng mức chi phí nhân công trực tiếp chịu ảnh hưởng bởi hai nhân tố: Số lượng công nhân sản xuất và tiền lương bình quân. + Dự báo chi phí sản xuất chung bằng hồi quy đơn Sử dụng phương pháp thống kê hồi quy nhằm để dự báo chi phí sản xuất chung theo khối lượng sản xuất linh hoạt, điều này sẽ giúp cho nhà quản lý có thể chủ động điều tiết lượng hàng sản xuất cho phù hợp với quy mô hoạt động tình hình tài chính của đơn vị. - Phân tích biến động giá thành + Phân tích biến động giá thành đơn vị: Phân tích tình hình thực hiện kế hoạch giá thành đơn vị sản phẩm sẽ giúp cho các nhà quản lý biết được một cách chính xác và cụ thể tình hình thực hiện các định mức kinh tế - kỹ thuật, tình hình tiết kiệm hay vượt chi trên từng khoản chi phí. Từ đó, đánh giá được chính xác công tác quản lý giá thành của toàn doanh nghhiệp, đưa ra được các biện pháp hữu hiệu để giảm giá thành. + Phân tích biến động tổng giá thành sản phẩm so sánh được: Nhằm đánh giá chung tình hình biến động giá thành theo từng loại sản phẩm và toàn bộ sản phẩm sản xuất trong kỳ. Giúp chúng ta nhận thức một cách tổng quát khả năng tăng hay giảm lợi tức của doanh nghiệp do ảnh hưởng của giá thành sản phẩm nào. + Phân tích chi phí trên 1.000 đồng sản phẩm bán ra: Để thấy được mối quan hệ giữa chi phí và kết quả thu nhập trong hoạt động sản xuất kinh doanh, nhất là những doanh nghiệp có sản xuất những sản phẩm không thể so sánh được, mà loại này chiếm tỷ trọng lớn trong tổng số sản phẩm sản xuất được của doanh nghiệp. Vì vậy, việc phân tích kế hoạch hạ thấp giá thành của sản phẩm so sánh được không thấy được sự phấn đấu thực hiện của doanh nghiệp, do đó ta nên phân tích chỉ tiêu chi phí trên 1.000 đồng sản phẩm hàng hoá bán ra - Phân tích lợi nhuận: Đối với doanh nghiệp: Lợi nhuận quyết định sự tồn vong, khẳng định khả năng cạnh tranh, bản lĩnh doanh nghiệp trong một nền kinh tế mà vốn dĩ đầy bất trắc và khắc nghiệt. Vì vậy, tạo ra lợi nhuận là chức năng duy nhất của doanh nghiệp. - Lợi nhuận trong mối quan hệ với doanh thu và chi phí: Phân tích lợi nhuận trong mối quan hệ với doanh thu và chi phí không chỉ giúp doanh nghiệp đánh giá tổng quát quá trình kinh doanh, kết quả kinh doanh và các nhân tố đã ảnh hưởng đến tình hình thực hiện lợi nhuận mà còn là phương pháp phân tích dựa trên những 9
  10. dữ liệu mang tính dự báo, phục vụ cho các quyết định quản trị trong lĩnh vực điều hành hiện tại và hoạch định kế hoạch tương lai. - Phân tích lợi nhuận từ hoạt động kinh doanh: Kết quả hoạt động sản xuất kinh doanh chính phản ánh kết quả hoạt động do chức năng kinh doanh chính đem lại, trong từng kỳ hạch toán của doanh nghiệp, làm cơ sở chủ yếu để đánh giá, phân tích hiệu quả các mặt, các lĩnh vực hoạt động, phân tích nguyên nhân và mức độ ảnh hưởng của các nguyên nhân cơ bản đến kết quả chung của doanh nghiệp. Đồng thời là số liệu quan trọng để tính và kiểm tra số thuế thu nhập doanh nghiệp mà doanh nghiệp phải nộp và sự kiểm tra, đánh giá của các cơ quan quản lý về chất lượng hoạt động của doanh nghiệp. - Bài toán lãi suất: Là quy trình xác định giá trị của tỷ suất lợi tức, lãi suất hiệu dụng lãi đơn và lãi kép. - Bài toán chiết khấu: Là quy trình xác định giá trị hiện tại của một lượng tiền tệ tại một thời điểm trong tương lai và việc thanh toán tiền dựa trên cơ sở các tính toán giá trị thời gian của tiền tệ. Giá trị chiết khấu của một vòng quay tiền tệ được xác định bằng cách khấu trừ giá trị của nó đi một tỷ lệ chiết khấu thích hợp đối với từng đơn vị thời gian giữa thời điểm mà vòng quay tiền tệ được lượng giá với thời gian bắt đầu của vòng quay tiền tệ. Thông thường phần lớn các tỷ lệ chiết khấu được biểu diễn như là tỷ lệ phần trăm theo năm. 10
  11. Chương 2 Ngôn ngữ lập trình Visual Basic 2.1. Biểu mẫu và một số điều khiển thông dụng 2.1.1. Các khái niệm * Điều khiển: Các thành phần có sẵn để người lập trình tạo giao diện tương tác với người dùng. Mỗi điều khiển thực chất là một đối tượng, do vậy nó sẽ có một số điểm đặc trưng cho đối tượng, chẳng hạn như các thuộc tính, các phương thức & các sự kiện. * Thuộc tính: Các đặc trưng của một điều khiển tạo nên dáng vẻ của điều khiển đó. * Phương thức: Các điều khiển có thể thực thi một số tác vụ nào đó, các tác vụ này được định nghĩa sẵn bên trong các phương thức (còn gọi là chương trình con: hàm & thủ tục), người lập trình có thể gọi thực thi các phương thức này nếu cần. * Sự kiện: là hành động của người dùng tác động lên ứng dụng đang thực thi. Thí dụ: - Nhấn phím bất kỳ trên bàn phím. - Nhấp chuột. Các thành phần giao diện có khả năng đáp ứng lại sự kiện. Chẳng hạn khi chúng ta nhấp chuột vào button, lúc đó button nhận biết được sự kiện này; hay như textbox nhận biết được sự kiện bàn phím tác động lên nó. Một ứng dụng trên Windows thường được thực hiện nhờ vào việc đáp ứng lại các sự kiện của người dùng. * Lập trình sự kiện: Các thành phần giao diện có khả năng nhận biết được các sự kiện từ phía người dùng. Tuy nhiên khả năng đáp ứng lại các sự kiện được thực hiện bởi người lập trình. Khi một thành phần giao diện được sử dụng, người lập trình phải xác định chính xác hành động của thành phần giao diện đó để đáp ứng lại một sự kiện cụ thể. Lúc đó người lập trình phải viết đoạn mã lệnh mà đoạn mã lệnh này sẽ được thực thi khi sự kiện xảy ra. 11
  12. Chẳng hạn, trong ứng dụng Paint của Windows; khi người sử dụng nhấp chuột vào nút vẽ hình elip sau đó dùng chuột vẽ nó trên cửa sổ vẽ, một hình elip được vẽ ra. Trong lập trình sự kiện, một ứng dụng được xây dựng là một chuỗi các đáp ứng lại sự kiện. Tất cả các hành động của ứng dụng là đáp ứng lại các sự kiện. Do vậy người lập trình cần phải xác định các hành động cần thiết của ứng dụng; phân loại chúng; sau đó viết các đoạn mã lệnh tương ứng. Ví dụ về đáp ứng lại sự kiện: Hình 1: Ví dụ về đáp ứng sự kiện - Khi người dùng không tác động vào ứng dụng, ứng dụng không làm gì cả. - Khi người dùng nhập dữ liệu vào các ô nhập Họ và tên, Địa chỉ; sự kiện bàn phím xảy ra trên các ô nhập. Tuy nhiên, ứng dụng vẫn không làm gì cả vì không có đoạn mã lệnh nào đáp ứng các sự kiện này. - Khi người dùng nhấp nút chọn Ghi đĩa, ứng dụng tìm kiếm trong mã lệnh của mình thấy có đoạn mã lệnh đáp ứng lại sự kiện này; lúc đó đoạn mã lệnh được thực thi. - Tương tự như vậy đối với nút chọn In giấy. * Cách xác lập các thuộc tính & các phương thức trong chương trình . . [( )] * Tên điều khiển (thuộc tính Name) Đây là thuộc tính xác định tên của điều khiển trong ứng dụng. Tên này được đặt theo quy tắc: o Tên có thể dài từ 1 - 40 ký tự. o Tên phải bắt đầu với ký tự chữ, có thể chữ hoa hay thường. 12
  13. o Sau ký tự đầu tiên, tên có thể chứa ký tự, số hay dấu gạch dưới. Ví dụ: Num, StudentCode, Class12A2 là những tên hợp lệ. 345, 7yu là nhữg tên không hợp lệ. 2.1.2 Biểu mẫu (Form) a. Khái niệm: Chương trình ứng dụng giao tiếp với người dùng thông qua các biểu mẫu (hay còn gọi là cửa sổ, xuất phát từ chữ Form hay Windows); các điều khiển (Control) được đặt lên bên trên giúp cho biểu mẫu thực hiện được công việc đó. Biểu mẫu là các cửa số được lập trình nhằm hiển thị dữ liệu và nhận thông tin từ phía người dùng. b. Thuộc tính o Name: thuộc tính này như là một định danh nhằm xác định tên của biểu mẫu là gì? Ta sẽ sử dụng thuộc tính này để truy xuất đến các thuộc tính khác cùng với phương thức có thể thao tác được trên biểu mẫu. o Caption: chuỗi hiển thị trên thanh tiêu đề của biểu mẫu. o Icon: hình icon được dùng trong thanh tiêu đề của biểu mẫu, nhất là khi biểu mẫu thu nhỏ lại. o WindowState: xác định biểu mẫu sẽ có kích thước bình thường (Normal=0), hay Minimized (=1), Maximized =(2). o Font: xác lập Font cho biểu mẫu. Thuộc tính này sẽ được các điều khiển nằm trên nó thừa kế. Tức là khi ta đặt một điều khiển lên biểu mẫu, thuộc tính Font của điều khiển ấy sẽ tự động trở nên giống y của biểu mẫu. o BorderStyle: xác định dạng của biểu mẫu c. Phương thức o Move: di chuyển biểu mẫu đến tọa độ X,Y: Move X, Y. d. Sự kiện o Form_Initialize: Sự kiện này xảy ra trước nhất và chỉ một lần thôi khi ta tạo ra thể hiện đầu tiên của biểu mẫu. Ta dùng sự kiện Form_Initialize để thực hiện những gì cần phải làm chung cho tất cả các thể hiện của biểu mẫu này. o Form_Load: Sự kiện này xảy ra mỗi lần ta gọi thể hiện một biểu mẫu. 13
  14. Nếu ta chỉ dùng một thể hiện duy nhất của một biểu mẫu trong chương trình thì Form_Load coi như tương đương với Form_Initialize. Ta dùng sự kiện Form_Load để khởi tạo các biến, điều khiển cho các thể hiện của biểu mẫu này. o Form_Activate: Mỗi lần một biểu mẫu được kích hoạt (active) thì một sự kiện Activate phát sinh. Ta thường dùng sự kiện này để cập nhật lại giá trị các điều khiển trên biểu mẫu. o Form_QueryUnload: Khi người sử dụng chương trình nhấp chuột vào nút X phía trên bên phải để đóng biểu mẫu thì một sự kiện QueryUnload được sinh ra. Đoạn chương trình con dưới đây mô tả thủ tục xử lý sự kiện QueryUnload. Private Sub Form_QueryUnload(Cancel As Integer, _ UnloadMode As Integer) End Sub Sự kiện này cho ta khả năng hủy bỏ hành động đóng biểu mẫu bằng cách đặt lại Cancel là 1. o Form_Resize: Sự kiện này xảy ra mỗi khi biểu mẫu thay đổi kích thước. 2.1.3. Nhãn (Label) a. Khái niệm: Nhãn là điều khiển dạng đồ họa cho phép người sử dụng hiển thị chuỗi ký tự trên biểu mẫu nhưng họ không thể thay đổi chuỗi ký tự đó một cách trực tiếp. Biểu tượng (shortcut) trên hộp công cụ: b. Thuộc tính: o Name: Đây là một tên xác định một định danh, người lập trình có thể thay đổi tên này theo cách của mình để tiện sử dụng. o Caption: Thuộc tính quy định chuỗi ký tự hiển thị khi ta tạo một điều khiển nhãn. Khi ta tạo mới một điều khiển thì thuộc tính Caption có giá trị mặc nhiên là “Label ”. Ví dụ: Ta muốn tạo một nhãn là “Chào mừng bạn đến với Visual Basic”, ta thay đổi giá trị của thuộc tính Caption thành “Chào mừng bạn đến với Visual Basic”. Ta có thể thay đổi giá trị của thuôc tính Caption tại thời điểm ứng dụng đang chạy nhờ vào đoạn mã lệnh đơn giản như sau: 14
  15. L1.Caption = "Đã đổi giá trị Caption" với L1 là tên của điều khiển nhãn mà ta muốn đổi. o Font, Fore Color: Quy định kiểu chữ, kích thước, màu hiển thị. o BackStyle, BackColor: BackStyle quy định là nhãn trong suốt hay không. BackColor quy định màu nền của nhãn trong trường hợp không trong suốt. c. Phương thức: o Move: di chuyển nhãn đến tọa độ X,Y: Move X, Y. d. Sự kiện: o Change: Xảy ra mỗi khi nhãn thay đổi giá trị. o Click: Mỗi khi nhãn được chuột nhấp lên, sự kiện này xảy ra. o DblClick: Xảy ra khi người sử dụng nhấp đúp chuột lên điều khiển nhãn. 2.1.4. Khung (Frame) a. Khái niệm: Khung là một điều khiển dùng trong việc bố trí giao diện của biểu mẫu một cách trong sáng và rõ nét. Thông thường các điều khiển cùng phục vụ cho một công việc nào đó sẽ được đặt trong một khung nhằm làm nổi bật vai trò của chúng. Biểu tượng (shortcut) trên hộp công cụ: Khi chúng ta tạo mới một khung để chứa các điều khiển khác, ta có hai cách thực hiện: - Tạo khung chứa trước, sau đó đưa các điều khiển vào trong khung chứa. Đây là cách đơn giản nhất. - Tạo khung chứa sau khi đã tạo mới các điều khiển, khi đó khung chứa sẽ che mất các điều khiển, vì vậy ta cần phải đưa khung chứa ra sau các điều khiển bằng cách nhấp chuột phải và chọn Send to Back. Nhưng đối với cách này, các điều khiển khác không nằm trên khung chứa. Do vậy ta có thể giải quyết bằng cách cắt (Cut) các điều khiển này đi, sau đó dán (Paste) vào trong khung chứa. 15
  16. b. Thuộc tính: Khung cũng có các thuộc tính thông dụng như của điều khiển nhãn chẳng hạn như: Name, Caption, c. Phương thức: o Move: di chuyển khung đến tọa độ X,Y: Move X, Y. d. Sự kiện: o Click, DblClick: xảy ra khi khung nhận được một thao tác nhấp (nhấp đúp) chuột. 2.1.5. Nút lệnh (Command Button) a. Khái niệm: Nút lệnh là một điều khiển dùng để bắt đầu, ngắt hoặc kết thúc một quá trình. Khi nút lệnh được chọn thì nó trông như được nhấn xuống, do đó nút lệnh còn được gọi là nút nhấn (Push Button). Người sử dụng luôn có thể chọn một nút lệnh nào đó bằng cách nhấn chuột trên nút lệnh đó. Biểu tượng (shortcut) trên hộp công cụ: b. Thuộc tính: o Name: sử dụng như một định danh nhằm xác định tên của nút lệnh. o Caption: Dùng để hiển thị một chuỗi nào đó trên nút lệnh. o Default: Nếu giá trị của thuộc tính này là True thì ta có thể chọn nút lệnh bằng cách nhấn phím Enter. 16
  17. o Cancel: Nếu giá trị của thuộc tính này là True thì ta có thể chọn nút lệnh nào đó bằng cách nhấn phím ESC. o Enabled: Trong một biểu mẫu, có thể có nhiều nút lệnh để thực hiện nhiều công việc khác nhau và tại một thời điểm nào đó ta chỉ được phép thực hiện một số công việc. Nếu giá trị thuộc tính Enabled là False thì nút lệnh đó không có tác dụng. Giá trị mặc định của thuộc tính này là True. Ta có thể thay đổi giá trị của thuộc tính tại thời điểm chạy ứng dụng. o ToolTipText: cho phép hiển thị một đoạn văn bản chú thích công dụng của nút lệnh khi người sử dụng dùng chuột rê trên nút nhấn. o Font, Fore Color: Quy định kiểu chữ, kích thước, màu hiển thị. c. Phương thức o Move: di chuyển nút lệnh đến tọa độ X,Y: Move X, Y. d. Phương thức o Click: đây là sự kiện thường xảy ra với nút lệnh. Mỗi khi một nút lệnh được chọn, sự kiện này được kích hoạt. Do đó, người sử dụng sẽ viết mã các lệnh để đáp ứng lại sự kiện này. Ví dụ: Tạo một biểu mẫu có một ô nhập liệu với nhãn là họ tên và một nút lệnh cho phép đưa ra câu chào người dùng đó. Private Sub Command1_Click() MsgBox "Chao mung ban " & Text1.Text & _ " lam quen voi Visual Basic" End Sub Click here Hình 3: Sử dụng nút lệnh 17
  18. 2.1.6. Ô nhập liệu (TextBox) a. Khái niệm: Ô nhập liệu là một điều khiển cho phép nhận thông tin do người dùng nhập vào. Đối với ô nhập liệu ta cũng có thể dùng để hiển thị thông tin, thông tin này được đưa vào tại thời điểm thiết kế hay thậm chí ở thời điểm thực thi ứng dụng. Còn thao tác nhận thông tin do người dùng nhập vào dĩ nhiên là được thực hiện tại thời điểm chạy ứng dụng. Biểu tượng (shortcut) trên hộp công cụ b. Thuộc tính: o Name: Đây là tên của ô nhập liệu, được sử dụng như một định danh. o MaxLength: Thuộc tính quy định số ký tự tối đa có thể nhập vào ô nhập liệu. Nếu số ký tự nhập vào vượt quá số ký tự tối đa thì chỉ có đúng số ký tự tối đa được ghi nhận vào trong thuộc tính Text. o Text: Dùng để nhập vào thông tin cần hiển thị trong Textbox tại thời điểm thiết kế hoặc nhận giá trị do người dùng nhập vào tại thời điểm chạy ứng dụng. Ví dụ: MsgBox Text1.Text Đoạn mã này viết trong sự kiện Click của nút lệnh OK. Cho phép hộp thông báo hiển thị nội dung do người dùng nhập vào ô nhập liệu. Hình 4: Ví dụ về điều khiển ô nhập liệu o Locked: Thuộc tính cho phép người dùng thay đổi nội dung của ô nhập liệu được hay không? Thuộc tính này có thể nhận 2 giá trị True hoặc False. 18
  19. Nếu False thì người dùng có thể thay đổi nội dung của ô nhập liệu & mặc định thì thuộc tính này có giá trị là False. o PasswordChar: Thuộc tính này quy định cách hiển thị thông tin do người dùng nhập vào. Chẳng hạn, nếu ta nhập vào giá trị thuộc tính này là * thì các ký tự nhập vào điều hiển thị bởi dấu * . Thuộc tính này thường được dùng trong trường hợp thông tin nhập vào cần được che giấu (Ví dụ mật khẩu đăng nhập một chương trình ứng dụng nào đó mà trong đó các người dùng khác nhau thì có các quyền khác nhau). o Multiline: Thuộc tính quy định ô nhập liệu có được hiển thị thông tin dưới dạng nhiều hàng hay không, nếu là TRUE thì ô nhập liệu cho phép nhiều hàng. o Font, Fore Color: Quy định kiểu chữ, kích thước, màu hiển thị. o SelLength:Cho phép trả về hoặc đặt trước số lượng ký tự được chọn trong ô nhập liệu. o SelStart: Trả về hoặc xác định điểm bắt đầu của chuỗi được chọn. Đây là vị trí bắt đầu chèn một chuỗi mới trong trường hợp không có đánh dấu chọn chuỗi. o SelText: Trả về hoặc xác định chuỗi ký tự được đánh dấu chọn, chỗi trả về sẽ là rỗng nếu như không đánh dấu chọn chuỗi nào. Ba thuộc tính SelLength, SelStart, SelText chỉ có tác dụng tại thời điểm chạy ứng dụng. c. Phương thức o Move: Di chuyển ô nhập liệu đến tọa độ X, Y: Move X, Y. o SetFocus: Phương thức này nhằm mục đích thiết lập cho điều khiển ô nhập liệu nhận được Focus, nghĩa là nó sẵn sàng được tương tác bởi người sử dụng. d. Sự kiện: o KeyPress: xảy ra khi người sử dụng chương trình nhấn một phím. Đối với điều khiển TextBox, ta thường dùng nó để lọc (filter out) các phím không chấp nhận. Sự kiện KeyPress cho ta một mã Ascii, một số có giá trị từ 0 đến 255, của phím vừa nhấn. Trong ví dụ dưới đây, TextBox Text1 sẽ chỉ nhận biết các phím là số (0 - 9), không nhận biết các phím khác: 19
  20. Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii 57 Then ‘ Mã Ascii của 0 là 48, của 9 là 57 KeyAscii = 0 End If End Sub o KeyDown, KeyUp: mỗi sự kiện KeyPress lại cho ta một cặp sự kiện KeyDown/KeyUp. Sự kiện KeyDown/KeyUp có 2 tham số là KeyCode và Shift. Sự kiện này cho phép ta nhận biết được các phím đặc biệt trên bàn phím. Trong ví dụ dưới đây, ta hiển thị tên các phím chức năng mà người sử dụng chương trình nhấn vào: Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer) If (KeyCode >= 112) And (KeyCode <= 123) Then MsgBox "Ban vua nhan phim chuc nang: F" & _ Trim(Str(KeyCode - 111)) End If End Sub 2.2. Lập trình cấu trúc trong Visual Basic 2.2.1. Môi trường lập trình a. Soạn thảo chương trình: Trong Visual Basic IDE, cửa sổ mã lệnh (Code) cho phép soạn thảo chương trình. Cửa sổ này có một số chức năng nổi bật: o Đánh dấu (Bookmarks): Chức năng này cho phép đánh dấu các dòng lệnh của chương trình trong cửa sổ mã lệnh để dễ dàng xem lại về sau này. Để bật tắt khả năng này, chọn Bookmarks từ menu Edit, hoặc chọn từ thanh công cụ Edit. o Các phím tắt trong cửa sổ mã lệnh: Chức năng Phím tắt Xem cửa sổ Code F7 Xem cửa sổ Object Browser F2 Tìm kiếm CTRL+F 20
  21. Thay thế CTRL+H Tìm tiếp SHIFT+F4 Tìm ngược SHIFT+F3 Chuyển đến thủ tục kế tiếp CTRL+DOWN ARROW Chuyển đến thủ tục trước đó CTRL+UP ARROW Xem định nghĩa SHIFT+F2 Cuộn xuống một màn hình CTRL+PAGE DOWN Cuộn lên một màn hình CTRL+PAGE UP Nhảy về vị trí trước đó CTRL+SHIFT+F2 Trở về đầu của mô-đun CTRL+HOME Đến cuối mô-đun CTRL+END b. Các chức năng tự động: o Tự động kiểm tra cú pháp (Auto Syntax Check) Nếu chức năng này không được bật thì khi ta viết một dòng mã có chứa lỗi, VB chỉ hiển thị dòng chương trình sai với màu đỏ nhưng không kèm theo chú thích gì và tất nhiên ta có thể viết tiếp các dòng lệnh khác. Còn khi chức năng này được bật, VB sẽ cho ta biết một số thông tin về lỗi và hiển thị con trỏ ngay dòng chương trình lỗi để chờ ta sửa. o Yêu cầu khai báo biến (Require Variable Declaration) VB sẽ thông báo lỗi khi một biến được dùng mà không khai báo và sẽ chỉ ra vị trí của biến đó. 21
  22. Hình 5: Cửa sổ Options o Gợi nhớ mã lệnh (Code): Khả năng Auto List Members: Tự động hiển thị danh sách các thuộc tính và phương thức của 1 điều khiển hay một đối tượng khi ta gõ vào tên của chúng. Chọn thuộc tính hay phương thức cần thao tác và nhấn phím Tab hoặc Space để đưa nó vào chương trình. Hình 6: Cửa sổ Code với khả năng gợi nhớ Code 2.2.2. Kiểu dữ liệu a. Khái niệm Kiểu dữ liệu là một tập hợp các giá trị mà một biến của kiểu có thể nhận và một tập hợp các phép toán có thể áp dụng trên các giá trị đó. 22
  23. b. Các kiểu dữ liệu cơ sở trong Visual Basic Kiểu dữ liệu Mô tả Boolean Gồm 2 giá trị: TRUE & FALSE. Byte Các giá trị số nguyên từ 0 – 255 Integer Các giá trị số nguyên từ -32768 – 32767 Long Các giá trị số nguyên từ -2147483648 – 2147483647. Kiểu dữ liệu này thường được gọi là số nguyên dài. Single Các giá trị số thực từ -3.402823E+38 – 3.402823E+38. Kiểu dữ liệu này còn được gọi là độ chính xác đơn. Double Các giá trị số thực từ -1.79769313486232E+308 1.79769313486232E+308. Kiểu dữ liệu này được gọi là độ chính xác kép. Currency Dữ liệu tiền tệ chứa các giá trị số từ - 922.337.203.685.477,5808 - 922.337.203.685.477,5807. String Chuỗi dữ liệu từ 0 đến 65.500 ký tự hay ký số, thậm chí là các giá trị đặc biệt như ^%@. Giá trị kiểu chuỗi được đặt giữa 2 dấu ngoặc kép (“”). Date Dữ liệu kiểu ngày tháng, giá trị được đặt giữa cặp dấu ##. Việc định dạng hiển thị tùy thuộc vào việc thiết lập trong Control Panel. Variant Chứa mọi giá trị của các kiểu dữ liệu khác, kể cả mảng. 2.2.3. Hằng số a. Khái niệm Hằng số (Constant) là giá trị dữ liệu không thay đổi. b. Khai báo hằng [Public|Private] Const [As ] = Trong đó, tên hằng được đặt giống theo quy tắc đặt tên của điều khiển. Ví dụ: Const g = 9.8 Const Num As Integer = 4*5 Ta có thể dùng cửa sổ Object Browser để xem danh sách các hằng có sẵn của 23
  24. VB và VBA (Visual Basic for Application). Trường hợp trùng tên hằng trong những thư viện khác nhau, ta có thể chỉ rõ tham chiếu hằng. [ .][ .] 2.2.4 Biến a. Khái niệm Biến (Variable) là vùng lưu trữ được đặt tên để chứa dữ liệu tạm thời trong quá trình tính toán, so sánh và các công việc khác. Biến có 2 đăc điểm: o Mỗi biến có một tên. o Mỗi biến có thể chứa duy nhất một loại dữ liệu. b. Khai báo [Public|Private|Static|Dim] [ As ] Trong đó, tên biến: là một tên được đặt giống quy tắc đặt tên điều khiển. Nếu cần khai báo nhiều biến trên một dòng thì mỗi khai báo cách nhau dấu phẩy (,). Nếu khai báo biến không xác định kiểu dữ liệu thì biến đó có kiểu Variant. Khai báo ngầm: Đây là hình thức không cần phải khai báo một biến trước khi sử dụng. Cách dùng này có vẻ thuận tiện nhưng sẽ gây một số sai sót, chẳng hạn khi ta đánh nhầm tên biến, VB sẽ hiểu đó là một biến mới dẫn đến kết quả chương trình sai mà rất khó phát hiện. Ví dụ: Dim Num As Long, a As Single Dim Age As Integer Khai báo tường minh: Để tránh rắc rối như đã nêu ở trên, ta nên quy định rằng VB sẽ báo lỗi khi gặp biến chưa được khai báo bằng dòng lệnh: Option Explicit trong phần Declaration (khai báo) của mô-đun. Option Explicit chỉ có tác dụng trên từng mô-đun do đó ta phải đặt dòng lệnh này trong từng mô-đun của biểu mẫu, mô-đun lớp hay mô-đun chuẩn. 24
  25. 2.2.5. Biểu thức a. Khái niệm Toán tử hay phép toán (Operator): là từ hay ký hiệu nhằm thực hiện phép tính và xử lý dữ liệu. Toán hạng: là giá trị dữ liệu (biến, hằng ). Biểu thức: là tập hợp các toán hạng và các toán tử kết hợp lại với nhau theo quy tắc nhất định để tính toán ra một giá trị nào đó. b. Các loại phép toán Phép toán Ý nghĩa Kiểu của đối số Kiểu của kết quả - Phép lấy số đối Kiểu số (Integer, Single ) Như kiểu đối số + Phép cộng hai số Kiểu số (Integer, Single ) Như kiểu đối số - Phép trừ hai số Kiểu số (Integer, Single ) Như kiểu đối số * Phép nhân hai số Kiểu số (Integer, Single ) Như kiểu đối số / Phép chia hai số Kiểu số (Integer, Single ) Single hay Double \ Phép chia lấy phần nguyên Integer, Long Integer, Long Mod Phép chia lấy phần dư Integer, Long Integer, Long ^ Tính lũy thừa Kiểu số (Integer, Single ) Như kiểu đối số Các phép toán số học: Thao tác trên các giá trị có kiểu dữ liệu số. Các phép toán quan hệ Đây là các phép toán mà giá trị trả về của chúng là một giá trị kiểu Boolean (TRUE hay FALSE). Phép toán Ý nghĩa = So sánh bằng nhau So sánh lớn hơn = So sánh lớn hơn hoặc bằng <= So sánh nhỏ hơn hoặc bằng Các phép toán Logic: là các phép toán tác động trên kiểu Boolean và cho kết quả là kiểu Boolean. Các phép toán này bao gồm AND (và), OR (hoặc), NOT 25
  26. (phủ định). Sau đây là bảng giá trị của các phép toán: X Y X AND Y X OR Y NOT X TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE 2.2.6. Câu lệnh Một câu lệnh (statement) xác định một công việc mà chương trình phải thực hiện để xử lý dữ liệu đã được mô tả và khai báo. Các câu lệnh được ngăn cách với nhau bởi ký tự xuống dòng. Ký tự xuống dòng báo hiệu kết thúc một câu lệnh. a. Lệnh gán Cú pháp: = Ví dụ: Giả sử ta có khai báo sau: Dim TodayTemp As Single, MinAge As Integer Dim Sales As Single, NewSales As Single, FullName As String Các lệnh sau gán giá trị cho các biến trên: TodayTemp = 30.5 MinAge = 18 Sales = 200000 NewSales = Sales * 1.2 Giả sử người dùng cần nhập họ và tên vào ô nhập liệu TextBox có thuộc tính Name là txtName, câu lệnh dưới đây sẽ lưu giá trị của ô nhập liệu vào trong biến FullName: FullName = txtName.Text Lưu ý: Kiểu dữ liệu của biểu thức (vế phải của lệnh gán) phải phù hợp với 26
  27. biến ta cần gán trị. b. Lệnh rẽ nhánh If o Một dòng lệnh: If Then o Nhiều dòng lệnh: If Then Các dòng lệnh End If Lưu đồ cú pháp: Trong đó, : biểu thức mà kết quả trả về kiểu Boolean. Ý nghĩa câu lệnh: Các dòng lệnh hay dòng lệnh sẽ được thi hành nếu như điều kiện là đúng. Còn nếu như điều kiện là sai thì câu lệnh tiếp theo sau cấu trúc If Then được thi hành. o Dạng đầy đủ: If Then Else If Then [Khối lệnh 1] ElseIf Then [Khối lệnh 2] 27
  28. [Else [Khối lệnh n]] End If VB sẽ kiểm tra các điều kiện, nếu điều kiện nào đúng thì khối lệnh tương ứng sẽ được thi hành. Ngược lại nếu không có điều kiện nào đúng thì khối lệnh sau từ khóa Else sẽ được thi hành. Ví dụ: If (TheColorYouLike = vbRed) Then MsgBox "You are a lucky person" ElseIf (TheColorYouLike = vbGreen) Then MsgBox "You are a hopeful person" ElseIf (TheColorYouLike = vbBlue) Then MsgBox "You are a brave person" ElseIf (TheColorYouLike = vbMagenta) Then MsgBox "You are a sad person" Else MsgBox "You are an average person" End If c. Lệnh lựa chọn Select Case Trong trường hợp có quá nhiều các điều kiện cần phải kiểm tra, nếu ta dùng cấu trúc rẽ nhánh If Then thì đoạn lệnh không được trong sáng, khó kiểm tra, sửa đổi khi có sai sót. Ngược lại với cấu trúc Select Case, biểu thức điều kiện sẽ được tính toán một lần vào đầu cấu trúc, sau đó VB sẽ so sánh kết quả với từng trường hợp (Case). Nếu bằng nó thi hành khối lệnh trong trường hợp (Case) đó. Select Case Case [Khối lệnh 1] Case 28
  29. [Khối lệnh 2] . . . [Case Else [Khối lệnh n]] End Select Mỗi danh sách kết quả biểu thức sẽ chứa một hoặc nhiều giá trị. Trong trường hợp có nhiều giá trị thì mỗi giá trị cách nhau bởi dấu phẩy (,). Nếu có nhiều Case cùng thỏa điều kiện thì khối lệnh của Case đầu tiên sẽ được thực hiện. Ví dụ của lệnh rẽ nhánh If Then ở trên có thể viết như sau: Select Case TheColorYouLike Case vbRed MsgBox "You are a lucky person" Case vbGreen MsgBox "You are a hopeful person" Case vbBlue MsgBox "You are a brave person" Case vbMagenta MsgBox "You are a sad person" Case Else MsgBox "You are an average person" End Select Toán tử Is & To Toán tử Is: Được dùng để so sánh với một biểu thức nào đó Toán tử To: Dùng để xác lập miền giá trị của . Ví dụ: Select Case Tuoi Case Is <18 MsgBox “Vi thanh nien” 29
  30. Case 18 To 30 MsgBox “Ban da truong thanh, lo lap than di” Case 31 To 60 MsgBox “Ban dang o lua tuoi trung nien” Case Else MsgBox “Ban da lon tuoi, nghi huu duoc roi day!” End Select Lưu ý: Trong ví dụ trên không thể viết Case Tuoi Loop Khối lệnh sẽ được thi hành đến khi nào điều kiện không còn đúng nữa. Do biểu thức điều kiện được kiểm tra trước khi thi hành khối lệnh, do đó có thể khối lệnh sẽ không được thực hiện một lần nào cả. Kiểu 2: Do Loop While Khối lệnh sẽ được thực hiện, sau đó biểu thức điều kiện được kiểm tra, nếu điều kiện còn đúng thì, khối lệnh sẽ được thực hiện tiếp tục. Do biểu thức điều kiện được kiểm tra sau, do đó khối lệnh sẽ được thực hiện ít nhất một lần. 30
  31. Kiểu 3: Do Until Loop Cũng tương tự như cấu trúc Do While Loop nhưng khác biệt ở chỗ là khối lệnh sẽ được thi hành khi điều kiện còn sai. Kiểu 4: Do Loop Until Khối lệnh được thi hành trong khi điều kiện còn sai và có ít nhất là một lần lặp Ví dụ: Đoạn lệnh dưới đây cho phép kiểm tra một số nguyên N có phải là số nguyên tố hay không? Dim i As Integer i = 2 Do While (i Sqr(N)) And (N <> 1) Then MsgBox Str(N) & “ la so nguyen to” Else MsgBox Str(N) & “ khong la so nguyen to” End If Trong đó, hàm Sqr: hàm tính căn bậc hai của một số * Lặp biết trước số lần lặp - For Next Đây là cấu trúc biết trước số lần lặp, ta dùng biến đếm tăng dần hoặc giảm dần để xác định số lần lặp. 31
  32. For = To [Step ] [khối lệnh] Next Biến đếm, điểm đầu, điểm cuối, bước nhảy là những giá trị số (Integer, Single, ). Bước nhảy có thể là âm hoặc dương. Nếu bước nhảy là số âm thì điểm đầu phải lớn hơn điểm cuối, nếu không khối lệnh sẽ không được thi hành. Khi Step không được chỉ ra, VB sẽ dùng bước nhảy mặc định là một. Ví dụ: Đoạn lệnh sau đây sẽ hiển thị các kiểu chữ hiện có của máy bạn. Private Sub Form_Click( ) Dim i As Integer For i = 0 To Screen.FontCount MsgBox Screen.Fonts(I) Next End Sub Ví dụ: Tính N! o Bư ớc 1: Thiết kế chương trình có giao diện: TextBox: Name:txtNum Label: Name: lblKQ o Bước 2: Sự kiện Command1_Click được xử lý: Private Sub Command1_Click() Dim i As Integer, n As Integer, Kq As Long n = Val(txtNum.Text) Kq = 1 For i = 1 To n Kq = Kq * i Next lblKQ.Caption = Str(Kq) End Sub 32
  33. o Lưu dự án và chạy chương trình ta được kết quả như hình dưới: * For Each Next Tương tự vòng lặp For Next, nhưng nó lặp khối lệnh theo số phần tử của một tập các đối tượng hay một mảng thay vì theo số lần lặp xác định. Vòng lặp này tiện lợi khi ta không biết chính xác bao nhiêu phần tử trong tập hợp. For Each In Next Lưu ý: - Phần tử trong tập hợp chỉ có thể là biến Variant, biến Object, hoặc một đối tượng trong Object Browser. - Phần tử trong mảng chỉ có thể là biến Variant. - Không dùng For Each Next với mảng chứa kiểu tự định nghĩa vì Variant không chứa kiểu tự định nghĩa. 2.2.7. Chương trình con a. Khái niệm Trong những chương trình lớn, có thể có những đoạn chương trình viết lặp đi lặp lại nhiều lần, để tránh rườm rà và mất thời gian khi viết chương trình người ta thường phân chia chương trình thành nhiều module, mỗi module giải quyết một công việc nào đó. Các module như vậy gọi là các chương trình con. Một tiện lợi khác của việc sử dụng chương trình con là ta có thể dễ dàng kiểm tra xác định tính đúng đắn của nó trước khi ráp nối vào chương trình chính và do đó việc xác định sai sót để tiến hành hiệu đính trong chương trình chính sẽ thuận lợi hơn. Trong Visual Basic, chương trình con có hai dạng là hàm (Function) và 33
  34. thủ tục (Sub). Hàm khác thủ tục ở chỗ hàm trả về cho lệnh gọi một giá trị thông qua tên của nó còn thủ tục thì không. Do vậy ta chỉ dùng hàm khi và chỉ khi thoả mãn đồng thời các yêu cầu sau đây: o Ta muốn nhận lại một kết quả (chỉ một mà thôi) khi gọi chương trình con. o Ta cần dùng tên chương trình con (có chứa kết quả) để viết trong các biểu Nếu không thỏa mãn hai điều kiện ấy thì dùng thủ tục. b. Thủ tục Khái niệm: Thủ tục là một chương trình con thực hiện một hay một số tác vụ nào đó. Thủ tục có thể có hay không có tham số. Khai báo thủ tục [Private | Public] [Static] Sub [( [As ])] hay End Sub Trong đó: - : Đây là một tên được đặt giống quy tắc tên biến, hằng, - [: ]: có thể có hay không? Nếu có nhiều tham số thì mỗi tham số phân cách nhau dấu phẩy. Nếu không xác định kiểu tham số thì tham số có kiểu Variant. Để gọi thủ tục để thực thi, ta có 2 cách: o [ ] o Call ([ ]) Ví dụ: Thiết kế chương trình kiểm tra xem số nguyên N có phải là số nguyên tố hay không? o Bước 1: Thiết kế chương trình có giao diện 34
  35. TextBox: Name:txtNum o Bước 2: Viết thủ tục KtraNgTo trong phần mã lệnh của Form Sub KTraNgTo(N As Integer) Dim i As Integer i = 2 Do While (i 0) i = i + 1 Loop If (i > Sqr(N)) And (N <> 1) Then MsgBox Str(N) & " la so nguyen to" Else MsgBox Str(N) & " khong la so nguyen to" End If End Sub o Bước 3: Xử lý sự kiện Command1_Click; trong thủ tục xử lý sự kiện này ta có gọi thủ tục KtraNgTo như sau: Private Sub Command1_Click() KTraNgTo Val(txtNum.Text) ‘ Call KtraNgTo(Val(txtNum.Text)) End Sub o Bước 4: Lưu dự án và chạy chương trình. Ta được kết quả sau: 35
  36. Trong ví dụ trên thay vì gọi thủ tục bằng lời gọi: KTraNgTo Val(txtNum.Text) Ta có thể sử dụng cách khác: Call KtraNgTo(Val(txtNum.Text)) c. Hàm Khái niệm: Hàm (Function) là một chương trình con có nhiệm vụ tính toán và cho ta một kết quả. Kết quả này được trả về trong tên hàm cho lời gọi nó. Khai báo hàm [Private | Public | Static] Function [( [As ])] _ [As ] hay End Function Trong đó: - : Đây là một tên được đặt giống quy tắc tên biến, hằng, - [: ]: có thể có hay không? Nếu có nhiều tham số thì mỗi tham số phân cách nhau dấu phẩy. Nếu không xác định kiểu tham số thì tham số có kiểu Variant. - : Kết quả trả về của hàm, trong trường hợp không khai báo As , mặc định, VB hiểu kiểu trả về kiểu Variant. Khi gọi hàm để thực thi ta nhận được một kết quả. Cần chú ý khi gọi hàm thực thi ta nhận được một kết quả có kiểu chính là kiểu trả về của hàm (hay là kiểu Variant nếu ta không chỉ rõ kiểu trả về trong định nghĩa hàm). Do đó lời gọi hàm phải là thành phần của một biểu thức. Cú pháp gọi hàm thực thi: [(tham số)]. Ví dụ: Tính N! o Bước 1: Thiết kế chương trình có giao diện: 36
  37. TextBox: Name:txtNum Label: Name: lblKQ o Bước 2: Thêm một hàm vào cửa sổ mã lệnh của Form Function Giaithua(N As Integer) As Long Dim i As Integer, Kq As Long Kq = 1 For i = 1 To n Kq = Kq * i Next Giaithua = Kq End Function Private Sub Command1_Click() Dim n As Integer n = Val(txtNum.Text) lblKQ.Caption = Str(Giaithua(n)) End Sub Lưu dự án và chạy chương trình ta được kết quả như hình dưới: Lưu ý: Do khi gọi hàm ta nhận được một kết quả nên bên trong phần định 37
  38. nghĩa hàm, trước khi kết thúc ta phải gán kết quả trả về của hàm thông qua tên hàm (trong ví dụ trên là dòng lệnh Giaithua = Kq) 2.2.8. Truy xuất dữ liệu trong Visual Basic a. Các khái niệm o Module: - Một ứng dụng đơn giản có thể chỉ có một biểu mẫu, lúc đó tất cả mã lệnh của ứng dụng đó được đặt trong cửa sổ mã lệnh của biểu mẫu đó (gọi là Form Module). Khi ứng dụng được phát triển lớn lên, chúng ta có thể có thêm một số biểu mẫu nữa và lúc này khả năng lặp đi lặp lại nhiều lần của một đoạn mã lệnh trong nhiều biểu mẫu khác nhau là rất lớn. - Để tránh việc lặp đi lặp lại trên, ta tạo ra một Module riêng rẽ chứa các chương trình con được dùng chung. Visual Basic cho phép 3 loại Module: Module biểu mẫu (Form module): đi kèm với mỗi một biểu mẫu là một module của biểu mẫu đó để chứa mã lệnh của biểu mẫu này. Với mỗi điều khiển trên biểu mẫu, module biểu mẫu chứa các chương trình con và chúng sẵn sàng được thực thi để đáp ứng lại các sự kiện mà người sử dụng ứng dụng tác động trên điều khiển. Module biểu mẫu được lưu trong máy tính dưới dạng các tập tin có đuôi là *.frm. Module chuẩn (Standard module): Mã lệnh không thuộc về bất cứ một biểu mẫu hay một điều khiển nào sẽ được đặt trong một module đặc biệt gọi là module chuẩn (được lưu với đuôi *.bas). Các chương trình con được lặp đi lặp lại để đáp ứng các sự kiện khác nhau của các điều khiển khác nhau thường được đặt trong module chuẩn. Module lớp (Class module): được sử dụng để tạo các điều khiển được gọi thực thi trong một ứng dụng cụ thể. Một module chuẩn chỉ chứa mã lệnh nhưng module lớp chứa cả mã lệnh và dữ liệu, chúng có thể được coi là các điều khiển do người lập trình tạo ra (được lưu với đuôi *.cls). o Phạm vi (scope): xác định số lượng chương trình có thể truy xuất một biến. Một biến sẽ thuộc một trong 3 loại phạm vi: Phạm vi biến cục bộ. Phạm vi biến module. Phạm vi biến toàn cục. b. Biến toàn cục o Khái niệm: Biến toàn cục là biến có phạm vi hoạt động trong toàn bộ ứng dụng. 38
  39. o Khai báo: Global [As ] c. Biến cục bộ o Khái niệm: Biến cục bộ là biến chỉ có hiệu lực trong những chương trình mà chúng được định nghĩa. o Khai báo: Dim [As ] Lưu ý: Biến cục bộ được định nghĩa bằng từ khóa Dim sẽ kết thúc ngay khi việcthi hành thủ tục kết thúc. d. Biến Module o Khái niệm: Biến Module là biến được định nghĩa trong phần khai báo (General|Declaration) của Module và mặc nhiên phạm vi hoạt động của nó là toàn bộ Module ấy. o Khai báo: - Biến Module được khai báo bằng từ khóa Dim hay Private & đặt trong phần khai báo của Module. Ví dụ: Private Num As Integer - Tuy nhiên, các biến Module này có thể được sử dụng bởi các chương trình con trong các Module khác. Muốn thế chúng phải được khai báo là Public trong phân Khai báo (General|Declaration) của Module. Ví dụ: Public Num As Integer Lưu ý: Không thể khai báo biến với từ khóa là Public trong chương trình con. e. Truyền tham số cho chương trình con o Khái niệm Một chương trình con đôi lúc cần thêm một vài thông tin về trạng thái của đoạn mã lệnh mà nó định nghĩa để thực thi. Những thông tin này là các biến được truyền vào khi gọi chương trình con, các biến này gọi là tham số của chương trình con. 39
  40. Có hai cách để truyền tham số cho chương trình con: Truyền bằng giá trị & truyền bằng địa chỉ. o Truyền tham số bằng giá trị Với cách truyền tham số theo cách này, mỗi khi một tham số được truyền vào, một bản sao của biến đó được tạo ra. Nếu chương trình con có thay đổi giá trị, những thay đổi này chỉ tác động lên bản sao của biến. Trong VB, từ khóa ByVal được dùng để xác định tham số được truyền bằng giá trị. Ví dụ: Sub Twice (ByVal Num As Integer) Num = Num * 2 Print Num End Sub Private Sub Form_Click() Dim A As Integer A = 4 Print A Twice A Print A End Sub Kết quả thực hiện của đoạn chương trình trên: 4 8 4 o Truyền tham số bằng địa chỉ Truyền tham số theo địa chỉ cho phép chương trình con truy cập vào giá trị gốc của biến trong bộ nhớ. Vì thế, giá trị của biến có thể sẽ bị thay đổi bởi đoạn mã lệnh trong chương trình con. Mặc nhiên, trong VB6 các tham số được truyền theo địa chỉ; tuy nhiên ta có thể chỉ định một cách tường minh nhờ vào từ khóa ByRef. Ví dụ: Sub Twice (Num As Integer) Num = Num * 2 40
  41. Print Num End Sub Private Sub Form_Click() Dim A As Integer A = 4 Print A Twice A Print A End Sub Kết quả thực hiện của đoạn chương trình trên: 4 8 8 2.2.9. Bẫy lỗi trong Visual Basic Các thao tác bẫy các lỗi thực thi của chương trình là cần thiết đối với các ngôn ngữ lập trình. Người lập trình khó kiểm soát hết các tình huống có thể gây ra lỗi. Chẳng hạn người ta khó có thể kiểm tra chặt chẽ việc người dùng đang chép dữ liệu từ đĩa mềm (hay CD) khi chúng không có trong ổ đĩa. Nếu có các thao tác bẫy lỗi ở đây thì tiện cho người lập trình rất nhiều. Visual Basic cũng cung cấp cho ta một số cấu trúc để bẫy các lỗi đang thực thi. Cú pháp: Dạng 1: On Error GoTo : Ý nghĩa: - : là một tên được đặt theo quy tắc của một danh biểu. - Nếu một lệnh trong thì khi chương trình thực thi đến câu lệnh đó, chương trình sẽ tự động nhảy đến đoạn chương 41
  42. trình định nghĩa bên dưới để thực thi. Dạng 2: On Error Resume Next Ý nghĩa: - Nếu một lệnh trong thì khi chương trình thực thi đến câu lệnh đó, chương trình sẽ tự động bỏ qua câu lệnh bị lỗi và thực thi câu lệnh kế tiếp. 2.3 Các kiểu dữ liệu có cấu trúc 2.3.1. Khai báo Có hai đặc tả chuỗi ký tự theo cú pháp như sau: - String * Chỉ ra một chuỗi ký tự có độ dài cố định là bao nhiêu ký tự. Trong trường hợp giá trị thực của chuỗi có độ dài ngắn hơn độ dài khai báo thì độ dài của chuỗi thì một số khoảng trắng được thêm vào cho đủ độ dài thực. Trong trường hợp giá trị thực của chuỗi có độ dài lớn hơn độ dài khai báo thì sẽ cắt bớt các ký tự dư thừa bên phải. Một chuỗi không có ký tự nào (độ dài bằng 0) gọi là chuỗi rỗng. - String: Khi không chỉ ra chiều dài tối đa của chuỗi thì mặc nhiên chuỗi có chiều dài tối đa là 65.500 ký tự. Ví dụ: Dim Name As String * 30, Class As String * 10 Dim A As String 2.3.2. Các hàm xử lý chuỗi o Ghép chuỗi: cho phép ghép 2 hay nhiều chuỗi lại với nhau nhờ phép toán &. Ví dụ: Dim FirstWord As String, SecondWord As String Dim Greeting As String FirstWord = "Hello" SecondWord = "World" Greeting = FirstWord & SecondWord ' Greeting bây giờ là "HelloWorld" 42
  43. o Len: trả về chiều dài một chuỗi được chỉ định. Ví dụ: reeting= "Hi John!" Dim iLen As Integer iLen = Len(Greeting) ' iLen bây giờ bằng 8 o Left: Trích chuỗi con từ phần đầu chuỗi gốc Left (String, [length]). o Right: Trích chuỗi con từ phần đuôi chuỗi gốc Right (String, [length]) o Mid: Trích chuỗi con từ giữa chuỗi gốc Mid(String, Start As Long, [length]) Ví dụ 1: Dim Today As String, StrDay As String, StrMonth As String Dim StrYear As String, StrMonthYear As String Today = "24/05/2001" ' Lấy ra 2 ký tự từ bên trái của chuỗi Today StrDay = Left(Today,2) ' StrDay bây giờ bằng "24" ' Lấy ra 4 ký tự từ bên phải của String Today StrYear = Right(Today,4) ' StrYear bây giờ bằng "2001" ' Lấy ra 2 characters bắt đầu từ ký tự thứ tư của chuỗi ‘ Today, ký tự đầu tiên từ bên trái là thứ nhất StrMonth = Mid(Today,4,2) ' StrMonth bây giờ bằng "05" ' Lấy ra phần còn lại bắt đầu từ ký tự 4 của chuỗi Today StrMonthYear = Mid(Today,4) ' StrMonthYear bằng “05/2001" Ví dụ 2: Today = "24/05/2001" ' Thay thế character thứ 3 của Today bằng "-" Mid(Today,3,1) = "-" ' Thay thế 2 ký tự bắt đầu từ ký tự 4 của Today bằng "10" 43
  44. Mid(Today,4,2) = "10" ' Thay thế character thứ 6 của Today bằng "-" Mid(Today,6,1) = "-" ' Today bây giờ bằng "24-10-2001" o InStr: Tìm chuỗi con trong chuỗi gốc. Nếu hàm InStr trả về 0, nghĩa là không tìm thấy. Cú pháp: InStr([start,] string1, string2 [, compare]) Trong đó: - Start: Xác định vị trí trong chuỗi bắt đầu việc tìm kiếm. Nếu giá trị là Null thì sẽ bắt đầu từ đầu chuỗi. Nếu như tham số Compare có đặc tả thì bắt buộc phải khai báo tham số Start. - String1: Biểu thức chuỗi để so sánh. - String2: Chuỗi cần tìm. - Compare: Xác định kiểu so sánh chuỗi. Giá trị: vbTextCompare, vbBinaryCompare. Ví dụ 1: Dim myString As String, Position As Integer myString = "The *rain in Spain mainly " Position = Instr(myString,"*") ' Position sẽ là 5 Nếu trong myString không có dấu "*" thì Position sẽ bằng 0 Ví dụ 2: Dim KeyValuePair As String, Key As String Dim Value As String KeyValuePair = "BeatlesSong=Yesterday" Pos = Instr(KeyValuePair, "=") Key = Left(KeyValuePair, Pos-1) Value = Mid(KeyValuePair, Pos+1) o Replace: tìm và thay thế chuỗi. Cú pháp: Replace(Expression, find, replace[, start[, count[, compare]]]) Trong đó: 44
  45. - Expression: Biểu thức chuỗi chứa chuỗi cần thay thế. - find:Chuỗi cần tìm. - replace: Chuỗi thay thế chuỗi tìm được. - start: Tương tự như hàm InStr. - count: Xác định số lần thay thế. Mặc định là 1. - compare: Tương tự như hàm InStr. o LTrim (RTrim): cắt tất cả các khoảng trắng bên trái (bên phải của chuỗi) Cú pháp: LTrim(string) RTrim(string) o UCase: đổi chuỗi sang chuỗi gồm các ký tự là chữ hoa. Cú pháp: UCase(string) o Asc: cho mã Ascii của một ký tự. o Chr: trả về ký tự ứng với mã Ascii được chỉ định. Dim ASCIINumberA As Integer, CharB As String * 1 Dim StrFive As String * 1 ASCIINumberA = Asc("A") ' ASCIINumberA bây giờ bằng 65 CharB = Chr(66) StrFive = Chr(Asc("0") + 5) ' ta có digit "5" o InstrRev: tương tự như InStr nhưng việc tìm kiếm được tiến hành từ phải sang. o Val: Hàm đổi chuỗi sang số. o Str: Hàm đổi số sang chuỗi. 2.3.3. Kiểu ngày tháng (Date) - Là kiểu mà các biến của nó chứa giá trị ngày tháng. - Để cho VB biết dữ liệu là kiểu Date ta cần đặt giữa hai dấu # (hoặc cặp “”). Ví dụ: Dim D As Date D = #01/02/98# ‘ Hay “01/02/98” 45
  46. Nếu hiểu theo kiểu người Mỹ, đây là ngày 2 tháng giêng năm 1998, còn nếu theo kiểu Anh thì đây là ngày 1 tháng hai năm 1998. Tuy nhiên, định dạng ngày tháng hiển thị phụ thuộc vào quy định của Windows. Hàm Now: trả về ngày giờ hiện tại. Ví dụ: Dùng hàm Now & Format: MsgBox "NOW IS " & Format (Now, "ddd dd-mmm-yyyy hh:nn:ss") ' sẽ hiển thị NOW IS Tue 05-Oct-2004 16:15:532.2.4. Các loại số o Để chuyển đổi một chuỗi ra số ta có các hàm Val, CInt, CSng. Ngược lại để chuyển đổi từ số sang chuỗi ta dùng CStr, Str. Ví dụ: Dollars = "500" ExchangeRatePerDollar = "7000" tempValue= Val(Dollars) * Val(ExchangeRatePerDollar) VNDong = CStr(tempValue) MsgBox "Amount in VN Dong is " & VNDong Ví dụ: Dollars = "500.0" ExchangeRatePerDollar = "7000.0" 'Dùng hàm CSng để đổi chuỗi ra Single tempValue = CSng(Dollars) * CSng(ExchangeRatePerDollar) 'Dùng hàm Format để có các dấu phẩy ở ngàn và triệu ‘ và phải có 2 chữ số sau dấu chấm thập phân. VNDong = Format (tempValue, "#,###,###.00") MsgBox "Amount in VN Dong is " & VNDong o Round: bỏ bớt một số chữ số sau dấu chấm thập phân Ví dụ: Round ( 12.3456789, 4 ) chỉ giữ lại 4 con số sau dấu chấm thập phân và cho ta 12.3457 2.2.5.Kiểu Object Biến kiểu Object chứa một địa chỉ 4 Byte trỏ đến đối tượng trong ứng dụng 46
  47. hiện hành hoặc các ứng dụng khác. Dùng lệnh Set để chỉ ra đối tượng cụ thể. Dim ObjDb As Object Set ObjDb = OpenDatabase("d:\tqdinh\thu.mdb") Khi khai báo biến đối tượng, ta nên chỉ ra tên lớp tường minh, chẳng hạn như TextBox thay vì Control, ứng dụng của ta sẽ chạy nhanh hơn. Ta có thể xem danh sách các lớp có sẵn trong cửa sổ Object Browser. 2.2.6. Kiểu Variant Biến kiểu Variant có thể chứa mọi kiểu dữ liệu kể cả kiểu mảng, kiểu do người dùng định nghĩa nhưng ngoại trừ kiểu chuỗi có độ dài cố định . Biến kiểu Variant có thể nhận các giá trị đặc biệt như Empty, Nothing, Error, Null. Ta có thể xác định kiểu dữ liệu của biến Variant bằng các sử dụng hàm VarType hoặc hàm TypeName. Hàm VarType dùng để kiểm tra kiểu dữ liệu Hằng Giá trị Diễn giải vbEmpty 0 Không chứa gì cả vbNull 1 Dữ liệu không hợp lệ vbInteger 2 Dữ liệu kiểu Integer chuẩn vbLong 3 Dữ liệu kiểu Long Integer vbSingle 4 Dữ liệu kiểu dấu chấm động Single vbDouble 5 Dữ liệu kiểu dấu chấm động Double vbCurrency 6 Kiểu Currency vbDate 7 Kiểu Date vbString 8 Kiểu String vbObject 9 Kiểu Object vbError 10 Có một đối tượng lỗi vbBoolean 11 Kiểu giá trị Boolean chuẩn vbVariant 12 Kiểu Variant vbDataObject 13 Kiểu DAO chuẩn (data access object) vbDecimal 14 Giá trị thuộc hệ thập phân vbByte 17 Kiểu Byte vbUserDefinedType 36 Kiểu do người dùng định nghĩa vbArray 8192 Kiểu mảng 47
  48. Một số chú ý khi dùng biến kiểu Variant: - Nếu muốn thi hành các hàm toán học, Variant phải chứa giá trị kiểu số. - Nếu muốn nối chuỗi, dùng toán tử & thay vì toán tử +. Giá trị Empty: - Đây là giá trị đặc biệt xuất hiện khi một biến chưa được gán trị. Ta dùng hàm IsEmpty để kiểm tra giá trị Empty. - Giá trị Empty biến mất khi có một giá trị bất kỳ được gán cho biến Variant, để trở về giá trị Empty, ta gán từ khoá Empty cho biến Variant. Giá trị Null: Biến Variant chứa giá trị Null trong trường hợp những ứng dụng cơ sở dữ liệu thể hiện không có dữ liệu hoặc dữ liệu không xác định. Giá trị Error: Trong một biến kiểu Variant, Error là một giá trị đặc biệt cho biết đã có một lỗi đã xảy ra bên trong thủ tục. Ví dụ: Private Sub cmdShowDataTypes_Click() Dim sMess As String Dim vVariant As Variant vVariant = "Xin chao" 'String sMess = VarType(vVariant) & vbCrLf ' xuống dòng & về đầu dòng vVariant = 25 ' Integer sMess = sMess & VarType(vVariant) & vbCrLf vVariant = True ' Boolean sMess = sMess & VarType(vVariant) & vbCrLf 'Date vVariant = #1/1/2001# 'trong cặp dấu # sMess = sMess & VarType(vVariant) MsgBox sMess End Sub Khi chạy chương trình kết quả là: 48
  49. 2.2.7. Kiểu Mảng a. Khái niệm - Mảng là tập hợp các phần tử có cùng một kiểu. - Dùng mảng sẽ làm cho chương trình đơn giản và gọn hơn vì ta có thể sử dụng vòng lặp. Mảng sẽ có biên trên và biên dưới, trong đó các thành phần của mảng là liên tiếp trong khoảng giữa hai biên này. - Có hai loại biến mảng: mảng có chiều dài cố định và mảng có chiều dài thay đổi lúc thi hành. b. Khai báo o Mảng có chiều dài cố định: Dim ( ) [As ] Lúc này phần tử đầu tiên có chỉ số là 0 & phần tử cuối cùng có chỉ số là . Dim ( To ) [As ] Ví dụ: ' Khai báo một biến mảng 15 phần tử kiểu Integer Dim Counters(14)As Integer ' Khai báo một biến mảng 21 phần tử kiểu Double Public Sums(20)As Double ' Khai báo một biến mảng 10 phần tử kiểu chuỗi ký tự 49
  50. Dim List (1 To 10) As String * 12 - Hàm UBound trả về biên trên của một mảng. - Hàm LBound trả về biên dưới của một mảng. Ví dụ: UBound(List) sẽ trả về giá trị là 10. LBound(List) sẽ trả về giá trị là 1. * Lưu ý: ta có thể khai báo một mảng nhiều chiều như sau Dim Multi3D (3, 1 To 10, 9) As Double Khai báo này tạo ra một mảng 3 chiều với kích thước 4 x 10 x 10. o Mảng động: - Đây là mảng có kích thước thay đổi, đó là một trong những ưu điểm của mảng động vì nó giúp ta tiết kiệm tài nguyên hệ thống. Ta có thể sử dụng một mảng có kích thước lớn trong một thời gian nào đó rồi xoá bỏ để trả lại vùng nhớ cho hệ thống. - Khai báo một mảng động bằng cách cho nó một danh sách không theo chiều nào cả. Cú pháp: Dim () [As ] Dim DynArray() As Integer Sau đó ta có thể cấp phát số phần tử thật sự bằng lệnh ReDim. ReDim (N) ' Trong đó N là một biểu thức kiểu Integer. ReDim dùng để xác định hay thay đổi kích thước của một mảng động. Ta có thể dùng ReDim để thay đổi số phần tử, số chiều của một mảng nhiều lần nhưng không thể thay đổi kiểu dữ liệu của mảng ngoại trừ kiểu mảng là kiểu Variant. Mỗi lần gọi ReDim tất cả các giá trị chứa trong mảng sẽ bị mất. VB khởi tạo lại giá trị cho chúng (Empty đối với mảng Variant, 0 cho mảng kiểu số, chuỗi rỗng cho mảng chuổi hoặc Nothing cho mảng các đối tượng). Nhưng đôi khi ta muốn tăng kích cỡ của mảng nhưng không muốn làm mất dữ liệu, ta dùng ReDim đi kèm với từ khoá Preserve. Ta xem ví dụ dưới đây: ReDim Preserve DynArray (UBound(DynArray) +10) Tuy nhiên chỉ có biên trên của chiều cuối cùng trong mảng được thay đổi khi ta 50
  51. dùng Preserve. Nếu ta cố tình thay đổi chiều khác hoặc biên dưới thì VB sẽ báo lỗi. Ví dụ: Type TEmployee Fullname As String Salary As Single Age As Integer End Type Chúng ta vừa định nghĩa một kiểu dữ liệu mới có tên là TEmployee. Kiểu này có nét tương tự như một lớp. Về mặt chức năng, cả hai là như nhau, nhưng một lớp có thể chứa trong DLL và sẵn sàng cho việc dùng chung với các ứng dụng khác, trong khi đó kiểu dữ liệu do người dùng định nghĩa phải được khai báo lại trong từng dự án. Do vậy, kiểu lớp có nhiều mặt tiện lợi hơn. Cách truy xuất từng trường của kiểu mẩu tin: . Ví dụ: Giả sử ta có khai báo biến sau: Dim e As TEmployee Ta có thể gán: e.Fullname = “Nguyen Van An” e.Salary = 300000.00 e.Age = 26 Câu lệnh With: - Được sử dụng để viết gọn hơn khi thao tác với dữ liệu kiểu mẩu tin. - Cú pháp: With [ Truy xuất đến từng trường của mẩu tin theo dạng: . ] End With Ví dụ: Dim e As TEmployee Ta có thể gán: 51
  52. With e .Fullname = “Nguyen Van An” .Salary = 300000.00 .Age = 26 End With 2.4. Truy xuất cơ sở dữ liệu trong Visual Basic Visual Basic cung cấp kèm theo nó một bộ máy cơ sở dữ liệu có thể hiểu được dữ liệu của Microsoft Access gọi là Joint Engine Technology (JET). JET là một bộ máy truy cập cơ sở dữ liệu hướng đối tượng và nó là một phần không thể thiếu được của Visual Basic. Phiên bản của JET đi kèm với VB 6.0 là miễn phí nghĩa là VB có thể truy xuất trực tiếp cơ sở dữ liệu của Microsoft Access. Giao diện để VB truy xuất JET có tên là Data Access Objects (DAO). JET là một bộ máy cơ sở dữ liệu tuyệt vời cho các ứng dụng văn phòng chạy trên máy đơn, nhưng hiệu suất của nó giảm đáng kể khi số lượng người dùng tăng lên và cơ sở dữ liệu được mở rộng. Vì điều này JET không phải là một giải pháp tối ưu cho các ứng dụng cơ sở dữ liệu nhiều người dùng. Cho đến nay người ta chưa có một thống kê chính xác được kích thước dữ liệu tối đa hay số lượng người dùng tối đa của JET nhưng nhìn chung JET bị giới hạn nhiều hơn so với các giải pháp khác trong môi trường đa người dùng. Tuy vậy, JET là điểm khởi đầu tốt nhất cho người lập trình VB bởi vì sự đơn giản của nó. Khi kích thước dữ liệu tăng lên, người lập trình bao giờ cũng muốn xây dựng một ứng dụng Khách/Chủ (Client/Server) có khả năng bảo mật cao và linh hoạt. Vì lẽ đó, Microsoft hỗ trợ trong VB để truy cập các cơ sở dữ liệu quan hệ được thông dịch bởi chuẩn Open Database Connectivity (ODBC). ODBC là một kỹ thuật cho phép truy cập các cơ sở dữ liệu quan hệ cao cấp như SQL SERVER hay ORACLE. Tuy nhiên, ODBC cũng có thể được sử dụng để truy cập các cơ sở dữ liệu nhỏ tổ chức bằng Microsoft Access hay Foxpro, thậm chí các cơ sở dữ liệu máy chủ như IBM DB2. Visual Basic sử dụng giao diện đối tượng Remote Data Objects (RDO) để truy cập ODBC. DAO và RDO là những kỹ thuật hỗ trợ việc truy xuất đến các cơ sở dữ liệu quan hệ. Tuy nhiên, Microsoft lại cung cấp một công cụ hữu ích hơn để truy cập dữ liệu goi là OLEDB. OLEDB là kỹ thuật cho phép dữ liệu được truy xuất từ cả 2 nguồn cơ sở dữ liệu: quan hệ và không quan hệ. Điều đó có nghĩa là 52
  53. gồm các cơ sở dữ liệu của Microsoft Access, Oracle, SQL SERVER và cả các nguồn dữ liệu không quan hệ như Excel, Microsoft Index Server, Microsoft Exchange, Active Directory Visual Basic sử dụng giao diện đối tượng ActiveX Data Objects (ADO) để truy cập OLEDB. Visual Basic cung cấp cho ta nhiều công cụ để truy cập dữ liệu như DAO, RDO, ADO. Câu hỏi thường đặt ra là: Kỹ thuật nào được sử dụng lúc nào ở đâu? Nhiều người cho rằng DAO & RDO đã lỗi thời và người ta hiếm sử dụng chúng. Thật ra DAO & RDO là các điển hình cho một vài khả năng tiêu biểu của ADO. Hiện nay, vẫn còn khá nhiều ứng dụng sử dụng DAO & RDO và thật sự chúng bị giới hạn trong chừng mực nào đó. OLEDB thực sự cung cấp một khả năng rộng lớn để truy cập các cơ sở dữ liệu từ nhiều nguồn khác nhau. Tuy vậy, trong một số trường hợp một giải pháp dùng RDO lại hữu dụng hơn ADO. 2.4.1. Dùng Visual Basic để tạo một cơ sở dữ liệu Thông thường chúng ta sẽ sử dụng các hệ quản trị cơ sở dữ liệu để tạo nên một cơ sở dữ liệu, nhưng trong phần này ta sẽ xét qua tính năng tạo cơ sở dữ liệu bằng Visual Basic 6.0. Ta có thể áp dụng phương pháp này cho những cơ sở dữ liệu nhỏ và tương thích với Microsoft Access. a. Sử dụng cửa sổ cơ sở dữ liệu o Từ Menu của VB6, chọn mục Add-Ins, Visual Data Manager. Cửa sổ Visual Data Manager sẽ xuất hiện. o Chọn mục File -> New -> MicroSoft Access -> Version 7.0 MDB. o Chọn thư mục ta muốn lưu cơ sở dữ liệu và tên của cơ sở dữ liệu. Hình 7: Cửa sổ Visual Data Manager 53
  54. Tạo bảng: Để tạo mới một bảng, ta chọn Properties trong cửa sổ Databases, nhấp chuột phải, chọn New Table, đặt tên cho Table tại ô Table Name, ấn Add Field để tạo mới các trường cho bảng. Hình 8: Cửa sổ tạo Table Ta sẽ nhập tên trường tại ô Name, chọn kiểu của trường tại Combo Type, tùy chọn FixedField và VariableField xác định độ dài của trường là cố định hay thay đổi. Sau khi xác định đầy đủ các thuộc tính của trường, ấn OK và tiếp tục thêm vào các trường khác cho bảng. Nếu đã thêm mới đầy đủ các trường của bảng, ấn Close để quay về cửa sổ Table Structure. Sau khi quay về cửa sổ Table Structure, ta sẽ xác lập các chỉ mục cũng như khóa chính của bảng. Hình 9: Cửa sổ tạo khóa chính và chỉ mục Tại ô Name, ta sẽ nhập vào tên của chỉ mục, rồi chọn các trường tham 54
  55. gia vào chỉ mục đó. Nếu ta chọn Primary thì đó chính là các trường cấu thành khóa chính của bảng. Chọn Unique tức là giá trị của chỉ mục đó sẽ không có sự trùng lặp. Ấn Close xác nhận rằng ta đã xây dựng xong tập các chỉ mục của bảng. Sau khi đã hoàn thành tất cả các thao tác trên, để tạo bảng ta ấn Build the Table Tuy rằng đây là một tính năng mới của VB6, tuy nhiên chúng ta cũng sẽ gặp phải rất nhiều bất tiện khi phải thiết kế một cơ sở dữ liệu hoàn chỉnh cũng như trong quá trình bảo trì và sử dụng (khó khăn trong việc thay đổi các thuộc tính đã xác lập, không tạo liên kết giữa các bảng được ). Một phương cách tốt nhất đó là nên dùng các hệ quản trị cơ sở dữ liệu chuyên dùng để thực hiện công việc nêu trên. Hình 10: Tạo bảng cho cơ sở dữ liệu b. Dùng Visual Data Manager để tạo giao diện Ta có thể thiết kế một Form nhập liệu đơn giản cho một Table từ Visual Data Manager. Các bước tiến hành như sau: Từ Visual Data Manager chọn Cơ sở dữ liệu cần thao tác. Chọn Data Form Design từ mục Utility. Chọn Table cần cho việc tạo Form và các trường hiển thị trên Form (thông thường chúng ta sẽ cho hiển thị tất cả các trường). Chọn Build the Form, biểu mẫu mới đã được tạo trong đề án của chúng ta. 55
  56. Hình 11: Thiết lập các thuộc tính cho Form Kết quả sau khi chúng ta xây dựng Form bằng Visual Data Manager: 2.4.2. Sử dụng cửa sổ xem dữ liệu (Data View) VB6 còn hỗ trợ cho người lập trình khả năng làm việc với cơ sở dữ liệu mà không phải thông qua công cụ quản trị cơ sở dữ liệu hoặc các công cụ trong Add-In. Công cụ này chính là cửa sổ Data View. Từ Menu của VB chọn Data View hoặc nhấn nút Data View trên thanh công cụ. Cửa sổ Data View xuất hiện cho ta hai lựa chọn: Data Links và Data Environment Connections. 56
  57. Hình 12: Cửa sổ Data View Liên kết dữ liệu (Data Link) là một cách kết nối môi trường phát triển của VB6 với một cơ sở dữ liệu nào đó. Một kết nối môi trường dữ liệu (Data Environment Connection) là cách thức sử dụng cơ sở dữ liệu trong một đề án cụ thể. Điểm khác biệt giữa hai thành phần này là sự liên quan giữa cơ sở dữ liệu với đề án cụ thể. Để sử dụng cơ sở dữ liệu theo kiểu Data Link, ta tiến hành như sau: Chọn Data Links, ấn chuột phải -> Add a Data Link hoặc ấn nút Data Link trên thanh công cụ của cửa sổ. Cửa sổ Data Link Properties xuất hiện. Hình 13: Hộp thoại Data Link Properties Chọn trình cung cấp Microsoft Jet, chọn Next. Chọn cơ sở dữ liệu muốn nối kết đến, nhấn OK. 57
  58. Liên kết dữ liệu cung cấp một cách nhìn tóm lược về nguồn dữ liệu. Mỗi lần ta tạo một liên kết dữ liệu, ta có thể duyệt bằng cách mở rộng phần tử trong danh sách tóm lược. Thực hiện điều này bằng cách nhấn vào dấu cộng bên trái mỗi phần tử. Hình 14: Cửa số Data 2.4.3. Sử dụng điều khiển dữ liệu để tạo giao diện người sử dụng Điều khiển dữ liệu giúp cho người sử dụng liên kết biểu mẫu của mình đến nguồn cơ sở dữ liệu. Điều khiển dữ liệu cung cấp cho người sử dụng những tính năng xử lý dữ liệu cơ bản như duyệt qua các mẩu tin, thêm mới, cập nhật. Đối với phiên bản VB6 cung cấp cho chúng ta 3 trình điều khiển dữ liệu: DAO (Data Access Object), RDO (Remote Data Object) và ADO (ActiveX Data Object). a. Kết nối với cơ sở dữ liệu và làm việc với các mẩu tin thông qua điều khiển ADO Data Hiển thị dữ liệu Nếu như chúng ta xây dựng một biểu mẫu chỉ để hiển thị các mẩu tin của một bảng, điều này rất đơn giản và ta không cần phải lập trình gì cả. Để sử dụng điều khiển ADO Data, ta cần đánh dấu Microsoft ADO Data Control 6.0 (OLEDB) trong hộp thoại Components. 58
  59. Hình 15: Hộp thoại Components Chọn điều khiển ADO Data từ hộp công cụ đưa vào biểu mẫu, liên kết đến nguồn dữ liệu thông qua hai thuộc tính ConnectionString và RecordSource. ConnectionString: Xác định nguồn dữ liệu cần nối kết, đó chính là chuỗi nối kết chỉ đến cơ sở dữ liệu mà ta thao tác. RecordSource: Xác định xem nối kết của ta đang thao tác trên bảng nào. Ví dụ: Tạo một nối kết đến cơ sở dữ liệu "C:\Program Files\Microsoft Visual Studio\VB98 \Biblio.mdb". Chọn Use Connection String, ấn Build. Chọn Microsoft Jet 4.0 OLE DB Provider. Chọn cơ sở dữ liệu như ví dụ. Ấn OK. Quay về cửa sổ Property Pages, chọn Tab RecordSource, xác định các tùy chọn như hình vẽ. Ấn Close. 59
  60. Sau khi đã xác định được nối kết, ta vẫn không thấy được sự hoạt động của điều khiển dữ liệu, nguyên nhân do chúng ta không có điều khiển để hiển thị nội dung, cách giải quyết vấn đề là dùng điều khiển TextBox hiển thị dữ liệu. Để dùng điều khiển Textbox hiển thị dữ liệu, ta xác định hai thuộc tính sau đây của điều khiển: DataSource, DataField. Các thuộc tính này xác định nguồn dữ liệu và tên trường, đối với ví dụ này đó là Adodc1 (tên của ADO Data) và Au_Id. Thực thi đề án, ta được kết quả sau: Hình 16: Ví dụ dùng ADO Data b. Cập nhật dữ liệu Thao tác cập nhật dữ liệu cũng khá đơn giản, điều khiển ADO Data sẽ tự 60
  61. động cập nhật lại giá trị của mẩu tin hiện hành mỗi khi ta duyệt qua mẩu tin khác, vì vậy ta cũng không phải làm gì cả. c. Thêm mới mẩu tin Để có thể thêm mới mẩu tin, ta có hai phương cách như sau: Thiết lập thuộc tính EOFAction của điều khiển ADO Data là 2- AddNew. Cách này không cần phải lập trình gì cả. Để thêm mới vào một mẩu tin, ta sẽ đi đến cuối mẩu tin, sau đó ấn nút tiếp, ta nhận thấy giá trị của các trường sẽ rỗng để chờ chúng ta nhập mới thông tin vào. Hình 17: Thêm mới mẩu tin dùng ADO Data Thêm mới mẩu tin bằng 2 phương thức AddNew và Update, các bước tiến hành sẽ như sau: - Thiết kế hai nút lệnh là ADD NEW và UPDATE. - Trong sự kiện Click của hai nút trên lần lượt nhập vào câu lệnh sau: Adodc1.Recordset.AddNew, Adodc1.Recordset.Update với Adodc1 là thuộc tính Name của điều khiển dữ liệu. 61
  62. Hình 18: Sử dụng phương thức AddNew và Update d. Dùng sự kiện MoveComplete để cập nhật giao diện người sử dụng Ta có thể dùng sự kiện MoveComplete của điều khiển ADO Data để khởi động sửa đổi trong ứng dụng khi người sử dụng di chuyển từ mẩu tin này sang mẩu tin khác. Sự kiện MoveComplete được kích hoạt khi một mẩu tin mới thành mẩu tin hiện hành. Đây là một trong vài sự kiện được kích hoạt khi điều khiển di chuyển từ mẩu tin này sang mẩu tin khác. Các sự kiện khác bao gồm WillChange, được kích hoạt khi điều khiển di chuyển từ mẩu tin này sang mẩu tin khác hay thay đổi một mẩu tin và sự kiện RecordChangeComplete, xảy ra khi một mẩu tin được sửa đổi thành công trong cơ sở dữ liệu như một kết quả của hoạt động trong điều khiển dữ liệu. e. Xóa mẩu tin Để xóa mẩu tin trong một ứng dụng sử dụng điều khiển dữ liệu, ta dùng phương thức Delete của đối tượng Recordset của điều khiển dữ liệu. Ví dụ: Adodc1.Recordset.Delete f. Dùng sự kiện WillChangeRecord để đảm bảo dữ liệu hợp lệ Trong lập trình cơ sở dữ liệu, việc đảm bảo rằng dữ liệu nhập vào phù hợp với các quy tắc của một cơ sở dữ liệu người dùng cụ thể là yếu tố quan trọng bậc nhất và mang tính bắt buộc. Đối với điều khiển ADO Data, việc xác định xem dữ liệu có hợp lệ hay không sẽ được viết trong sự kiện WillChangeRecord của điều khiển. Sự kiện này sẽ được kích hoạt khi người dùng thay đổi thông tin của một mẩu tin và di chuyển sang mẩu tin khác hoặc thêm mới mẩu tin. 2.4.4. Các đối tượng truy cập cơ sở dữ liệu (DATA ACCESS OBJECTS) Các ứng dụng Visual Basic có thể thao tác trên cơ sở dữ liệu thông qua DAO (Data Access Objects). Dùng DAO ta có thể thi hành các câu truy vấn để xem, cập nhật, cũng như tạo mới các giá trị cho các mẩu tin của bảng DAO có thể được sử dụng cho các ứng dụng truy cập dữ liệu từ máy cá nhân hoặc các ứng dụng theo kiểu Khách/Chủ (Client/Server). Tuy nhiên, vào thời điểm hiện tại, chúng ta chỉ dùng DAO để thao tác với cơ sở dữ liệu Jet vì dạng ứng dụng Client/Server là thế mạnh của ADO (ActiveX Data Objects). 62
  63. a. Mô hình đối tượng Data Access Objects (DAO) Mô hình đối tượng DAO khá phức tạp với hàng trăm yếu tố với rất nhiều tập hợp chứa khá nhiều đối tượng, mỗi đối tượng lại có các thuộc tính, phương thức và các đối tượng con của riêng nó. Sau đây là mô hình cây phân cấp của đối tượng DAO: Trong lập trình DAO, có một tập hợp cốt lõi các kỹ thuật thông dụng được sử dụng gần như mọi chương trình. Chúng bao gồm: o Thi hành câu truy vấn SELECT để lấy về dữ liệu từ cơ sở dữ liệu. o Duyệt qua từng mẩu tin trong một Recordset. o Thi hành câu truy vấn hành động (Update, Delete, Insert). o Sửa đổi cấu trúc cơ sở dữ liệu. o Xử lý lỗi phát sinh bởi truy cập cơ sở dữ liệu. b. Sử dụng DAO để làm việc với cơ sở dữ liệu Để sử dụng đối tượng DAO, ta cần tham chiếu đến đối tượng này bằng cách chọn Project -> References, sau đó đánh dấu chọn Microsoft DAO 3.51 Object Library. Nhấn OK và ta đã có thể sử dụng các đối tượng do DAO cung cấp. Đối tượng Database Đối tượng Database là nơi bắt đầu việc truy cập đến cơ sở dữ liệu, hay nói cách khác để có thể kết nối và thao tác với cơ sở dữ liệu thông qua DAO thì cần thông qua đối tượng đầu tiên đó là đối tượng Database. Trước tiên ta khai báo một đối tượng Database như sau: Dim db As Database Đối tượng Database có rất nhiều phương thức, ta sẽ chỉ xét qua những phương thức cơ bản và quan trọng nhất cho phép ta thao tác với cơ sở dữ liệu. Sử dụng phương thức OpenDatabase để tạo một đối tượng Database Ta dùng phương thức OpenDatabase để cho phép một đối tượng Database tham khảo đến một cơ sở dữ liệu cụ thể, đối số bắt buộc của phương thức là một chuỗi, kết quả trả về là một đối tượng Database, vì vậy trước khi sử dụng phương thức này, ta cần khai báo một đối tượng Database. Chẳng hạn như: Dim db As Database 63
  64. Set db = OpenDatabase(" \ \baigiang.mdb") Cú pháp đầy đủ của phương thức OpenDatabase: Set database = OpenDatabase (dbname, options, read-only, connect) Ý nghĩa các tham số của phương thức OpenDatabase như sau: Thành phần Ý nghĩa database Biến kiểu đối tượng Database mà ta muốn sử dụng. dbname Chuỗi xác định sự tồn tại của cơ sở dữ liệu Jet hoặc là tên nguồn dữ liệu (DSN) dạng ODBC data source. options Biến mang giá trị xác định tùy chọn loại cơ sở dữ liệu. read-only Mang giá trị kiểu Boolean, TRUE nếu như mở cơ sở dữ liệu dạng chỉ đọc, ngược lại cho kiểu truy xuất đọc và ghi. connect Kiểu chuỗi, xác định kiểu nối kết bao gồm cả mật khẩu. Các giá trị của tùy chọn Options Giá trị Ý nghĩa dbDriverNoPrompt Trình quản lý ODBC dùng chuỗi nối kết cung cấp tên cơ sở dữ liệu và nối kết. Nếu ta không cung cấp thông tin cụ thể, sẽ xảy ra lỗi tại thời điểm thực thi. dbDriverPrompt Trình quản lý ODBC hiển thị hộp thoại các nguồn dữ liệu ODBC. Chuỗi kết nối sẽ được tạo từ nguồn dữ liệu do người dùng chọn thông qua hộp thoại, nếu không nguồn dữ liệu mặc định sẽ được sử dụng. dbDriverComplete Nếu nối kết và tên nguồn dữ liệu xác định đầy đủ các thông tin cần thiết cho một nối kết thì trình quản lý ODBC sẽ dùng chuỗi trong nối kết nếu không sẽ như trường hợp sử dụng dbDriverPrompt. Sử dụng phương thức Execute để thi hành câu truy vấn hành động Ta sử dụng phương thức Excute của đối tượng Database để thi hành một câu lệnh SQL trên cơ sở dữ liệu. tuy vậy phương thức này không nên dùng cho 64
  65. mọi trường hợp. ta chỉ nên dùng phương thức Excute để thi hành các lệnh SQL cho các mục đích sau: o Cập nhật, xóa hay sao chép mẩu tin (trong Access/Jet, ta gọi là các truy vấn hành động). o Sửa cấu trúc cơ sở dữ liệu (được biết như là các lệnh DDL – Ngôn ngữ định nghĩa dữ liệu, Data Definition Language). Các câu truy vấn SELECT theo quy ước (lấy về các mẩu tin) được thi hành nhờ phương thức OpenRecordset của đối tượng Database. Cú pháp: Object.Execute Source - Object: đối tượng Database. - Source: câu SQL kiểu biến chuỗi. Ví dụ: Tăng giá bán mỗi sản phẩm của bảng Products của CSDL Northwind.MDB lên 10%. Dim db As Database Private Sub Form_Load() Set db = OpenDatabase(“Northwind.mdb”) End Sub Private Sub cmdExcute_Click() db.Excute “UPDATE Products ” & _ “SET [Unit Price] = [Unit Price] * 1.1” End Sub Đối tượng Recordset Đối tượng Recordset xác định một tập hợp các mẩu tin từ một bảng cơ sở hoặc kết quả của một câu lệnh truy vấn nào đó. Tại một thời điểm bất kỳ, đối tượng Recordset chỉ tham khảo đến một mẩu tin đơn, đó là mẩu tin hiện hành. Để sử dụng đối tượng Recordset, ta dùng phương thức Open Recordset. Cú pháp thông dụng của OpenRecordset như sau: Set recordset = object.OpenRecordset source [, Type][, Options][, LockEdits] 65
  66. Trong đó phương thức OpenRecordset trả về đối tượng Recordset và object là biến đối tượng kiểu Database, tham số Source ở đây sẽ là một câu lệnh truy vấn (SELECT). Đối tượng Recordset có nhiều loại (Type) khác nhau, sau đây là bảng phân tích công dụng cũng như ưu, nhược điểm của từng kiểu Recordset. Kiểu Ưu điểm Nhược điểm Dynamic Cập nhật được, kết quả trả về Kém hiệu quả hơn so có thể thuộc nhiều bảng khác với kiểu (dbOpenDynamic) nhau thông qua nối kết bảng. Dynaset Một ưu điểm nổi trội đó là đối với cơ sở dữ liệu nhiều người sử dụng, nó có được khả năng tự cập nhật khi các người dùng khác cập nhật mẩu tin chứa trong đó. Dynaset Các chức năng tương tự như Tìm kiếm không thật sự Dynamic, nhưng đạt được hiệu quả do không có (dbOpenDynaset) hiệu quả hơn do không thao các chỉ mục. tác trên dữ liệu thực sự mà là sự tham chiếu đến dữ liệu. Forward-Only Có thể lấy về mẩu tin từ Ta chỉ có thể di (dbOpenForwardOnly) nhiều bảng thông qua nối kết chuyển đến phía trước. bảng. Đặc biệt hiệu quả đối với các Recordset nhỏ. Snapshot Tương tự như Forward-Only Không cập nhật được (dbOpenSnapshot) với dữ liệu Jet. Trả về một bảng sao đến dữ liệu, nên thao tác chậm hơn rất nhiều so với Table Có thể định vị và lấy về các Không thể thực hiện một câu (dbOpenTable) mẩu tin một cách nhanh chóng vì các bảng được lập truy vấn liên quan đến chỉ mục. nhiều bảng. 66
  67. Lưu ý: 9 Nếu ta mở một Recordset với bộ máy CSDL Microsoft Jet và ta không xác định tham số type của OpenRecordset thì dbOpenTable là mặc định (nếu có thể). 9 Với một Recordset xác định một câu truy vấn, dbOpenDynaset là mặc định. 9 Với cách truy cập CSDL theo ODBC, dbOpenForwardOnly là mặc định. Một số giá trị của tham số Option, một hằng số có thể được kết hợp bởi nhiều giá trị khác nhau, xác định đặc tính của Recordset. Hằng số Ý nghĩa dbAppendOnly Cho phép người dùng thêm mẩu tin mới vào Recordset, nhưng không được sửa đổi hay xóa các mẩu tin có sẵn (chỉ với dynaset-Recordset của JET). dbSQLPassThrough Cho phép tham khảo đến các câu SQL của bộ máy CSDL JET khi khi nó được nối với một nguồn dữ liệu ODBC (chỉ với snapshot-Recordset của JET). dbSeeChanges Một lỗi thực thi sẽ xuất hiện khi một người dùng thay đổi dữ liệu mà người khác đang thao tác (chỉ với dynaset-Recordset của JET). Điều này thật sự có ích cho ứng dụng đa người dùng cần đồng bộ hóa dữ liệu. dbDenyWrite Ngăn cản người dùng khác sửa đổi hay thêm mẩu tin. 67
  68. dbDenyRead Ngăn cản người dùng khác đọc dữ liệu từ một bảng (chi với Table-Recordset của JET). dbForwardOnly Một Recordset chỉ cho phép di chuyển tới (snapshot- Recordset của JET). dbReadOnly Không cho người dùng thay đổi dữ liệu. dbRunAsync Thực thi một câu truy vấn không đồng bộ (truy cập dữ liệu theo ODBC). dbExecDirect Thực thi câu truy vấn bỏ qua phương thức SQLPrepare và trực tiếp gọi phương thức SQLExecDirect (truy cập dữ liệu ODBC trong môi trường đa người dùng). Lưu ý: Ta không thể sử dụng tham số lockedits khi options là dbReadOnly. Một số các giá trị của tham số lockedits: Hằng số Ý nghĩa dbReadOnly Ngăn cản người dùng sửa đổi dữ liệu (mặc nhiên đối với cách truy cập dữ liệu theo ODBC). Ta có thể sử dụng hằng số này ở tham số Options hay LockEdits đều được, nhưng không thể cùng một lúc (lỗi thực thi xảy ra). 68
  69. dbPessimistic Khóa trang bi quan trong môi trường đa người dùng. Trang chứa mẩu tin đang sửa đổi sẽ bị khóa lại khi phương thức Edit được thực thi (mặc định đối với JET). dbOptimistic Khóa trang lạc quan trong môi trường đa người dùng. Trang chứa mẩu tin đang sửa đổi sẽ không bị khóa cho tới khi phương thức Update được gọi thực thi. dbOptimisticValue Khóa trang lạc quan đồng thời dựa vào giá trị của một dòng cụ thể (chỉ đối với cách truy cập dữ liệu theo ODBC). dbOptimisticBatch Cho phép cập nhật theo lô (chỉ đối với cách truy cập dữ liệu theo ODBC). Lưu ý: Xét ví dụ sau: Dim db As Database Dim rs As Recordset Set db = OpenDataBase (" \ \baigiang.mdb") Set rs = db.OpenRecordset ("Select * From Canbo " & _ "Order by hotencb="Truong"") - Như vậy câu lệnh cuối cùng trong ví dụ trên sẽ sai ở chỗ là VB không xác định được đâu là dấu trích dẫn của chuỗi và đâu là dấu trích dẫn hết câu lệnh truy vấn. Cách khắc phục là đổi dấu trích dẫn chuỗi thành dấu nháy đơn. - Một điểm cần chú ý khác là khi viết một câu truy vấn trên nhiều dòng thì cần có ký tự nối dòng _ cuối mỗi dòng. - Nếu giá trị của tham số trong câu truy vấn không phải là cứng nhắc, tức ta lấy giá trị từ một biến thì ta theo nguyên tắc sau: 69
  70. Set rs = db.OpenRecordset ("Select * From Canbo " & _ "Order by hotencb = ‘"& name & "’") Đối tượng Field Đối tượng Field giúp chúng ta truy xuất giá trị của một trường trong Recordset. Giá trị của trường sẽ truy xuất qua thuộc tính Value của đối tượng Field, tuy nhiên thuộc tính Value là thuộc tính mặc định của Field, nên ta không cần tham khảo tường minh đến thuộc tính này. Như vậy để truy xuất giá trị của một trường trong 1 Recordset cụ thể, ta có thể dùng một trong các cách sau: - Fields(Num): Num là số thứ tự của trường trong Recordset (bắt đầu tính từ 0) - Fields("name"): Với name là tên trường - Fields![name]: Với name là tên trường. Các phương thức duyệt qua đối tượng Recordset Sau khi nhận về một đối tượng Recordset, ta cần có những cách thức để duyệt qua các mẩu tin phục vụ cho một công việc cụ thể nào đó. Ta có một số phương thức duyệt Recordset như sau: Phương thức Ý nghĩa MoveFirst Di chuyển đến mẩu tin đầu tiên trong Recordset MoveNext Di chuyển đến mẩu tin kế tiếp trong Recordset MovePrevious Di chuyển đến mẩu tin liền trước trong Recordset MoveLast Di chuyển đến mẩu tin cuối trong Recordset Move N Di chuyển đi N mẩu tin được chỉ định trong Recordset Cũng như đã nêu ở trên, có nhiều loại kiểu Recordset, tùy vào từng kiểu mà chúng ta chỉ có thể duyệt tới mà không thể đi lui, khi đó các phương thức như MoveFirst, MovePrevious sẽ gây ra lỗi. Để biết được rằng chúng ta đang di chuyển trong phạm vi các mẩu tin của Recordset, ta sử dụng hai thuộc tính sau đây để xác định điều đó: - BOF: Trả về TRUE nếu ta di chuyển đến trước mẩu tin đầu tiên của Recordset. - EOF: Trả về TRUE nếu ta di chuyển đến sau mẩu tin cuối cùng của 70
  71. Recordset. Hơn thế nữa, ta có thể dùng hai thuộc tính này để kiểm tra một Recordset có rỗng hay không, một Recordset rỗng khi tại một thời điểm bất kỳ cả hai thuộc tính EOF và BOF đều có giá trị là TRUE. Để xác định số mẩu tin có trong một Recordset, ta dùng thuộc tính RecordCount. Nhưng chú ý rằng ta cần di chuyển đến mẩu tin cuối cùng trước khi sử dụng thuộc tính RecordCount thì kết quả trả về mới chính xác. Tại sao lại như vậy? Bởi vì câu lệnh truy vấn được xử lý thông qua hai giai đoạn, trả về số lượng đủ mẩu tin cho xử lý và xử lý bên dưới câu lệnh truy vấn trên một số lượng đúng dữ liệu kết quả, và ta không thể điều khiển được hai quá trình này. Để cập nhật giá trị của 1 mẩu tin ta làm theo các bước như sau: - Dùng các phương thức duyệt mẩu tin để đi đến mẩu tin cần thay đổi giá trị. - Thi hành phương thức Edit. - Dùng thuộc tính Fields để gán trị cho trường trong mẩu tin, chẳng hạn: rs.Fields("hotencb") = “Truong Quoc Dinh” - Lưu lại sự thay đổi bằng cách thi hành phương thức Update. Để thêm mới một mẩu tin ta làm theo các bước: - Thi hành phương thức AddNew, VB sẽ thêm mới một mẩu tin trắng. - Sử dụng các cách thức gán trị để cập nhật giá trị cho mẩu tin mới thêm vào. - Thi hành phương thức Update. Sau khi đã hoàn thành công việc chúng ta cần thi hành phương thức Close để đóng một đối tượng Recordset. Điều này thật sự có ý nghĩa khi Recordset hiện hành đang khóa dữ liệu, phương thức Close sẽ mở khóa và các người dùng khác có thể thao tác trên dữ liệu. Tìm kiếm dữ liệu trong Recordset và Table (bảng) Đôi khi đối với một số công việc nào đó, ta cần tìm kiếm một mẩu tin cụ thể trong một tập các mẩu tin của Recordset, có nhiều phương thức tìm kiếm mẩu tin, tùy vào nội dung công việc mà ta áp dụng phương thức nào cho hiệu quả. Ta có các phương thức tìm kiếm trên Recordset như sau: FindFirst|FindLast|FindNext|FindPrevious 71
  72. Cú pháp của phương thức Find: recordset.{FindFirst | FindLast | FindNext | FindPrevious} criteria Thành phần Ý nghĩa recordset Một biến đối tượng Recordset kiểu dynaset hoặc snapshot. criteria Chuỗi dùng để xác định mẩu tin, giống như mệnh đề WHERE trong câu lệnh SQL nhưng không có từ khóa WHERE. Phương thức Bắt đầu từ Hướng tìm kiếm FindFirst Mẩu tin đầu tiên Đến cuối Recordset FindLast Mẩu tin cuối cùng Đến đầu Recordset FindNext Mẩu tin hiện hành Đến cuối Recordset FindPrevious Mẩu tin hiện hành Đến đầu Recordset Các phương thức tìm kiếm này sẽ không làm nảy sinh một Recordset, nó chỉ di chuyển đến mẩu tin hợp điều kiện và mẩu tin đó trở thành mẩu tin hiện hành, nếu không tìm thấy, mẩu tin hiện hành không thay đổi, khi này thuộc tính NoMacth có giá trị là TRUE. Ngoài ra đối tượng Recordset còn cung cấp phương thức Seek giúp ta tìm kiếm trên một Recordset kiểu bảng có chỉ mục, cú pháp như sau: recordset.Seek comparison, key1, key2 key13 Thành phần Ý nghĩa recordset Một biến đối tượng Recordset kiểu bảng đã định nghĩa chỉ mục thông qua thuộc tính Index. comparison Một trong các biểu thức so sánh sau =, or >. key1, key2 key13 Một hoặc nhiều giá trị tương ứng với trường chỉ mục hiện hành, ta có thể dùng tối đa đến 13 giá trị. c. Sử dụng điều khiển DAO Data 72
  73. Hiện tại mặc dù việc liên kết với cơ sở dữ liệu đều có thể thực hiện thông qua điều khiển ADO Data với nhiều tính năng mạnh hơn, tuy nhiên ta cũng có thể dùng điều khiển DAO Data để tham khảo đến cơ sở dữ liệu Jet cũng như một số loại cơ sở dữ liệu khác như DBASE, văn bản, bảng tính Excel mà chúng ta không cần dùng ODBC. Điều khiển này chính là điều khiển Data mà ta đã xét ở chương 8. Tuy nhiên khi sử dụng điều khiển này thì ta cần chú ý đến thuộc tính Connect, đây là thuộc tính quy định loại dữ liệu sẽ kết nối. Một số kiểu cơ sở dữ liệu được hỗ trợ bởi điều khiển DAO Data: - Microsoft Access. - DBASE III, IV và 5.0. - Phiên bản Excel 3.0, 4.0, 5.0 và 8.0. - Phiên bản FoxPro 2.0,2.5 2.6 và 3.0. - Lotus spreadsheet với định dạng WK1, WK3 và WK4. - Phiên bản Paradox 3.x, 4.x và 5.x. - Tập tin văn bản ASCII có phân cách. 73