Đố vui về ADO, DAO.

Liên hệ QC
Nhân viên Lê Đức Trí có mã NV khác và cũng thuộc phòng khác vậy các bác (trùng tên khác mâ số và phòng)
vậy các bác làm sao?__--__

Cái này thuộc về cách thiết kế CSDL của bạn. Nếu thiết kế chuẩn thì "uyển chuyển" rất dễ. Nếu không chuẩn thì... không nên dùng ADO.

Lý do: ADO lợi dụng tiêu chuẩn của SQL để làm việc cho gọn gàng. SQL chỉ gọn khi CSDL được thiết kế đủ chuẩn (ít nhất là chuẩn bậc 1, tuy lý tưởng thì là bậc 3). Nếu không chuẩn thì thà dùng code cổ điển đọc từng dòng gọn hơn.
 
Em thấy trên SQL có hàm COMPUTE để xử lý ra kq như của bác, nhưng ko biết có áp dụng đc trên ADO ko? Mà em thấy nếu ko dùng ADO thì có thể dùng Pivot để ra kq. hj
Bạn hãy thử nhé, nếu được thì mọi người sẽ học hỏi thêm.
Do ở đây là đề tài ADO nên dùng ADO, Pivot thì nói làm gì nữa bạn.
 
Em thấy trên SQL có hàm COMPUTE để xử lý ra kq như của bác, nhưng ko biết có áp dụng đc trên ADO ko? Mà em thấy nếu ko dùng ADO thì có thể dùng Pivot để ra kq. hj

Bạn thấy ở đâu vậy? Cái chỗ bạn thấy nó nói áp dụng trên đâu thì áp dụng được trên đấy. ADO chỉ là công cụ truy xuất dữ liệu. Truy xuất như thế nào là tuỳ theo cái nguồn.
 
Vấn đề này chỉ thuần lý thuyết. Có hai phần chính.

1. Rất nhiều người lầm cái từ SQL. SQL là viết tắt của Structured Query Language. Ngôn ngữ này được IBM lập ra để truy vấn một dạng CSDL của họ. Về sau, SQL được ANSI tiêu chuẩn hoá thành ngôn ngữ truy vấn CSDL dạng Liên Hệ.

Microsoft chọn cái tên SQL Server cho phần mềm CSDL của mình là cố tình đánh vào cái hay nhầm của người dùng. Vì vậy, người VN khi nói câu SQL hết 99% là họ muốn nói SQL Server. Mỗi CSDL của nhà cung cấp có một phiên bản SQL phác nhau. Ngôn ngữ dùng để truy vấn SQL Server tên là T-SQL (Transact SQL)

Phiên bản T-SQL cho SQL Server 2008 R2 có hàm Compute dùng để tính tổng con tổng mẹ. Tôi nghĩ là bài #162 muốn nói cái này. Lưu ý là qua phiên bản 2012 thì T-SQL tránh Compute và dùng lệnh truy vấn khác.

2. ADO chỉ là một object nằm trong Windows, dùng để đọc dữ liệu. Tuỳ theo dạng chứa của dữ liệu mà ta phải bảo ADO dùng cỗ máy (engine) nào để đọc. Khi phần mềm gởi thông điệp kết nối cho ADO, chuỗi kết nối có chứa lệnh chọn cỗ máy. Vì ở đây, ta chỉ đọc dữ liệu từ file Excel cho nên cỗ máy đọc là Access (đời cũ là Jet).

Access sử dụng lệnh truy vấn chỉ gần giống SQL chứ không hoàn toàn 100%. Và việc sử dụng lệnh Compute còn tuỳ thuộc vào Access có hổ trợ lệnh này hay không. Nên nhớ là công cụ query trong Access rất giới hạn. Những việc trình bày phức tạp như tổng tiếc, người ta dùng report và VBA.
 
Tiện về ADO cho e hỏi các anh chị, vấn để sau. Vì file of a rất nhiều dòng, nên dùng công thức chạy rất chậm. mà ADO e chưa rành lắm. Nhờ các chỉ giùm cách làm việc trong file với ạ!
 

File đính kèm

  • HOI ADO.xlsx
    10.1 KB · Đọc: 16
Tiện về ADO cho e hỏi các anh chị, vấn để sau. Vì file of a rất nhiều dòng, nên dùng công thức chạy rất chậm. mà ADO e chưa rành lắm. Nhờ các chỉ giùm cách làm việc trong file với ạ!

