Đố vui về ADO, DAO.

Liên hệ QC
Cái này cho vào hàm iif, kết hợp phép toán +,-,* là ra.
Đại loại ví dụ như sau:


BẠn test thử nhé, xin lỗi vì chưa kiểm tra.
Em thì em có cách giải quyết khác(nó đơn giản hơn nhiều), nhưng chờ mng giả xem thế nào. Cái của bác em cũng không giám chắc đúng hay ko, nhưng nếu như có thêm chục điều kiện nữa thì iif nó cứ dài loằng ngoằng và khó control lắm ạ.
 
Vấn đề này sử dụng cú pháp Range trong SQL có lẽ hợp lý hơn
 
Tiện đây em cũng xin góp vui 1 bài toán về Tính tiền điện.
Các bạn coi file để rõ bài toán.

Xin thử code này.

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, Sum(f6 * B.f3) "
    Query = Query & "From (Select *, iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) as f6 From [A2:B6] as A "
    Query = Query & "Left Join [D2:F6] as B on A.f2 > B.f1 ) as C Group by A.f1"
    rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
 
Xin thử code này.

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, Sum(f6 * B.f3) "
    Query = Query & "From (Select *, iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) as f6 From [A2:B6] as A "
    Query = Query & "Left Join [D2:F6] as B on A.f2 > B.f1 ) as C Group by A.f1"
    rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub
Đúng rùi bạn, bạn có bài nào hay đưa lên để mng cùng thử sức.
 
Xin thử code này.

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, Sum(f6 * B.f3) "
    Query = Query & "From (Select *, iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) as f6 From [A2:B6] as A "
    Query = Query & "Left Join [D2:F6] as B on A.f2 > B.f1 ) as C Group by A.f1"
    rs.Open Query, cn
    Range("K2").CopyFromRecordset rs
    rs.Close: cn.Close: Set rs = Nothing: Set cn = Nothing
End Sub

Bạn có thể giải thích sơ qua cái Query trong code trên không vậy. Cảm ơn bạn
 
Em xin góp vui 1 bài toán nữa: Thông báo khi nhập dữ liệu trùng
Bài này đã có trên GPE và em thấy bài toán này dùng ADO hay nhất nên đưa vào topic này để mng cùng thư giãn ạ. Yêu cầu chi tiết nằm trong file.
 

File đính kèm

  • Ghi Nhan San Luong.xlsx
    12.4 KB · Đọc: 21
Bạn có thể giải thích sơ qua cái Query trong code trên không vậy. Cảm ơn bạn
Giải thích như thế này:

Mình join 2 bản lại với nhau với điều kiện A.f2 > B.f1 để tạo ra 1 bảng ví dụ:
với MR là B và Value là 126 thì bảng mới sẽ có 2 giá trị:
MRValueFromToCost
B12601002000
B1261002001600

Tiếp theo đó dùng công thức iif(B.f2 >= A.f2,A.f2 - B.f1,B.f2 - B.f1) để ra 1 cột phụ:

MRValueFromToCostf6
B12601002000100
B126100200160026


Rùi cuối cùng tính toán lại Cost * f6 và dùng GROUP để trả về tổng của B.
 
Bài này có đuợc sử dụng thêm bảng phụ k bạn? Nếu k sử dụng bảng phụ thì truy vấn hơi dài mà yêu cầu report nhiều tháng hơn thì khó mà làm được. Ý bạn là chỉ cần ra như kết ủa mẫu hay muốn tổng quát?

ủa bạn hiểu được đề bài rồi à ? mình nhìn vào chả hiểu gì . hic . Phần Capacity của từng thành viên tính bằng công thức gì vậy ? Ô F3 = 31/12/2030 là ý nghĩa gì ? +-+-+-++-+-+-+
 
ủa bạn hiểu được đề bài rồi à ? mình nhìn vào chả hiểu gì . hic . Phần Capacity của từng thành viên tính bằng công thức gì vậy ? Ô F3 = 31/12/2030 là ý nghĩa gì ? +-+-+-++-+-+-+

Em nghĩ chú trọng tới yêu cầu chưsố liệu giả định k quan trọng lắm. Hj.
Hình như có vấn đề về bảng kết quả. Nhưng em vẫn quan tâm tới phuơng pháp giải bài này
 
Em nghĩ chú trọng tới yêu cầu chưsố liệu giả định k quan trọng lắm. Hj.
Hình như có vấn đề về bảng kết quả. Nhưng em vẫn quan tâm tới phuơng pháp giải bài này

đừng xưng em với tôi , tôi còn trẻ lắm . Bạn có thể cho tôi biết ô K2 tính bằng công thức gì để ra 42 vậy ?
 
Em xin góp vui 1 bài toán nữa: Thông báo khi nhập dữ liệu trùng
Bài này đã có trên GPE và em thấy bài toán này dùng ADO hay nhất nên đưa vào topic này để mng cùng thư giãn ạ. Yêu cầu chi tiết nằm trong file.

