Link table từ access A đến access B

Liên hệ QC

dongoclinh.vcli

Thành viên mới
Tham gia
19/2/19
Bài viết
9
Được thích
0
Chào các anh chị,

Hiện em đang gặp vấn đề về xử lý dữ liệu như sau ạ:

Khi thực hiện tính toán, em cần đưa 1 table X từ access A vào access B, làm thủ công ta có 2 cách (đều xử lý manual trên access B):

1. Tạo 1 table trên access B bằng cách: External data > access > chọn access A (theo đường dẫn) và "Link to the data source by creating a linked table", access B sẽ xuất hiện table X từ access A mà không tốn dữ liệu (do chỉ là link data)

2. Tạo 1 query trên access B link tới table X access A (có chứa đầy đủ nội dung của table X) SELECT * FROM ['C:\Users\abc\Desktop\A.accdb'].X...; (câu lệnh này đang sai và em chưa tìm cách viết đúng)

Vậy các anh/chị giúp em chuyển thành đoạn code (theo cách 1 hoặc 2, em cũng không chắc chắn cách nào dễ hơn) để ghép vào vba marco chạy trên excel để tạo table link từ access A, vào access B với ạ.

Hiện em đang bắt đầu tìm hiểu về cơ sở dữ liệu, quản lý data trên access, em đang tìm tài liệu có những nội dung liên quan cả cơ bản và nâng cao, anh/chị có thể chia sẻ cho em một vài đầu sách để em tìm đọc với ạ!

Cảm ơn anh/chị nhiều!
Chúc cuối tuần vui vẻ
 
Trong ứng dụng Ms Access không ai làm theo cách 2 của bạn nhé.
Access có 2 cách để link tới file dữ liệu (backend) là dùng Linked table hoặc dùng thư viện ADODB để kết nối. Đối với bạn mới vào Access thì dùng Linked table cho đơn giản, code cũng ít phức tạp hơn dùng ADO.
- Đối với linked table thì bạn muốn link tới bao nhiêu CSDL Access khác cũng được.
- Vì đây là giai đoạn thiết kế CSDL nên bạn phải tạo liên kết sẵn sàng hết đối với các table mà bạn cần xử lý. Phải tạo thủ công: - Import -> Access Database -> Link to data... Phải có các Table mặt mũi ra sao rồi mới tính tới chuyện query, code vba
- Còn việc viết code để tạo link hay Re-link là (đang nói trường hợp dùng Linked table) là khi bạn phân phối ứng dụng, bạn mới code để ứng dụng tự tìm đến đường dẫn của file dữ liệu khi copy qua máy khác để tự động kết nối trở lại. Trường hợp khác để dùng Relink table là khi CSDL của bạn nhiều quá phải cắt ra lưu trữ (ví dụ: cắt dữ liệu 3 năm trước ra lưu thành file data riêng) khi cần truy vấn lại dữ liệu cũ thì lúc đó mới code chuyển Linked table về CSDL cũ.
 
Trong ứng dụng Ms Access không ai làm theo cách 2 của bạn nhé.
...
Cách gọi thẳng ODBC của Access là cách ngừoi ta dùng cho sql động và csdl không có password

Ngữ pháp (syntax):
Select * From X IN "C:\aFolder\A.accdb"

Ngữ pháp (của thớt) sửa lại 1 chút:
Select * From [C:\aFolder\A.X]
Dùng kiểu này thì ODBC tự hiểu ngầm file là loại mdb. Tôi chưa thử với accdb, nhưng theo lô gic thì chắc là không được. Lỡ folder có cả 2 files thì sao?
 
Em muốn link table X từ 1 file Access B theo đường dẫn (C:\abc\B.accdb) vào file access A (đang thao tác trên file này) theo câu lệnh:

SELECT *
FROM [;DATABASE= C:\abc\B.accdb].X;


Em tạm gọi nó tên là Query1
Sau đó em sử dụng Query1 để truy xuất dữ liệu theo lệnh sau :

SELECT Query1.POL_NUM, Query1.PROD_CODE
FROM Query1 LEFT JOIN [Y] ON Query1.[POL_NUM] = [Y].[POL_NUM]
WHERE ((([Y].POL_NUM) Is Null));


Y là 1 table trong file Access A, có format giống X.
Mục đích của em là so sánh 2 table X và Y. Đoạn code trên em lấy dựa vào “Find Unmatched Query Wizard”.

Vấn đề hiện tại là có cách nào lồng 2 đoạn lệnh trên thành 1 đoạn, hoặc đưa cả 2 đoạn lệnh trên vào VBA marco để chạy không ạ? Hiện đoạn lệnh thứ 2 em đã thực hiện được trên VBA, em đang tắc ở đoạn lệnh 1 – tạo Query1 (đặt tên nó theo mình muốn)

Anh/Chị giúp em với!
Cảm ơn và chúc buổi tối vui vẻ ạ!
 
Sub compare()

Dim cn As Object
Dim RS As Object
Dim strDBName As String
Dim strSQL As String
Dim strcon As String
Dim strPath As String
Dim output As String

Set cn = CreateObject("ADODB.Connection")

strDBName = Range("Database")
strPath = Range("Path") & "\" & Range("Database")