"file of a" nghĩa là gì?
Hỏi thì nói rõ rệt cho người ta hiểu. Bày đặt nói tiếng này nọ chỉ tổ hiểu lầm.
 
Hic, mình đánh nhầm. cụm đó là "file of em"
Có thể mình diển đạt hơi khó hiểu. Ý của mình là trong file đó, có thể dùng ADO để tìm những phần tử có trong cột A mà không có trong cột B (và ngược lại)? Nếu được thì mong bạn và các anh chị chỉ dẩn.
 
Hic, mình đánh nhầm. cụm đó là "file of em"
Có thể mình diển đạt hơi khó hiểu. Ý của mình là trong file đó, có thể dùng ADO để tìm những phần tử có trong cột A mà không có trong cột B (và ngược lại)? Nếu được thì mong bạn và các anh chị chỉ dẩn.
theo như tôi được biết thì "file of a" hay "file of em" gì thì đối với anh Vetmini cũng không khác gì mấy
 
E nhờ các a chị nếu biết chỉ cách e cho với. Chứ mấy cái lổi đó nó củng ko đáng để bàn lắm. Lần sau e sẽ khắc phục là được thôi __--____--____--__
 
Gửi bạn file dùng ADO, nhưng ở đây chỉ là bản nháp, chưa trau chuốt, nên bạn cần hoàn thiện hơn. Tiện đây cho mình hỏi, tại sao dùng công thức lọc lại lâu. Mình ko nghĩ thế, vì mình có thể lọc hàng nghìn dòng trong vài giây.

Có 1 mẹo nhỏ là bạn có thể lọc mà ko cần dùng công thức và ADO, chỉ cần sử dụng remove duplicate trong excel, nhưng cần khéo. hi
 

File đính kèm

  • HOI ADO.xls
    42 KB · Đọc: 16
Em có 2 file CuaHang và BaoGia
CuaHang có 1 sheet gồm 3 cột: MaHang, ThongTin và DonGia
BaoGia có nhiều sheet A,B,C... mỗi sheet cũng gồm 3 cột MaHang, ThongTin và DonGia
Làm sao để cập nhật đơn giá của file CuaHang mỗi khi nhà cung cấp thay đổi DonGia trong BaoGia
Em thấy ADO hay quá mà chưa biết gì, mong các anh chị ra tay nghĩa hiệp.
Tks!
 
Tôi xin mượn bài https://docs.google.com/spreadsheets/d/1sJ9vn86-LOqbst-a-h0UqnAiOCHxHU51ap-_kgLrYOQ/edit#gid=0 của anh Hướng để góp vui.
Câu hỏi: Bạn dùng ADO để cho ra kết quả như bên dưới.

View attachment 162932

Em không hiểu tại sao bác muốn hiện như vậy, thấy hơi vô lý ("Chân" xuất hiện 1 lần mà dữ liệu cuối hiện 2) Em cố làm theo sao cho giống thui ạ. Bác xem có chấp nhận đc ko?
Mã:
Sub GPE()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        ThisWorkbook.FullName _
    & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
  Query = "SELECT A.f1, A.f2, B.f2 " & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "LEFT JOIN [A2:B6] As B ON B.f1 = A.f1 ORDER BY a.f1, b.f2, a.f2"
 
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing


End Sub
 
Em không hiểu tại sao bác muốn hiện như vậy, thấy hơi vô lý ("Chân" xuất hiện 1 lần mà dữ liệu cuối hiện 2) Em cố làm theo sao cho giống thui ạ. Bác xem có chấp nhận đc ko?
Mã:
Sub GPE()
    Dim Query As String
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
     With cn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
        ThisWorkbook.FullName _
    & ";Extended Properties=""Excel 12.0 Xml;HDR=NO;IMEX=1"";"
        .Open
    End With
  Query = "SELECT A.f1, A.f2, B.f2 " & Chr(10)
  Query = Query & "FROM (select distinct f1, f2 from [D2:E13]) As A " & Chr(10) & "LEFT JOIN [A2:B6] As B ON B.f1 = A.f1 ORDER BY a.f1, b.f2, a.f2"
 
   rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing


End Sub
Cám ơn bạn đã tham gia, tuy nhiên kết quả chưa giống theo như hình mẫu.
 
Web KT
Back
Top Bottom