Kết nối Ms Access Form với sql Server và sử dụng trong mạng nội bộ

Chia sẻ bởi:hands
★★★★★
Quảng cáo

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]

[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 Sub

Vớ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ự
Khóa học SprinGO phù hợp

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
★★★★★ 5 ★ 1 👤 1 ▥ 0
Quảng cáo

Bạn nên đọc

One Response

  1. hands says:

    Sau khi xem form của bác gửi cho em em thấy có mấy cái rất muốn làm được giống như bác nhưng em không biết thế nào,
    Bác chỉ cho em với ạ em cảm ơn nhiều.
    2641
    Làm sao để tạo được các nút như ở trên và sử dụng nó ạ.
    2640
    Bác làm thế nào ẩn được cái thanh công cụ đi ạ
    2639
    Và cái này nữa ạ. không hề còn tùy chọn nào để chỉnh sửa file nữa.

    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á.

    Public Sub SercurityDB(locker As Boolean)
    
    'SecurityDB True ( False)
    
    ' Doi ten ung dung
        ChangeProperty "Apptitle", dbText, "QUAN LY NHAN SU"
        ' Dat lai form khoi dong cua ung dung
        ChangeProperty "StartupForm", dbText, "frmLogin"
        ' Cho nhìn thay Khung Database hay không
        ChangeProperty "StartupShowDBWindow", dbBoolean, locker
        ' Cho nhìn thay thanh Status hay không
        ChangeProperty "StartupShowStatusBar", dbBoolean, locker
        ' Cho phép hien thanh  design hay không
        ChangeProperty "AllowBuiltinToolbars", dbBoolean, locker
        ' Cho phép thêm bot 1 item vào các thanh công cu hay không
        'ChangeProperty "AllowToolbarChanges", dbBoolean, locker
        ' Cho phép hien thanh menu con khi click chuot phai hay không
        ChangeProperty "AllowShortcutMenus", dbBoolean, locker
        ' Cho phép hien toan bo thanh menu hay không
        ChangeProperty "AllowFullMenus", dbBoolean, locker
        'Cho phép ngung chuong trình bang phím Ctrl+ Break khi dang chay hay không
        ChangeProperty "AllowBreakIntoCode", dbBoolean, locker
        ' Vô hieu hoa phím dac biet nhu: F11
        'ChangeProperty "AllowSpecialKeys", dbBoolean, locker
        ' Vô hieu hoa phím shift
        'ChangeProperty "AllowBypassKey", dbBoolean, locker
        'Cho phep design/ sua thuoc tính form/ report khi ðang mo hay không.
        ChangeProperty "AllowDesignChanges", dbBoolean, locker
    
    ChangeProperty "AppIcon", dbText, Access.CurrentProject.path & "HinhAnhIconsongke0711.ico"
        Application.SetOption "ShowWindowsInTaskbar", False
    
    End Sub
    
    Function ChangeProperty(strPropName, varPropType, varPropValue)
        Dim dbs As Database, prp As Property
        Const conPropNotFoundError = 3270
        Set dbs = CurrentDb
        On Error GoTo Change_XuLyLoi
        dbs.Properties(strPropName) = varPropValue
        ChangeProperty = True
    
    Change_KetThuc:
        Exit Function
    Change_XuLyLoi:
        'Thuôòc tính không thâìy
        If Err = conPropNotFoundError Then
            Set prp = dbs.CreateProperty(strPropName, _
                                         varPropType, varPropValue)
            dbs.Properties.Append prp
            Resume Next
        Else
            'Không coì thuôòc tiình ðoì
            ChangeProperty = False
            Resume Change_KetThuc
        End If
    End Function

Leave a Reply

Your email address will not be published. Required fields are marked *

Quảng cáo

Cũ vẫn chất

Xem thêm