Khai thác và tùy biến thêm, sửa, xuất file và lấy dữ liệu từ Recordset

Liên hệ QC

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,281
Được thích
15,780
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Thông thường ta lấy dữ liệu từ Recordset đổ tất cả dữ liệu vào 1 địa chỉ nào đó bằng cách sau:

Rich (BB code):
Sub LayDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * from [Sheet1$]")
    End With
End Sub
Nhưng ta có thể có những tùy chọn để lấy dữ liệu theo ý. Ví dụ như lấy dữ liệu từng trang với số dòng quy định trước, và còn nhiều cái mà ta chưa khai thác đến. Vậy hôm nay tôi quyết định mở đề tài này để mọi người cùng nhau chia sẻ và thảo luận.
 

File đính kèm

  • Recordset.xlsm
    19.2 KB · Đọc: 106
bây giờ em muốn lấy từ dòng 30 đến 70 được không anh hai lúa ?

Được, nếu CSDL có đánh số thứ tự hoặc thông tin gì đó tương tự (như số Row của Sheet Excel) . :)

Ví dụ như lấy dữ liệu từng trang với số dòng quy định trước

Nếu không lầm thì ý trên của bạn HLMT nên hiểu như thế này: xem hình.

Screen Shot 2020-11-09 at 10.46.39 PM.png

Thường làm việc với CSDL, nếu số lượng records lớn thì trong Form hiển thị danh sách, người ta không cho tải một lúc toàn bộ record lên Form mà chỉ tải từng trang với số lượng records qui định (như trong ví dụ trên là 50 records cho mỗi trang). Việc làm này giúp giảm tải lưu lượng dữ liệu truyền qua mạng quá lớn khi kết nối qua mạng LAN, WAN cũng như tài nguyên máy tính nếu phải lưu một Recordset quá lớn vào bộ nhớ.

Mã:
lngBeginId = lngEndId + 1
lngEndId = lngEndId + 50
   
Set rsDanhSachNV = ojbDanhSachNV.RetrieveList(lngBeginId, lngEndId)

Tôi hiểu là vậy, nếu không đúng ý đồ thì thôi nhé :)
 
Lần chỉnh sửa cuối:
Phần ADODB.Connection này với mình lạ quắc.mọi người cho mình link tài liệu tham khảo từ cơ bản với. mình chưa biết nên bắt đầu tìm kiếm và tìm hiểu từ đâu nữa
 
Được, nếu CSDL có đánh số thứ tự hoặc thông tin gì đó tương tự (như số Row của Sheet Excel) . :)



Nếu không lầm thì ý trên của bạn HLMT nên hiểu như thế này: xem hình.

View attachment 248973

Thường làm việc với CSDL, nếu số lượng records lớn thì trong Form hiển thị danh sách, người ta không cho tải một lúc toàn bộ record lên Form mà chỉ tải từng trang với số lượng records qui định (như trong ví dụ trên là 50 records cho mỗi trang). Việc làm này giúp giảm tải lưu lượng dữ liệu truyền qua mạng quá lớn khi kết nối qua mạng LAN, WAN cũng như tài nguyên máy tính nếu phải lưu một Recordset quá lớn vào bộ nhớ.

Mã:
lngBeginId = lngEndId + 1
lngEndId = lngEndId + 50
  
Set rsDanhSachNV = ojbDanhSachNV.RetrieveList(lngBeginId, lngEndId)

Tôi hiểu là vậy, nếu không đúng ý đồ thì thôi nhé :)
Đúng đó bạn, ví dụ thêm là nếu tôi truy vấn mà ra kết quả hơn số dòng quy định (Hơn vùng dữ liệu, hơn số dòng mặc định trong 1 sheet...) thì tôi sẽ ngắt nó ra và chuyển sang nơi khác.
 
Đúng đó bạn, ví dụ thêm là nếu tôi truy vấn mà ra kết quả hơn số dòng quy định (Hơn vùng dữ liệu, hơn số dòng mặc định trong 1 sheet...) thì tôi sẽ ngắt nó ra và chuyển sang nơi khác.
Vậy cho ví dụ thực tiễn luôn cho mọi người học hỏi bác Hai Lúa ơi!
 
