Xin nhờ xem giúp code về ADO

Liên hệ QC

ngothanhluan

Thành viên chính thức
Tham gia
25/6/13
Bài viết
70
Được thích
3
Em có 2 file, 1 file HANG HOA chứa dữ liệu hàng hóa, 1 file kia dùng để lấy hoặc chỉnh sửa dữ liệu, file TEST em có viết đoạn code ADO như sau nhưng bị báo lỗi, không biết bị sai chỗ nào mong mọi người giúp đỡ.
Mã:
Sub update()    
Dim cnn As ADODB.Connection
    Dim FileFullName As String
    Set cnn = New ADODB.Connection
    
    FileFullName = Application.ThisWorkbook.Path & "\TONG.xlsm"
    
    With cnn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                & "Data Source=" & FileFullName _
                & ";Extended Properties=""Excel 12.0;HDR=No"";"
        .Open
    End With
    cnn.Execute ("UPDATE DS_HH SET TEN_SP='ALO123' WHERE MA_SP=10003")
    MsgBox cnn.State
End Sub
 

File đính kèm

  • HANG HOA.xlsm
    40.3 KB · Đọc: 32
  • TEST.xlsm
    14.7 KB · Đọc: 34
Em cảm ơn anh Hai Lúa đã giúp, Nhân tiện nhờ anh xem Giúp đoạn code nằm ngoài vấn đề ADO dưới đây, em sử dụng hàm MyFilter2DArray của thầy siwtom nhưng cứ bị báo lỗi ngay dòng đỏ. Em có gửi file kèm theo.Mong anh xem giúp.
p/s: Dưới đây chỉ là một trích đoạn từ code, anh Hai Lúa xem file giúp em nhé.
Mã:
Sub LOC()
On Error Resume Next
Dim ArrCrit
Dim i, j As Long
Dim sArr(1 To 8, 1 To 2)
Dim tmp As Long
    
    sArr(1, 2) = 1
    sArr(2, 2) = 2
    sArr(3, 2) = 4
    sArr(4, 2) = 6
    sArr(5, 2) = 7
    sArr(6, 2) = 8
    sArr(7, 2) = 9
    sArr(8, 2) = 11
    
    For i = 1 To 8
        If Controls("textbox" & i) <> vbNullString Then
            sArr(i, 1) = sArr(i, 1) + i
            tmp = tmp + 1
        End If
    Next
    
    ReDim ArrCrit(1 To 2, 1 To tmp)
    
    j = 1
    
    For i = 1 To 8
    
        If sArr(i, 1) <> vbNullString Then
            
            ArrCrit(1, j) = sArr(i, 2)
            ArrCrit(2, j) = "*" & Controls("textbox" & i) & "*"
            
            If j = tmp Then
                Exit For
                
            Else
                j = j + 1
            End If
            
        End If
        
    Next
    