Bình thường thì tôi dị ứng với cách nói chuyện bở rồ, đia... lắm. Nhưng phải nhìn nhận là cái này rất là thú vị. Bạn cho biết tại sao bài toán này dùng ADO hay nhất rồi chúng ta sẽ cố giải.
 
đừng xưng em với tôi , tôi còn trẻ lắm . Bạn có thể cho tôi biết ô K2 tính bằng công thức gì để ra 42 vậy ?

Công thức tính như thế này:

Depat_1 bao gồm 2 members: Nguyen Van A và Nguyen Van D
Nguyen Van A làm full trong tháng 4 (Month - Apr-2016) - Bạn có thể nhìn vào period 1-Jan-2016 >> 1-May-2016
>>> Capacity của ông Nguyen Van A tháng 4 là 21 (21 ngày làm việc không tính t7 + cn)
Nguyen Van D làm full tháng 4 (Period 1-Jan-2016 -> 30-Apr-2016)
>>> Capacity của ông Nguyen Van D tháng 4 là 21

Capacity Dept_1 tháng 4 = (Nguyen Van A + Nguyen Van D) = 21 + 21 = 42

Đây là bài toán cụ thể mình đang làm (Resource Management Tool) của công ty mình.
Resource forecast cho 6 tháng tiếp theo.
 
Bình thường thì tôi dị ứng với cách nói chuyện bở rồ, đia... lắm. Nhưng phải nhìn nhận là cái này rất là thú vị. Bạn cho biết tại sao bài toán này dùng ADO hay nhất rồi chúng ta sẽ cố giải.
Em chưa hiểu điều gì khiến a dị ứng. Còn về vd "bài toán này dùng ADO là hay nhất" thì nó chỉ là ý kiến chủ quan của em. Mục đích em đưa bài này lên chỉ để mng giải trí, thư giãn thui ạ.
 
Mình sử dung code sau đề lấy dữ liệu từ Excel lên Form VB6 .TextBox mà nó sai khúc nào báo lỗi Read-only

Bạn nào biết khắc phục lỗi chỉ dùm
xin cảm ơn
Mã:
Sub GetData()
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.ConnectionString = "Data Source= " & App.path & "D:\XX.xlsm; Extended Properties=""Excel 12.0;HDR=Yes;"";"
    cn.CursorLocation = 3
    cn.Open
    rs.Open "SELECT * FROM [Sheet1$U23:U23]", cn, 3, 1
    Set Text1.DataSource = rs ''Gan len TextBox
    cn.Close
End Sub
 

File đính kèm

  • Capture.PNG
    Capture.PNG
    5.8 KB · Đọc: 48
Mình sử dung code sau đề lấy dữ liệu từ Excel lên Form VB6 .TextBox mà nó sai khúc nào báo lỗi Read-only

Bạn nào biết khắc phục lỗi chỉ dùm
xin cảm ơn
Mã:
Sub GetData()
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    cn.ConnectionString = "Data Source= " & App.path & "D:\XX.xlsm; Extended Properties=""Excel 12.0;HDR=Yes;"";"
    cn.CursorLocation = 3
    cn.Open
    rs.Open "SELECT * FROM [Sheet1$U23:U23]", cn, 3, 1
    Set Text1.DataSource = rs ''Gan len TextBox
    cn.Close
End Sub
Em k dám chắc nhưng em thấy k hợp lý ở chỗ table của a có mỗi cell U23 mà anh lại để HDR là yes, cái thứ 2 nữa là data source ấy, sao lại phải có app.path nhỉ. Đó là ý kiến của em thui nhé
 
Em chưa hiểu điều gì khiến a dị ứng. Còn về vd "bài toán này dùng ADO là hay nhất" thì nó chỉ là ý kiến chủ quan của em. Mục đích em đưa bài này lên chỉ để mng giải trí, thư giãn thui ạ.

[chưa hiểu điều gì khiến a dị ứng]
Tôi không thích nói chuyện với những người dùng từ giao thiệp bằng tiếng Anh. VD chào thì nói là Hi, cám ơn thì nói là thanks, bạn thì nói là bro... Có 2 lý do: 1 là tôi thích nói tiếng Việt, 2 là có những lúc người ta dùng sai ngữ cảnh tôi chả hiểu là người ta khen hay chửi tôi (điểm này tôi đã từng chứng minh rồi)

[bài toán này dùng ADO là hay nhất]
ADO có cái bất lợi của nó. Chỉ khi nào lượng lợi áp đảo lượng bất lợi thì giải pháp mới được gọi là "hay". Muốn hay nhất thì tỉ số lợi/bất lợi phải là cao nhất.
Tôi hỏi bạn thấy nó hay chỗ nào là vì tôi không muốn chủ quan. Có thể bạn nhìn thấy một số lợi mà tôi không thấy.
 
Web KT
Back
Top Bottom