Access Attachment File

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

ngoctuyen1995

Thành viên hoạt động
Tham gia
25/4/17
Bài viết
194
Được thích
19
Giới tính
Nữ
Thân chào cả nhà GPEX!

Hiện tại em muốn dùng code VBA để Attachment File lên table:
Dựa vào cột Contract để Attach file PDF từ Folder vào Table1 tương ứng với Contract đó, trường hợp một Contract có nhiều file thì dựa vào tên file trước dấu "_" để lấy được file ạ.
Ví dụ:
1704266218871.png
Mong cả nhà giúp đỡ em, em chân thành cảm ơn ạ.
Em có đính kèm file và code em tham khảo trên google ạ.
 

File đính kèm

  • Test.zip
    550.6 KB · Đọc: 5
Mong cả nhà giúp đỡ ạ.
 
Thân chào cả nhà GPEX!

Hiện tại em muốn dùng code VBA để Attachment File lên table:
Dựa vào cột Contract để Attach file PDF từ Folder vào Table1 tương ứng với Contract đó, trường hợp một Contract có nhiều file thì dựa vào tên file trước dấu "_" để lấy được file ạ.
Ví dụ:
View attachment 298015
Mong cả nhà giúp đỡ em, em chân thành cảm ơn ạ.
Em có đính kèm file và code em tham khảo trên google ạ.
Bạn cần phân tích, làm rõ lại cái qui trình đính kèm file vào Table1 trước khi code cho nó hiệu quả.
- File bạn đang làm là ấn một nút nó sẽ tự động đính kèm "tất cả" file (PDF) cho "toàn bộ" record có trong Table 1. Nếu chỉ có 1 hay vài record cần thay đổi file đính kèm thì vẫn phải chạy cập nhật lại cho toàn bộ record?? --> lãng phí thời gian.
- Cân nhắc giữa việc dùng kiểu Attachment hay chỉ cần link tới Folder chứa các file đính kèm. Dùng Field kiểu Attachment có cái lợi là dữ liệu nó gộp hết vào một database, thuận tiện sao lưu... Nhược điểm là dung lượng CSDL sẽ phình lên nhanh nếu số lượng file đính kèm nhiều.
(Tôi nghĩ bạn cứ dùng Field Attachment cho nhanh, ít code hơn...:D)

Thông thường với dữ liệu dạng hợp đồng này thì bạn nên cập nhật từng đối tượng (record) cho nó chính xác.
- Chọn dòng nào muốn đính kèm -> chọn file đính kèm -> RUN.
- Xem có cần xóa file đính kèm cũ hay không? Nếu không thì file mới phải đảm bảo không trùng tên, có điểm phân biệt.
 
Bạn cần phân tích, làm rõ lại cái qui trình đính kèm file vào Table1 trước khi code cho nó hiệu quả.
- File bạn đang làm là ấn một nút nó sẽ tự động đính kèm "tất cả" file (PDF) cho "toàn bộ" record có trong Table 1. Nếu chỉ có 1 hay vài record cần thay đổi file đính kèm thì vẫn phải chạy cập nhật lại cho toàn bộ record?? --> lãng phí thời gian.
- Cân nhắc giữa việc dùng kiểu Attachment hay chỉ cần link tới Folder chứa các file đính kèm. Dùng Field kiểu Attachment có cái lợi là dữ liệu nó gộp hết vào một database, thuận tiện sao lưu... Nhược điểm là dung lượng CSDL sẽ phình lên nhanh nếu số lượng file đính kèm nhiều.
(Tôi nghĩ bạn cứ dùng Field Attachment cho nhanh, ít code hơn...:D)

