Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Set combobox = ADOrecordset
#1
Chào mọi người. 
Làm thế nào để set recordset của 1 comboxbox = ADOrecordset. Trong đó ADOrecordset lấy nguồn từ 1 ADOcommand execute 1 storeprocedure có parameter trên SQL server.
Mình có dùng thử: Set me.combobox.recordset = ADOcom.excute thì lỗi.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#2
- Khi Connection.Execute, kết quả trả về sẽ được lưu trong một đối tượng Recordset mà câu lệnh trên của bạn không có đối đối tựơng rs nào để lưu nên báo lỗi.
   Set rs=cnn.execute
   Set cbo.recordset = rs
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
#3
Bạn xử lý như sau:

giả sử là bạn get dược recordset rồi nhé, khai báo là rs

Dim i As Long, s As String,cbo As Object
'cbo  là tên combobox của bạn
With rs
       .MoveFirst
       Do Until .EOF
          s = ""
          For i = 0 To rs.Fields.Count
              s = s & IIf(i = 0, "", ";") & rs.Fields(i).Value
              
          Next i
          cbo.AddItem s
          .MoveNext
       Loop
 End With

chỉ có vậy thôi happy
Chữ ký của hieuvn Xin chào! Mình là hieuvn, thành viên của Thủ Thuật Access tham gia ngày Oct 2010.
ღღღღღTài sản của hieuvn (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#4
Bạn hieuvn cho mình hỏi, nếu dùng dao thì có thể sử dụng form.filter property, còn ado recordset thì làm cách nào để filter. Ý mình là load recordset sau đó disconect kết nối, lúc này mình đã get được 1 cục recordset và mình muốn filter trên cục này thì phải làm thế nào.

Để dễ tưởng tượng thì ví dụ cụ thể thế này:
- Mình có 1 form với 1txtfilter, tại onload của form mình cho kết nối và load recordset về, gán recordset cho form, sau đó ngắt kết nối. Giờ mình muốn cục recordset này sẽ filter theo giá trị của txtfilter thì làm thế nào.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#5
Nếu là mình thì sẽ dùng giá trị từ txtfilter làm tham số (parameter) cho query (stringSQL) rồi mới load recordset từ đó chứ không lấy 1 cục về sẽ chậm hơn.
Chữ ký của hieuvn Xin chào! Mình là hieuvn, thành viên của Thủ Thuật Access tham gia ngày Oct 2010.
ღღღღღTài sản của hieuvn (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#6
Mình nghĩ nhanh hay chậm tùy trường hợp. Mình có sử dụng qua 1 số phần mềm, module báo cáo của họ thiết kế thế này, có chọn thời gian để xuất báo cáo, đây chính là parameter để lọc recordset load về, sau khi load về thì trên form của họ có thiết kế các textbox để filter cục recordset đó chứ ko load lại theo các txtfilter nữa. Và khi người dùng muốn khoảng thời gian khác thì mới tiến hành load lại recordset.
Đây chính là ý mình muốn. Hi vọng bạn có thể giúp mình bởi vì mình tìm kiếm đã lâu mà ko có kết quả.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#7
Có 1 cách hơi củ chuối là bạn lưu recordset vào table rồi tạo query làm recordset cho form hoặc report. Với Ms Access thì hiếm có tài liệu về vấn đề này, bên .Net thì bạn có thể dùng BindingSource để filter. Túm lại theo mình có 2 cách:
1,dùng parameter trên form đưa vào storeprocedure mỗi lần request (có thể bạn phải thiết kế lại storeprocedure).
2, Lưu recordset vào table rồi query.
Chữ ký của hieuvn Xin chào! Mình là hieuvn, thành viên của Thủ Thuật Access tham gia ngày Oct 2010.
ღღღღღTài sản của hieuvn (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#8
khó nhỉ, mình thấy cách đưa luôn cả filter vào parameter rồi load lại record nó còn lâu hơn cách mình đang tìm.

Như cụ thể trong ví dụ:
- Khi parameter là khoảng thời gian cần tìm, thì khi load dữ liệu ví dụ mất 10 phút chẳng hạn. Sau đó đó dùng filter theo kiểu mình muốn thì nó ra ngay, có nghĩa chỉ mất 10 phút load lần đầu.
- Còn đưa cả txtfilter vào parameter để load thì cho load mất 5 phút đi, nhưng cứ mỗi lần txtfilter thay đổi giá trị lại mất 5 phút để load <= đây chính là vấn đề mình nghĩ nó ko tối ưu như cái mình đang tìm kiếm.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#9
(20-10-18, 03:11 PM)mrsiro Đã viết: khó nhỉ, mình thấy cách đưa luôn cả filter vào parameter rồi load lại record nó còn lâu hơn cách mình đang tìm.

Như cụ thể trong ví dụ:
- Khi parameter là khoảng thời gian cần tìm, thì khi load dữ liệu ví dụ mất 10 phút chẳng hạn. Sau đó đó dùng filter theo kiểu mình muốn thì nó ra ngay, có nghĩa chỉ mất 10 phút load lần đầu.
- Còn đưa cả txtfilter vào parameter để load thì cho load mất 5 phút đi, nhưng cứ mỗi lần txtfilter thay đổi giá trị lại mất 5 phút để load <= đây chính là vấn đề mình nghĩ nó ko tối ưu như cái mình đang tìm kiếm.


Tôi thấy bạn không bắt tay vào làm test thử mà cứ tự suy đoán chủ quan.
Bạn nói đã sử dụng qua mấy phần mềm và module của họ load nguyên cục Recordset về vậy sao không xem và bắt chước code của họ làm thử luôn. Bạn tìm không thấy demo dùng cách như bạn muốn vì ít ai dùng nên không có demo là vậy.

Sẳn tôi làm demo cho bạn xem các kiểu và so sánh thời gian các cách để biết thực tế chứ không phải suy đoán.
- Tôi demo 2 loại dữ liệu back end: Ms Access và SQL Server.
- Dùng ADO để kết nối và lấy dữ liệu
- Test  trường hợp: Load về 1 cục Recordset rồi Filter; Filter trực tiếp trong câu lệnh SQL rồi kết nối lấy dữ liệu và ngắt kết nối.
- Riêng đối với back end là SQL Server thì tôi test 3 trường hợp: Load về 1 cục; dùng Paramterized Query và gọi Stored Proc mỗi lần filter. Đối vối SQL Server tôi chỉ test trên máy local. Bạn tự test kết nối qua internet.
- Mượn tạm dữ liệu của a ledangvan: 23.265 records để test.

[/url][Hình: 45423100432_b0494b7d93_c.jpg]  [url=https://flic.kr/p/NweKp8][Hình: 30534588657_6f174c14a9_c.jpg]

=> Kết quả:
- Thời gian gần như nhau khi dùng ADO.Filter và câu lệnh SQL filter mỗi lần kết nối. Nhưng riêng dùng ADO.Filter phải thêm thời gian load nguyên cục Recordset về. -> Cách dùng ADO vừa tốn bộ nhớ (vì cục Recordet lớn chiếm dụng) mà thời gian filter không nhanh hơn.
- Đối với SQL Server: một phát hiện là dùng Stored Proc. thì tốn thời gian gấp đôi so với dùng Parameterized Query nhưng vẫn = ADO.Filter
Tóm lại tôi thấy dùng Parameterized Query với ADO là nhanh nhất.

Theo tôi biết thì Parameterized Query cũng được SQL Server tạo Execution Plan như Stored Proc nên những lần chạy filter sau sẽ tận dụng lại plan này để xử lý nhanh hơn.
Có một thử nghiệm trên table 43.000 records thì Parameterized Query chạy nhanh hơn Dynamic SQL khoảng 30%, thời gian CPU xử lý cũng ít hơn và chiếm bộ nhớ cho execution plan cũng ít hơn.

[Hình: 44561407515_1c0fa0ed08_o.png]


Link demo: http://www.mediafire.com/file/608ac83860...g.rar/file
 
Trong file nén tôi có đính kèm:
- 2 file script để tạo database "Test" cho SQL Server. Một file cho SQL Server 2005 và một cho 2008.
- 1 file Access "db10.mdb" để test back end Access.
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


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Tìm kiếm Record ngay khi gõ trong Combobox - Class ongke0711 9 652 25-09-18, 12:00 PM
Bài mới nhất: ledangvan
  [Hỏi] Không cho chọn một vài thành phần trong combobox NguyenDungAnh 7 450 12-05-18, 03:34 PM
Bài mới nhất: cpucloi
  [Hỏi] sổ list rows trong combobox babyrock2009 3 473 03-04-18, 05:43 PM
Bài mới nhất: tranthanhan1962
  Combobox không hiện như rowsource value list thanhhau828 7 915 22-11-17, 11:05 AM
Bài mới nhất: ongke0711
Photo Thiết kế combobox chứa giới tính trong Access binhpc 4 730 09-11-17, 03:05 PM
Bài mới nhất: ongke0711

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ơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line