[COLOR=#ff0000]    tmpArr = MyFilter2DArray(DSPTArray, ArrCrit(), False, True)[/COLOR]
    
For i = 1 To UBound(ArrCrit, 2)
MsgBox ArrCrit(1, i)
MsgBox ArrCrit(2, i)
Next
Nhà cúp điện, máy hết pin, tôi chỉ có thể dùng điện thoại để trả lời bạn.

Nhìn chung thấy code tương đối hoàn chỉnh, riêng biến tmpArr chưa thấy khai báo. Đặc biệt, biến mảng DSPTArray tôi không biết nguồn dữ liệu lấy ở đâu, như thế nào.
 
Upvote 0
Nhà cúp điện, máy hết pin, tôi chỉ có thể dùng điện thoại để trả lời bạn.

Nhìn chung thấy code tương đối hoàn chỉnh, riêng biến tmpArr chưa thấy khai báo. Đặc biệt, biến mảng DSPTArray tôi không biết nguồn dữ liệu lấy ở đâu, như thế nào.
Dạ em có ghi chú lại là đoạn code trên chỉ là phần nằm trong form, phần khai báo em khai báo đầu chương trình rồi. Anh Nghĩa xem file giúp em thử xem sai chỗ nào. Trong khi em dùng msgbox để kiểm tra phần tử cũng như số cột và dòng của mảng thì vẫn thấy bình thường.
 
Upvote 0
Dạ em có ghi chú lại là đoạn code trên chỉ là phần nằm trong form, phần khai báo em khai báo đầu chương trình rồi. Anh Nghĩa xem file giúp em thử xem sai chỗ nào. Trong khi em dùng msgbox để kiểm tra phần tử cũng như số cột và dòng của mảng thì vẫn thấy bình thường.

Tầm 13h nhà đèn mới cho ký điện, nếu chừng đó mà chưa ai giúp thì tôi sẽ kiểm tra file bạn.
 
Upvote 0
Em cảm ơn anh Hai Lúa đã giúp, Nhân tiện nhờ anh xem Giúp đoạn code nằm ngoài vấn đề ADO dưới đây, em sử dụng hàm MyFilter2DArray của thầy siwtom nhưng cứ bị báo lỗi ngay dòng đỏ. Em có gửi file kèm theo.Mong anh xem giúp.
p/s: Dưới đây chỉ là một trích đoạn từ code, anh Hai Lúa xem file giúp em nhé.
Mã:
Sub LOC()
On Error Resume Next
Dim ArrCrit
Dim i, j As Long
Dim sArr(1 To 8, 1 To 2)
Dim tmp As Long
    
    sArr(1, 2) = 1
    sArr(2, 2) = 2
    sArr(3, 2) = 4
    sArr(4, 2) = 6
    sArr(5, 2) = 7
    sArr(6, 2) = 8
    sArr(7, 2) = 9
    sArr(8, 2) = 11
    
    For i = 1 To 8
        If Controls("textbox" & i) <> vbNullString Then
            sArr(i, 1) = sArr(i, 1) + i
            tmp = tmp + 1
        End If
    Next
    
    ReDim ArrCrit(1 To 2, 1 To tmp)
    
    j = 1
    
    For i = 1 To 8
    
        If sArr(i, 1) <> vbNullString Then
            
            ArrCrit(1, j) = sArr(i, 2)
            ArrCrit(2, j) = "*" & Controls("textbox" & i) & "*"
            
            If j = tmp Then
                Exit For
                
            Else
                j = j + 1
            End If
            
        End If
        
    Next
    
[COLOR=#ff0000]    tmpArr = MyFilter2DArray(DSPTArray, ArrCrit(), False, True)[/COLOR]
    
For i = 1 To UBound(ArrCrit, 2)
MsgBox ArrCrit(1, i)
MsgBox ArrCrit(2, i)
Next
Với cái sub trên, bạn lọc cái gì thế? Tôi chỉ hỏi ở TextBox1 thôi, lọc cái gì?
 
Upvote 0
Với cái sub trên, bạn lọc cái gì thế? Tôi chỉ hỏi ở TextBox1 thôi, lọc cái gì?
Dạ Textbox1 lọc mã phiếu thu, tương tự như các Textbox khác đó Anh. Tại vì theo như hàm của thầy siwtom nếu dùng em phải khai báo hết 8 cột trong arrcrit và cái này làm chậm code nên em mới dùng sub trên để khi người dùng lọc ở textbox nào thì sẽ tự tạo arrcrit.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ Textbox1 lọc mã phiếu thu, tương tự như các Textbox khác đó Anh. Tại vì theo như hàm của thầy siwtom nếu dùng em phải khai báo hết 8 cột trong arrcrit và cái này làm chậm code nên em mới dùng sub trên để khi người dùng lọc ở textbox nào thì sẽ tự tạo arrcrit.
Tôi không hiểu sao, trong listbox bạn lại set 12 cột, và trong đó có ẩn 2 cột
Rồi mấy cái cột bạn ẩn đó có tác dụng gì không vì trong code ADO bạn lại Select chúng ra?
Chính vì cái này tôi bị khựng không biết tại sao vì lúc đầu cứ tưởng chúng là liên tục theo chỉ số tăng dần của ListBox.

Và thêm nữa, nếu lọc ở 1 textbox khi ra kết quả thì sao? Có qua textbox khác lọc lại theo kết quả vừa có hay không hay vẫn lọc theo nguồn mảng ban đầu?
 
Upvote 0
Em cảm ơn anh Hai Lúa đã giúp, Nhân tiện nhờ anh xem Giúp đoạn code nằm ngoài vấn đề ADO dưới đây, em sử dụng hàm MyFilter2DArray của thầy siwtom nhưng cứ bị báo lỗi ngay dòng đỏ. Em có gửi file kèm theo.Mong anh xem giúp.
p/s: Dưới đây chỉ là một trích đoạn từ code, anh Hai Lúa xem file giúp em nhé.
Mã:
Sub LOC()
On Error Resume Next
Dim ArrCrit
Dim i, j As Long
Dim sArr(1 To 8, 1 To 2)
Dim tmp As Long
    
    sArr(1, 2) = 1
    sArr(2, 2) = 2
    sArr(3, 2) = 4
    sArr(4, 2) = 6
    sArr(5, 2) = 7
    sArr(6, 2) = 8
    sArr(7, 2) = 9
    sArr(8, 2) = 11
    
    For i = 1 To 8
        If Controls("textbox" & i) <> vbNullString Then
            sArr(i, 1) = sArr(i, 1) + i
            tmp = tmp + 1
        End If
    Next
    
    ReDim ArrCrit(1 To 2, 1 To tmp)
    
    j = 1
    
    For i = 1 To 8
    
        If sArr(i, 1) <> vbNullString Then
            
            ArrCrit(1, j) = sArr(i, 2)
            ArrCrit(2, j) = "*" & Controls("textbox" & i) & "*"
            
            If j = tmp Then
                Exit For
                
            Else
                j = j + 1
            End If
            
        End If
        
    Next
    
[COLOR=#ff0000]    tmpArr = MyFilter2DArray(DSPTArray, ArrCrit(), False, True)[/COLOR]
    
For i = 1 To UBound(ArrCrit, 2)
MsgBox ArrCrit(1, i)
MsgBox ArrCrit(2, i)
Next
Thường nếu làm việc trên form thì nên tạo hẳn 1 sub kết nối riêng, không cần thiết phải thực hiện 1 lệnh rồi mở kết nối lại từ đầu rồi đóng kết nối khi xong lệnh đó.
Trường hợp của bạn có thể thực hiện lọc luôn trong đoạn query. Cái code lọc trên không phải tôi viết và tôi cũng không nghiên cứu nó. Nếu bạn theo hướng theo code trên thì tôi chào thua, còn nếu muốn theo cách tôi gợi ý thì tiếp tục.
Điều đáng lưu ý với bạn là lọc ngày không đơn giản đâu nhé, phải định dạng theo chuẩn trước khi lọc.
 
Upvote 0
Tôi không hiểu sao, trong listbox bạn lại set 12 cột, và trong đó có ẩn 2 cột
Rồi mấy cái cột bạn ẩn đó có tác dụng gì không vì trong code ADO bạn lại Select chúng ra?
Chính vì cái này tôi bị khựng không biết tại sao vì lúc đầu cứ tưởng chúng là liên tục theo chỉ số tăng dần của ListBox.

Và thêm nữa, nếu lọc ở 1 textbox khi ra kết quả thì sao? Có qua textbox khác lọc lại theo kết quả vừa có hay không hay vẫn lọc theo nguồn mảng ban đầu?
Dạ những cột đó em thấy không cần thiết hiển thị nên mới ẩn đi để giảm bớt độ rộng cho form và rối mắt người dùng.
Mấy cột ẩn đó vẫn có tác dụng khi em lập phiếu thu ạ.
Dạ khi lọc ở các Textbox thì theo như sub em viết thì nếu mỗi lần ấn phím ENTER thì có n Textbox khác rỗng thì sẽ tạo ra ArrCrit(1 to 2, 1 to n) đề dùng hàm MyFilter2DArray để lọc và các điều kiện đều nối nhau bằng AND ạ.
 
Upvote 0
Thường nếu làm việc trên form thì nên tạo hẳn 1 sub kết nối riêng, không cần thiết phải thực hiện 1 lệnh rồi mở kết nối lại từ đầu rồi đóng kết nối khi xong lệnh đó.
Trường hợp của bạn có thể thực hiện lọc luôn trong đoạn query. Cái code lọc trên không phải tôi viết và tôi cũng không nghiên cứu nó. Nếu bạn theo hướng theo code trên thì tôi chào thua, còn nếu muốn theo cách tôi gợi ý thì tiếp tục.
Điều đáng lưu ý với bạn là lọc ngày không đơn giản đâu nhé, phải định dạng theo chuẩn trước khi lọc.
Mong Anh Hai Lúa gợi ý giúp em ạ. Em đang làm phần mềm bán hàng cho Công Ty em bằng excel kết hợp với A-Tool của Anh Nguyễn Duy Tuân nên nếu được, khi xong anh Hai Lúa với Anh Nghĩa có thể xem và góp ý giúp được không ạ.
 
Upvote 0
Dạ những cột đó em thấy không cần thiết hiển thị nên mới ẩn đi để giảm bớt độ rộng cho form và rối mắt người dùng.
Sao trong đoạn Query bạn không bỏ nó ra luôn cho nó nhẹ, chứ ẩn như bạn thì cũng đã load dữ liệu rồi.
Mong Anh Hai Lúa gợi ý giúp em ạ.
Thì tôi đã gợi ý cho bạn rồi đó, là không dùng cái hàm filter mà chỉ dùng where trong đoạn truy vấn mà thôi.
 
Upvote 0
Sao trong đoạn Query bạn không bỏ nó ra luôn cho nó nhẹ, chứ ẩn như bạn thì cũng đã load dữ liệu rồi.

Thì tôi đã gợi ý cho bạn rồi đó, là không dùng cái hàm filter mà chỉ dùng where trong đoạn truy vấn mà thôi.
Dạ em vẫn còn dùng 2 cột ẩn đó khi dùng đến Form lập phiếu thu nữa Anh Hai Lúa.
 
Upvote 0
Dạ cụ thể là Phần mềm em viết được dùng cho khoảng 5 chi nhánh. Mỗi chi nhánh sẽ có 1 file excel và access như vậy để chạy. Cộng thêm một file TONG chứa dữ liệu cần truy vấn chung như Danh sách Khách hàng... Tất cả được để trong một máy dùng A-Tool để chạy làm máy chủ ạ. Em không biết là nếu dùng ADO nhiều thì khi có nhiều máy cùng kết nối ADO với file thì không biết có vấn để gì không ạ.
 
Upvote 0
Dạ những cột đó em thấy không cần thiết hiển thị nên mới ẩn đi để giảm bớt độ rộng cho form và rối mắt người dùng.
Mấy cột ẩn đó vẫn có tác dụng khi em lập phiếu thu ạ.
Dạ khi lọc ở các Textbox thì theo như sub em viết thì nếu mỗi lần ấn phím ENTER thì có n Textbox khác rỗng thì sẽ tạo ra ArrCrit(1 to 2, 1 to n) đề dùng hàm MyFilter2DArray để lọc và các điều kiện đều nối nhau bằng AND ạ.
Với n của bạn sẽ là mấy? Ở đây Hàm đó tác giả chỉ có thực hiện lọc trên 2 hàng và 2 cột điều kiện tương ứng thôi.

Sao không làm theo hướng của Hai Lúa? Mở kết nối, không khóa, rồi slect theo điều kiện thôi? Sau đó xuất giá trị đó ra ListBox? Thoát form hãy đóng kết nối.
 
Upvote 0
Với n của bạn sẽ là mấy? Ở đây Hàm đó tác giả chỉ có thực hiện lọc trên 2 hàng và 2 cột điều kiện tương ứng thôi.

Sao không làm theo hướng của Hai Lúa? Mở kết nối, không khóa, rồi slect theo điều kiện thôi? Sau đó xuất giá trị đó ra ListBox? Thoát form hãy đóng kết nối.
Đúng là thế, mình không nói mình là dân chuyên nghiệp nhưng thường các phần mềm lớn người ta cũng làm thế.

@ngothanhluan:
Nếu CSDL là access thì tôi cũng đã từng làm có thể gặp lỗi khi 2 người cùng truy cập vào 1 dòng dữ liệu.
Nếu CSDL lớn sao không chọn giải pháp là SQLServer hay là MySQL?
 
Upvote 0
Với n của bạn sẽ là mấy? Ở đây Hàm đó tác giả chỉ có thực hiện lọc trên 2 hàng và 2 cột điều kiện tương ứng thôi.

Sao không làm theo hướng của Hai Lúa? Mở kết nối, không khóa, rồi slect theo điều kiện thôi? Sau đó xuất giá trị đó ra ListBox? Thoát form hãy đóng kết nối.
Dạ hàm MyFilter2DArray được phép lọc đến k cột lận Anh Nghĩa ơi.
Anh Hai Lúa với Anh Nghĩa xem thử ý kiến dưới của em có được không, em chỉ băn khoăn vấn đề dưới thôi. Chứ nếu được thì em sẽ sửa hết mọi hàm filter trong phần mềm thành dùng ADO hết cho nhanh ạ.

Dạ cụ thể là Phần mềm em viết được dùng cho khoảng 5 chi nhánh. Mỗi chi nhánh sẽ có 1 file excel và access như vậy để chạy. Cộng thêm một file TONG chứa dữ liệu cần truy vấn chung như Danh sách Khách hàng... Tất cả được để trong một máy dùng A-Tool để chạy làm máy chủ ạ. Em không biết là nếu dùng ADO nhiều thì khi có nhiều máy cùng kết nối ADO với file thì không biết có vấn để gì không ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Em không biết là nếu dùng ADO nhiều thì khi có nhiều máy cùng kết nối ADO với file thì không biết có vấn để gì không ạ
File mà bạn đang hỏi là kết nối đến file nào? File Access? Nếu thế thì tôi đã trả lời ờ bài #54
rồi. Thêm nữa là tôi cũng đã từng làm file access để dùng chứa dữ liệu 20 máy kết nối vào vẫn ok. Tuy nhiên phải share full folder, rất nguy hiểm và liên quan đến vấn đề bảo mật. Ai cũng có thể truy cập và nếu ai đó phá thì "bộp" 1 phát là xem như xong.
 
Upvote 0
File mà bạn đang hỏi là kết nối đến file nào? File Access? Nếu thế thì tôi đã trả lời ờ bài #54 rồi. Thêm nữa là tôi cũng đã từng làm file access để dùng chứa dữ liệu 20 máy kết nối vào vẫn ok. Tuy nhiên phải share full folder, rất nguy hiểm và liên quan đến vấn đề bảo mật. Ai cũng có thể truy cập và nếu ai đó phá thì "bộp" 1 phát là xem như xong.
Em xin gửi file lên để Anh Hai Lúa và Anh Nghĩa xem thử ạ. Một số form em chưa hoàn thành.
Người dùng chỉ trích xuất dữ liệu vào thao tác trên form thôi ạ. Còn các vấn đề phân quyền đã có A-Tool xử lý rồi ạ.
Mong 2 anh xem và góp ý giúp em để em hoàn thành sớm ạ.
 

File đính kèm

  • BH.rar
    831.9 KB · Đọc: 14
Lần chỉnh sửa cuối:
Upvote 0
Đúng là thế, mình không nói mình là dân chuyên nghiệp nhưng thường các phần mềm lớn người ta cũng làm thế.

@ngothanhluan:
Nếu CSDL là access thì tôi cũng đã từng làm có thể gặp lỗi khi 2 người cùng truy cập vào 1 dòng dữ liệu.
Nếu CSDL lớn sao không chọn giải pháp là SQLServer hay là MySQL?
Hix em mới học VBA được hơn tháng mà anh bảo dùng tới SQLServer thì chịu rồi. Hiện chỉ làm tạm bằng Access thôi, rồi em phải học thêm một thời gian nữa mới chuyển CSDL qua SQLServer được.
 
Upvote 0
Dạ hàm MyFilter2DArray được phép lọc đến k cột lận Anh Nghĩa ơi.
Hình như bạn chưa hiểu ý tôi nói, ở đây chỉ lọc 2 điều kiện.

Tôi nói rõ hơn cho bạn hiểu nhé,

Tôi lọc tại cột 1, của textbox1 kết quả hiện lên listbox

Tôi qua textbox2, tôi lại đặt điều kiện.

Có 2 trường hợp xảy ra:

1) Chỉ lọc trên nguồn dữ liệu cũ (DSPTArray), trường hợp này quá dễ rồi

2) Lọc tiếp cái kết quả đã lọc ở textbox1, cái này chua đây, bởi thực hiện toàn bộ trên 8 cái textbox thì sao?
 
Upvote 0
Hình như bạn chưa hiểu ý tôi nói, ở đây chỉ lọc 2 điều kiện.

Tôi nói rõ hơn cho bạn hiểu nhé,

Tôi lọc tại cột 1, của textbox1 kết quả hiện lên listbox

Tôi qua textbox2, tôi lại đặt điều kiện.

Có 2 trường hợp xảy ra:

1) Chỉ lọc trên nguồn dữ liệu cũ (DSPTArray), trường hợp này quá dễ rồi

2) Lọc tiếp cái kết quả đã lọc ở textbox1, cái này chua đây, bởi thực hiện toàn bộ trên 8 cái textbox thì sao?
Cái của em là trường hợp 1 có anh Nghĩa ơi, Vì mỗi lần ENTER ở một textbox thì nó phải chạy lại trên dữ liệu nguồn và với điều kiện là 8 cái textbox trên. Bởi vậy nên em mới làm cái sub đó để loại bớt những textbox rỗng đó anh. Nhưng không hiểu sao nó lại báo lỗi ngay cái Arrcrit() mong anh giải đáp giúp.
 
Upvote 0
Web KT
Back
Top Bottom