strcon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Replace(strPath, """", "") & "; User Id=admin;Password="

cn.Open strcon

Application.ScreenUpdating = False

'----Old policies in month----
strSQL = "SELECT Query1.POL_NUM, Query1.PROD_CODE "
strSQL = strSQL & " FROM Query1 LEFT JOIN [Y] ON Query1.[POL_NUM] = [Y].[POL_NUM]"
strSQL = strSQL & " WHERE ((([Y].POL_NUM) Is Null)); "


Set RS = cn.Execute(strSQL)

Range("old_POL").Clear

Range("old_POL").CopyFromRecordset RS

Application.ScreenUpdating = True
End Sub


strPath =: Em định dạng là đường dẫn đến file access B.

Đây là đoạn code em đang thực hiện, vấn đề là phải có sẵn 1 query Query1 (tạo thủ công) trên access B.
Em muốn chèn cái thao tác đó vào code VBA trên nhưng chưa làm được ạ.
Mong anh/chị giúp đỡ!

Trân trọng!
 
Bạn dùng Union query thử xem sao.
Dùng theo cách khai báo của anh Vetmini. Query này tìm ra dòng không trùng giữa 2 table.

Chuỗi kết nối:

Mã:
strcon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\abc\A.accdb;Persist Security Info=False;"

Mã:
strSQL = "SELECT POL_NUM From X IN 'D:\abc\B.accdb' WHERE X.POL_NUM Not In (SELECT POL_NUM From Y) " & _
             "Union " & _
             "SELECT POL_NUM FROM Y WHERE Y.POL_NUM Not In (SELECT POL_NUM From X IN 'D:\abc\B.accdb'); "
 
Lần chỉnh sửa cuối:
Bạn dùng Union query thử xem sao.
Dùng theo cách khai báo của anh Vetmini. Query này tìm ra dòng không trùng giữa 2 table.

Chuỗi kết nối:

Mã:
strcon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\abc\A.accdb;Persist Security Info=False;"

Mã:
strSQL = "SELECT POL_NUM From X IN 'D:\abc\B.accdb' WHERE X.POL_NUM Not In (SELECT POL_NUM From Y) " & _
             "Union " & _
             "SELECT POL_NUM FROM Y WHERE Y.POL_NUM Not In (SELECT POL_NUM From X IN 'D:\abc\B.accdb'); "

Cảm ơn anh ạ! Mai em sẽ ra công ty ngồi thử xem sao!
Query em viết là tìm 2 dòng ko trùng của 2 table, nhưng đó là 1 trong nhiều bài toán khác cần sử dụng Table X link từ 1 access khác ạ!
Nên em vẫn muốn tách riêng 1 query để tạo ra Query1.

Vậy có cách nào khác không ạ?

Trân trọng!
 
Cảm ơn anh ạ! Mai em sẽ ra công ty ngồi thử xem sao!
Query em viết là tìm 2 dòng ko trùng của 2 table, nhưng đó là 1 trong nhiều bài toán khác cần sử dụng Table X link từ 1 access khác ạ!
Nên em vẫn muốn tách riêng 1 query để tạo ra Query1.

Vậy có cách nào khác không ạ?

Trân trọng!

- Code trên tôi demo dạng hard code để dễ hiểu thôi. Sau đó bạn tuỳ nghi đổi tên CSDL, đường dẫn thành các tham số động truyền vào câu lệnh SQL.
- Cái uinon query trên là tìm ra nhưng dòng không giống nhau giữa 2 table. Những dòng table 1 có mà table 2 không và ngược lại.
- Còn về việc tạo query sẳn trên các file database thì tuỳ thích theo cách code của bạn, cách nào thấy thuận tiện thì làm thôi. Tạo sẳn các query trong file Access rồi gọi nó cũng giống như tạo các stored procedure trong Sql server rồi gọi từ các ứng dụng font end vậy.
 
Bạn dùng Union query thử xem sao.
Dùng theo cách khai báo của anh Vetmini. Query này tìm ra dòng không trùng giữa 2 table.

Chuỗi kết nối:

Mã:
strcon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=D:\abc\A.accdb;Persist Security Info=False;"

Mã:
strSQL = "SELECT POL_NUM From X IN 'D:\abc\B.accdb' WHERE X.POL_NUM Not In (SELECT POL_NUM From Y) " & _
             "Union " & _
             "SELECT POL_NUM FROM Y WHERE Y.POL_NUM Not In (SELECT POL_NUM From X IN 'D:\abc\B.accdb'); "

Em hỏi chút là trong đoạn code trên, em muốn thay thế đường link (bôi đen ở trên) bằng 1 range trên excel để linh hoạt trong quá trình thay đổi folder ạ!

Mong anh giúp đỡ!
Trân trọng!
 
Em hỏi chút là trong đoạn code trên, em muốn thay thế đường link (bôi đen ở trên) bằng 1 range trên excel để linh hoạt trong quá trình thay đổi folder ạ!

Ý bạn là chỗ câu lệnh SQL ở bài #5?
Tôi thấy chuỗi connection bạn đã dùng truyền tham số từ range rồi.
Nếu trong câu lệnh SQL của tôi thì bạn có thể làm như sau:

Mã:
Dim strDBSourceName As String

strDBSourceName= Sheet1.Range("A1")  '-->Tuỳ range của bạn'

strSQL = "SELECT POL_NUM From X IN '" & strDBSourceName & "'  WHERE X.POL_NUM Not In ..."
str
 
Ý bạn là chỗ câu lệnh SQL ở bài #5?
Tôi thấy chuỗi connection bạn đã dùng truyền tham số từ range rồi.
Nếu trong câu lệnh SQL của tôi thì bạn có thể làm như sau:

Mã:
Dim strDBSourceName As String

strDBSourceName= Sheet1.Range("A1")  '-->Tuỳ range của bạn'

strSQL = "SELECT POL_NUM From X IN '" & strDBSourceName & "'  WHERE X.POL_NUM Not In ..."
str

Dạ cảm ơn anh nhiều ạ!
Cho em hỏi thêm chút là em đang cần tìm 1 2 tài liệu nói về SQL, truy vấn dữ liệu... anh có thể gợi ý cho em một vài tài liệu không ạ!

Trân trọng!
 
Web KT
Back
Top Bottom