Đánh giá chủ đề:
  • 1 Votes - 4 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] [Hàm] Lấy dữ liệu giữa 2 file Access có cùng cấu trúc table
#1
Mình muốn append dữ liệu giữa 2 mdb có cùng cấu trúc thì viết code như thế nào. (nhiều người vào nhiều máy bây giờ muốn nối số liệu thành 1 table) muốn nối từ file đích vào file nguồn nhé
Xin mọi người giúp với

(ví dụ a.mdb có table b1, b.mdb cũng có table b1 mình muốn appen a.mdb table b1 vào b1 của b.mdb)
Chữ ký của trungminh trungminh,gia nhập Thủ Thuật Access từ 12-07 -16.
Reply
Những người đã cảm ơn
#2
CSDL này của bạn là đã có sẳn cần xử lý hay dự định thiết kế như vậy? Nếu là dự định thì nên chọn giải pháp khác (Linked table) cho khỏi mất công nối ghép.
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn maidinhdan , trungminh
#3
(03-10-16, 03:40 PM)ongke0711 Đã viết: CSDL này của bạn là đã có sẳn cần xử lý hay dự định thiết kế như vậy? Nếu là dự định thì nên chọn giải pháp khác (Linked table) cho khỏi mất công nối ghép.

(CSDL đã có sẵn vì nhiều máy làm) mình học được appen vào file đích được thôi bây giờ mình muốn appen từ file đích vào file nguồn (file nguồn là file đang mở). bạn có demo cả 2 loại cho mình xin với nhé
Chữ ký của trungminh trungminh,gia nhập Thủ Thuật Access từ 12-07 -16.
Reply
Những người đã cảm ơn
#4
(03-10-16, 10:05 AM)trungminh Đã viết: Mình muốn append dữ liệu giữa 2 mdb có cùng cấu trúc thì viết code như thế nào. (nhiều người vào nhiều máy bây giờ muốn nối số liệu thành 1 table) muốn nối từ file đích vào file nguồn nhé
Xin mọi người giúp với

(ví dụ a.mdb có table b1, b.mdb cũng có table b1 mình muốn appen a.mdb table b1 vào b1 của b.mdb)

Bạn rất may mắn là tôi đang viết ứng dụng liên quan đến chủ đề này,

Tôi xin tặng bạn 1 hàm để bạn dùng.

Bước 1. Tạo Modules mới và chép hàm này vào, lưu với tên gì tùy bạn.

Mã PHP:
Option Compare Database
'Khai bao

Public Ws As DAO.Workspace
Public db As DAO.Database
Public rst As DAO.Recordset
Public rstt As DAO.Recordset
'
---------------------------------------------------------------------------------------
' Procedure/ Ten thu tuc : Ketnoi1
AuthorNguoi khoi tao maidinhdan@gmail.com
' Tao tren may tinh User : DANAspireV5
DateNgay tao         9/29/2016-22:54
' Purpose/Mo ta          : Ket noi bang DAO, Ket noi theo kieu sao chep tu file nguon sang file dich - Sao chep toan bo
'
                          Da Test voi Data 500Mb ung voi 1 trieu recordtoc do truy xuat khoang 3phutnen thuc te ap dung Ketnoi2 se hay hon tốc độ kết nối khoảng 5s với nhiều User truy cầp cùng 1 lúc
'---------------------------------------------------------------------------------------
Public Function Ketnoi1(TenTable As String, Duongdanfile As String)
    Set Ws = DBEngine.Workspaces(0)
    '
Mo ket noi Data co Pass
    Set db 
Ws.OpenDatabase(Duongdanfile)
    Set rst db.OpenRecordset(TenTabledbOpenDynaset)                      
    Set rstt 
CurrentDb.OpenRecordset(TenTabledbOpenDynaset)
       rst.MoveFirst
    
Do Until rst.EOF
        
' Cap nhap vao table tam
        rstt.AddNew
        ' 
Duyet tu cot
        
For 0 To rst.Fields.Count 1
            rstt
.Fields(i) = rst.Fields(i)
        Next
        rstt
.Update
        rst
.MoveNext
    Loop
    rst
.Close
    Set db 