Thông thường với dữ liệu dạng hợp đồng này thì bạn nên cập nhật từng đối tượng (record) cho nó chính xác.
- Chọn dòng nào muốn đính kèm -> chọn file đính kèm -> RUN.
- Xem có cần xóa file đính kèm cũ hay không? Nếu không thì file mới phải đảm bảo không trùng tên, có điểm phân biệt.
Em cảm ơn anh đã quan tâm và cho em các hướng để phân tích vấn đề ạ.
- File bạn đang làm là ấn một nút nó sẽ tự động đính kèm "tất cả" file (PDF) cho "toàn bộ" record có trong Table 1. Nếu chỉ có 1 hay vài record cần thay đổi file đính kèm thì vẫn phải chạy cập nhật lại cho toàn bộ record??
Mục đích của em là khi ấn nút đó nó sẽ update lại toàn bộ Record Attachment có trong Table 1 ạ, vì tránh trường hợp một số File PDF có Update và đè lên. em đang bị bí chỗ là không biết code thế nào để có thể attchment 02 File vào 01 Record theo số Hợp đồng thôi ạ.
Cân nhắc giữa việc dùng kiểu Attachment hay chỉ cần link tới Folder chứa các file đính kèm. Dùng Field kiểu Attachment có cái lợi là dữ liệu nó gộp hết vào một database, thuận tiện sao lưu... Nhược điểm là dung lượng CSDL sẽ phình lên nhanh nếu số lượng file đính kèm nhiều.
Số lượng File của em không nhiều và em muốn gôm lại một Database cho dễ quản lý hơn ạ
 
Lần chỉnh sửa cuối:
Hiện tại em muốn dùng code VBA để Attachment File lên table:
Dựa vào cột Contract để Attach file PDF từ Folder vào Table1 tương ứng với Contract đó, trường hợp một Contract có nhiều file thì dựa vào tên file trước dấu "_" để lấy được file ạ.
Ví dụ:
View attachment 298015

Duới đây là code cho cái nút lệnh [Run] của bạn.

Screen Shot 2024-01-04 at 23.45.57.png

JavaScript:
Option Compare Database
Option Explicit

