Microsoft hiện đang làm chủ các hệ Quản trị CSDL: Foxpro, Access, SQL Server.
Access do Microsoft phát triển từ đầu và trở thành một trong những sản phẩm thành công nhất. Visual Basic dùng kết nối database engine của Access để xử lí dữ liệu, Visual Basic không phải là một hệ quản trị dữ liệu mà là một ngôn ngữ vạn năng. Với Visual Basic ta có thể phát triển nhiều ứng dụng khác nhau.
Nó bao gồm cả trình biên dịch, cho phép nhà phát triển sinh ra các tập tin .EXE chạy độc lập ( dĩ nhiễn cần có thêm các thư viện DLL, VBX, OCX ) còn Access hoàn toàn là một hệ quản trị CSDL. Access không có trình biên dịch như Visual Basic. Tuy nhiên Microsoft cung cấp thêm bộ Access Run time để chạy các ứng dụng mà không cần cài đặt Access.
Cách thiết kế trực quan và cách lập trình hướng sự kiện được áp dụng trong Access và Visual Basic. Access tỏ ra mạnh hơn khi cho phép quản lí các sự kiện tinh tế hơn chẳng hạn như Text Box control, Access cho phép xử lí các cự kiện liên quan đến sự thay đổi dữ liệu: OnChange, BeforeUpdate, AfterUpdate trong khi Visual Basic 4.0 chỉ có thể kiểm tra sự kiện Change. Vì vậy Access cho phép phát triển các chương trình cập nhật dữ liệu thông minh hơn do kiểm soát được dữ liệu nhập một cách tinh tế.
Ban đầu Access đơn giản chỉ là quản trị CSDL quan hệ ( Relation Database Management System ) dùng trong văn phòng ( nằm trong bộ Microsft Professional Word, Exccel, Power Point ) do đó Microsft đặc biệt chú trọng đến người sử dụng cuối (end user) hơn là nhà phát triển. Điều này làm cho công cụ hỗ trợ thiết kế ( giao diện thiết kế, các Wizard cho phép tự động hoá các quá trình thủ công trong quá trình thiết kế form, table, query ) của Access tỏ ra rất mạnh, hơn hẳn Visual Basic.
Chẳng hạn nhiều lập trình viên kinh nghiệm khi viết các câu lệnh SQL trong Visual Basic thường dùng kềm bộ thiết kế Query trong Access để sinh ra trong câu lệnh SQL một cách dễ dàng.
Access Basic có những khác biệt nhất định so với Visual Basic. Chỉ đến phiên bản Access 7.0. Visual Basis về sau và Access mới dùng chung ngôn ngữ lập trình mà Microsft gọi là VBA - Visual Basis for Application.
Ta thấy Access và Visual Basic khác nhau ở cách chế tạo ra các ứng dụng so với các công cụ thiết kế khác nhau nhưng thành phần xử lí CSDL thì có nhiều điểm tương đồng vì cùng sử dụng Jet Engine.
Visual Basic cho phép biện dịch các ứng dụng thành tập tin EXE, trong khi Access ta phỉ phân phối luôn cả tài nguyên thiết kế. Khái ngườiệm CSDL trong Access bao gồm cả phần dữ liệu (các bảng) và phần ứng dụng ( query, form, table, report, macro, module ), trong khi đối với các hệ khác, CSDL chỉ bao gồm phần dữ liệu. Chiến lược bảo mật tài nguyên thiết kế phải được đặt lên hàn đầu khi chọn Access làm công cụ phát triển ứng dụng.
Hệ thống giao diện hỗ trợ thiết kế ( đặc biệt trong Access ) cũng khá rắc rối khiến người chưa có kinh nghiệm hay lẫn lộn giữa các thức dành cho người dùng cuối và những thứ dành cho người lập trình, thứ chỉ dùng cho thiết kế và thứ có thể mang vào ứng dụng.
88 trang |
Chia sẻ: oanh_nt | Lượt xem: 1413 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Báo cáo quản lý điểm sinh viên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Visual Basic là một ngôn ngữ lập trình được hãng Microsoft phát triển .Visual Basic gắn liền với khái niệm lập trình trực quan, nghĩa là khi thiết kế chương trình bạn nhìn ngay thấy ngay kết quả qua từng thao tác và giao diện khi chương trình thực hiện. Đây là thuận lợi lớn so với ngôn ngữ lập trình khác, Visual Basic cho phép bạn chỉnh sửa đơn giản, nhanh chóng màu sắc, kích thước, hình dáng của các đối tượng có mặt trong ứng dụng. Về mặt công nghệ lập trình cũng như tổ chức môi trường làm việc, phiên bản 5.0 và 6.0 có nhiều ưu điểm hơn. Mặt khác, phiên bản 5.0 32 bit và 6.0 được phép xây dựng các ứng dụng 32 bit với môi trường làm việc là Microsoft Windows 95 -> 2000. Cụ thể:
- Version 5.0: Phiên bản 32 bit, phiên bản tương thích hoàn toàn trên môi trường Windows. Hệ thống thư viện sử dụng các DLL ( Dynamic Link Library ) và các thư viện OLE theo công nghệ OCX. Phiên bản 32 tỏ ra thực sự có ưu điểm trong môi trường Windows 95 & 97 nếu cấu hình máy tính của người sử dụng được các nhu cầu sử dụng cao.
- Version 6.0: Là phiên bản mới hiện nay chạy trên môi trường Windows 9.X. Hệ thống sử dụng thư viện DLL và các thư viện OLE theo công nghệ OCX, nhu cầu đòi hỏi cấu hình của máy tính phải đủ mạnh ( máy tính từ 586 trở lên ).
3.3.2. Tổ chức của Mirosoft Visual Basic
- Project: Là sản phẩm lập trình trong môi trường Microsoft được tổ chức thành một Project bao gồm:
- MDI form: Một Project có thể có một màn hình làm theo chế độ Multi Document Interfaccce.
Form: Các màn hình làm việc của Project.
Form: Các màn hình làm việc của Project.
- Module: Được sử dụng để khai báo các Sub, Function, Type, Constant tổng quát trong Proect.
Class Module: khai báo đối tượng trong Project.
Controls:
Các đối tượng được sử dụng trong form Prọect là các thư viện kiểu VBX hoặc OCX. Mỗi đối tượng được đặc trưng Properties và các Events. Các đối tượng của Microsoft Visual Basic có thể phân chia thành các nhóm sau:
Các control chuẩn của hệ điều hành Windows.
- Các đối tượng do Microsoft cung cấp (Data control, Rich Text Control...).
Các đối tượng do hãng phần mền thứ ba hỗ trợ.
3.2.3. Lập trình trên Mirosoft Visual Basic có thể khái quát như sau.
Xây dựng Project trên cơ sở phân tích hệ thống bài toán.
Thiết kế các đối tượng.
- Điều khiển tính chất các đối tượng và viết mã lệnh xử lí trên các sự kiện và các đối tượng.
3.2.4. Lập trình trên Mirosoft Visual Basic
Mirosoft Visual Basic hỗ trợ sử dụng Query trong chương trình của mình. Do vậy việc xử lí dữ liệu có nhiều thuận lợi, đặc biệt CSDL của Access. Trong khi viết chương trình có một số vấn đề quan trọng cần chú ý đó là lỗi và xử lí lỗi.
Công cụ gỡ rối: Khi chạy thử chương trình có thể sử dụng công cụ gỡ rối khá mạnh của Mirosoft Visual Basic ( Debug ). Công cụ này cho phép hiệu chỉnh phần câu lệnh ngay trong khi thực hiện chương tình đối với các lôĩ không quan trọng.
Để thiết kế cơ sở dữ liệu có thể sử dụng một trong các công cụ sau:
ư. Sử dụng phiên bản Micosofft Access tương ứng với phiên bản của Mirosoft Visual Basis.
ư. Sử dụng chương trình DataManager được cung cấp kèm theo Visual Basic
- Thiết kế báo cáo: Để thiết kế mẫu biểu báo cáo có thể sử dụng một trong các công cụ sau:
- Sử dụng phiên bản DataEnviroment tương ứng trong Microsoft Visual Basic
Sử dụng DataReport được cung cấp kèm theo.
3.2.5. Visual Basic và Microsoft Access.
Visual Basic là ngôn ngữ lập trình hướng sự kiện có thể giải quyết được mọi bài toán. Visual Basic cũng giải quyết đựơc các bài toán quản lí mà các ngôn ngữ khác không có. Để phát huy hết khả năng Visual Basic hay Acces chúng ta phải hiểu thật rõ cơ chế xử lí dữ liệu ( Jet Engine ), Jet Engine cho phép làm việc với nhiều dang thức dữ liệu khác nhau và cung cấp giao diện lập trình hướng đối tượng để làm viêc với CSDL. JetEngin là thành phần cốt lõi của hệ quản trị CSDL Access do đó có thể trở thành một nhà lập trình chuyên nghiệp với Visual Basis thì điều đầu tiên là Jet Engine.
Tuy nhiên mỗi ngôn ngữ lập trình có một hệ thống mạnh riêng của nó, ở lĩnh vực này nó không đáp ứng được, không thích hợp được nhưng ở lĩnh vực khác thì lại làm được. Ví dụ như Access có công cụ thiết kế báo biểu mạnh hơn nhiều so với Visual Basis, trong Visual Basic có bộ thiết kế báo biểu không do Microsoft phát triển mà lại do hãng Seagate, và được đưa vào như một OLE Custom Control độc lập.
Vì vậy tuỳ theo yêu cầu của một bài toán cụ thể mà người lập trình chọn một ngôn ngữ thích hợp để giải quyết chúng. Visual Basic 6.0 cho phép người lập trình nhúng các đối tượng hay sử dụng các hàm thư viện DLL một các dễ dàng.
Visual Basis 2.0 đã nhanh hơn, mạnh hơn và còn sử dụng hơn Visual Basic 1.0. Visual Basic 3.0 tăng thêm những cách thức đơn giản để điều khiển các cơ sở dữ liệu mạnh nhất sẵn có. Visual Basic 4.0 hỗ trợ sự phát triển 32 - bit và bắt đầu tiến trình chuyển Visual Basic thành một ngôn ngữ lập trình hướng đối tượng đầy đủ. Phiên bản 5.0 và 6.0 có nhiều tính năng mạnh hơn, đặc biệt là tốc độ gia tăng đáng kể (khoảng 20% nhanh hơn so với Visual Basic 4.0) và những đặc tính liên quan đến Web. Có 3 khía cạnh khẳng định Visual Basic 6.0 thực sự là một ngôn ngữ lập trình đa năng: Thời gian nhập biểu (Form) và điều khiển (control) nhanh hơn hẳn Visual Basic 4.0 tốc độ truy cập dữ liệu nhanh, công nghệ tối ưu của Mirosoft Visual C++ được dùng trong Visual Basic 5.0 và 6.0, phiên bản Visual Basic 6.0 có thêm một số tính năng ngôn ngữ mong muốn, tăng cường cho Internet và các tính năng cơ sở dữ liệu mạnh hơn.
Ngoài ra Visual Basic 5.0 và 6.0 còn có công cụ trợ giúp thông minh, công cụ gỡ rối cao, các công cụ tạo lập ActiveX, cho phép truy cập nhiều nguồn dữ liệu khác nhau. Visual Basic chuyển ứng dụng sang môi trường Web được thực hiện dễ dàng và nhanh chóng hơn.
3.2.6. Mối liên hệ giữa Access và Visual Basic.
Microsoft hiện đang làm chủ các hệ Quản trị CSDL: Foxpro, Access, SQL Server.
Access do Microsoft phát triển từ đầu và trở thành một trong những sản phẩm thành công nhất. Visual Basic dùng kết nối database engine của Access để xử lí dữ liệu, Visual Basic không phải là một hệ quản trị dữ liệu mà là một ngôn ngữ vạn năng. Với Visual Basic ta có thể phát triển nhiều ứng dụng khác nhau.
Nó bao gồm cả trình biên dịch, cho phép nhà phát triển sinh ra các tập tin .EXE chạy độc lập ( dĩ nhiễn cần có thêm các thư viện DLL, VBX, OCX ) còn Access hoàn toàn là một hệ quản trị CSDL. Access không có trình biên dịch như Visual Basic. Tuy nhiên Microsoft cung cấp thêm bộ Access Run time để chạy các ứng dụng mà không cần cài đặt Access.
Cách thiết kế trực quan và cách lập trình hướng sự kiện được áp dụng trong Access và Visual Basic. Access tỏ ra mạnh hơn khi cho phép quản lí các sự kiện tinh tế hơn chẳng hạn như Text Box control, Access cho phép xử lí các cự kiện liên quan đến sự thay đổi dữ liệu: OnChange, BeforeUpdate, AfterUpdate trong khi Visual Basic 4.0 chỉ có thể kiểm tra sự kiện Change. Vì vậy Access cho phép phát triển các chương trình cập nhật dữ liệu thông minh hơn do kiểm soát được dữ liệu nhập một cách tinh tế.
Ban đầu Access đơn giản chỉ là quản trị CSDL quan hệ ( Relation Database Management System ) dùng trong văn phòng ( nằm trong bộ Microsft Professional Word, Exccel, Power Point ) do đó Microsft đặc biệt chú trọng đến người sử dụng cuối (end user) hơn là nhà phát triển. Điều này làm cho công cụ hỗ trợ thiết kế ( giao diện thiết kế, các Wizard cho phép tự động hoá các quá trình thủ công trong quá trình thiết kế form, table, query ) của Access tỏ ra rất mạnh, hơn hẳn Visual Basic.
Chẳng hạn nhiều lập trình viên kinh nghiệm khi viết các câu lệnh SQL trong Visual Basic thường dùng kềm bộ thiết kế Query trong Access để sinh ra trong câu lệnh SQL một cách dễ dàng.
Access Basic có những khác biệt nhất định so với Visual Basic. Chỉ đến phiên bản Access 7.0. Visual Basis về sau và Access mới dùng chung ngôn ngữ lập trình mà Microsft gọi là VBA - Visual Basis for Application.
Ta thấy Access và Visual Basic khác nhau ở cách chế tạo ra các ứng dụng so với các công cụ thiết kế khác nhau nhưng thành phần xử lí CSDL thì có nhiều điểm tương đồng vì cùng sử dụng Jet Engine.
Visual Basic cho phép biện dịch các ứng dụng thành tập tin EXE, trong khi Access ta phỉ phân phối luôn cả tài nguyên thiết kế. Khái ngườiệm CSDL trong Access bao gồm cả phần dữ liệu (các bảng) và phần ứng dụng ( query, form, table, report, macro, module ), trong khi đối với các hệ khác, CSDL chỉ bao gồm phần dữ liệu. Chiến lược bảo mật tài nguyên thiết kế phải được đặt lên hàn đầu khi chọn Access làm công cụ phát triển ứng dụng.
Hệ thống giao diện hỗ trợ thiết kế ( đặc biệt trong Access ) cũng khá rắc rối khiến người chưa có kinh nghiệm hay lẫn lộn giữa các thức dành cho người dùng cuối và những thứ dành cho người lập trình, thứ chỉ dùng cho thiết kế và thứ có thể mang vào ứng dụng.
Chương 4
Các Form trong
chương trình
1. Form chính của chương trình
2. Form Danh mục lớp học
3. Danh mục môn học
4. Danh mục Sinh viên
5. Bảng điểm
Mã nguồn chương trình
1.FRMABOUT:
Option Explicit
' Reg Key Security Options...
Const READ_CONTROL = &H20000
Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE + KEY_SET_VALUE + _
KEY_CREATE_SUB_KEY + KEY_ENUMERATE_SUB_KEYS + _
KEY_NOTIFY + KEY_CREATE_LINK + READ_CONTROL
' Reg Key ROOT Types...
Const HKEY_LOCAL_MACHINE = &H80000002
Const ERROR_SUCCESS = 0
Const REG_SZ = 1 ' Unicode nul terminated string
Const REG_DWORD = 4 ' 32-bit number
Const gREGKEYSYSINFOLOC = "SOFTWARE\Microsoft\Shared Tools Location"
Const gREGVALSYSINFOLOC = "MSINFO"
Const gREGKEYSYSINFO = "SOFTWARE\Microsoft\Shared Tools\MSINFO"
Const gREGVALSYSINFO = "PATH"
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, ByRef phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal lpData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Sub cmdSysInfo_Click()
Call StartSysInfo
End Sub
Private Sub cmdOK_Click()
Unload Me
End Sub
Public Sub StartSysInfo()
On Error GoTo SysInfoErr
Dim rc As Long
Dim SysInfoPath As String
' Try To Get System Info Program Path\Name From Registry...
If GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFO, gREGVALSYSINFO, SysInfoPath) Then
' Try To Get System Info Program Path Only From Registry...
ElseIf GetKeyValue(HKEY_LOCAL_MACHINE, gREGKEYSYSINFOLOC, gREGVALSYSINFOLOC, SysInfoPath) Then
' Validate Existance Of Known 32 Bit File Version
If (Dir(SysInfoPath & "\MSINFO32.EXE") "") Then
SysInfoPath = SysInfoPath & "\MSINFO32.EXE"
' Error - File Can Not Be Found...
Else
GoTo SysInfoErr
End If
' Error - Registry Entry Can Not Be Found...
Else
GoTo SysInfoErr
End If
Call Shell(SysInfoPath, vbNormalFocus)
Exit Sub
SysInfoErr:
MsgBox "System Information Is Unavailable At This Time", vbOKOnly
End Sub
Public Function GetKeyValue(KeyRoot As Long, KeyName As String, SubKeyRef As String, ByRef KeyVal As String) As Boolean
Dim i As Long ' Loop Counter
Dim rc As Long ' Return Code
Dim hKey As Long ' Handle To An Open Registry Key
Dim hDepth As Long '
Dim KeyValType As Long ' Data Type Of A Registry Key
Dim tmpVal As String ' Tempory Storage For A Registry Key Value
Dim KeyValSize As Long ' Size Of Registry Key Variable
'------------------------------------------------------------
' Open RegKey Under KeyRoot {HKEY_LOCAL_MACHINE...}
'------------------------------------------------------------
rc = RegOpenKeyEx(KeyRoot, KeyName, 0, KEY_ALL_ACCESS, hKey) ' Open Registry Key
If (rc ERROR_SUCCESS) Then GoTo GetKeyError ' Handle Error...
tmpVal = String$(1024, 0) ' Allocate Variable Space
KeyValSize = 1024 ' Mark Variable Size
'------------------------------------------------------------
' Retrieve Registry Key Value...
'------------------------------------------------------------
rc = RegQueryValueEx(hKey, SubKeyRef, 0, _
KeyValType, tmpVal, KeyValSize) ' Get/Create Key Value
If (rc ERROR_SUCCESS) Then GoTo GetKeyError ' Handle Errors
If (Asc(Mid(tmpVal, KeyValSize, 1)) = 0) Then ' Win95 Adds Null Terminated String...
tmpVal = Left(tmpVal, KeyValSize - 1) ' Null Found, Extract From String
Else ' WinNT Does NOT Null Terminate String...
tmpVal = Left(tmpVal, KeyValSize) ' Null Not Found, Extract String Only
End If
'------------------------------------------------------------
' Determine Key Value Type For Conversion...
'------------------------------------------------------------
Select Case KeyValType ' Search Data Types...
Case REG_SZ ' String Registry Key Data Type
KeyVal = tmpVal ' Copy String Value
Case REG_DWORD ' Double Word Registry Key Data Type
For i = Len(tmpVal) To 1 Step -1 ' Convert Each Bit
KeyVal = KeyVal + Hex(Asc(Mid(tmpVal, i, 1))) ' Build Value Char. By Char.
Next
KeyVal = Format$("&h" + KeyVal) ' Convert Double Word To String
End Select
GetKeyValue = True ' Return Success
rc = RegCloseKey(hKey) ' Close Registry Key
Exit Function ' Exit
GetKeyError: ' Cleanup After An Error Has Occured...
KeyVal = "" ' Set Return Val To Empty String
GetKeyValue = False ' Return Failure
rc = RegCloseKey(hKey) ' Close Registry Key
End Function
Private Sub lblDescription_Click()
End Sub
Private Sub lblDisclaimer_Click()
End Sub
2.FRMADDLH:
Option Explicit
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdOK_Click()
If Trim(txtName.Text) = "" Or Trim(txtKhoaHoc.Text) = "" Or Trim(txtId.Text) = "" Then
MsgBox "Thông tin về lớp học cần được nhập đầy đủ.", vbInformation, "Thông báo"
Exit Sub
End If
If IsNumeric(txtKhoaHoc.Text) = False Then
MsgBox "Khoá học cần được nhập theo dạng số.", vbInformation, "Thông báo"
Exit Sub
End If
txtKhoaHoc.Text = CInt(txtKhoaHoc.Text)
If v_Add = True Then
If gFTenLop(txtId.Text) = "" Then
gDbe.BeginTrans
gSql = "Insert into LopHoc (MSLop,TenLop,KhoaHoc) " & _
" Values ('" & UCase(txtId.Text) & "', '" & txtName.Text & "', " & Trim(txtKhoaHoc.Text) & ")"
gDb.Execute gSql
gDbe.CommitTrans
Call s_ClearText
FrmLopHoc.Adodc1.Refresh
FrmLopHoc.TDBGrid1.Refresh
Unload Me
Else
MsgBox "Bạn nhập trùng mã số lớp học.", vbCritical, "Error"
txtId.SetFocus
Exit Sub
End If
Else
gDbe.BeginTrans
gSql = "Update LopHoc Set TenLop='" & txtName.Text & "', KhoaHoc = " & Trim(txtKhoaHoc.Text) & " " & _
"Where MSLop='" & v_IdEdit & "'"
gDb.Execute gSql
gDbe.CommitTrans
DoEvents
FrmLopHoc.Adodc1.Refresh
FrmLopHoc.TDBGrid1.Refresh
Unload Me
End If
End Sub
Private Sub Form_Load()
If v_Add = True Then
txtId.Enabled = True
Else
txtId.Enabled = False
txtId.Text = v_IdEdit
txtName.Text = gFTenLop(v_IdEdit)
txtKhoaHoc.Text = gKhoaHoc
End If
End Sub
Private Sub s_ClearText()
txtId.Text = ""
txtName.Text = ""
txtKhoaHoc.Text = ""
End Sub
3.FRMADDMH:
Option Explicit
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdOK_Click()
If Trim(txtName.Text) = "" Or Trim(txtHocKy.Text) = "" Or Trim(txtId.Text) = "" Or Trim(txtSotrinh.Text) = "" Then
MsgBox "Thông tin về môn học cần được nhập đầy đủ.", vbInformation, "Thông báo"
Exit Sub
End If
If IsNumeric(txtHocKy.Text) = False Or IsNumeric(txtSotrinh.Text) = False Then
MsgBox "Học kỳ, Số trình cần được nhập theo dạng số.", vbInformation, "Thông báo"
Exit Sub
End If
txtHocKy.Text = CInt(txtHocKy.Text)
txtSotrinh.Text = CInt(txtSotrinh.Text)
If v_Add = True Then
If gFTenMon(txtId.Text) = "" Then
gDbe.BeginTrans
gSql = "Insert into MonHoc (MSMon,TenMon,HocKy,SoTrinh) " & _
" Values ('" & UCase(txtId.Text) & "', '" & txtName.Text & "', " & Trim(txtHocKy.Text) & ", " & Trim(txtSotrinh.Text) & ")"
gDb.Execute gSql
gDbe.CommitTrans
Call s_ClearText
FrmMonHoc.Adodc1.Refresh
FrmMonHoc.TDBGrid1.Refresh
Unload Me
Else
MsgBox "Bạn nhập trùng mã số môn học.", vbCritical, "Error"
txtId.SetFocus
Exit Sub
End If
Else
gDbe.BeginTrans
gSql = "Update MonHoc Set TenMon='" & txtName.Text & "', HocKy = " & Trim(txtHocKy.Text) & ", SoTrinh = " & Trim(txtSotrinh.Text) & " " & _
"Where MSMon='" & v_IdEdit & "'"
gDb.Execute gSql
gDbe.CommitTrans
DoEvents
FrmMonHoc.Adodc1.Refresh
FrmMonHoc.TDBGrid1.Refresh
Unload Me
End If
End Sub
Private Sub Form_Load()
Dim rst As Recordset
If v_Add = True Then
txtId.Enabled = True
Else
txtId.Enabled = False
txtId.Text = v_IdEdit
Set rst = gDb.OpenRecordset("Select * From MonHoc Where MSMon='" & v_IdEdit & "'")
If rst.EOF = False Or rst.BOF = False Then
rst.MoveFirst
txtName.Text = rst!TenMon
txtHocKy.Text = rst!HocKy
txtSotrinh.Text = rst!SoTrinh
End If
rst.Close
End If
End Sub
Private Sub s_ClearText()
txtId.Text = ""
txtName.Text = ""
txtHocKy.Text = ""
txtSotrinh.Text = ""
End Sub
4.FRMBANGDIEM:
Option Explicit
Private Sub CmChapNhan_Click()
On Error GoTo Err_
If Adodc1.Recordset.EOF = False Then
Adodc1.Recordset.MoveNext
End If
gDbe.BeginTrans
gSql = "Delete From BangDiem Where BangDiem.MSMon = '" & gMSMon & _
"' And BangDiem.MSSV In (Select Distinct MSSV From BangDiemTam)"
gDb.Execute gSql
gSql = "Insert Into BangDiem (MSSV, Diem1, Diem2) " & _
"Select MSSV, Diem1, Diem2 From BangDiemTam"
gDb.Execute gSql
gSql = "Update BangDiem Set MSMon = '" & gMSMon & "' Where IsNull(MSMon)"
gDb.Execute gSql
gDb.Execute "Update BangDiem Set Diem2 = Null Where Diem1>=5"
gDbe.CommitTrans
Unload Me
Exit Sub
Err_:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Error"
gDbe.Rollback
End Sub
Private Sub CmHuyBo_Click()
Unload Me
End Sub
Private Sub Form_Activate()
If Adodc1.Recordset.EOF = True And Adodc1.Recordset.BOF = True Then
MsgBox "Không tồn tại bản ghi", vbInformation, "Thông báo"
'Unload Me
End If
End Sub
Private Sub Form_Load()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdTable
.CursorLocation = adUseClient
.RecordSource = "BangDiemTam"
.Refresh
End With
Select Case gForm
Case 2 ' Nhập điểm thi lần 1
TDBGrid1.Columns(3).Visible = False
Me.Caption = "Nhập điểm thi lần 1 của môn: " & gMSMon & " - " & gFTenMon(gMSMon)
Case 3 ' Nhập điểm thi lần 2
TDBGrid1.Columns(2).Visible = False
Me.Caption = "Nhập điểm thi lần 2 của môn: " & gMSMon & " - " & gFTenMon(gMSMon)
End Select
With TDBGrid1
.Width = .Width - .Columns(3).Width
FrmBangDiem.Width = FrmBangDiem.Width - .Columns(3).Width
CmChapNhan.Left = CmChapNhan.Left - (.Columns(3).Width \ 2)
CmHuyBo.Left = CmHuyBo.Left - (.Columns(3).Width \ 2)
End With
End Sub
Private Sub OpDiem_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
If gForm = 2 Then
.RecordSource = "Select * From BangDiemTam Order by Diem1 Desc"
ElseIf gForm = 3 Then
.RecordSource = "Select * From BangDiemTam Order by Diem2 Desc"
End If
.Refresh
End With
End Sub
Private Sub OpHoTen_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From BangDiemTam Order by HoTen"
.Refresh
End With
End Sub
Private Sub OpMSSV_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From BangDiemTam Order by MSSV"
.Refresh
End With
End Sub
Private Sub TDBGrid1_Click()
End Sub
5.FRMBANGDIEMSINHVIEN:
Option Explicit
Private Sub cmdCancel_Click()
Unload Me
End Sub
Private Sub cmdOK_Click()
Dim rs As Recordset, rs1 As Recordset, v_st As Integer, v_d As Double
If Not IsNumeric(txtHocKy.Text) Then
MsgBox "Học kỳ nhập vào không đúng.", vbCritical, "Error"
Exit Sub
End If
Set rs = gDb.OpenRecordset("Select SV.HoTen, Lop.TenLop From SinhVien SV, LopHoc Lop " & _
"Where MSSV='" & txtMSSV.Text & "' And SV.MSLop=Lop.MSLop")
If rs.EOF = True And rs.BOF = True Then
MsgBox "Không có sinh viên có mã số=" & txtMSSV.Text, vbCritical, "Error"
rs.Close
Exit Sub
End If
With DataEnvi.Connections("Connect")
' .Provider = "Microsoft.Jet.OLEDB.3.5"
' .ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=" & v_AppPath & "Database.mdb"
'.Provider = "MSDASQL.1"
'.ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=Data"
.ConnectionString = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=Data"
.Open
.Properties.Refresh
End With
With DataEnvi.Commands("BangDiem")
.CommandType = adCmdText
.CommandText = "SELECT MSSV, HoTen, MSMon, TenMon, HocKy, SoTrinh, Diem1, Diem2, ST_Diem FROM Query2 " & _
"WHERE MSSV='" & txtMSSV.Text & "' AND HocKy=" & txtHocKy.Text & " " & _
"ORDER BY MSSV"
End With
DataEnvi.Connections("Connect").Properties.Refresh
Call Sleep(500)
Set rs1 = gDb.OpenRecordset("Select Sum(SoTrinh) as ST,Sum(ST_Diem) As STD from Query2 " & _
"Where MSSV='" & txtMSSV.Text & "' AND HocKy=" & txtHocKy.Text)
v_st = IIf(IsNull(rs1!ST), 1, rs1!ST)
v_d = IIf(IsNull(rs1!STD), 0, rs1!STD)
With RptBangDiem
.Sections("RptHeader").Controls("lblName").Caption = rs!HoTen
.Sections("RptHeader").Controls("lblLop").Caption = rs!TenLop
.Sections("RptHeader").Controls("lblHocKy").Caption = "Học kỳ " & txtHocKy.Text
.Sections("RptFooter").Controls("lblDTB").Caption = v_d / v_st
End With
rs.Close
rs1.Close
RptBangDiem.Show 1
Set DataEnvi = Nothing
End Sub
Private Sub Form_Load()
End Sub
6.FRMDIEMTB:
Option Explicit
Private Style1 As TrueDBGrid60.Style
Private Sub CmPreview_Click()
With TDBGrid1.PrintInfo
.PageHeaderFont.Italic = True
.PageHeaderFont.Bold = True
.PageHeaderFont.Size = 13
.PageHeaderFont.Name = ".VnTime"
.PageHeader = "Bảng điểm trung bình học kỳ " & gHocKy & " - Lớp: " & gFTenLop(gMSLop) & " K" & gKhoaHoc
.RepeatColumnHeaders = True
.SettingsMarginBottom = 1000
.PageFooter = "\tTrang: \p"
.PrintPreview Check1.Value
End With
End Sub
Private Sub CmReport_Click()
With CommonDialog1
.Filter = "html"
.DefaultExt = "html"
.DialogTitle = "Lưu lại bảng điểm dưới dạng file HTML"
.ShowSave
End With
If Trim(CommonDialog1.FileName) "" Then
TDBGrid1.ExportToFile CommonDialog1.FileName, False, Check1.Value '0 - dbgAllRows; 1 - dbgSelectedRows
End If
End Sub
Private Sub CmThoat_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim i As Integer
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * from Temp order by Lan1"
.Refresh
End With
With TDBGrid1
.Columns("MSSV").Width = 1200
.Columns("MSSV").BackColor = 12768977
.Columns("HoTen").Width = 2000
.Columns("HoTen").Caption = "Họ và tên"
.Columns("HoTen").ForeColor = vbBlue
.Columns("DTB").Width = 700
.Columns("DTB").Caption = "Điểm TB"
.Columns("DTB").Alignment = 2
.Columns("DTB").BackColor = vbGreen
.Columns("DTB").NumberFormat = "FormatText Event" '"Edit Mask"
'.Columns("DTB").EditMask = "#.##"
For i = 3 To (.Columns.Count - 2)
.Columns(i).Width = 800
.Columns(i).Alignment = 2
Next
.Columns(.Columns.Count - 1).Visible = False
End With
' Set Style1 = TDBGrid1.Styles.Add("ChangeColor1")
' With Style1
' .Parent = "Normal"
' .Font.Name = ".VnTime"
' .Font.Size = 10
' .BackColor = vbWhite
' .ForeColor = vbWhite
' End With
End Sub
Private Sub TDBGrid1_FormatText(ByVal ColIndex As Integer, Value As Variant, Bookmark As Variant)
If ColIndex = 2 Then
Value = Round(Value, 2)
Value = SetChamPhay(Value, True)
End If
End Sub
7.FRMINDS:
Option Explicit
Private Sub CmChapNhan_Click()
If gFormIn = 1 Then
If Val(TxFrom.Text) > Val(TxTo.Text) Then
MsgBox "Bạn nhập khoá học không hợp lệ", vbInformation, "Thông báo"
Exit Sub
End If
With DataEnvi.Connections("Connect")
' .Provider = "Microsoft.Jet.OLEDB.4.0"
' .ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=" & v_AppPath & "Database.mdb"
.Provider = "MSDASQL.1"
.ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=Data"
.Open
.Properties.Refresh
End With
With DataEnvi.Commands("CommandLop")
.CommandType = adCmdText
If Val(TxFrom.Text) = Val(TxTo.Text) Then
.CommandText = "Select * From LopHoc Where KhoaHoc = " & Val(TxFrom.Text) & " Order by MSLop"
Else
.CommandText = "Select * From LopHoc Where KhoaHoc Between " & Val(TxFrom.Text) & " And " & _
Val(TxTo.Text) & " Order by KhoaHoc, MSLop"
End If
End With
DataEnvi.Connections("Connect").Properties.Refresh
If Val(TxFrom.Text) = Val(TxTo.Text) Then
ReportLop.Sections("SectionRH").Controls("LbKhoaHoc").Caption = "Khoá học: K" & TxFrom.Text
Else
ReportLop.Sections("SectionRH").Controls("LbKhoaHoc").Caption = "Từ khoá: K" & TxFrom.Text & " Đến khoá: K" & TxTo.Text
End If
ReportLop.Show 1
ElseIf gFormIn = 2 Then
If Val(TxFrom.Text) > Val(TxTo.Text) Then
MsgBox "Bạn nhập học kỳ không hợp lệ", vbInformation, "Thông báo"
Exit Sub
End If
With DataEnvi.Connections("Connect")
' .Provider = "Microsoft.Jet.OLEDB.3.51"
' .ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=" & v_AppPath & "Database.mdb"
.Provider = "MSDASQL.1"
.ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=Data"
.Open
End With
With DataEnvi.Commands("CommandMon")
.CommandType = adCmdText
If Val(TxFrom.Text) = Val(TxTo.Text) Then
.CommandText = "Select * From MonHoc Where HocKy = " & Val(TxFrom.Text) & " Order by MSMon"
Else
.CommandText = "Select * From MonHoc Where HocKy Between " & Val(TxFrom.Text) & " And " & _
Val(TxTo.Text) & " Order by HocKy, MSMon"
End If
End With
DataEnvi.Connections("Connect").Properties.Refresh
If Val(TxFrom.Text) = Val(TxTo.Text) Then
ReportMon.Sections("SectionRH").Controls("LbHocKy").Caption = "Học kỳ: " & TxFrom.Text
Else
ReportMon.Sections("SectionRH").Controls("LbHocKy").Caption = "Từ học kỳ: " & TxFrom.Text & " Đến học kỳ: " & TxTo.Text
End If
ReportMon.Show 1
End If
Set DataEnvi = Nothing
End Sub
Private Sub CmHuyBo_Click()
Unload Me
End Sub
Private Sub Form_Load()
Select Case gFormIn
Case 1
Frame1.Caption = "Chọn in danh sách lớp học:"
Label1.Caption = "Từ khoá học:"
Label2.Caption = "Đến khoá học:"
Case 2
Frame1.Caption = "Chọn in danh sách môn học:"
Label1.Caption = "Từ học kỳ:"
Label2.Caption = "Đến học kỳ:"
End Select
End Sub
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
Private Sub TxFrom_Validate(Cancel As Boolean)
If gFormIn = 1 Then
If Not IsNumeric(TxFrom.Text) Then
MsgBox "Bạn nhập khoá học không hợp lệ", vbInformation, "Thông báo"
Cancel = True
End If
ElseIf gFormIn = 2 Then
If Not IsNumeric(TxFrom.Text) Then
MsgBox "Bạn nhập học kỳ không hợp lệ", vbInformation, "Thông báo"
Cancel = True
End If
End If
End Sub
Private Sub TxTo_Validate(Cancel As Boolean)
If gFormIn = 1 Then
If Not IsNumeric(TxTo.Text) Then
MsgBox "Bạn nhập khoá học không hợp lệ", vbInformation, "Thông báo"
Cancel = True
End If
ElseIf gFormIn = 2 Then
If Not IsNumeric(TxTo.Text) Then
MsgBox "Bạn nhập học kỳ không hợp lệ", vbInformation, "Thông báo"
Cancel = True
End If
End If
End Sub
8.FRMLOGIN:
Option Explicit
Private dem As Integer
Private Sub cmdOK_Click()
dem = dem + 1
If txtPassword.Text = MatKhau Then
Unload Me
Else
If dem = 3 Then
MsgBox "Bạn không có quyền sử dụng chương trình này!", , "No permission"
Unload Me
Set gDb = Nothing
End
Else
MsgBox "Mật khẩu nhập vào không đúng, hãy thử lại lần nữa!", , "Login"
txtPassword.SetFocus
SendKeys "{Home}+{End}"
End If
End If
End Sub
Private Sub Form_Load()
Call SetFontSize(Me)
dem = 0
End Sub
9.FRMLOPHOC:
Option Explicit
Private Sub cmdAdd_Click()
v_Add = True
frmAddLH.Show 1
End Sub
Private Sub cmdDel_Click()
On Error GoTo Err_
If MsgBox("Do you want to delete this record?", vbYesNo + vbQuestion, "Warning") = vbYes Then
Adodc1.Recordset.Delete (adAffectCurrent)
End If
Exit Sub
Err_:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Error"
End Sub
Private Sub cmdEdit_Click()
v_Add = False
v_IdEdit = Adodc1.Recordset("MSLop").Value
frmAddLH.Show 1
End Sub
Private Sub CmIn_Click()
gFormIn = 1
FrmInDS.Show 1
End Sub
Private Sub CmThoat_Click()
Unload Me
End Sub
Private Sub Form_Load()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From LopHoc Order by MSLop"
.Refresh
End With
End Sub
Private Sub OpMSLop_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From LopHoc Order by MSLop"
.Refresh
End With
End Sub
Private Sub OpTenLop_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From LopHoc Order by TenLop"
.Refresh
End With
End Sub
Private Sub OpKhoaHoc_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From LopHoc Order by KhoaHoc"
.Refresh
End With
End Sub
Private Sub TDBGrid1_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13 And TDBGrid1.Col = 2) Then
TDBGrid1.Col = 0
SendKeys "{Down}"
End If
End Sub
10. FRMMAIN:
Option Explicit
Option Compare Text
Private Sub Form_Load()
Dim Database As Variant
Dim gRst As Recordset
v_AppPath = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
Set gDb = gDbe.Workspaces(0).OpenDatabase(v_AppPath & "Database.mdb", Database, False, ";pwd=tranduc")
With gConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & v_AppPath & "Database.mdb;Persist Security Info=False;"
.CommandTimeout = 10
.CursorLocation = adUseClient
.Open
End With
gForm = 0
gFormIn = 0
' Mật khẩu chương trình
Set gRst = gDb.OpenRecordset("Select * From Password")
If gRst.EOF = False Or gRst.BOF = False Then
mnuThietLapMatKhau.Enabled = False
mnuThayDoiMatKhau.Enabled = True
gRst.MoveFirst
MatKhau = IIf(gRst!Password "", gRst!Password, "")
gRst.Close
If MatKhau "" Then
frmLogin.Show 1
End If
Else
mnuThietLapMatKhau.Enabled = True
mnuThayDoiMatKhau.Enabled = False
gRst.Close
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
Private Sub mnuAbout_Click()
frmAbout.Show 1
End Sub
Private Sub mnuBangDiem_Click()
gForm = 4
FrmMSLop.Show 1
End Sub
Private Sub mnuBangDiemSV_Click()
frmBangDiemSV.Show 1
End Sub
Private Sub mnuExit_Click()
End
End Sub
Private Sub mnuLopHoc_Click()
FrmLopHoc.Show 1
End Sub
Private Sub mnuMonHoc_Click()
FrmMonHoc.Show 1
End Sub
Private Sub mnuNhapDiem1_Click()
gForm = 2
FrmMSLop.Show 1
End Sub
Private Sub mnuNhapDiem2_Click()
gForm = 3
FrmMSLop.Show 1
End Sub
Private Sub mnuSinhVien_Click()
gForm = 1
FrmMSLop.Show 1
End Sub
Private Sub mnuThayDoiMatKhau_Click()
FrgChangePassword.Show 1
End Sub
Private Sub mnuThietLapMatKhau_Click()
FrgPassword.Show 1
End Sub
Private Sub mnuThiLan1_Click()
gForm = 5
FrmMSLop.Show 1
End Sub
Private Sub mnuThiLan2_Click()
gForm = 6
FrmMSLop.Show 1
End Sub
11. FRMMONHOC:
Option Explicit
Private Sub cmdAdd_Click()
v_Add = True
frmAddMH.Show 1
End Sub
Private Sub cmdDel_Click()
On Error GoTo Err_
If MsgBox("Do you want to delete this record?", vbYesNo + vbQuestion, "Warning") = vbYes Then
Adodc1.Recordset.Delete (adAffectCurrent)
End If
Exit Sub
Err_:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Error"
End Sub
Private Sub cmdEdit_Click()
v_Add = False
v_IdEdit = Adodc1.Recordset("MSMon").Value
frmAddMH.Show 1
End Sub
Private Sub CmIn_Click()
gFormIn = 2
FrmInDS.Show 1
End Sub
Private Sub CmThoat_Click()
Unload Me
End Sub
Private Sub Form_Load()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From MonHoc Order by MSMon"
.Refresh
End With
End Sub
Private Sub OpHocKy_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From MonHoc Order by HocKy"
.Refresh
End With
End Sub
Private Sub OpMSMon_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From MonHoc Order by MSMon"
.Refresh
End With
End Sub
Private Sub OpTenMon_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From MonHoc Order by TenMon"
.Refresh
End With
End Sub
Private Sub TDBGrid1_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13 And TDBGrid1.Col = 3) Then
TDBGrid1.Col = 0
SendKeys "{Down}"
End If
End Sub
12. FRMMSLOP:
Option Explicit
Private Sub CbMSLop_Click()
LbTenLop.Caption = gFTenLop(CbMSLop.Text)
End Sub
Private Sub CbMSMon_Click()
LbTenMon.Caption = gFTenMon(CbMSMon.Text)
End Sub
Private Sub CmChapNhan_Click()
gMSLop = Trim(CbMSLop.Text)
Select Case gForm
Case 1
FrmSinhVien.Show 1
Case 2, 3
gDbe.BeginTrans
gMSMon = Trim(CbMSMon.Text)
gDb.Execute "Delete From BangDiemTam"
If gForm = 2 Then
gSql = "Insert Into BangDiemTam " & _
"Select SinhVien.MSSV, SinhVien.HoTen, BangDiem.Diem1, BangDiem.Diem2 From SinhVien, BangDiem " & _
"Where SinhVien.MSLop = '" & gMSLop & "' And SinhVien.MSSV = BangDiem.MSSV " & _
"And BangDiem.MSMon = '" & gMSMon & "'"
gDb.Execute gSql
gSql = "Insert Into BangDiemTam " & _
"Select SinhVien.MSSV, SinhVien.HoTen From SinhVien " & _
"Where SinhVien.MSLop = '" & gMSLop & "' And SinhVien.MSSV Not In (Select Distinct MSSV From BangDiemTam)"
gDb.Execute gSql
Else
If Check1.Value = 1 Then
gSql = "Insert Into BangDiemTam " & _
"Select BangDiem.MSSV, SinhVien.HoTen, BangDiem.Diem1, BangDiem.Diem2 From SinhVien, BangDiem " & _
"Where SinhVien.MSLop = '" & gMSLop & "' And BangDiem.MSSV = SinhVien.MSSV And BangDiem.Diem1<5 " & _
"And BangDiem.MSMon = '" & gMSMon & "'"
Else
gSql = "Insert Into BangDiemTam " & _
"Select BangDiem.MSSV, SinhVien.HoTen, BangDiem.Diem1, BangDiem.Diem2 From SinhVien, BangDiem " & _
"Where SinhVien.MSLop = '" & gMSLop & "' And BangDiem.MSSV = SinhVien.MSSV And ((BangDiem.Diem1<5 " & _
"And IsNull(BangDiem.Diem2)) Or BangDiem.Diem2 < 5) And BangDiem.MSMon = '" & gMSMon & "'"
End If
gDb.Execute gSql
End If
gDbe.CommitTrans
FrmBangDiem.Show 1
Case 4
gHocKy = CByte(TxHocKy.Text)
Call MakeRptDiem(gMSLop, CByte(TxHocKy.Text))
FrmDiemTB.Show 1
Case 5, 6
gHocKy = CByte(TxHocKy.Text)
gMSMon = Trim(CbMSMon.Text)
With DataEnvi.Connections("Connect")
'.Provider = "Microsoft.Jet.OLEDB.3.51"
'.ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=" & v_AppPath & "Database.mdb"
.Provider = "MSDASQL.1"
.ConnectionString = "Persist Security Info=False;Data Source=Data"
.Open
.Properties.Refresh
End With
With DataEnvi.Commands("CommandSV")
.CommandType = adCmdText
If gForm = 5 Then
.CommandText = "Select MSSV, HoTen, NgaySinh From SinhVien Where MSLop = '" & gMSLop & "' Order by MSSV"
Else
.CommandText = "Select BangDiem.MSSV, SinhVien.HoTen, SinhVien.NgaySinh From SinhVien, BangDiem " & _
"Where SinhVien.MSLop = '" & gMSLop & "' And BangDiem.MSSV = SinhVien.MSSV And ((BangDiem.Diem1<5 " & _
"And IsNull(BangDiem.Diem2)) Or BangDiem.Diem2 < 5) And BangDiem.MSMon = '" & gMSMon & "'"
End If
End With
Call Sleep(1000)
DataEnvi.Connections("Connect").Properties.Refresh
With ReportDSThi.Sections("SectionRH")
.Controls("LbLopHoc").Caption = "Lớp: " & gFTenLop(gMSLop)
.Controls("LbMon").Caption = gFTenMon(gMSMon)
.Controls("LbKhoaHoc").Caption = "K" & gKhoaHoc
.Controls("LbHocKy").Caption = "Học kỳ: " & TxHocKy.Text
If gForm = 5 Then
.Controls("LbDanhSach").Caption = "Danh sách sinh viên thi lần i"
Else
.Controls("LbDanhSach").Caption = "Danh sách sinh viên thi lần ii"
End If
End With
ReportDSThi.Show 1
Set DataEnvi = Nothing
End Select
Unload Me
End Sub
Private Sub CmHuyBo_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim gRst As Recordset
If gForm 1 Then CmChapNhan.Enabled = False
CbMSLop.Clear
Set gRst = gDb.OpenRecordset("Select MSLop, TenLop From LopHoc Order by KhoaHoc")
If gRst.EOF = False Or gRst.BOF = False Then
gRst.MoveFirst
Do Until gRst.EOF
CbMSLop.AddItem gRst!MSLop
gRst.MoveNext
Loop
gRst.MoveFirst
CbMSLop.Text = gRst!MSLop
LbTenLop.Caption = gRst!TenLop
End If
gRst.Close
Select Case gForm
Case 1, 4
CbMSMon.Visible = False
Label2.Visible = False
LbTenMon.Caption = ""
Check1.Visible = False
CbMSLop.Top = CbMSLop.Top + 200
Label1.Top = Label1.Top + 200
LbTenLop.Top = LbTenLop.Top + 200
If gForm = 1 Then
TxHocKy.Visible = False
Label3.Visible = False
End If
TxHocKy.Top = TxHocKy.Top + 200
Label3.Top = Label3.Top + 200
If gForm = 1 Then
Frame1.Caption = "Xem Danh sách Sinh viên:"
Else
Frame1.Caption = "Xem Danh sách điểm của các sinh viên:"
End If
Case 2, 3, 5, 6
CbMSMon.Clear
CbMSMon.Enabled = False
LbTenMon.Caption = ""
If gForm = 2 Then
Check1.Visible = False
Frame1.Caption = "Nhập/xem điểm thi lần 1:"
ElseIf gForm = 3 Then
Frame1.Caption = "Nhập/xem điểm thi lại:"
ElseIf gForm = 5 Then
Check1.Visible = False
Frame1.Caption = "Danh sách Sinh viên thi lần 1:"
ElseIf gForm = 6 Then
Check1.Visible = False
Frame1.Caption = "Danh sách Sinh viên thi lần 2:"
End If
End Select
End Sub
Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single)
End Sub
Private Sub TxHocKy_LostFocus()
If gForm = 2 Or gForm = 3 Or gForm = 5 Or gForm = 6 Then
CbMSMon.SetFocus
End If
End Sub
Private Sub TxHocKy_Validate(Cancel As Boolean)
Dim gRst As Recordset
If Not IsNumeric(TxHocKy.Text) Or (Val(TxHocKy.Text) - Round(Val(TxHocKy.Text), 0)) 0 Or Val(TxHocKy.Text) = 15 Then
CmChapNhan.Enabled = False
Cancel = True
CbMSMon.Enabled = False
Else
If gForm = 2 Or gForm = 3 Or gForm = 5 Or gForm = 6 Then
CbMSMon.Enabled = True
CbMSMon.Clear
Set gRst = gDb.OpenRecordset("Select MSMon, TenMon From MonHoc Where HocKy = " & Val(TxHocKy.Text) & " Order by MSMon")
If gRst.EOF = False Or gRst.BOF = False Then
gRst.MoveFirst
Do Until gRst.EOF
CbMSMon.AddItem gRst!MSMon
gRst.MoveNext
Loop
gRst.MoveFirst
CbMSMon.Text = gRst!MSMon
LbTenMon.Caption = gRst!TenMon
CmChapNhan.Enabled = True
Else
MsgBox "Không tồn tại môn học trong học kỳ này.", vbInformation, "Thông báo"
CbMSMon.Locked = True
CmChapNhan.Enabled = False
End If
gRst.Close
Else
CmChapNhan.Enabled = True
End If
End If
End Sub
13. FRMSINHVIEN:
Option Explicit
Option Compare Text
Private Sub cmdDelete_Click()
On Error GoTo Err_
If MsgBox("Do you want to delete this record?", vbYesNo + vbQuestion, "Warning") = vbYes Then
Adodc1.Recordset.Delete (adAffectCurrent)
End If
Exit Sub
Err_:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Error"
Adodc1.Refresh
End Sub
Private Sub CmIn_Click()
With DataEnvi.Connections("Connect")
' .Provider = "Microsoft.Jet.OLEDB.3.51"
' .ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=" & v_AppPath & "Database.mdb"
.Provider = "MSDASQL.1"
.ConnectionString = "Password=tranduc;Persist Security Info=False;Data Source=Data"
.Open
.Properties.Refresh
End With
With DataEnvi.Commands("CommandSV")
.CommandType = adCmdText
.CommandText = "Select MSSV, HoTen, NgaySinh, ThuongTru, NguyenQuan From SinhVien " & _
"Where MSLop = '" & gMSLop & "' Order by MSSV"
End With
Call Sleep(1000)
DataEnvi.Connections("Connect").Properties.Refresh
With ReportSV.Sections("SectionRH")
.Controls("LbLopHoc").Caption = "Lớp: " & gFTenLop(gMSLop)
.Controls("LbKhoaHoc").Caption = "K" & gKhoaHoc
End With
ReportSV.Show 1
Set DataEnvi = Nothing
End Sub
Private Sub CmThoat_Click()
Unload Me
End Sub
Private Sub Form_Load()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From SinhVien Where MSLop = '" & gMSLop & "' Order by MSSV"
.Refresh
End With
End Sub
Private Sub OpHoTen_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From SinhVien Where MSLop = '" & gMSLop & "' Order by HoTen"
.Refresh
End With
End Sub
Private Sub OpMSSV_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From SinhVien Where MSLop = '" & gMSLop & "' Order by MSSV"
.Refresh
End With
End Sub
Private Sub Option1_Click()
With Adodc1
.ConnectionString = gConn.ConnectionString
.CommandType = adCmdText
.CursorLocation = adUseClient
.RecordSource = "Select * From SinhVien Where MSLop = '" & gMSLop & "' Order by NgaySinh"
.Refresh
End With
End Sub
Private Sub TDBGrid1_AfterColUpdate(ByVal ColIndex As Integer)
If ColIndex = 0 Then
TDBGrid1.Columns(6).Text = gMSLop
End If
End Sub
Private Sub TDBGrid1_KeyPress(KeyAscii As Integer)
If (KeyAscii = 13 And TDBGrid1.Col = 5) Then
TDBGrid1.Col = 0
SendKeys "{Down}"
End If
End Sub
14. FRMSPLASH:
Option Explicit
Dim v_time As Byte
Private Sub Form_KeyPress(KeyAscii As Integer)
Unload Me
End Sub
Private Sub Form_Load()
v_time = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
FrmMain.Show
End Sub
Private Sub Frame1_Click()
Unload Me
End Sub
Private Sub Timer1_Timer()
v_time = v_time + 1
If v_time > 25 Then
Unload Me
End If
End Sub
* MODULES:
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public gMSLop As String, gMSMon As String, gHocKy As Byte, gKhoaHoc As Integer
Public gForm As Byte ' Default = 0; FrmSinhVien = 1; FrmBangDiem1 = 2; FrmBangDiem2 = 3; In Bảng điểm = 4; ReportDSThi = 5
Public gFormIn As Byte ' Default = 0; FrmLopHoc = 1; FrmMonHoc = 2
Public gDbe As New DBEngine
Public gDb As Database
Public gConn As New ADODB.Connection
Public gSql As String
Public MatKhau As String ' Mật khẩu chương trình
Public v_AppPath As String
Public v_Add As Boolean 'Add: True; Edit: False
Public v_IdEdit As String
' Hàm gFTenLop trả về tên lớp học có mã lớp = MaLop
Public Function gFTenLop(MaLop As String) As String
Dim Rst1 As Recordset
gFTenLop = ""
Set Rst1 = gDb.OpenRecordset("Select TenLop, KhoaHoc From LopHoc Where MSLop = '" & MaLop & "'")
If Rst1.EOF = False Or Rst1.BOF = False Then
gFTenLop = Rst1!TenLop
gKhoaHoc = Rst1!KhoaHoc
End If
Rst1.Close
End Function
' Hàm gFTenMon trả về tên môn học có mã môn = MaMon
Public Function gFTenMon(MaMon As String) As String
Dim Rst1 As Recordset
gFTenMon = ""
Set Rst1 = gDb.OpenRecordset("Select TenMon From MonHoc Where MSMon = '" & MaMon & "'")
If Rst1.EOF = False Or Rst1.BOF = False Then
gFTenMon = Rst1!TenMon
End If
Rst1.Close
End Function
' Hàm gFTenSV trả về tên sinh viên có MSSV = MaSo
Public Function gFTenSV(MaSo As String) As String
Dim Rst1 As Recordset
gFTenSV = ""
Set Rst1 = gDb.OpenRecordset("Select HoTen From SinhVien Where MSSV = '" & MaSo & "'")
If Rst1.EOF = False Or Rst1.BOF = False Then
gFTenSV = Rst1!HoTen
End If
Rst1.Close
End Function
Public Function NullNumber(ByVal Bien) As Variant
If Bien "" Then
NullNumber = Bien
Else
NullNumber = 0
End If
End Function
Public Function NullDate(ByVal Bien) As String
If Bien "" Then
'NullDate = DoiNgayThang(Bien, True)
Else
NullDate = "__/__/____"
End If
End Function
Public Function NullText(ByVal Bien) As String
If Bien "" Then
NullText = Bien
Else
NullText = ""
End If
End Function
Public Function FillNull(ByVal Bien, ByVal KieuData As String) As String
If Trim(Bien) = "" Or Bien = "____" Or Bien = "__/____" Or Bien = "__/__/____" Or IsNull(Bien) Then
FillNull = "Null"
Else
Select Case LCase(KieuData)
Case "text"
FillNull = "'" & Trim(Bien) & "'"
Case "number"
FillNull = Trim(Bien)
Case "date"
FillNull = "#" & Trim(Bien) & "#"
End Select
End If
End Function
Public Sub MakeRptDiem(Lop As String, HocKy As Byte)
On Error GoTo Err_
Dim Qdf1 As QueryDef, Qdf2 As QueryDef
Dim Sql1 As String, Sql2 As String
gDbe.BeginTrans
Sql1 = "TRANSFORM First(BangDiem.Diem1) AS [The Value] " & _
"SELECT BangDiem.MSSV, SinhVien.HoTen, Sum((BangDiem.Diem1)*(MonHoc.SoTrinh))/Sum(MonHoc.SoTrinh) AS DTB " & _
"FROM SinhVien, MonHoc, BangDiem Where MonHoc.MSMon = BangDiem.MSMon And " & _
"SinhVien.MSSV = BangDiem.MSSV And SinhVien.MSLop = '" & Lop & "' And MonHoc.HocKy = " & HocKy & " " & _
"GROUP BY BangDiem.MSSV, SinhVien.HoTen " & _
"PIVOT BangDiem.MSMon"
Set Qdf1 = gDb.CreateQueryDef("QdfDiem1", Sql1)
If TonTaiBang("Temp") = True Then
gDb.Execute "Drop Table Temp"
End If
gDb.Execute "Select * Into Temp From QdfDiem1" 'Qdf1.Name
gDb.Execute "Alter Table Temp Add Column Lan1 Text(15)"
gDb.Execute "Update Temp Set Lan1=MSSV & '-1'"
gDb.Execute "Drop Table QdfDiem1" ' Xoá Query tạo ra trong Access
gDb.Execute "Create Index NewIndex On Temp (MSSV)"
Sql2 = "TRANSFORM First(BangDiem.Diem2) AS [The Value] " & _
"SELECT BangDiem.MSSV, SinhVien.HoTen, Sum((IIf(BangDiem.Diem2 > BangDiem.Diem1, BangDiem.Diem2, " & _
"BangDiem.Diem1))*(MonHoc.SoTrinh))/Sum(MonHoc.SoTrinh) AS DTB " & _
"FROM SinhVien, MonHoc, BangDiem " & _
"Where MonHoc.MSMon = BangDiem.MSMon And " & _
"SinhVien.MSSV = BangDiem.MSSV And SinhVien.MSLop = '" & Lop & "' And MonHoc.HocKy = " & HocKy & " " & _
"GROUP BY BangDiem.MSSV, SinhVien.HoTen " & _
"PIVOT BangDiem.MSMon"
Set Qdf2 = gDb.CreateQueryDef("QdfDiem2", Sql2)
gDb.Execute "Insert Into Temp Select * From QdfDiem2" 'Qdf2.Name
gDb.Execute "Drop Table QdfDiem2" ' Xoá Query tạo ra trong Access
gDb.Execute "Update Temp Set Lan1=MSSV & '-2' Where Lan1 Is Null"
gDbe.CommitTrans
gDbe.BeginTrans
gDb.Execute "Update Temp Set MSSV=Null, HoTen=Null Where Lan1 like '*-2'"
gDbe.CommitTrans
'Sleep (500)
Exit Sub
Err_:
MsgBox Err.Number & " - " & Err.Description, vbCritical, "Error"
gDbe.Rollback
End Sub
Private Function TonTaiBang(TenBang As String) As Boolean
Dim i As Integer
TonTaiBang = False
For i = 0 To gDb.TableDefs.Count - 1
If gDb.TableDefs(i).Name = TenBang Then
TonTaiBang = True
Exit Function
End If
Next
End Function
Public Sub SetFontSize(Frm As Form)
Dim i As Integer
For i = 0 To Frm.Controls.Count - 1
If TypeOf Frm.Controls(i) Is Label Or TypeOf Frm.Controls(i) Is TextBox Or TypeOf Frm.Controls(i) Is CheckBox Or _
TypeOf Frm.Controls(i) Is OptionButton Or TypeOf Frm.Controls(i) Is ComboBox Or TypeOf Frm.Controls(i) Is ListBox Or _
TypeOf Frm.Controls(i) Is CommandButton Or TypeOf Frm.Controls(i) Is Frame Then
If Frm.Controls(i).FontSize 10 Then
Frm.Controls(i).FontSize = 10
End If
If Frm.Controls(i).Font ".VnTime" Then
Frm.Controls(i).Font = ".VnTime"
End If
End If
Next i
End Sub
Public Function SetChamPhay(ByVal So As String, Cham As Boolean) As String
Dim SoCham As Long, i As Long, J As Long, SoKyTu As Long, SoDau As Long, DauAm As String * 1
Dim Mang() As String * 4
SoCham = 0
DauAm = ""
If Cham = True Then ' Chuyển Anh sang Việt
If Left(So, 1) = "-" Then
So = Mid(So, 2)
DauAm = "-"
End If
SoKyTu = IIf(InStr(1, So, ".", vbBinaryCompare) 0, InStr(1, So, ".", vbBinaryCompare) - 1, Len(So))
SoCham = (SoKyTu - 1) \ 3 'Lấy phần nguyên
SoDau = IIf((SoKyTu Mod 3) = 0, 3, SoKyTu Mod 3) 'Lấy phần dư
ReDim Mang(SoCham + 1)
So = Replace(So, ".", ",", 1, -1, vbBinaryCompare)
SetChamPhay = So
If SoCham > 0 Then
i = 1
For J = SoKyTu + 1 To 3 Step (-3)
Mang(i) = "." & Mid(So, J - 3, 3)
i = i + 1
If i > SoCham Then Exit For
Next
If Len(So) > SoKyTu Then
Mang(0) = Mid(So, SoKyTu + 1, Len(So) - SoKyTu)
Else
Mang(0) = ""
End If
Mang(SoCham + 1) = Mid(So, 1, SoDau)
SetChamPhay = ""
For i = SoCham + 1 To 0 Step -1
SetChamPhay = SetChamPhay & Trim(Mang(i))
Next
End If
SetChamPhay = DauAm & SetChamPhay
Else ' Chuyển Việt thành Anh - dùng khi Update vào Data
So = Replace(So, ".", "", 1, -1, vbBinaryCompare)
So = Replace(So, ",", ".", 1, -1, vbBinaryCompare)
SetChamPhay = So
End If
End Function
Tài liệu tham khảo
Microsoft Visual Basic 6.0 & Lập trình cơ sở dữ liệu - Nhà xuất bản giáo dục.
Beginning Visual basic 6 - Peter Wright, Wrox Press.
Database Access with Visual Basic 6 - Jeffrey P.McManus, SAMS Publishing.
Beginning Visual Basic 6 Database Programming - John connell, Wrox Press.
Visual Basic 6 Database Programming - John W.Fronckowiak và David J.Helda , IDG Books Worldwide, Inc.
MSDN Library Visual Basic 6.0 - Microsoft.
Các chương trình mẫu Visual Basic 6.0 - Tác giả Võ Hiếu Nghĩa - Nhà xuất bản thống kê.
Ngoài ra còn một số tài liệu và tạp chí Tin học
Các file đính kèm theo tài liệu này:
- 37022.doc