Nothing
End 
Function 

Ghi chú: Nếu file nguồn có pass thì thay cả cái cái dòng đó bằng: ( giả sử pass là 123)
Mã PHP:
Set db Ws.OpenDatabase(DuongdanfileFalseFalse"MS Access;PWD=123"

Bước 2: Gọi hạm để sử dụng.
Tạo 1 nút Click và gọi nó ra

Cú pháp gọi:
Mã PHP:
Ketnoi1 "TênTable","D:\a.mdb" 

+ Duongdanfile là file Nguồn nhé: "D:\a.mdb"
+ Nhớ là TênTable cả hai file phải giống nhau, kể cả cấu trúc các cột cũng phải giống:

Thân mến!
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn ongke0711 , trungminh , jeck09nt , Minh Tiên
#5
(03-10-16, 04:10 PM)maidinhdan Đã viết:
(03-10-16, 10:05 AM)trungminh Đã viết: Mình muốn append dữ liệu giữa 2 mdb có cùng cấu trúc thì viết code như thế nào. (nhiều người vào nhiều máy bây giờ muốn nối số liệu thành 1 table) muốn nối từ file đích vào file nguồn nhé
Xin mọi người giúp với

(ví dụ a.mdb có table b1, b.mdb cũng có table b1 mình muốn appen a.mdb table b1 vào b1 của b.mdb)

Bạn rất may mắn là tôi đang viết ứng dụng liên quan đến chủ đề này,

Tôi xin tặng bạn 1 hàm để bạn dùng.

Bước 1. Tạo Modules mới và chép hàm này vào, lưu với tên gì tùy bạn.

Mã PHP:
Option Compare Database
'Khai bao

Public Ws As DAO.Workspace
Public db As DAO.Database
Public rst As DAO.Recordset
Public rstt As DAO.Recordset
'
---------------------------------------------------------------------------------------
' Procedure/ Ten thu tuc : Ketnoi1
AuthorNguoi khoi tao maidinhdan@gmail.com
' Tao tren may tinh User : DANAspireV5
DateNgay tao         9/29/2016-22:54
' Purpose/Mo ta          : Ket noi bang DAO, Ket noi theo kieu sao chep tu file nguon sang file dich - Sao chep toan bo
'
                          Da Test voi Data 500Mb ung voi 1 trieu recordtoc do truy xuat khoang 3phutnen thuc te ap dung Ketnoi2 se hay hon tốc độ kết nối khoảng 5s với nhiều User truy cầp cùng 1 lúc
'---------------------------------------------------------------------------------------
Public Function Ketnoi1(TenTable As String, Duongdanfile As String)
    Set Ws = DBEngine.Workspaces(0)
    '
Mo ket noi Data co Pass
    Set db 
Ws.OpenDatabase(Duongdanfile)
    Set rst db.OpenRecordset(TenTabledbOpenDynaset)                      
    Set rstt 
CurrentDb.OpenRecordset(TenTabledbOpenDynaset)
       rst.MoveFirst
    
Do Until rst.EOF
        
' Cap nhap vao table tam
        rstt.AddNew
        ' 
Duyet tu cot
        
For 0 To rst.Fields.Count 1
            rstt
.Fields(i) = rst.Fields(i)
        Next
        rstt
.Update
        rst
.MoveNext
    Loop
    rst
.Close
    Set db 
Nothing
End 
Function 

Ghi chú: Nếu file nguồn có pass thì thay cả cái cái dòng đó bằng: ( giả sử pass là 123)
Mã PHP:
Set db Ws.OpenDatabase(DuongdanfileFalseFalse"MS Access;PWD=123"

Bước 2: Gọi hạm để sử dụng.
Tạo 1 nút Click và gọi nó ra

Cú pháp gọi:
Mã PHP:
Ketnoi1 "TênTable","D:\a.mdb" 

+ Duongdanfile là file Nguồn nhé: "D:\a.mdb"
+ Nhớ là TênTable cả hai file phải giống nhau, kể cả cấu trúc các cột cũng phải giống:

Thân mến!

Bạn ơi đường dẫn file nguồn mình muốn nó không mặc định mà linh hoạt hơn thì làm thế nào
mình đưa file bạn sửa cho mình đường dẫn theo textbox

Link: http://www.mediafire.com/file/4y0j4drmmu...UPDATE.rar
Chữ ký của trungminh trungminh,gia nhập Thủ Thuật Access từ 12-07 -16.
Reply
Những người đã cảm ơn
#6
(03-10-16, 07:23 PM)trungminh Đã viết:
(03-10-16, 04:10 PM)maidinhdan Đã viết: Bước 2: Gọi hạm để sử dụng.
Tạo 1 nút Click và gọi nó ra

Cú pháp gọi:
Mã PHP:
Ketnoi1 "TênTable","D:\a.mdb" 

+ Duongdanfile là file Nguồn nhé: "D:\a.mdb"
+ Nhớ là TênTable cả hai file phải giống nhau, kể cả cấu trúc các cột cũng phải giống:

Thân mến!

Bạn ơi đường dẫn file nguồn mình muốn nó không mặc định mà linh hoạt hơn thì làm thế nào
mình đưa file bạn sửa cho mình đường dẫn theo textbox

Link: http://www.mediafire.com/file/4y0j4drmmu...UPDATE.rar

Bạn hỏi như vậy là bạn không rõ cách hoạt động của code này rồi, Code này chính là code linh động đó sư huynh.

Theo bài bạn thì sửa lại thành:
Mã PHP:
Ketnoi1 "b1"Me.Text11 

Chỉ có vậy:
Nói túm lại hàm này phát biểu gồm 2 phần:
Mã PHP:
Ketnoi1("Tên table cần import""Tên đường dẫn file cần import vào"


Hy vọng bấy nhiu bạn sẽ hiểu cách dùng nó.
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn trungminh
#7
(03-10-16, 08:38 PM)maidinhdan Đã viết:
(03-10-16, 07:23 PM)trungminh Đã viết:
(03-10-16, 04:10 PM)maidinhdan Đã viết: Bước 2: Gọi hạm để sử dụng.
Tạo 1 nút Click và gọi nó ra

Cú pháp gọi:
Mã PHP:
Ketnoi1 "TênTable","D:\a.mdb" 

+ Duongdanfile là file Nguồn nhé: "D:\a.mdb"
+ Nhớ là TênTable cả hai file phải giống nhau, kể cả cấu trúc các cột cũng phải giống:

Thân mến!

Bạn ơi đường dẫn file nguồn mình muốn nó không mặc định mà linh hoạt hơn thì làm thế nào
mình đưa file bạn sửa cho mình đường dẫn theo textbox

Link: http://www.mediafire.com/file/4y0j4drmmu...UPDATE.rar

Bạn hỏi như vậy là bạn không rõ cách hoạt động của code này rồi, Code này chính là code linh động đó sư huynh.

Theo bài bạn thì sửa lại thành:
Mã PHP:
Ketnoi1 "b1"Me.Text11 

Chỉ có vậy:
Nói túm lại hàm này phát biểu gồm 2 phần:
Mã PHP:
Ketnoi1("Tên table cần import""Tên đường dẫn file cần import vào"


Hy vọng bấy nhiu bạn sẽ hiểu cách dùng nó.

Mình cũng mới bắt đầu học và làm phần mềm nhỏ để giảm bớt phải tính toán báo cáo thôi cảm ơn nhiều
Chữ ký của trungminh trungminh,gia nhập Thủ Thuật Access từ 12-07 -16.
Reply
Những người đã cảm ơn
#8
Gửi  Maidinhdan,
Nếu theo bản Demo của bạn Trungminh thì khi click chuột bao nhiêu lần thì sẽ import mấy nhiêu dữ liệu.
Giờ mình muốn : 
 - Nếu bảng đích rỗng thì import tất cả dữ liệu từ bảng nguồn
 - Nếu bảng đích đã có dữ liệu thì chỉ import thêm những dữ liệu nào có "ngày khám" là khác nhau hoặc import theo các lựa chọn theo các trường của bảng "B1" của file đích.

Nhờ Maidinhdan hướng dẫn giúp !
Xin cám ơn.
Chữ ký của jeck09nt Hãy chia sẻ kinh nghiệm cùng mình trên ThuThuatAccess nhé! Chúc vui vẻ rose
Reply
Những người đã cảm ơn
#9
(04-10-16, 12:19 PM)jeck09nt Đã viết: Gửi  Maidinhdan,
Nếu theo bản Demo của bạn Trungminh thì khi click chuột bao nhiêu lần thì sẽ import mấy nhiêu dữ liệu.
Giờ mình muốn : 
 - Nếu bảng đích rỗng thì import tất cả dữ liệu từ bảng nguồn
 - Nếu bảng đích đã có dữ liệu thì chỉ import thêm những dữ liệu nào có "ngày khám" là khác nhau hoặc import theo các lựa chọn theo các trường của bảng "B1" của file đích.

Nhờ Maidinhdan hướng dẫn giúp !
Xin cám ơn.

Trả lời:

Bạn chú ý 2 dòng này:
Mã PHP:
    Set rst = db.OpenRecordset(TenTable, dbOpenDynaset)                      
    Set rstt 
= CurrentDb.OpenRecordset(TenTable, dbOpenDynaset

Trong đó:
+ rst: là bảng Nguồn
+ rstt: là bảng đích

Vậy thì, để giải quyết thắc mắc trên ta cần thay chỗ TenTable bằng 1 đoạn code SQL của query

Câu 1. Nếu bản đích rỗng, tức là ta sẽ đếm xem rstt có dữ liệu không. Câu này quá dễ bạn có thể tự làm bằng hàm if endif ngay ở click.

Câu 2. Câu hỏi này tôi hiểu ý bạn muốn đạt được là gì ( Đó là bạn chỉ muốn import dữ liệu bản nguồn có mà bản đích chưa có phải không) nhưng cách bạn hỏi như vậy nó không rõ ràng nên tôi sẽ trả lời 2 hướng ( Lý do: Nếu lấy cột ngày khám để so sánh import nó sẽ import tầm bậy vì 1 ngày sẽ có nhiều đối tượng đến khám, ở đây ta nên chọn cột nào chưa khóa chính để So sánh thì hàm ta viết sẽ dể và gọn gàng hơn.)

Ta sẽ làm như sau: Lấy cột STT là khóa chính để so sánh nhé
Bước 1: Tao thêm table B2, y chang như thằng B1 trong file Đích ( và B2 này là file chính dùng cho chương trình, còn B1 là file Tạm)

Bước 2: Tạo query Append có tên qrB2, chèn code này vào
Mã PHP:
INSERT INTO B2 STTNGAYKHAMHOVATENTUOIGIOINGHENGHIEP )
SELECT B1.STTB1.NGAYKHAMB1.HOVATENB1.TUOIB1.GIOIB1.NGHENGHIEP
FROM B1
WHERE 
(((B1.STTNot In (Select STT from B2))); 

Bước 3: Bổ sung vào đoạn cuối cùng của Hàm Kết nối 1, đoạn code sau
Mã PHP:
    DoCmd.SetWarnings False
    DoCmd
.OpenQuery "qrB2"
    Dim sql As String
    sql 
"DELETE * from " TenTable
    DoCmd
.RunSQL sql
    DoCmd
.SetWarnings True 

Như vậy thì Code Ketnoi1 đầy đủ là:
Mã PHP:
Public Function Ketnoi1(TenTable As StringDuongdanfile As String)
    Set Ws DBEngine.Workspaces(0)
    'Mo ket noi Data co Pass
    Set db = Ws.OpenDatabase(Duongdanfile)
    Set rst = db.OpenRecordset(TenTable, dbOpenDynaset)
    Set rstt = CurrentDb.OpenRecordset(TenTable, dbOpenDynaset)
       rst.MoveFirst
    Do Until rst.EOF
        ' 
Cap nhap vao table tam
        rstt
.AddNew
        
' Duyet tu cot
        For i = 0 To rst.Fields.Count - 1
            rstt.Fields(i) = rst.Fields(i)
        Next
        rstt.Update
        rst.MoveNext
    Loop
    rst.Close
    Set db = Nothing
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "qrB2"
    Dim sql As String
    sql = "DELETE * from " & TenTable
    DoCmd.RunSQL sql
    DoCmd.SetWarnings True
End Function 


Để tiện cho bạn Test mình Post Demo đã sửa theo yêu cầu của bạn đây.

Ghi chú:
+ Đáp án này nó giải quyết luôn chuyện bạn nhấn 100 lần thì cũng như 1 lần.
Bạn nhấn thử sau đó lên bản nguồn thêm 1 recode hay 100 cái mới thì nó chỉ thêm vào những cái nào mới thôi
+ Table B1 trong bảng Đích là table tạm nơi không bao giờ có dữ liệu trong đó, nhưng xóa sẽ lỗi
+ Thật ra tôi không muốn tạo thêm nó vì viết quá nhiều code thì đôi khi bạn không hiểu và không thể áp dụng vào bài khác thêm nửa.



* Mình thì không thích hỏi lắc nhắc cho 1 vấn đề, Bạn cứ nghiên cứu rồi hỏi 1 lượt 100 câu cũng được. Làm phần mềm là phải đoán trước được các biến cố sẽ xảy ra trong tương lai. Vì vậy bạn nên tập làm quen như vậy sẽ rất tốt.


Thân mến!


File đính kèm
.zip   ImporttufileAccesskhaccoSosanh.zip (Kích cỡ: 54.98 KB / Tải về: 22)
Chữ ký của maidinhdan * Để được hỗ trợ tốt nhất, nhấn vào link dưới đây để xem.
1. [Hướng dẫn] Kiểu file gửi lên để được giúp đỡ
2. [Hướng dẫn] Nội quy diễn đàn
3. [Hướng dẫn] Cách Đưa file và hình vào diễn đàn
4.[Hướng dẫn] Để xây dựng một ứng dụng hoàn hảo và lời cảm tạ
5. Cần tìm Demo hay ứng dụng sử dụng thanh tìm kiếm phía trên cùng, bên phải của diễn đàn.
* Nếu muốn cảm ơn, hãy nhấn nút thank, không cần viết thêm bài nào nửa.



ღღღღღTài sản của maidinhdan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn jeck09nt
#10
Chào Dân !
Tiên đang Import dữ liệu bằng cách dùng SQL ( theo bài viết của pausteigel thì phải) như sau:

1. Tạo link table từ CSQL đích vào CSDL hiện tại - Nguồn.
2. Dùng code CurrentDb.Execute "INSERT INTO tableDich(Field1, Field2,...) SELECT  Field1, Field2, ... FROM tableNguon;"
3. Xóa link table.

Tiên đã test thử với table hơn 200.000 record tốc độ chỉ 10 giây (Theo code của Dân mất 26 giây ).
'- ưu điểm của SQL là:
   + Nhanh;
   + Cấu trúc table nguồn và đích ko cần giống nhau ( Chỉ cần các Field có cùng kiểu dữ liệu ).
- Nhượt:
   + Code hơi dài (Code Link, Xóa Link, SQL)

Dân cùng các Pro test lại thử có đúng ko nhé !
Thân./.
Chữ ký của Minh Tiên -----------------------------------------------
Đường tuy ngắn, không đi không đến
Việc tuy nhỏ, không làm không nên.
                                           Tuân Tử
-----------------------------------------------
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  copy dữ liệu excel vào access có kí tự xuống dòng babyrock2009 2 84 01-12-16, 11:16 AM
Bài mới nhất: babyrock2009
  [Hỏi] Chữ IN HOA trong table diepvien1989 5 307 08-09-16, 10:16 PM
Bài mới nhất: Nguyen Hoang Diep
  [Help] So sánh 2 Table Lấy ra dữ liệu trùng nhau sang 1 table có sẳn khác thdanh 21 1,682 19-07-16, 04:21 PM
Bài mới nhất: maidinhdan
  [Help] ràng buộc dữ liệu giữa 2 field trong 2 bảng khác nhau hoangtiep 5 282 08-07-16, 05:07 PM
Bài mới nhất: maidinhdan
  Chuyển dữ liệu từ bảng A qua bảng B có chọn lọc bdbqn2007 5 378 08-06-16, 11:36 PM
Bài mới nhất: maidinhdan

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