Private Sub cmdAttachFiles_Click()
    Dim db As DAO.Database, rs As DAO.Recordset, rsAtt As DAO.Recordset2
    Dim sFolderPath As String, sFullFilePath As String
    Dim fso As Object, oFolder As Object, oFile As Object, oFiles As Object

    On Error Goto errHandler

    sFolderPath = "\\Mac\Home\Downloads\Test\File PDF"  'Tu sua theo tuy theo may

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oFiles = fso.GetFolder(sFolderPath).Files

    Set db = CurrentDb
    Set rs = db.OpenRecordset("Table1")

    Do While Not rs.EOF
        rs.Edit
        Set rsAtt = rs.Fields("Att").Value
        ' Phai xoa toan bo file attachment cu vi se bao loi (3820) neu trung lap.
        Do Until rsAtt.EOF
            rsAtt.Delete
            rsAtt.MoveNext
        Loop
       
        'Duyet toan bo file trong folder chi dinh, neu thay trung ten thi add vo attachment Fld
        For Each oFile In oFiles
            If InStr(1, oFile.Name, rs.Fields("Contract").Value, vbTextCompare) > 0 Then
                With rsAtt
                    .AddNew
                    .Fields("FileData").LoadFromFile (sFolderPath & "\" & oFile.Name)
                    .Update
                End With
            End If
        Next oFile
        rs.Update
        rs.MoveNext
    Loop
   
    MsgBox "Da cap nhat toan bo file dinh kem thanh cong.", vbInformation, "Thông báo"
   
errExit:
    rs.Close
    Set rs = Nothing
    Set rsAtt = Nothing
    Set db = Nothing
    Set fso = Nothing
    Exit Sub

errHandler:
    MsgBox Err.Number & ": " & Err.Description
    Resume errExit

End Sub
 
Lần chỉnh sửa cuối:
Duới đây là code cho cái nút lệnh [Run] của bạn.

View attachment 298076

JavaScript:
Option Compare Database
Option Explicit

Private Sub cmdAttachFiles_Click()
    Dim db As DAO.Database, rs As DAO.Recordset, rsAtt As DAO.Recordset2
    Dim sFolderPath As String, sFullFilePath As String
    Dim fso As Object, oFolder As Object, oFile As Object, oFiles As Object

    On Error Goto errHandler

    sFolderPath = "\\Mac\Home\Downloads\Test\File PDF"  'Tu sua theo tuy theo may

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oFiles = fso.GetFolder(sFolderPath).Files

    Set db = CurrentDb
    Set rs = db.OpenRecordset("Table1")

    Do While Not rs.EOF
        rs.Edit
        Set rsAtt = rs.Fields("Att").Value
        ' Phai xoa toan bo file attachment cu vi se bao loi (3820) neu trung lap.
        Do Until rsAtt.EOF
            rsAtt.Delete
            rsAtt.MoveNext
        Loop
      
        'Duyet toan bo file trong folder chi dinh, neu thay trung ten thi add vo attachment Fld
        For Each oFile In oFiles
            If InStr(1, oFile.Name, rs.Fields("Contract").Value, vbTextCompare) > 0 Then
                With rsAtt
                    .AddNew
                    .Fields("FileData").LoadFromFile (sFolderPath & "\" & oFile.Name)
                    .Update
                End With
            End If
        Next oFile
        rs.Update
        rs.MoveNext
    Loop
  
    MsgBox "Da cap nhat toan bo file dinh kem thanh cong.", vbInformation, "Thông báo"
  
errExit:
    rs.Close
    Set rs = Nothing
    Set rsAtt = Nothing
    Set db = Nothing
    Set fso = Nothing
    Exit Sub

errHandler:
    MsgBox Err.Number & ": " & Err.Description
    Resume errExit

End Sub
Wow, Em cảm ơn Anh đã giúp đỡ ạ, Code chạy nhanh và rất đúng ý của em ạ.
Em chúc Anh sức khỏe và thành công, Chúc diễn đàn ngày càng phát triển và lớn mạnh ạ.
 
Duới đây là code cho cái nút lệnh [Run] của bạn.

View attachment 298076

JavaScript:
Option Compare Database
Option Explicit

Private Sub cmdAttachFiles_Click()
    Dim db As DAO.Database, rs As DAO.Recordset, rsAtt As DAO.Recordset2
    Dim sFolderPath As String, sFullFilePath As String
    Dim fso As Object, oFolder As Object, oFile As Object, oFiles As Object

    On Error Goto errHandler

    sFolderPath = "\\Mac\Home\Downloads\Test\File PDF"  'Tu sua theo tuy theo may

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oFiles = fso.GetFolder(sFolderPath).Files

    Set db = CurrentDb
    Set rs = db.OpenRecordset("Table1")

    Do While Not rs.EOF
        rs.Edit
        Set rsAtt = rs.Fields("Att").Value
        ' Phai xoa toan bo file attachment cu vi se bao loi (3820) neu trung lap.
        Do Until rsAtt.EOF
            rsAtt.Delete
            rsAtt.MoveNext
        Loop
      
        'Duyet toan bo file trong folder chi dinh, neu thay trung ten thi add vo attachment Fld
        For Each oFile In oFiles
            If InStr(1, oFile.Name, rs.Fields("Contract").Value, vbTextCompare) > 0 Then
                With rsAtt
                    .AddNew
                    .Fields("FileData").LoadFromFile (sFolderPath & "\" & oFile.Name)
                    .Update
                End With
            End If
        Next oFile
        rs.Update
        rs.MoveNext
    Loop
  
    MsgBox "Da cap nhat toan bo file dinh kem thanh cong.", vbInformation, "Thông báo"
  
errExit:
    rs.Close
    Set rs = Nothing
    Set rsAtt = Nothing
    Set db = Nothing
    Set fso = Nothing
    Exit Sub

errHandler:
    MsgBox Err.Number & ": " & Err.Description
    Resume errExit

End Sub
Em chào Anh ạ,
Sau mấy ngày chạy thử Code anh viết cho em ạ, em thấy chỗ Code xóa tất cả các File đính kèm nó chạy khá chậm ạ, nhiều khi máy em bị treo luôn ạ.
Anh có thể sửa lại giúp em nếu dòng nào trong Table1 đã có File đính kèm rồi thì không cần Attachment file nữa được không ạ.
Em xin lỗi vì đã làm phiền anh ạ :(
 
Em chào Anh ạ,
Sau mấy ngày chạy thử Code anh viết cho em ạ, em thấy chỗ Code xóa tất cả các File đính kèm nó chạy khá chậm ạ, nhiều khi máy em bị treo luôn ạ.
Anh có thể sửa lại giúp em nếu dòng nào trong Table1 đã có File đính kèm rồi thì không cần Attachment file nữa được không ạ.
Em xin lỗi vì đã làm phiền anh ạ :(
File csdl thực tế của bạn có bao nhiêu file đính kèm?
 
Sau mấy ngày chạy thử Code anh viết cho em ạ, em thấy chỗ Code xóa tất cả các File đính kèm nó chạy khá chậm ạ, nhiều khi máy em bị treo luôn ạ.
Anh có thể sửa lại giúp em nếu dòng nào trong Table1 đã có File đính kèm rồi thì không cần Attachment file nữa được không ạ.
Sao bạn biết đoạn code xóa file gây chậm? hay do trong thực tế phải xử lý số lượng file lớn nên tổng thể code nó sẽ mất thời gian để xử lý lại toàn bộ file đính kèm?
Bạn đọc kỹ lại bài trước của tôi, đã có đề cập: giải thuật xử lý của bạn nó không hợp lý. Mỗi khi có sự thay đổi phải làm lại toàn bộ một cách không cần thiết. Bạn phải phân tích cho thật kỹ, tính toán lâu dài, tính mọi khía cạnh, sau này qua một năm thì khối dữ liệu nó phình lên như thế nào???
Bạn phải tự đặt các câu hỏi tình huống ví dụ như bên dưới, rồi sau đó lên cái qui trình thao tác, xử lý rồi mới code cho nó.
- Như bạn muốn: Nếu dòng nào trong Table 1 đã có file đính kèm rồi thì không cần đính kèm file. Vậy nếu như dòng Hợp đồng (HD) đó đã có file nhưng bạn cần sửa nội dung, cần cập nhật lại thì code sẽ bỏ qua, không đính kèm file đó, bạn sẽ xử lý như thế nào?
- Khi bạn thêm 1 dòng (HD) mới, bạn copy file đính kèm vào Folder Att -> phải chạy code duyệt hết từng dòng HD đối chiếu với 1 vòng lặp duyệt file đính kèm bên Folder Att rồi tìm xem file đính kèm nào chưa được thêm --> attach vào Table. Bạn tính xem nếu chạy 300 dòng HD, mỗi dòng duyệt cái Folder Att 1 lần thì tốn bao nhiêu tài nguyên máy, thời gian???
- Người dùng chỉ sửa hoặc thêm có 1, 2 file đính kèm --> lại phải chạy code duyệt từng dòng của Table 1 cho đến hết để đối chiếu, tìm file trùng, chỉ để đính kèm 1, 2 file --> Bạn không nghĩ nó quá tốn kém à??
- ...
Nếu là tôi thiết kế cái tool này, tôi chỉ cho phép người dùng khi sửa hay tạo mới một dòng trong Table1, sẽ tự thủ công chọn đường dẫn đến file(s) cần đính kèm rồi bấm nút lệnh đính kèm. Làm theo cách đơn giản nhất nhưng hiệu quả nhất (theo tôi nghĩ). Tuyệt đối không thêm tính năng tự động tìm kiếm trong Folder rồi đính kèm hàng loạt. Tự động mà không kiểm soát được thì không nên làm. (Thường tôi chỉ tạo thêm cái tool riêng tự động làm hàng loạt ở giai đoạn đầu tiên khi đưa dữ liệu vào hệ thống mới rồi thôi).
Nói túm lại là cái yêu cầu trên của bạn tôi không hỗ trợ code được vì theo quan điểm, sự phân tích cá nhân của tôi, nó không thực tế, code xong rồi chắc chắn phải sửa dài dài...
Nếu bạn cần code dã chiến để xử lý vấn đề trên, theo giải pháp mà bạn nghĩ là hợp lý thì nhờ các thành viên khác code giùm nhé.
 
Tôi đang suy nghĩ 1 tí

1/ tại sao cứ nhất thiết phải nhét cái file xx vào file Access.... giới hạn của File Access là 2 GB vậy nhét nhiều vào điều gì sẻ xẩy ra và các dữ liệu của Table trên File Access nữa ?!

2/ Hình như ( không chắc chắn lắm ) chuyển file cần nhét thành mảng byte xong nhét vào có vẻ file sẻ nhỏ lại và chiếm ít size của File Access
đoán vậy hên và xui = 50/50 --=0

à quên hình như nhầm lẫn gì đó không phải là nhét mà là xx đang xem lại chút _)()(- --=0

1704765151281.png
 
Lần chỉnh sửa cuối:
Sao bạn biết đoạn code xóa file gây chậm? hay do trong thực tế phải xử lý số lượng file lớn nên tổng thể code nó sẽ mất thời gian để xử lý lại toàn bộ file đính kèm?
Bạn đọc kỹ lại bài trước của tôi, đã có đề cập: giải thuật xử lý của bạn nó không hợp lý. Mỗi khi có sự thay đổi phải làm lại toàn bộ một cách không cần thiết. Bạn phải phân tích cho thật kỹ, tính toán lâu dài, tính mọi khía cạnh, sau này qua một năm thì khối dữ liệu nó phình lên như thế nào???
Bạn phải tự đặt các câu hỏi tình huống ví dụ như bên dưới, rồi sau đó lên cái qui trình thao tác, xử lý rồi mới code cho nó.
- Như bạn muốn: Nếu dòng nào trong Table 1 đã có file đính kèm rồi thì không cần đính kèm file. Vậy nếu như dòng Hợp đồng (HD) đó đã có file nhưng bạn cần sửa nội dung, cần cập nhật lại thì code sẽ bỏ qua, không đính kèm file đó, bạn sẽ xử lý như thế nào?
- Khi bạn thêm 1 dòng (HD) mới, bạn copy file đính kèm vào Folder Att -> phải chạy code duyệt hết từng dòng HD đối chiếu với 1 vòng lặp duyệt file đính kèm bên Folder Att rồi tìm xem file đính kèm nào chưa được thêm --> attach vào Table. Bạn tính xem nếu chạy 300 dòng HD, mỗi dòng duyệt cái Folder Att 1 lần thì tốn bao nhiêu tài nguyên máy, thời gian???
- Người dùng chỉ sửa hoặc thêm có 1, 2 file đính kèm --> lại phải chạy code duyệt từng dòng của Table 1 cho đến hết để đối chiếu, tìm file trùng, chỉ để đính kèm 1, 2 file --> Bạn không nghĩ nó quá tốn kém à??
- ...
Nếu là tôi thiết kế cái tool này, tôi chỉ cho phép người dùng khi sửa hay tạo mới một dòng trong Table1, sẽ tự thủ công chọn đường dẫn đến file(s) cần đính kèm rồi bấm nút lệnh đính kèm. Làm theo cách đơn giản nhất nhưng hiệu quả nhất (theo tôi nghĩ). Tuyệt đối không thêm tính năng tự động tìm kiếm trong Folder rồi đính kèm hàng loạt. Tự động mà không kiểm soát được thì không nên làm. (Thường tôi chỉ tạo thêm cái tool riêng tự động làm hàng loạt ở giai đoạn đầu tiên khi đưa dữ liệu vào hệ thống mới rồi thôi).
Nói túm lại là cái yêu cầu trên của bạn tôi không hỗ trợ code được vì theo quan điểm, sự phân tích cá nhân của tôi, nó không thực tế, code xong rồi chắc chắn phải sửa dài dài...
Nếu bạn cần code dã chiến để xử lý vấn đề trên, theo giải pháp mà bạn nghĩ là hợp lý thì nhờ các thành viên khác code giùm nhé.
dạ, em cảm ơn anh đã hỗ trợ em phân tích các vấn đề trên. Nếu dùng các Attchment file trực tiếp vào Access này thì không thể dùng thời gian dài được ạ. Em đã suy nghĩ đến việc chỉ cần bỏ đường dẫn link (Share Point) của File vào Filed Att. Việc này em sẽ phân tích và cân nhắc lại.
Em chân thành cam ơn Anh đã giành thời gian phân tích và chỉ ra những điểm không hợp trên qui trình làm Tool của em ạ.
 
dạ, em cảm ơn anh đã hỗ trợ em phân tích các vấn đề trên. Nếu dùng các Attchment file trực tiếp vào Access này thì không thể dùng thời gian dài được ạ. Em đã suy nghĩ đến việc chỉ cần bỏ đường dẫn link (Share Point) của File vào Filed Att. Việc này em sẽ phân tích và cân nhắc lại.
Em chân thành cam ơn Anh đã giành thời gian phân tích và chỉ ra những điểm không hợp trên qui trình làm Tool của em ạ.
Bạn nên dành thời gian phân tích cho kỹ qui trình rồi thiết kế một lần xài lâu dài luôn chứ đừng nghĩ tới đâu, thiết kế tới đó rồi phải sửa đi sửa lại, mất thời gian còn nhiều hơn.
 
Web KT
Back
Top Bottom