Lọc dữ liệu băng ADO

Liên hệ QC

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
934
Được thích
568
Chào các anh chị
Em có mượn code của anh @Hai Lúa Miền Tây để lọc dữ liệu bằng ADO.
Code rất ngắn gọn và chạy tốt. Tuy nhiên có 1 tình huống mà anh ấy chưa nêu ra là khi không có dữ liệu thì cần thông báo cho người dùng. Em đã thử mà chưa thành công. Nhờ các anh chị hoặc anh @Hai Lúa Miền Tây giúp đỡ
Xin chân thành cảm ơn !

1700765166656.png
 

File đính kèm

  • LocDL-ADO.xlsb
    42.6 KB · Đọc: 11
Kiểm tra Sum f19=0 sau khi load thì thông báo...
 

File đính kèm

  • Untitled.png
    Untitled.png
    16.6 KB · Đọc: 16
Lần chỉnh sửa cuối:
Cách này không đúng chuẩn. Dữ liệu cũ bị xóa rồi mới thông báo cho user thì không hay rồi. Cảm ơn bạn.
Hỏi một đường, người ta trả lời thì ...
Bạn hỏi đoạn Connect, có hỏi đoạn trên đâu ? Bước trên trước khi kết nối là xóa dữ liệu mà :D có hay không có thì cũng đã xóa.
PHP:
   If Sheet11.[D4] = "" Then
      MsgBox "Vui lòng nhap ID", vbInformation, "Thông báo"
      'Sheet11.[D4].Select
   Else
    'Load du lieu
    Dim STAFFID As String, FDate As String
    STAFFID = Range("D4").Value
    FDate = Range("AE1").Value

        With CreateObject("ADODB.Recordset")
            .Open ("SELECT PO, PCS, KGS, CM, UT, REMARK FROM [LGH$AE30:AL500] WHERE STAFFID = '" & STAFFID & "' AND DATE = " & FDate & " ORDER BY UT"), _
            "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
               
                If .EOF And .BOF Then
                    MsgBox "Không có d? li?u"
                Else
                    Sheet11.[D10:I17].ClearContents
                    Sheet11.[D10].CopyFromRecordset .DataSource
                End If
           
            .Close
        End With
    End If
 
Lần chỉnh sửa cuối:
Có cách để đếm số records trả về;
Nhưng dòng code Sheet11.[D10:I17].ClearContents cũng đã xóa dữ liệu cũ rồi còn gì...
 

File đính kèm

  • 222.png
    222.png
    7.6 KB · Đọc: 5
Đối với ADO recordset thì kiểm tra có record hay không ngay khi lấy dữ liệu ( như bạn huhumalu đã làm ở trên) trước khi xử lý các bước kế tiếp. Đếm record mất thời gian hơn là dùng EOF/ BOF. Tùy kiểu lấy recordset, có trường hợp không đếm được.
 
Hỏi một đường, người ta trả lời thì ...
Bạn hỏi đoạn Connect, có hỏi đoạn trên đâu ? Bước trên trước khi kết nối là xóa dữ liệu mà :D có hay không có thì cũng đã xóa.
PHP:
   If Sheet11.[D4] = "" Then
      MsgBox "Vui lòng nhap ID", vbInformation, "Thông báo"
      'Sheet11.[D4].Select
   Else
    'Load du lieu
    Dim STAFFID As String, FDate As String
    STAFFID = Range("D4").Value
    FDate = Range("AE1").Value

        With CreateObject("ADODB.Recordset")
            .Open ("SELECT PO, PCS, KGS, CM, UT, REMARK FROM [LGH$AE30:AL500] WHERE STAFFID = '" & STAFFID & "' AND DATE = " & FDate & " ORDER BY UT"), _
            "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
              
                If .EOF And .BOF Then
                    MsgBox "Không có d? li?u"
                Else
                    Sheet11.[D10:I17].ClearContents
                    Sheet11.[D10].CopyFromRecordset .DataSource
                End If
          
            .Close
        End With
    End If
Cảm ơn bác nhé. Code đã chạy tốt rồi. Hôm trước em cứ loay hoay đặt cái BOF và EOF mà không thành công
Bài đã được tự động gộp:

Có cách để đếm số records trả về;
Nhưng dòng code Sheet11.[D10:I17].ClearContents cũng đã xóa dữ liệu cũ rồi còn gì...
Cảm ơn bác đã quan tâm hỗ trợ. Có thể em trả lời vội vã nên chưa hết ý. Em biết ADO có chức năng kiểm tra có record hay không trước khi trải ra Cells, em muốn mọi người fix cái phần chữ màu xanh như trong ảnh. Còn cái lệnh xóa nội dung được đặt ở đầu là em tạm đưa lên đó để đỡ "vướng víu" khi thử nghiệm thôi. Một lần nữa cảm ơn bác
Bài đã được tự động gộp:

