Kết nối Ms Access Form với sql Server và sử dụng trong mạng nội bộ
Hiện tại em có xây dựng 1 ứng dụng trên MS Access Form, Data em sử dụng Linked table đến sql-server.
Vậy làm thế nào để khi 1 người khác sử dụng Ms Access Form của em đều chung dữ liệu từ sql-server ạ?
Vì lúc đầu em sử dụng file .mdb và share ổ nhưng vì tìm hiểu thì file mdb chỉ chứa tối đa 2 GB nên em muốn chuyển dữ liệu sang sql-server để chứa được nhiều dung lượng hơn.
Em cảm ơn nhiều ạ.Tôi đưa ra phương án mò là bạn có tạo ra một cái ứng dụng link table tới sql-server thật chuẩn rồi sao ra nhiều bản cho mỗi người xài. (cái này tôi chưa có điều kiện thử nên không chắc).
Hoặc bạn viết ứng dụng trên Access giống như làm ứng dụng trên một nền tảng lập trình thuần túy nghĩa là tạo form, viết code như kiểu tạo form viết code trên C#, Delphi, Java… Ngôn ngữ của bạn dùng ở đây không phải C#,… mà sẽ là VBA và môi trường thiết kế form là của Access. Cái này chắc chắc là làm được và không khó hơn mấy những gì bạn đã làm nhé. Lúc đó dữ liệu lưu tại file Access có thể là thông số hoạt động của ứng dụng.
Nói thêm.
– Cái file .mdb của bạn tạm gọi là Font End (FE) đi. Bạn có thể copy cho bao nhiêu máy tính cũng được.
– Khi qua máy khác bạn phải kết nối thủ công lại CSDL SQL Server cho từng máy (chắc bạn dùng ODBC). Nếu muốn tự động thì bạn phải viết code trong form khởi động để kiểm tra linked table còn hiệu lực không nếu không thì phải kết nối lại toàn bộ.
– Khi thiết kế cho môi trường đa người dùng thì bạn phải dự phòng trường hợp 2 ngừoi cùng nhập liệu và bấm nút lưu cùng một lúc lên SQL Server (trường hợp này rất hiếm vì có thể thời gian lưu chênh lênh phần ngàn giây) nhưng cũng là có phát sinh. Khi đó sẽ bị lỗi trùng khoá chính, một người sẽ không lưu được gây phiền toái. Nếu CSDL bạn không phải lúc nào cũng có giao dịch liên tục thì cũng không cần quan tâm vụ này. 🙂
Em phân quyền cho từng người dùng theo nhóm công việc vì vậy khả năng xung đột là không có ạ.
Em chưa hiểu khi đưa ứng dụng qua các máy khác kèm file .mdb sau kết nối với sql Server như nào ạ. Vì thực chất em đang tự học hỏi để làm nên còn nhiều thứ em chưa biết rõ lắm ạ.
Bác có thể hướng cho em chi tiết được không ạ.
EM cảm ơn!
Tôi cũng chưa nắm rõ ý bạn lắm.
Đối với file hiện tại trên máy PC của bạn, thao tác kết nối tới SQL Server như thế nào thì khi copy ứng dụng (FE) qua máy khác bạn cũng thao tác tương tự để các Linked table trong nó cập nhật lại đường dẫn tới SQL Server (hoặc tới DSN trên máy đó).
HIện tại bạn kết nối tới SQL Server như thế nào?
Đây em liên kết như này tới SQL server bác ạ,
nhưng khi mang sang máy khác thì cái Link table này chắc nó không chạy được ạ.
Em chưa tìm được ra cách kết nối khác, mong bác hỗ trợ.
Em cảm ơn!
26382637263626352634
Bạn xem link về các chia sẻ kết nối ODBC khi qua máy khác cho nhanh thay vì bạn phải thao tác lại các bước như hình trên.
Có 2 cách để bạn kết nối với CSDL SQL Server: ODBC và ADODB.
Dùng ODBC như bạn đang làm là dễ nhất vì nó mang CSDL của SQL Server về Access và bạn có thể thao tác nó y như thao tác với Table (query, insert, update…). Đây gọi là kết nối liên tục tức là nó kết nối thường trực với CSDL SQL server, lượng dữ liệu thường xuyên chuyển tải qua mạng sẽ lớn nhưng vì bạn dùng mạng LAN nên cũng không thấy ảnh hưởng.
Còn dùng ADODB thì bạn phải học các phương thức, thuộc tính của nó để thao tác với dữ liệu SQL Server. Đây là cách nên dùng nhưng do bạn mới bắt đầu thì nên dùng ODBC cho dễ. Với ADOBD thì bạn sẽ gửi lệnh tới máy chủ, tận dụng được sức mạnh của máy chủ SQL Server để thao tác dữ liệu như truy vấn (View), dùng các stored procedure để xử lý dữ liệu ngay trên Server chứ không phải dùng tới tài nguyên của máy con.Máy con chỉ sử dụng ADODB để lấy dữ liệu đã xử lý trả về, hiển thị cho người dùng xem thôi. Dùng ADODB thì chỉ khi nào cần lấy dữ liệu thì mới kết nối tới SQL Server, sau khi thực hiện xong sẽ đóng kết nối và code của nó luôn có viêc kết nối và ngắt kết nối. Nếu làm làm qua môi trường internet sẽ thấy rõ lợi ích của viêc này, kể cả khi load dữ liệu về cũng chẻ nhỏ ra mà load, chỉ load dữ liệu cần chứ không load cả ngàn dòng dữ liệu về máy con.
Bạn đọc bài này của anh Lê Hồng Đức sẽ có thể hiểu và sử dụng thư viện ADODB để làm việc với SQL Server.
Link: [URL='www.giaiphapexcel.com/diendan/threads/s%E1%BB%AD-d%E1%BB%A5ng-class-module-v%C3%A0-k%E1%BA%BFt-n%E1%BB%91i-d%E1%BB%AF-li%E1%BB%87u-sql-server-trong-access-vba.67063/#post-411268']www.giaiphapexcel.com/diendan/threads/sử-dụng-class-module-và-kết-nối-dữ-liệu-sql-server-trong-access-vba.67063/#post-411268
Chào các Bạn,
Trước khi tiếp tục nội dung chính của chuyên đề này, tôi xin trao đổi cùng các Bạn một số vấn đề mang tính chất "bếp núc" với file ứng dụng chúng ta đang sử dụng.
1. Vấn đề 1: Linh hoạt việc kết nối file ứng dụng với file dữ liệu bất kỳ.
Như các Bạn đã thấy trong file ứng dụng, chúng ta có thể tùy ý kết nối đến file dữ liệu SQL SERVER bất kỳ mà ta muốn. Các thủ tục kết nối dữ liệu trong file ứng dụng này hoàn toàn không cố định phải kết nối đến 1 file dữ liệu nào cả.
Để làm được điều đó, ứng dụng có 1 Procedure để kết nối đến file dữ liệu có thể tùy chọn được, như các Bạn thấy trong module "modQuanlyDulieu":[COLOR=#006400]Sub OpenDbConnection()[/COLOR] ' [COLOR=#0000cd]'Co the tham khao chuoi ket noi den cac nguon du lieu khac nhau 'tai dia chi sau: www.connectstring.com[/COLOR] On Error GoTo HandleError Dim vServer, vData, vUser, vPsw, vLogInDft As Boolean With Forms("frmLogIn") vLogInDft = !chkLogIn.Value If vLogInDft = True Then vServer = "mssql.quantribanhang.vn" vData = "danhba" vUser = "nhanvien1" vPsw = "Nv001" Else vServer = !txtServer vData = !txtData vUser = !txtUser vPsw = !txtPsw End If End With Set cnConn = New ADODB.Connection cnConn.Open _ "Provider = sqloledb;" & _ "Data Source=" & vServer & ";" & _ "Initial Catalog=" & vData & ";" & _ "User ID=" & vUser & ";" & _ "Password=" & vPsw & ";" Exit Sub HandleError: GeneralErrorHandler Err.Number, Err.Description, DB_QUANLY, "OpenDbConnection" Exit Sub [COLOR=#006400]End Sub[/COLOR]Đồng thời thiết kế 1 form để LogIn vào server và file dữ liệu xác định. Form này có tên là "frmLogIn".
Ngay trong procedure trên cũng đã tham chiếu đến các giá trị được người chạy ứng dụng khai báo trên Form này khi mở form Cập nhật Danh bạ (form "frmContacts").Có Bạn đã hỏi tôi, nếu muốn kết nối đến file dữ liệu thiết kế bằng Microsoft Access có được không?
Hoàn toàn được các Bạn ạ. Chỉ cần khai báo lại đoạn sau trong procedure nêu trên:cnConn.Open _ "Provider = sqloledb;" & _ "Data Source=" & vServer & ";" & _ "Initial Catalog=" & vData & ";" & _ "User ID=" & vUser & ";" & _ "Password=" & vPsw & ";"thành chuỗi kết nối đến dữ liệu Microsoft Access. Các Bạn có thể tra cứu chuỗi kết nối thích hợp tại trang [URL="https://www.connectstring.com"]www.connectstring.com
Trong trường hợp này, các Bạn phải chú ý sửa lại form "frmLogIn" và các đoạn code có liên quan trong procedure nêu trên cho phù hợp nhé.Vấn đề 2. Xử lý những thông tin của Object bị bỏ trống (Null value) như thế nào?
Các giá trị bị bỏ trống nói ở đây có thể là giá trị trong các ô dữ liệu trên form "frmContacts" hoặc trong bảng dữ liệu SQL SERVER.
Để xử lý trường hợp này ứng dụng có 1 Function có tên là FixNull cũng ở bên trong module nêu trên:[COLOR=#006400]Function FixNull[/COLOR]([COLOR=#0000ff]varIn As Variant[/COLOR]) [COLOR=#006400]As String[/COLOR] If IsNull(varIn) Then FixNull = "" Else FixNull = varIn End If [COLOR=#006400]End Function[/COLOR]Và trong 2 procedure có liên quan trong Class module "clsDanhba" ứng dụng đã sử dụng Function FixNull này để khử các giá trị Null như các Bạn đã thấy:
[COLOR=#006400]Sub PopulatePropertiesFromForm()[/COLOR] 'Lay thong tin tu Form frmContacts de gan gia tri cac thuoc tinh cho objDanhba On Error GoTo HandleError With Me .Ten = FixNull(Forms("frmContacts")!txtTen) .HoChulot = FixNull(Forms("frmContacts")!txtHoChulot) .Diachi = FixNull(Forms("frmContacts")!txtDiachi) .Dtdd = FixNull(Forms("frmContacts")!txtDtdd) .Dtnha = FixNull(Forms("frmContacts")!txtDtnha) .Dtvp = FixNull(Forms("frmContacts")!txtDtvp) If Len(Forms("frmContacts")!txtNgaysinh) > 0 Then .Ngaysinh = Forms("frmContacts")!txtNgaysinh Else .Ngaysinh = Null End If .Gioitinh = Forms("frmContacts")!frmGioitinh.Value End With Exit Sub HandleError: GeneralErrorHandler Err.Number, Err.Description, CLS_DANHBA, "PopulatePropertiesFromForm" Exit Sub [COLOR=#006400]End Sub[/COLOR]và
[COLOR=#006400]Sub PopulatePropertiesFromRecordset[/COLOR]([COLOR=#0000cd]rsCont As ADODB.Recordset[/COLOR]) 'Lay thong tin tu Recordset rsCont de gan gia tri cac thuoc tinh cho objDanhba On Error GoTo HandleError With Me .DanhbaId = rsCont!DanhbaId .Ten = Trim(FixNull(rsCont!Ten)) .HoChulot = Trim(FixNull(rsCont!HoChulot)) .Diachi = Trim(FixNull(rsCont!Diachi)) .Dtdd = Trim(FixNull(rsCont!Dtdd)) .Dtnha = Trim(FixNull(rsCont!Dtnha)) .Dtvp = Trim(FixNull(rsCont!Dtvp)) If Not IsNull(rsCont!Ngaysinh) Then .Ngaysinh = rsCont!Ngaysinh Else .Ngaysinh = "" End If .Gioitinh = rsCont!Gioitinh End With Exit Sub HandleError: GeneralErrorHandler Err.Number, Err.Description, CLS_DANHBA, "PopulatePropertiesFromRecordset" Exit Sub [COLOR=#006400]End Sub[/COLOR]3. Vấn đề bẩy lỗi trong các module:
Như các Bạn đã thấy, ứng dụng có 1 procedure để bẩy các lỗi có thể phát sinh khi chạy các thủ tục trong ứng dụng:[COLOR=#006400]Public Sub GeneralErrorHandler[/COLOR]([COLOR=#0000cd]lngErrNumber As Long, strErrDesc As String, strModuleSource As String, strProcedureSource As String[/COLOR]) On Error Resume Next Dim strMessage As String 'build the error message string from the parameters passed in strMessage = "An error has occurred in the application." strMessage = strMessage & vbCrLf & "Error Number: " & lngErrNumber strMessage = strMessage & vbCrLf & "Error Description: " & strErrDesc strMessage = strMessage & vbCrLf & "Module Source: " & strModuleSource strMessage = strMessage & vbCrLf & "Procedure Source: " & strProcedureSource 'display the message to the user MsgBox strMessage, vbCritical Exit Sub [COLOR=#006400]End Sub[/COLOR]Và trong các procedure viết trong ứng dụng, đều có khai báo dòng bẩy lỗi tham chiếu đến procedure GeneralErrorHandler nêu trên:
... On Error GoTo HandleError ... HandleError: GeneralErrorHandler Err.Number, Err.Description, <[COLOR=#0000cd]Tên module[/COLOR]>, <[COLOR=#0000cd]Tên procedure[/COLOR]> Exit SubVới cách làm như vậy, chúng ta sẽ dễ dàng quản lý được lỗi phát sinh, thậm chí xác định chính xác lỗi phát sinh ở procedure nào nằm trong module nào.
Tạm thời xin trao đổi với các Bạn 3 chuyện bếp núc như vậy. Mời các Bạn cho thêm ý kiến nhé.
www.giaiphapexcel.com/diendan/threads/k%E1%BA%BFt-n%E1%BB%91i-ms-access-form-v%E1%BB%9Bi-sql-server-v%C3%A0-s%E1%BB%AD-d%E1%BB%A5ng-trong-m%E1%BA%A1ng-n%E1%BB%99i-b%E1%BB%99.143244/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Hình trên là tạo Ribbon menu thôi bạn à. Bên cạnh đó còn thêm một số code can thiệp hệ thống để khoá, ngăn không cho người dùng táy máy vào được hệ thống thiết kế sửa/ xoá tùm lum.
Dứoi đây là cái hàm để khoá hệ thống.
Tôi đặc biệt cảnh báo:
– Phải lưu file dự phòng trước khi chạy các code này vì không đúng trình tự, nó khoá luôn file.
– Phải đảm bảo tạo form có nút mở khoá trước rồi mới tạo nút khoá và Form này có thể gọi được từ thanh menu hoặc có thể gọi ở form khởi động ứng dụng (ví dụ: form đăng nhập có thêm nút lệnh để gọi form mở khoá database). Nếu không khi bạn khoá rồi thì không thể vô ngăn Form để gọi nó ra mà mở khoá.