• giúp đở Cách lấy đừng link của tables
  • giúp đở Cách lấy đừng link của tables

    http2 > 31-07-19, 01:39 PM

    chào anh em diễn đàn ! lại có 1 ca nghỉ nát óc rồi không hiểu . nhờ mọi người giúp đở . không biết khai biết như vậy có đúng không sao cái mid(td.connect" ,11) không bắt được đường dẫn của table đang link tables .
    vấn đề ở đây là em muốn khi mở file access thì sẽ kiểm tra link tables xem đừng dẫn có đúng chưa . nếu chưa thì hiện form cho cho chọn link (cái này em làm được rồi ) còn mỗi cái kiểm tra link tables có đúng chưa thì em chưa làm được . mong mọi người giúp đở 

    Mã:
    Public Sub CheckLinkTbales()
        Dim strTest As String
        Dim db As Database
        Set db = CurrentDb
        Dim td As TableDef, MyStr
        Dim msgs As Variant

        For Each td In db.TableDefs
            If Len(td.Connect) = 0 Then
                msgs = MsgBox(Mid(td.Connect, 11), vbOKCancel)
                If msgs = vbOK Then
                    MsgBox "exit"
                    Exit For
                End If
            Else
                MsgBox "sai"
                Exit For
            End If
        Next td
    End Sub
  • RE: giúp đở Cách lấy đừng link của tables

    ongke0711 > 31-07-19, 02:05 PM

    Tôi không hiểu sao bạn lại thích dùng hàm Msgbox() trong code vậy. Muốn kiểm tra câu lệnh có đúng không thì dùng Debug.Print.
    Nếu CSDL có 30 chục cái Table thì nó hiện 30 cái msgbox để chọn Yes, No à? Chưa kể bạn còn dùng sai hàm này.
    Dịch từ code của bạn:

    - Duyệt qua từng table trong CSDL.
    - If Len(td.Connect)=0 Then  --> nếu table này không phải là Linked table thì...
    - msg= MsgBox (...)"              --> Hiển thị thông báo đường dẫn file .mdb kết nối + tuỳ chọn trả lời OK/Cancel
    -                                         --> Nếu trả lời OK thì thoát còn lại thì báo lỗi

    ==> toàn bộ câu lệnh không có ý nghĩa gì luôn.

    Nếu không phải là Linked table thì lấy đâu ra đường dẫn "td.connect" mà hiển thị trong MsgBox?

    - Thứ nhất về Linked table bạn Link thông qua ODBC hay chỉ Import linked thông thường? Nó sẽ quyết định cái chuỗi "td.Connect" để bạn trích ra đường dẫn file.
    Mid(td.Connect, 11): là lấy ra đường dẫn CSDL link tới nó (dạng String). Bạn muốn biết file theo đường dẫn này có tồn tại hay không thì dùng hàm Dir() chứ dùng hàm MsgBox làm gì? hàm Msgbox nó hiện ra đường dẫn đề nhìn thôi chứ có biết nó còn trên máy tính hay không?

    Trên diễn đàn đã có nhiều bài về kiểm tra linked table đó bạn. Tìm kiếm và tham khảo đi nhé.
    https://thuthuataccess.com/forum/thread-9949.html
  • RE: giúp đở Cách lấy đừng link của tables

    http2 > 31-07-19, 02:31 PM

    dạ Chào anh . em lại làm phiền anh rồi ^^ em chỉ link table bình thườnt thôi anh . không có sử dụng ODBC.
    - giờ file em đã có sẵn 2 file mdb .  file1 chưa table . file2 chứa báo cáo ,query và form + code . giờ em đã link tables hết qua bên file data rồi . giờ em muốn khi em dời đi chổ khác thì mở file2 thì nó sẽ kiểm tra xem link tables đã đúng chưa nếu chưa thì sẽ hiên form cho em add lại link tables . nếu đúng thì mở form login .
    phần mở để chọn file để link lại thì em làm được rồi . còn mỗi cái kiểm tra link còn sống hay chết thì chưa thực hiện được . anh có thể cho em hướng giải quyết được không .
  • RE: giúp đở Cách lấy đừng link của tables

    AnNguyen > 31-07-19, 03:08 PM

    (31-07-19, 02:05 PM)ongke0711 Đã viết: Tôi không hiểu sao bạn lại thích dùng hàm Msgbox() trong code vậy. Muốn kiểm tra câu lệnh có đúng không thì dùng Debug.Print.
    Nếu CSDL có 30 chục cái Table thì nó hiện 30 cái msgbox để chọn Yes, No à? Chưa kể bạn còn dùng sai hàm này.
    Bác cho em hỏi chút ạ, Dùng Msgbox có vấn đề gì ạ, vì em viết code thông báo hay gì em toàn để bật ra MSgbox hết ạ.
    Em chưa hiểu được về cái Debug.Print.
  • RE: giúp đở Cách lấy đừng link của tables

    http2 > 31-07-19, 04:58 PM

    Thân Chào Anh . em đã nghiên cứu hết rồi . chỉ có kiểm tra xem có table hay không , nếu có rồi thì thôi . không có thì link table mới . không có cái nào là kiểm tra đường link tables đúng hay sai cả . hiu hiu . 
    Giờ chỉ có cách là làm cách nào lấy được đường link của cái table là em có thể làm típ phần sau . giờ dang lấn cứng ngây đó . còn cái  "mid(td.connect,11) đúng là bắt link của table nhưng không ra cái gì cả trắng bóc . nhưng sử dụng "len(td.connect) thì nó chuẩn . híc nó cho ra là "1.doc" đúng nhức đầu .


    Mã PHP:
    Public Sub CheckLinkTbales()
        Dim strTest As String
        Dim db 
    As Database
        Set db 
    CurrentDb
        Dim td 
    As TableDefMyStr
        Dim Msgs 
    As Variant

        
    For Each td In db.TableDefs
            
            
    If Len(td.Connect) > 0 Then
                strTest 
    Dir(Mid(td.Connect11))
                If Len(strTest) = 0 Then
                    Msgs 
    MsgBox("không thấy dữ liệu: " Mid(td.Connect11) , vbOKOnly"Waring")
                    If Msgs vbOK Then
                        DoCmd
    .OpenForm "frmGetPath"
                        Exit For
                    End If
                End If
            Else
                
                Msgs 
    MsgBox(mid(td.Connect), vbOKOnly)
                If Msgs vbOK Then
                    DoCmd
    .OpenForm "frmGetPath"
                End If
                Exit For
            End If
        Next
    End Sub 
  • RE: giúp đở Cách lấy đừng link của tables

    mrsiro > 31-07-19, 05:46 PM

    mỗi lần link thành công thì bạn lưu đường dẫn vào 1 table nào đó. Rồi khi form login hiện lên thì dùng hàm dir() cái đường dẫn đó, nếu = "" thì là đường link ko đúng. Mình có cái module dùng riêng cho việc này, qui trình thì như mình nói ở trên.
  • RE: giúp đở Cách lấy đừng link của tables

    ongke0711 > 31-07-19, 07:48 PM

    (31-07-19, 03:08 PM)AnNguyen Đã viết:
    (31-07-19, 02:05 PM)ongke0711 Đã viết: Tôi không hiểu sao bạn lại thích dùng hàm Msgbox() trong code vậy. Muốn kiểm tra câu lệnh có đúng không thì dùng Debug.Print.
    Nếu CSDL có 30 chục cái Table thì nó hiện 30 cái msgbox để chọn Yes, No à? Chưa kể bạn còn dùng sai hàm này.
    Bác cho em hỏi chút ạ, Dùng Msgbox có vấn đề gì ạ, vì em viết code thông báo hay gì em toàn để bật ra MSgbox hết ạ.
    Em chưa hiểu được về cái Debug.Print.

    Việc dùng Msgbox() thì không có vấn đề gì cả nếu dùng đúng mục đích của nó là để hiện thông báo. Còn ở trường hợp trên thì dùng sai chỗ và sai cách. Tôi cũng không hiểu mục đích dùng ở vị trí đó để làm gì? Nếu mục đích muốn kiểm tra code chạy như thế nào thì dùng Debug.print còn nếu muốn thiết kế để ứng dụng hiện thông báo cho người dùng biết thì sai hoàn toàn.

    Debug.print chỉ đơn giản là in xuống của sổ Immediate Window kết quả của biến, hàm mà bạn muốn kiểm tra thử xem nó chạy đúng như ý đồ code hay không
    Ví dụ: muốn biết cái chuỗi td.Connect nó như thế nào thì dùng Debug.Print ngay bên dưới dòng code này.

    For Each td In db.TableDefs
         Debug.Print td.Connect
    Next td
  • RE: giúp đở Cách lấy đừng link của tables

    ongke0711 > 31-07-19, 09:03 PM

    (31-07-19, 04:58 PM)http2 Đã viết: Thân Chào Anh . em đã nghiên cứu hết rồi . chỉ có kiểm tra xem có table hay không , nếu có rồi thì thôi . không có thì link table mới . không có cái nào là kiểm tra đường link tables đúng hay sai cả . hiu hiu . 
    Giờ chỉ có cách là làm cách nào lấy được đường link của cái table là em có thể làm típ phần sau . giờ dang lấn cứng ngây đó . còn cái  "mid(td.connect,11) đúng là bắt link của table nhưng không ra cái gì cả trắng bóc . nhưng sử dụng "len(td.connect) thì nó chuẩn . híc nó cho ra là "1.doc" đúng nhức đầu .


    Mã PHP:
    Public Sub CheckLinkTbales()
        Dim strTest As String
        Dim db 
    As Database
        Set db 
    CurrentDb
        Dim td 
    As TableDefMyStr
        Dim Msgs 
    As Variant

        
    For Each td In db.TableDefs
            
            
    If Len(td.Connect) > 0 Then
                strTest 
    Dir(Mid(td.Connect11))
                If Len(strTest) = 0 Then
                    Msgs 
    MsgBox("không thấy dữ liệu: " Mid(td.Connect11) , vbOKOnly"Waring")
                    If Msgs vbOK Then
                        DoCmd
    .OpenForm "frmGetPath"
                        Exit For
                    End If
                End If
            Else
                
                Msgs 
    MsgBox(mid(td.Connect), vbOKOnly)
                If Msgs vbOK Then
                    DoCmd
    .OpenForm "frmGetPath"
                End If
                Exit For
            End If
        Next
    End Sub 

    - Bạn phải tập thói quen và nhớ kỹ là khai báo thư viện DAO, đặc biệt là khi dùng Linked Table. 

    Dim db As DAO.Database
    Dim td As DAO.TableDefs


    - Khai báo biến tường minh. Hạn chế khai báo kiểu Variant nếu có thể (biết chính xác kiểu trả vể). Bạn chắc bên Excel qua nên có kiểu khai báo biến nối tiếp nhau dấu phẩy và không khai báo kiểu dữ liệu, để VBA tự gán.
     
    Dim MyStr As String
    Dim Msgs As Long

    Demo chuỗi td.Connect khi linked table với CSDL Access như sau:

             td.Connect = ";DATABASE=Y:\Study\Access\CheckLinkedTables\db2_be.mdb"
             Mid(td.Connect,11) = "Y:\Study\Access\CheckLinkedTables\db2_be.mdb"

             Dir(Mid(td.Connect,11)) = "db2_be.mdb"

    Tại sao phải dùng Len(td.Connect) >0 và phải thêm Dir(...)? Vì sẽ có trường hơp Table đó là linked table nên td.Connect sẽ >0 nhưng chưa chắc cái link đó còn sống hay không do đó phải kiểm tra thêm một bước nữa là dùng Dir(...) để xem cái file đó còn tồn tại (có và đúng đường dẫn) hay không. 

    Cái MsgBox bạn hỏi người ta cũng phải cho rõ thì người dùng mới biết "Nếu chọn OK sẽ được gì và chọn Cancel sẽ ra sao"
    Vd: Msgs = MsgBox("Không thấy dữ liệu: " & Mid(td.Connect, 11) & vbCrLf & "Bạn có muốn chọn lại file không? Chon OK để ...., chon Cancel để Huỷ....." , vbOKCancel, "Waring")
    Còn nếu không thì chỉ hiện Msgbox và OpenForm không cần phải qua bước trung gian If trả lời = ok nữa cho tốn code.
  • RE: giúp đở Cách lấy đừng link của tables

    http2 > 01-08-19, 12:35 PM

    Dạ em cám ơn anh . hôm qua em đã dùng cách khác . là kiểm tra 1 table nào đó trong database . nếu nó còn đó (table đó có phải là link tables hay là table không link ) thì sẽ thực hiện openReconrdset , nếu báo lỗi có nghĩa là table đó không mở được vậy thực hiện mở form linktables lại . ngược lại nếu table đó không tồn tại thì thực hiện mở form linktables thẳng luôn . em bẩy lỗi ngây OpenReconrdset .
    cám ơn anh đã chỉ em dùng id.connect.
  • RE: giúp đở Cách lấy đừng link của tables

    ongke0711 > 02-08-19, 09:49 AM

    (01-08-19, 12:35 PM)http2 Đã viết: Dạ em cám ơn anh . hôm qua em đã dùng cách khác . là kiểm tra 1 table nào đó trong database . nếu nó còn đó (table đó có phải là link tables hay là table không link ) thì sẽ thực hiện openReconrdset , nếu báo lỗi có nghĩa là table đó không mở được vậy thực hiện mở form linktables lại . ngược lại nếu table đó không tồn tại thì thực hiện mở form linktables thẳng luôn . em bẩy lỗi ngây OpenReconrdset .
    cám ơn anh đã chỉ em dùng id.connect.

    Kiểm tra Linked Table còn sống hay không cũng có nhiều cách như:
    1. Dir()
    2. OpenRecordset
    3. Dcount()
    4. RefreshLink rồi bắt Error. Chỉ định thẳng tên Table link, không cần loop trong TableDefs.

    Nếu rảnh bạn kiểm tra thử xem cách OpenRecordset và cách 4 xem cái nào nhanh hơn?
    Theo tôi suy luận thì OpenRecorset sẽ tốn thời gian hơn vì nếu linked table vẫn còn tồn tại thì nó sẽ kết nối để lấy Recordset về rồi mới trả kết quả cho bạn.
    Còn nếu chỉ đơn giản dùng "Refreshlink", nếu table còn tồn tại thì không báo lỗi =>OK. Nếu đường dẫn sai hoặc table không còn như cũ thì sẽ báo lỗi -> lúc đó bạn chỉ cần bẫy lỗi "3011, 3024" là "Table không tồn tại", chọn lại đường dẫn khác là xong.
    Bạn check thử xem.

    VD:
    On Error Goto EH
    Const conLINKED_TABLE As String = "tblUsers"
    If Len(CurrentDb.TableDefs(conLINKED_TABLE).Connect) > 0 Then
        CurrentDb.TableDefs(conLINKED_TABLE).RefreshLink
    End If

    EH_Exit:
       Exit Sub
    EH:
       Select Case Err.Number
       Case 3011,3024
          'table không tồn tại.
          ....
       Case Else
       ..,
       End Select