Các bác ch
Đối với ADO recordset thì kiểm tra có record hay không ngay khi lấy dữ liệu ( như bạn huhumalu đã làm ở trên) trước khi xử lý các bước kế tiếp. Đếm record mất thời gian hơn là dùng EOF/ BOF. Tùy kiểu lấy recordset, có trường hợp không đếm được.
Bác cho em hỏi, dùng ADO có thể Select, Update dữ liệu trong bảng, vậy có thể Delete và Insert (If not exist Insert) record hay không ? Em đã thử Delete theo cú pháp của SQL mà không được. Với Insert em chưa thử vì quen dùng copy nối vào
 
Lần chỉnh sửa cuối:
ADO dễ và giản dị. Nhưng đó là nếu cứ sử theo câu SQL để lọc, chỉnh,...

Không rành cách hoạt động của Recordset thì đừng đụng vào ba cái mớ đếm điếc., BOF, EOF. Rất dễ sai.
 
Bác cho em hỏi, dùng ADO có thể Select, Update dữ liệu trong bảng, vậy có thể Delete và Insert (If not exist Insert) record hay không ? Em đã thử Delete theo cú pháp của SQL mà không được. Với Insert em chưa thử vì quen dùng copy nối vào
- SELECT, UPDATE, INSERT với câu lệnh SQL trong ADODB thì được nhưng DELETE thì không được nhé.
- Sau khi INSERT thì phải cập nhật lại Range, sau đó mới INSERT tiếp được. Không dùng WHERE được trong câu lệnh INSERT INTO (..,..) VALUES (...)".
- Range (hoặc Table) của Excel không phải là table của CSDL thực sự nên nhiều phương thức, thuộc tính của ADODB không sử dụng được.
 
- Sau khi INSERT thì phải cập nhật lại Range, sau đó mới INSERT tiếp được. Không dùng WHERE được trong câu lệnh INSERT INTO (..,..) VALUES (...)".
Cái này mình không hiểu. Vì đây là Insert vào Cell, cập nhật lại Range là thế nào bác nhỉ ? Bác giải thích thêm được không ?

Em có 1 vấn đề nữa nhờ các bác chỉ cho: Em có dùng ADO để Insert dữ liệu vào SQL database, giả sử đó là thêm mới 1 mã hàng hóa. Trước khi Insert thì cần lấy mã số lớn nhất hiện có ghi ra cell, rồi cộng thêm 1 đơn vị. tiếp theo mới Insert vào cho hàng hóa mới. Em muốn hỏi cách đưa recordset vào thẳng biến rồi tăng 1 đơn vị cho biến thay vì ghi ra Cell, rồi lại gán vào biến. Cách em đang làm như dưới.

Conn.Open ConnStr

'Lay ma so to nhat dang dùng
rst.ActiveConnection = Conn
rst.Open Source:="SELECT Max (ItemCode) FROM DSHH "
Sheet1.[A1].CopyFromRecordset rst
rst.Close

Dim NewItemCode As Integer
NewItemCode = Sheet1.[A1] + 1 'Tang ma so thêm 1

'Thêm hàng moi
Conn.Execute "INSERT INTO DSHH " & _
"(ItemCode, ItemName, ItemUnit, ItemPrice) " & _
"VALUES (" & NewItemCode & "," & TenHang & "," &DVT & "," & DonGia & ") "
 
Cái này mình không hiểu. Vì đây là Insert vào Cell, cập nhật lại Range là thế nào bác nhỉ ? Bác giải thích thêm được không ?

Em có 1 vấn đề nữa nhờ các bác chỉ cho: Em có dùng ADO để Insert dữ liệu vào SQL database, giả sử đó là thêm mới 1 mã hàng hóa. Trước khi Insert thì cần lấy mã số lớn nhất hiện có ghi ra cell, rồi cộng thêm 1 đơn vị. tiếp theo mới Insert vào cho hàng hóa mới. Em muốn hỏi cách đưa recordset vào thẳng biến rồi tăng 1 đơn vị cho biến thay vì ghi ra Cell, rồi lại gán vào biến. Cách em đang làm như dưới.

...
rst.Open Source:="SELECT Max (ItemCode) FROM DSHH "
Field [ItemCode] của bạn không dùng kiểu Identity à? Nó tự động tăng khi Insert record.

Còn vụ cập nhật range Excel là khi bạn khai báo Range trong câu lệnh SQL để kết nối bằng ADODB, luôn dùng Range động thì câu lệnh SQL Insert Into... mới chạy được.
Vd:
Mã:
sSQL = "INSERT INTO [Sheet1$A1:B20] (ColA,ColB) VALUES (11,22)"
Sau khi insert 1 dòng thì cái range trên phải cập nhật thành [A1:B21]
 
Lần chỉnh sửa cuối:
Với những yêu cầu khó như thế này thì bọn nước ngoài chỉ dùng duy nhất một lệnh INSERT rất hay.
SQL:
INSERT INTO myTable (col1, col2, col3....)
SELECT 1, 2, mySP_or_mySDF(), 3, 4
Dựa trên cái SQL này, việc biến tấu thêm hàm MAX thì quá dễ với trình độ của bạn. Tôi thử kết hợp cả MAX với lệnh INSERT trên Access chạy cực tốt. Không biết chạy với dữ liệu Excel của bạn thì kết quả thế nào,
 
Web KT
Back
Top Bottom