Lần chỉnh sửa cuối:
Lấy được nhưng không ý nghĩa gì hết,
Khi cơ sở dữ liệu thì người ta không để ý thứ tự dòng, vì coi vai trò dòng như nhau (khác excel)
Tùy biến sử dụng thôi bạn, tôi chỉ đưa ra là có thể làm được điều đó. Có thể đối với người này không có ý nghĩa gì nhưng cũng có khi đối với người khác nó rất có ý nghĩa.
 
Nếu lấy dòng 20 to 30 thử chơi kiểu cho nó vào 1 Array xong chạy 2 dòng For Next chặt cái đầu cái đuôi cho vào thùng rác xong lấy khúc giữa xem sao ???!!!
 
Nếu lấy dòng 20 to 30 thử chơi kiểu cho nó vào 1 Array xong chạy 2 dòng For Next chặt cái đầu cái đuôi cho vào thùng rác xong lấy khúc giữa xem sao ???!!!
Đó là một cách, mời các bạn tìm thêm cách khác mà không đưa vào Array nhé.
 
Hihi về CSDL em yếu lắm, đợt trước anh @ongke0711 có gợi ý em cũng viết được 1 sub bằng ADO lấy được số Record theo ý muốn trong Table, chỉ cần nhập số dòng bắt đầu và kết thúc không cần STT gì cả.
Cách đơn giản nhất là em di chuyển con trỏ đến dòng đó rồi đổ dữ liệu.
Ví dụ anh lấy 70 dòng từ dòng 30 thì code như sau:

Mã:
Sub LayDL_HLMT1()
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move 29
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 70
    End With
End Sub
 
Cách đơn giản nhất là em di chuyển con trỏ đến dòng đó rồi đổ dữ liệu.
Ví dụ anh lấy 70 dòng từ dòng 30 thì code như sau:

Mã:
Sub LayDL_HLMT1()
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move 29
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 70
    End With
End Sub
Vậy thì thế này cũng được mà bác
Mã:
Sub LayDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * from [Sheet1$A30:C100]")
    End With
End Sub
 
Cách đơn giản nhất là em di chuyển con trỏ đến dòng đó rồi đổ dữ liệu.
Ví dụ anh lấy 70 dòng từ dòng 30 thì code như sau:

Mã:
Sub LayDL_HLMT1()
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move 29
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 70
    End With
End Sub
hay thế ... cứ dấu hoài giờ mới biết
 
Vậy thì thế này cũng được mà bác
Mã:
Sub LayDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * from [Sheet1$A30:C100]")
    End With
End Sub
bài 13 viết thành cái hàm truyền cái Tham số dòng dầu và dòng cuối vào sẻ hay hơn đấy
Mạnh nhìn qua là biết ngay à
 
Vậy thì thế này cũng được mà bác
Mã:
Sub LayDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * from [Sheet1$A30:C100]")
    End With
End Sub
Ví dụ mình truy vấn với CSDL là Access thì trường hợp này không thể đáp ứng yêu cầu nhé bạn.
hay thế ... cứ dấu hoài giờ mới biết
Giấu gì đâu anh, nếu giấu thì đã không viết bài về ADO cách đây khá lâu rồi.
 
Lần chỉnh sửa cuối:
Cách đơn giản nhất là em di chuyển con trỏ đến dòng đó rồi đổ dữ liệu.
Ví dụ anh lấy 70 dòng từ dòng 30 thì code như sau:

Mã:
Sub LayDL_HLMT1()
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move 29
        Sheet2.Range("A2").CopyFromRecordset .DataSource, 70
    End With
End Sub
trời ngắn dữ vậy anh :eek:
 
bài 13 viết lại sơ bộ như sau thấy hay mà vui đấy .... HLMT = số 1 he -0-0-0-

Mã:
Sub GetRs(ByVal dongdau As Long, ByVal dongcuoi As Long)
    With CreateObject("ADODB.Recordset")
        .Open ("Select * from [Sheet1$]"), "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 Xml;Data Source=" & ThisWorkbook.FullName
        .Move dongdau
        Sheet2.Range("A2").CopyFromRecordset .DataSource, dongcuoi
    End With
End Sub

Sub Main()
    Call GetRs(29, 70)
End Sub
 
Web KT
Back
Top Bottom