Nhờ hỗ trợ cú pháp truy vấn trong ADODB (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

vanthinh3101

Thành viên tích cực
Tham gia
24/1/15
Bài viết
1,127
Được thích
1,488
Giới tính
Nam
Nghề nghiệp
Finance
Em đang có vướng mắc xin nhờ mọi người giúp.
Dữ liệu giả định và kết quả cần có em đã để trong file đính kèm.
Em đang mắc về cú pháp truy vấn
- JoinText dữ liệu từ nhiều dòng về 1 dòng (có loại trùng)
- Tính tổng doanh thu theo từng KH (cần quy đổi giá trị đối với trường hợp Currency là USD).

Rất mong nhận được sự giúp đỡ của mọi người.
 

File đính kèm

- JoinText dữ liệu từ nhiều dòng về 1 dòng (có loại trùng)

Đối với bài toán của bạn thì tôi vẫn phải dùng thêm một hàm "gộp dòng thành cột" rồi chạy câu lệnh SQL kết hợp hàm đó. Nói chung là cũng dài dòng. Không biết nếu dữ liệu lớn thì nó chạy như thế nào.
Tôi chưa biết cách nào khác.

Mã:
s = "SELECT ID FROM [" & sRngName & "] GROUP BY ID"
    Set oRst = GetADORecordset(s)
    oRst.MoveFirst
    i = 2
    Do Until oRst.EOF
        s1 = "SELECT ID, Name, 'VND','" & LienKetDong(oRst!ID) & "' AS Product2 , Sum(IIf([Currency]='USD',[Revenue]*23000,[Revenue])) AS Rev " & _
             "FROM [" & sRngName & "] " & _
             "GROUP BY ID, Name HAVING [ID]='" & oRst!ID & "'"
        'Debug.Print s1
        Set oRst2 = GetADORecordset(s1)
        Sheet1.Range("H" & i).CopyFromRecordset oRst2
        oRst2.Close
        i = i + 1
        oRst.MoveNext
    Loop
 

File đính kèm

Đối với bài toán của bạn thì tôi vẫn phải dùng thêm một hàm "gộp dòng thành cột" rồi chạy câu lệnh SQL kết hợp hàm đó. Nói chung là cũng dài dòng. Không biết nếu dữ liệu lớn thì nó chạy như thế nào.
Tôi chưa biết cách nào khác.

Mã:
s = "SELECT ID FROM [" & sRngName & "] GROUP BY ID"
    Set oRst = GetADORecordset(s)
    oRst.MoveFirst
    i = 2
    Do Until oRst.EOF
        s1 = "SELECT ID, Name, 'VND','" & LienKetDong(oRst!ID) & "' AS Product2 , Sum(IIf([Currency]='USD',[Revenue]*23000,[Revenue])) AS Rev " & _
             "FROM [" & sRngName & "] " & _
             "GROUP BY ID, Name HAVING [ID]='" & oRst!ID & "'"
        'Debug.Print s1
        Set oRst2 = GetADORecordset(s1)
        Sheet1.Range("H" & i).CopyFromRecordset oRst2
        oRst2.Close
        i = i + 1
        oRst.MoveNext
    Loop
Em cám ơn bác đã giúp đỡ.
Nó dài dòng thật bác ạ, chạy vòng lặp mãi.
Giá như ADODB hỗ trợ luôn Group_Concat có phải tốt không?
 
Em cám ơn bác đã giúp đỡ.
Nó dài dòng thật bác ạ, chạy vòng lặp mãi.
Giá như ADODB hỗ trợ luôn Group_Concat có phải tốt không?
ADODB không có bổn phận phải hỗ trợ lệnh SQL. Nó chỉ gởi câu truy vấn qua giao diện với CSDL thôi.
Bổn phận này thuộc về cỗ máy dùng để kết nối. Vì CSDL ở đây là bảng tính Excel cho nên cỗ máy dùng là Access. Và câu SQL phải tuân theo cú pháp của Access.
Nếu CSDL là SQL Server thì câu SQL sẽ theo cú pháp T-SQL. Nếu từ Oracle thì sẽ theo cú pháp SQL-Plus.
 
ADODB không có bổn phận phải hỗ trợ lệnh SQL. Nó chỉ gởi câu truy vấn qua giao diện với CSDL thôi.
Bổn phận này thuộc về cỗ máy dùng để kết nối. Vì CSDL ở đây là bảng tính Excel cho nên cỗ máy dùng là Access. Và câu SQL phải tuân theo cú pháp của Access.
Nếu CSDL là SQL Server thì câu SQL sẽ theo cú pháp T-SQL. Nếu từ Oracle thì sẽ theo cú pháp SQL-Plus.
Em cám ơn bác đã chỉ dạy.
 
Em cám ơn bác đã giúp đỡ.
Nó dài dòng thật bác ạ, chạy vòng lặp mãi.
Giá như ADODB hỗ trợ luôn Group_Concat có phải tốt không?

Trong code này tôi còn quên một phương thức Filter để giảm việc mở Recordset nhiều lần. Thứ 2 là giảm tương tác nhiều lần với sheet bằng việc gán kết quả vào mảng rồi gán một lần xuống sheet. Tôi rảnh xem lại như thế nào.
 
Chơi thử Dictionary được không @vanthinh3101
Mã:
Sub TongHop()

    Dim i&, sArr(), dArr(), Dic1 As Object, TG(), Dic2 As Object, k&
    TG = Range(Sheet1.[B14], Sheet1.[C15])
    sArr = Range(Sheet1.[A2], Sheet1.[E9])
    ReDim dArr(1 To UBound(sArr), 1 To 5)
    Set Dic1 = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(TG)
        Dic1(TG(i, 1)) = TG(i, 2)
    Next
   
    For i = 1 To UBound(sArr)
        itm = sArr(i, 1) & sArr(i, 2)
        If Not Dic2.Exists(itm) Then
            k = k + 1
            Dic2(itm) = k
            dArr(k, 1) = sArr(i, 1)
            dArr(k, 2) = sArr(i, 2)
            dArr(k, 3) = "VND"
            dArr(k, 4) = sArr(i, 4)
            dArr(k, 5) = sArr(i, 5) * Dic1.Item(sArr(i, 3))
        Else
            dArr(Dic2.Item(itm), 4) = sArr(i, 4) & ";" & dArr(Dic2.Item(itm), 4)
            dArr(Dic2.Item(itm), 5) = sArr(i, 5) * Dic1.Item(sArr(i, 3)) + dArr(Dic2.Item(itm), 5)
        End If
    Next
    Sheet1.[H14].Resize(i - 1, 5) = dArr
End Sub

Tôi có chế thêm bảng tỷ giá, vì giả sử có EUR/JPG/GPB....
Mỗi cái đoạn mã sản phẩm trùng nhau (trường Product tôi chưa nghĩ ra cách loại trùng, nhờ các thành viên hỗ trợ thêm phần loại trùng này).
 

File đính kèm

Lần chỉnh sửa cuối:
Chơi thử Dictionary được không @vanthinh3101
Mã:
Sub TongHop()

    Dim i&, sArr(), dArr(), Dic1 As Object, TG(), Dic2 As Object, k&
    TG = Range(Sheet1.[B14], Sheet1.[C15])
    sArr = Range(Sheet1.[A2], Sheet1.[E9])
    ReDim dArr(1 To UBound(sArr), 1 To 5)
    Set Dic1 = CreateObject("Scripting.Dictionary")
    Set Dic2 = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(TG)
        Dic1(TG(i, 1)) = TG(i, 2)
    Next
  
    For i = 1 To UBound(sArr)
        itm = sArr(i, 1) & sArr(i, 2)
        If Not Dic2.Exists(itm) Then
            k = k + 1
            Dic2(itm) = k
            dArr(k, 1) = sArr(i, 1)
            dArr(k, 2) = sArr(i, 2)
            dArr(k, 3) = "VND"
            dArr(k, 4) = sArr(i, 4)
            dArr(k, 5) = sArr(i, 5) * Dic1.Item(sArr(i, 3))
     Else
            dArr(Dic2.Item(itm), 4) = sArr(i, 4) & ";" & dArr(Dic2.Item(itm), 4)
            dArr(Dic2.Item(itm), 5) = sArr(i, 5) * Dic1.Item(sArr(i, 3)) + dArr(Dic2.Item(itm), 5)
        End If
    Next
    Sheet1.[H14].Resize(i - 1, 5) = dArr
End Sub

Tôi có chế thêm bảng tỷ giá, vì giả sử có EUR/JPG/GPB....
Mỗi cái đoạn mã sản phẩm trùng nhau (trường Product tôi chưa nghĩ ra cách loại trùng, nhờ các thành viên hỗ trợ thêm phần loại trùng này).
Em cám ơn anh nhé!
Dùng Scripting.Dictionary thì em làm được rồi anh ạ.
Dữ liệu lớn nên em mới tính đến phương án dùng ADODB.
Mỗi cái đoạn mã sản phẩm trùng nhau (trường Product tôi chưa nghĩ ra cách loại trùng, nhờ các thành viên hỗ trợ thêm phần loại trùng này).
Anh thêm 1 thủ tục kiểm tra xem sản phẩm đó đã tồn tại chưa như sau:
PHP:
...
Else
    if Instr(1,darr(Dic2.Item(itm),4),sArr(i,4)) = 0 then
        dArr(Dic2.Item(itm), 4) = sArr(i, 4) & ";" & dArr(Dic2.Item(itm), 4)
    end if

Em xin phép góp ý 1 chút về code của anh:
- Không cần phải khai báo thêm 1 mảng kết quả vì mảng kết quả luôn luôn nhỏ hơn hoặc bằng mảng ban đầu.
- Anh cứ duyệt qua từng dòng của mảng ban đầu rồi thay thế kết quả luôn vào mảng ban đầu là được.
 
Em cám ơn anh nhé!
Dùng Scripting.Dictionary thì em làm được rồi anh ạ.
Dữ liệu lớn nên em mới tính đến phương án dùng ADODB.

Anh thêm 1 thủ tục kiểm tra xem sản phẩm đó đã tồn tại chưa như sau:
PHP:
...
Else
    if Instr(1,darr(Dic2.Item(itm),4),sArr(i,4)) = 0 then
        dArr(Dic2.Item(itm), 4) = sArr(i, 4) & ";" & dArr(Dic2.Item(itm), 4)
    end if

Em xin phép góp ý 1 chút về code của anh:
- Không cần phải khai báo thêm 1 mảng kết quả vì mảng kết quả luôn luôn nhỏ hơn hoặc bằng mảng ban đầu.
- Anh cứ duyệt qua từng dòng của mảng ban đầu rồi thay thế kết quả luôn vào mảng ban đầu là được.
hoá ra múa rìu qua mắt thợ, sori sori... cảm ơn @vanthinh nhé

Bạn đã nghĩ đến dùng power query chưa? Chắc ăn được ADO (tôi nghĩ vậy)
 
Có gì đâu anh?
Ngày đầu vào diễn đàn, em cũng học hỏi từ đầu.
Diễn đàn cần những người nhiệt tình như anh thì mới phát triển được chứ.
Hôm nào rảnh, em gọi anh ngồi cafe/bia nhé! :)
Anh bên Hồ Thiền Quang, welcome nhé, cf ngắm Thiên Nga...
 
Em đang có vướng mắc xin nhờ mọi người giúp.
Dữ liệu giả định và kết quả cần có em đã để trong file đính kèm.
Em đang mắc về cú pháp truy vấn
- JoinText dữ liệu từ nhiều dòng về 1 dòng (có loại trùng)
- Tính tổng doanh thu theo từng KH (cần quy đổi giá trị đối với trường hợp Currency là USD).

Rất mong nhận được sự giúp đỡ của mọi người.
Dữ liệu nhiều bạn có thể dùng các tool của excel, Power query hay power pivot đều được
Cho bạn cách làm của 2 tool trên, thay đổi dữ liệu bấm refresh trong pivot là được
 

File đính kèm

Lần chỉnh sửa cuối:
Em cám ơn anh nhé!
Dùng Scripting.Dictionary thì em làm được rồi anh ạ.
Dữ liệu lớn nên em mới tính đến phương án dùng ADODB.

Anh thêm 1 thủ tục kiểm tra xem sản phẩm đó đã tồn tại chưa như sau:
PHP:
...
Else
    if Instr(1,darr(Dic2.Item(itm),4),sArr(i,4)) = 0 then
        dArr(Dic2.Item(itm), 4) = sArr(i, 4) & ";" & dArr(Dic2.Item(itm), 4)
    end if

Em xin phép góp ý 1 chút về code của anh:
- Không cần phải khai báo thêm 1 mảng kết quả vì mảng kết quả luôn luôn nhỏ hơn hoặc bằng mảng ban đầu.
- Anh cứ duyệt qua từng dòng của mảng ban đầu rồi thay thế kết quả luôn vào mảng ban đầu là được.
Bạn nên uyển chuyển sử dụng kết hợp giữa SQL và các công cụ của VBA thì hay hơn
Vì Concat mà dùng Engine của Access thì vất vả rồi, và như thế có thể lặp ở VBA còn nhanh hơn
Nên thử nghiệm kết hợp xem sao
 
Dữ liệu nhiều bạn có thể dùng các tool của excel, Power query hay power pivot đều được
Cho bạn cách làm của 2 tool trên, thay đổi dữ liệu bấm refresh trong pivot là được
Em cám ơn anh đã giúp đỡ ạ.
Bài đã được tự động gộp:

Bạn nên uyển chuyển sử dụng kết hợp giữa SQL và các công cụ của VBA thì hay hơn
Vì Concat mà dùng Engine của Access thì vất vả rồi, và như thế có thể lặp ở VBA còn nhanh hơn
Nên thử nghiệm kết hợp xem sao
Em cám ơn anh đã góp ý và chỉ dẫn.
 
Em đang có vướng mắc xin nhờ mọi người giúp.
Dữ liệu giả định và kết quả cần có em đã để trong file đính kèm.
Em đang mắc về cú pháp truy vấn
- JoinText dữ liệu từ nhiều dòng về 1 dòng (có loại trùng)
- Tính tổng doanh thu theo từng KH (cần quy đổi giá trị đối với trường hợp Currency là USD).

Rất mong nhận được sự giúp đỡ của mọi người.
Nếu là tôi thì tôi có thể làm báo biểu như sau:

1603509310044.png
 
Dữ liệu nhiều bạn có thể dùng các tool của excel, Power query hay power pivot đều được
Cho bạn cách làm của 2 tool trên, thay đổi dữ liệu bấm refresh trong pivot là được
Rất hay ạ.
Anh viết các lệnh trực tiếp trong Advanced Editor đúng không ạ?
 
Dữ liệu nhiều bạn có thể dùng các tool của excel, Power query hay power pivot đều được
...
Trong giai đoạn phát triển Power Query và Power Pivot, MS đã có dự định dùng chúng cho Data Mining (qua Data Model). Vì vậy cỗ máy sau lưng bọn 'Power' này rất hiệu quả.
Nếu tôi không lầm thì cỗ máy sau lưng Data Model dựa trên kỹ thuật của SQL Server.

Vì vậy, nhiều người trong ngành của tôi (ngành phân tích dữ liệu) cho rằng khi dữ liệu nhiều thì bọn 'Power' sẽ tỏ rõ hiệu quả của chúng.

Túm lại, theo tôi thì nếu chơi với dữ liệu cỡ chục ngàn dòng trở lên mà không chịu học Power Query, cứ bám vào ADO là tự mình lỗi thời.
 
Đọc cú pháp thấy khó nhằn quá ạ, trông không thân thiện như trong VBA.
Chắc mới và cách viết khác với VBA nên bạn chưa quen, tôi thấy nó cũng không khó, cứ sử dụng các công cụ có sẵn của nó , mỗi cái nó đều có code bạn không cần viết lại làm gì, chỉ cần sửa lại theo ý mình, vì nó lập trình theo từng bước nên nó debug rất dễ, làm nhiều case bạn sẽ quen thôi
 
Chắc mới và cách viết khác với VBA nên bạn chưa quen, tôi thấy nó cũng không khó, cứ sử dụng các công cụ có sẵn của nó , mỗi cái nó đều có code bạn không cần viết lại làm gì, chỉ cần sửa lại theo ý mình, vì nó lập trình theo từng bước nên nó debug rất dễ, làm nhiều case bạn sẽ quen thôi
Vâng anh,
Như trong power pivot e cũng chưa hình dung có công cụ measure mạnh vậy. Mới chỉ dừng lại ở kéo thả, thêm vài trường cộng trừ nhân chia...
Kể cả trong power query, thông thường có các step để biết nó đang làm j, mà thấy code của a chạy vèo cái, chẳng có step nào, nên chưa biết bắt đầu từ đâu.
 
Vâng anh,
Như trong power pivot e cũng chưa hình dung có công cụ measure mạnh vậy. Mới chỉ dừng lại ở kéo thả, thêm vài trường cộng trừ nhân chia...
Kể cả trong power query, thông thường có các step để biết nó đang làm j, mà thấy code của a chạy vèo cái, chẳng có step nào, nên chưa biết bắt đầu từ đâu.
Tôi để hàm dưới in nên nó không show từng step, tôi gửi lại
Theo đúng thì khi connect dữ liệu xong dùng power query để chỉnh sửa dữ liệu cho đúng chuẩn rồi add vào Data model viết các Measure để thực hiện insight và analysis , rồi dùng power pivot để tạo các báo cáo BI.
Power query có thể trả kết quả được nhưng như vậy như VBA chỉ trả 1 kết quả không phải báo cáo BI (không thể kéo thả), muốn kết quả khác là phải code lạị
Excel nhờ có 2 công cụ này mà nó là một trong những tool BI tốt nhất bên cạnh power BI, Tableau, Qlikview...Các chứng chỉ thi data analytics ban đầu của Micrsoft đều có Excel là Power pivot, Power query chứ không phải hàm excel hay VBA, xu hướng giờ là business intelligence, business analyst, data analytics nên các báo cáo phải automactic hết đưa lên web, cloud... có thể xem real time mọi nơi, các doanh nghiệp có ERP gần như phải có thêm các tool BI này, thế giới đã đi trước cái này lâu rồi mà Việt Nam giờ mới bắt đầu
Hai công cụ trên excel là miễn phí và nó căn bản để bước vào data analytics, diễn dàn bây giờ tập chung vào hàm excel và VBA quá mà cái mảng BI thì gần như chưa có chỉ có lác đác mấy bài cơ bản của thầy Ptm, diễn đàn nên đầu tư thêm vào mảng này vì chắc chắn xu hướng tới nó sẽ phát triển rất mạnh (một buổi học trung bình power BI có giá 2 triệu là thấy nó hot cỡ nào)
Tôi nói thật từ lúc chuyển sang các tool BI giá trị nó mang lại cho tôi rất nhiều so với trước về thời gian cũng như giá trị, chẳng phải ngồi làm số liệu hàng tháng, chẳng phải code cho từng case hay report, hạn chế được cái sai sót trong quá trình tính toán, chỉ mất thời gian thiết lập ban đầu, các tháng sau chỉ cần lên lịch refresh là xong. Các báo cáo của Công ty tôi chuyển sang dùng các tool này hết , connect trực tiếp vơi DB hay Cloud (sharepoint, onedrive..), các báo chi tiết thì dùng Power query power pivot, các dashborad, summary report thì dùng power BI pubilc lên Web, điện thoại. Lúc trước dùng mail để gửi báo cáo thì giờ các BOD, BOM có thể xem trực tiếp qua Web, điện thoại luôn
Một cái hấp dẫn nữa trong power pivot là Dax language, các hàm trong Dax phần nhiều giống hàm bên excel, nó xử lý trên mảng và là dynamic array, nó trả các kết quả khác nhau phụ thuộc vào ngữ cảnh vì vậy nó có thể tạo được rất nhiều báo cáo chứ không phải trả một kết quả như bên excel, các bạn nào thích mảng bên excel qua Dax sẽ thấy nó thú vị hơn nhiều , đến một lúc nào đó các bạn sẽ có suy nghĩ "sao không tìm hiểu cái này sớm hơn" như tôi, một điểm lưu ý là M và Dax thì không cần thiết phải học cả 2 nhưng để làm báo cáo BI thì phải học Dax, M giống như công cụ hỗ trợ cho Dax ( Dax không có loop, đệ quy) giống như VBA và hàm excel, vì vậy chỉ cần học Dax , Power query biết các tool có sẵn nó là đủ
 

File đính kèm

...Hai công cụ trên excel là miễn phí và nó căn bản để bước vào data analytics, diễn dàn bây giờ tập chung vào hàm excel và VBA quá mà cái mảng BI thì gần như chưa có chỉ có lác đác mấy bài cơ bản của thầy Ptm, diễn đàn nên đầu tư thêm vào mảng này vì chắc chắn xu hướng tới nó sẽ phát triển rất mạnh (một buổi học trung bình power BI có giá 2 triệu là thấy nó hot cỡ nào)
...
Từ mấy năm trước tôi đã nhắc nhở rằng ở diễn đàn này (GPE) người ta chỉ biết chạy theo dữ liệu chứ chưa hề biết vượt qua và dẫn đầu chúng.
Để đền bù vào chỗ này, người ta chú tâm vào VBA, có những lúc đi vượt ra ngoài, dùng mấy công cụ COM và API để làm đủ mọi thứ người ta tưởng rằng mình đã có khả năng làm chủ.
Sự thật thì "ra ngoài" hoàn toàn khác với "vượt lên trước". Làm chủ là dùng cái nhìn tổng thể, nhìn khối dữ liệu và tự biết những gì có thể rút được gì từ đấy. Chạy theo dữ liệu là cứ dùng những khuôn mẫu sẵn có và sử dụng những kỹ thuật để dồn dữ liệu vào các khuôn mẫu ấy.
 
Chỗ này thêm RPA (Robotic Process Automation), có thể dùng luôn Microsoft Power Automate (hoặc UiPath Orchestrator) thì không phải động gì tới luôn. :)
Cài lịch refresh thì ở lúc thiết lập ban đầu thôi bạn, refresh lúc mấy giờ, mấy lần trong ngày, 1 tháng bao nhiêu ngày ... tới thời điểm tự động refresh. Microsoft Power Automate tôi có từng thử nhưng thấy nó thiết lập lằng nhằng quá nên thôi, hiện tại tôi đang sử dụng Gateway và Flow của Microsoft.
 
... không phải động gì tới luôn. :)
Thường thường các bạn trên đây làm việc theo kiểu tổng hợp dữ liệu thành báo cáo cho nên coi trọng cái vụ "tự động". Vì nó đỡ bước nào hay bước nấy.
Tôi làm việc theo kiểu phân tích dữ liệu để hổ trợ quản lý cho nên không thích cái vụ "tự động". Một vài bước "refresh" chúng tôi chẳng coi vào đâu.
 
Từ mấy năm trước tôi đã nhắc nhở rằng ở diễn đàn này (GPE) người ta chỉ biết chạy theo dữ liệu chứ chưa hề biết vượt qua và dẫn đầu chúng.
Để đền bù vào chỗ này, người ta chú tâm vào VBA, có những lúc đi vượt ra ngoài, dùng mấy công cụ COM và API để làm đủ mọi thứ người ta tưởng rằng mình đã có khả năng làm chủ.
Sự thật thì "ra ngoài" hoàn toàn khác với "vượt lên trước". Làm chủ là dùng cái nhìn tổng thể, nhìn khối dữ liệu và tự biết những gì có thể rút được gì từ đấy. Chạy theo dữ liệu là cứ dùng những khuôn mẫu sẵn có và sử dụng những kỹ thuật để dồn dữ liệu vào các khuôn mẫu ấy.
Vâng, lúc trước cũng hài lòng với excel , VBA và một số cái khác hỗ trợ . Một file excel nhét mấy chục cái báo cáo, đưa lên ribbon cho phép chọn giống Slicer, kết hợp qua lại giữa hàm và VBA... sau khi ra ngoài làm thời gian mới biết mình lạc hậu người ta đã lên Cloud sài automatic report chứ không phải làm thù công như mình, nghĩ lại giờ nhàn bao nhiêu thì lúc đó cực bấy nhiêu, mỗi lần phát sinh mấy báo cáo mới là phải ngồi code tiếp, dữ liệu bị sai thì chẳng biết sai do code hay do Data phải ngồi debug lại, giờ dùng mấy tool BI chỉ cần thiết kế data chuẩn viết vài dòng Dax là giải quyết hơn 40% các báo cáo lúc trước, việc debug là chỉ còn xem xét phía data. Mà dùng VBA để làm dữ liệu nó còn dở hơn hàm, VBA dùng Dic phải quét từng dòng nếu Table có nhiều relationship với các Table khác thì dùng hàm ngon hơn, nếu không dữ liệu nhiều nó quét biết chừng nào mới xong, Data model và các tool BI bây giờ sử dụng công nghệ Columnar storage tức là nó chỉ quan tâm đến distinct value chứ không quan tâm đến số lượng dòng, một Table mà có 10 ID mà có 50 triệu dòng sẽ nhẹ hơn rất nhiều với 1 Table có 1 triệu ID mà 1 triệu dòng.
 
Tôi để hàm dưới in nên nó không show từng step, tôi gửi lại
Theo đúng thì khi connect dữ liệu xong dùng power query để chỉnh sửa dữ liệu cho đúng chuẩn rồi add vào Data model viết các Measure để thực hiện insight và analysis , rồi dùng power pivot để tạo các báo cáo BI.
....
Hai công cụ trên excel là miễn phí và nó căn bản để bước vào data analytics, diễn dàn bây giờ tập chung vào hàm excel và VBA quá mà cái mảng BI thì gần như chưa có chỉ có lác đác mấy bài cơ bản của thầy Ptm, diễn đàn nên đầu tư thêm vào mảng này vì chắc chắn xu hướng tới nó sẽ phát triển rất mạnh (một buổi học trung bình power BI có giá 2 triệu là thấy nó hot cỡ nào)
......
Cảm ơn anh, các Step đã rất rõ ràng rồi a.
Tài liệu của thầy @ptm0412 về Power Query cho Beginners, nhưng e thấy đã rất hữu ích rồi. Trước việc tổng hợp dữ liệu bằng VBA cỡ vài chục nghìn dòng, từ vài file thì được. Mà khi chơi đến vài chục file, từ vài Folder là thấy bất cập ngay.
Nếu có tài liệu, kinh nghiệm hay với Dax, mong anh chia sẻ để anh/em diễn đàn cùng phát triển.
 
Cảm ơn anh, các Step đã rất rõ ràng rồi a.
Tài liệu của thầy @ptm0412 về Power Query cho Beginners, nhưng e thấy đã rất hữu ích rồi. Trước việc tổng hợp dữ liệu bằng VBA cỡ vài chục nghìn dòng, từ vài file thì được. Mà khi chơi đến vài chục file, từ vài Folder là thấy bất cập ngay.
Nếu có tài liệu, kinh nghiệm hay với Dax, mong anh chia sẻ để anh/em diễn đàn cùng phát triển.
Không có gì trong số đó vô ý sinh ra đâu
VBA giải quyết nhiều folder, nhiều trăm ngàn dòng thì vẫn có thể tốt - quan trọng là thuật toán và công cụ phối hợp thôi
DAX, POWER Query, ... PIVOT TABLE chỉ thích hợp với các dữ liệu có mẫu chuẩn hoặc gần chuẩn, hoặc chí ít không hay ít dao động về cấu trúc thôi, ...
Trong khi đó VBA thì linh động hơn nhiều, với nhiều bài toán khác nhau không chỉ Cơ sở dữ liệu, mà còn các bài toán đúng dần, tối ưu ...vv
Vì sao khẳng định thế - vì VBA cũng là dạng ngôn ngữ, ngôn ngữ thì sử dụng sao là do người lập trình: có uyển chuyển và thuật toán tốt: góc nhìn, quy mô ra sao mà thôi.
Tất nhiên ứng với 1 trường hợp cụ thể thì sử dụng cái gì tốt hơn cái khác là có, Xét hay khẳng định cho tất cả là điều dễ làm ngộ nhận
 
Lần chỉnh sửa cuối:
Không có gì trong số đó vô ý sinh ra đâu
VBA giải quyết nhiều folder, nhiều trăm ngàn dòng thì vẫn có thể tốt - quan trọng là thuật toán và công cụ phối hợp thôi
DAX, POWER Query, ... PIVOT TABLE chỉ thích hợp với các dữ liệu có mẫu chuẩn hoặc gần chuẩn, hoặc chí ít không hay ít dao động về cấu trúc thôi, ...
Trong khi đó VBA thì linh động hơn nhiều, với nhiều bài toán khác nhau không chỉ Cơ sở dữ liệu, mà còn các bài toán đúng dần, tối ưu ...vv
Vì sao khẳng định thế - vì VBA cũng là dạng ngôn ngữ, ngôn ngữ thì sử dụng sao là do người lập trình: có uyển chuyển và thuật toán tốt: góc nhìn, quy mô ra sao mà thôi.
Tất nhiên ứng với 1 trường hợp cụ thể thì sử dụng cái gì tốt hơn cái khác là có, Xét hay khẳng định cho tất cả là điều dễ làm ngộ nhận
Vâng ạ, đúng là so sánh thì hơi khập khiễng, dùng VBA thì cơ động, chỉ là cần phải suy nghĩ nhiều hơn, làm sao thuật toán phải tối ưu (từ khâu nhỏ nhất là khai báo biến) để code chạy nhanh nhất.
Với Power Query thì không cần nghĩ ngợi gì, cứ để cho nó tự thân làm, thôi thì thời gian suy nghĩ tối ưu code thì để thời gian đó làm việc khác.
 
Không có gì trong số đó vô ý sinh ra đâu
VBA giải quyết nhiều folder, nhiều trăm ngàn dòng thì vẫn có thể tốt - quan trọng là thuật toán và công cụ phối hợp thôi
DAX, POWER Query, ... PIVOT TABLE chỉ thích hợp với các dữ liệu có mẫu chuẩn hoặc gần chuẩn, hoặc chí ít không hay ít dao động về cấu trúc thôi, ...
Trong khi đó VBA thì linh động hơn nhiều, với nhiều bài toán khác nhau không chỉ Cơ sở dữ liệu, mà còn các bài toán đúng dần, tối ưu ...vv
Vì sao khẳng định thế - vì VBA cũng là dạng ngôn ngữ, ngôn ngữ thì sử dụng sao là do người lập trình: có uyển chuyển và thuật toán tốt: góc nhìn, quy mô ra sao mà thôi.
Tất nhiên ứng với 1 trường hợp cụ thể thì sử dụng cái gì tốt hơn cái khác là có, Xét hay khẳng định cho tất cả là điều dễ làm ngộ nhận
Hình như bạn có chút hiểu lầm thì phải, dữ liệu đưa vào Data model thì có thể phải chuẩn, còn Power query thì không cần, vì nhiệm vụ chính của Power query là xử lý dữ liệu chưa sạch, chưa chuẩn thành dữ liệu chuẩn để add vào Data model
Lấy ví dụ connect dữ liệu các file excel trong folder, nếu cùng cấu trúc như cùng sheet , cùng Range thì VBA và PQ làm tốt, nhưng giả sử các Table nó nằm ở các vị trí không giống nhau, có thể nằm vị trí này vị trí kia , sheet này sheet kia, tiêu đề các Table có thể không giống nhau nhưng cùng tính chất thì có thể nói là dữ liệu chưa chuẩn thì tôi nghĩ VBA lấy không được, còn Power query thì làm được nó cho phép view , chỉnh sửa chọn giả lập trước khi connect.
Tốc độ thì không cần phải bàn, cơ chế VBA là dùng vòng lặp xét từng phần tử thì nó đã không tối ưu rồi so với các công nghệ mới là In-memory và columnar storage rồi, cộng đồng power BI nó xem M language là VBA version 2 và DAX language là hàm excel Version 2
 
Vâng ạ, đúng là so sánh thì hơi khập khiễng, dùng VBA thì cơ động, chỉ là cần phải suy nghĩ nhiều hơn, làm sao thuật toán phải tối ưu (từ khâu nhỏ nhất là khai báo biến) để code chạy nhanh nhất.
Với Power Query thì không cần nghĩ ngợi gì, cứ để cho nó tự thân làm, thôi thì thời gian suy nghĩ tối ưu code thì để thời gian đó làm việc khác.
Ta chỉ cần nữa Power Query - không phải chìa khóa vạn năng
Hình như bạn có chút hiểu lầm thì phải, dữ liệu đưa vào Data model thì có thể phải chuẩn, còn Power query thì không cần, vì nhiệm vụ chính của Power query là xử lý dữ liệu chưa sạch, chưa chuẩn thành dữ liệu chuẩn để add vào Data model
Lấy ví dụ connect dữ liệu các file excel trong folder, nếu cùng cấu trúc như cùng sheet , cùng Range thì VBA và PQ làm tốt, nhưng giả sử các Table nó nằm ở các vị trí không giống nhau, có thể nằm vị trí này vị trí kia , sheet này sheet kia, tiêu đề các Table có thể không giống nhau nhưng cùng tính chất thì có thể nói là dữ liệu chưa chuẩn thì tôi nghĩ VBA lấy không được, còn Power query thì làm được nó cho phép view , chỉnh sửa chọn giả lập trước khi connect.
Tốc độ thì không cần phải bàn, cơ chế VBA là dùng vòng lặp xét từng phần tử thì nó đã không tối ưu rồi so với các công nghệ mới là In-memory và columnar storage rồi, cộng đồng power BI nó xem M language là VBA version 2 và DAX language là hàm excel Version 2
Cũng vậy thôi bạn, Tôi không phủ định bài toán với đối tượng xử lý là trường (filed) hay bảng (table) thì Power query xử lý tốt (dù trước đó phải Clean Data - có chuẩn hay không chuẩn thì cũng phải là theo dạng cơ sở dữ liệu (dù chưa chuẩn)

Còn VBA thì linh động hơn: ở các bài toán đa dạng và nhiều dạng không chỉ kiểu cơ sở dữ liệu.

Nên không có gì hiểu lầm ở đây cả. Sử dụng đúng công cụ với dữ liệu mới là điều cần làm.
 
Ta chỉ cần nữa Power Query - không phải chìa khóa vạn năng
...
Nó gần như là chìa khoá vạn năng trong lĩnh vực bảng tính đối với dân cần kết nối dữ liệu như tôi.
Đương nhiên ngoài lĩnh vực bảng tính thì tôi có những cách làm khác. Điển hình ở đây nhiều ngừoi thích dùng VBA để quản lý files, nhưng với tôi thì đây là công việc của script (tức là VBScript) hay powershell. Công việc về toán thì Python ăn đứt VBA.
 
Ta chỉ cần nữa Power Query - không phải chìa khóa vạn năng

Cũng vậy thôi bạn, Tôi không phủ định bài toán với đối tượng xử lý là trường (filed) hay bảng (table) thì Power query xử lý tốt (dù trước đó phải Clean Data - có chuẩn hay không chuẩn thì cũng phải là theo dạng cơ sở dữ liệu (dù chưa chuẩn)

Còn VBA thì linh động hơn: ở các bài toán đa dạng và nhiều dạng không chỉ kiểu cơ sở dữ liệu.

Nên không có gì hiểu lầm ở đây cả. Sử dụng đúng công cụ với dữ liệu mới là điều cần làm.
Dữ liệu nạp vào Power query không nhất thiết là table , filed mà là dạng any có thể là String, html...kết quả trả về cũng không nhất thiết là Table, filed (trừ khi phải nạp vào Data model)
Ví dụ như bài sắp xếp chuỗi tăng dần (dữ liệu là String) : A1,A5,A4,A3,A2,A2,A1=>A1,A2,A3,A4,A5 nếu viết VBA thì phải split dùng vòng lặp loại trùng , sau đó viết thêm hàm sắp xếp, hoặc dùng array list...
Còn trong power query thì đơn giản như vầy, các hàm trong M gần như loại bỏ việc phải dùng vòng lặp như trong VBA nó rất mạnh trong việc xử lý mảng, trường hợp đặc biệt lắm mới phải dùng loop, nó chỉ kém VBA các vấn đề liên quan đến window như cut, copy file, folder....Như bạn nói, các case đặc biệt thì dùng VBA , còn riêng về xử lý số liệu thì nên dùng các tool này, vì nó là gốc của các báo cáo BI
1603697802635.png
 
...Như bạn nói, các case đặc biệt thì dùng VBA , còn riêng về xử lý số liệu thì nên dùng các tool này, vì nó là gốc của các báo cáo BI
Tôi đồng ý với bài #36 của bạn (*), ngoài điểm này.
Bạn có nuôi con nít hay thú cưng (chó, mèo, chim, ...) bao giờ chưa? Khi bạn cho chúng ăn, nếu chìu theo những món ăn chúng thích thì không bao lâu chúng sẽ lâm vào tình trạng nhẹ thì mập quá cân, nặng thì mỡ gan và chết. Bắt buộc phải ép chúng ăn cho đúng thành phần (thỉnh thoảng ăn bậy không kể).

Đối với người nghiện VBA cũng vậy. Nếu không cứng rắn thì họ sẽ viện mọi cớ để thoả cơn nghiện của mình. Những người giúp ở đây cũng không ngoại lệ, họ cũng nghiện VBA cho nên cứ gặp vấn đề đẻ viết VBA là mừng húm, ít khi nghĩ đến giải pháp khác.

(*) Tương lai của truy cập dữ liệu là từ nhiều nguồn lạ và rất có thể toàn rác rưởi. Khi MS ra Power Query là đã chú ý đến chỗ này. Tương lai của Power Query hoặc công cụ nào đó thay thế nó là nhìn dữ liệu theo nhiều góc cạnh (cube) chứ không phải hai chiều (table, căn bản bảng tính).
VBA dẫu có biến hoá hế nào thì cũng là ngôn ngữ lập trình thế hệ 3 (third generation language). Được hổ trợ bằng dll chỉ đủ để nó gọi các COM's của Windows và may ra gọi là 3.5 thôi. Fourth/Fifth generation thuộc về các ngôn ngữ có thư viện khổng lồ và không bị giới hạn bởi địa bàn (platform: Windows, Mac,...) như Python.
 
Tôi đồng ý với bài #36 của bạn (*), ngoài điểm này.
Bạn có nuôi con nít hay thú cưng (chó, mèo, chim, ...) bao giờ chưa? Khi bạn cho chúng ăn, nếu chìu theo những món ăn chúng thích thì không bao lâu chúng sẽ lâm vào tình trạng nhẹ thì mập quá cân, nặng thì mỡ gan và chết. Bắt buộc phải ép chúng ăn cho đúng thành phần (thỉnh thoảng ăn bậy không kể).

Đối với người nghiện VBA cũng vậy. Nếu không cứng rắn thì họ sẽ viện mọi cớ để thoả cơn nghiện của mình. Những người giúp ở đây cũng không ngoại lệ, họ cũng nghiện VBA cho nên cứ gặp vấn đề đẻ viết VBA là mừng húm, ít khi nghĩ đến giải pháp khác.

(*) Tương lai của truy cập dữ liệu là từ nhiều nguồn lạ và rất có thể toàn rác rưởi. Khi MS ra Power Query là đã chú ý đến chỗ này. Tương lai của Power Query hoặc công cụ nào đó thay thế nó là nhìn dữ liệu theo nhiều góc cạnh (cube) chứ không phải hai chiều (table, căn bản bảng tính).
VBA dẫu có biến hoá hế nào thì cũng là ngôn ngữ lập trình thế hệ 3 (third generation language). Được hổ trợ bằng dll chỉ đủ để nó gọi các COM's của Windows và may ra gọi là 3.5 thôi. Fourth/Fifth generation thuộc về các ngôn ngữ có thư viện khổng lồ và không bị giới hạn bởi địa bàn (platform: Windows, Mac,...) như Python.
Các tool BI bây giờ cũng có thêm Python và R trong việc xử lý số liệu, mà 2 thằng này xem như là trùm trong việc xử lý số liệu rồi.
 
Nó gần như là chìa khoá vạn năng trong lĩnh vực bảng tính đối với dân cần kết nối dữ liệu như tôi.
Đương nhiên ngoài lĩnh vực bảng tính thì tôi có những cách làm khác. Điển hình ở đây nhiều ngừoi thích dùng VBA để quản lý files, nhưng với tôi thì đây là công việc của script (tức là VBScript) hay powershell. Công việc về toán thì Python ăn đứt VBA.
ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.

Nên VBA hay Power Query cũng chỉ là một phần rất nhỏ của xử lý dữ liệu thôi.


Nó gần như là chìa khoá vạn năng trong lĩnh vực bảng tính đối với dân cần kết nối dữ liệu như tôi.
Đương nhiên ngoài lĩnh vực bảng tính thì tôi có những cách làm khác. Điển hình ở đây nhiều ngừoi thích dùng VBA để quản lý files, nhưng với tôi thì đây là công việc của script (tức là VBScript) hay powershell. Công việc về toán thì Python ăn đứt VBA.
ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.

Nên VBA hay Power Query cũng chỉ là một phần rất nhỏ của xử lý dữ liệu thôi.
Dữ liệu nạp vào Power query không nhất thiết là table , filed mà là dạng any có thể là String, html...kết quả trả về cũng không nhất thiết là Table, filed (trừ khi phải nạp vào Data model)
Ví dụ như bài sắp xếp chuỗi tăng dần (dữ liệu là String) : A1,A5,A4,A3,A2,A2,A1=>A1,A2,A3,A4,A5 nếu viết VBA thì phải split dùng vòng lặp loại trùng , sau đó viết thêm hàm sắp xếp, hoặc dùng array list...
Còn trong power query thì đơn giản như vầy, các hàm trong M gần như loại bỏ việc phải dùng vòng lặp như trong VBA nó rất mạnh trong việc xử lý mảng, trường hợp đặc biệt lắm mới phải dùng loop, nó chỉ kém VBA các vấn đề liên quan đến window như cut, copy file, folder....Như bạn nói, các case đặc biệt thì dùng VBA , còn riêng về xử lý số liệu thì nên dùng các tool này, vì nó là gốc của các báo cáo BI
View attachment 248071
Bạn lôi cả python và R nữa thì là hết rồi
Các bài viết tôi chỉ muốn nói, không nên lạm dụng hay tôn thờ 1 công cụ xử lý hết các vấn đề, Thậm chí cả Python và R cũng vậy vẫn có những hạn chế của nó. Hay cả Excel sẽ có đến lúc cũng phải thay đổi lớn.

Khi xử lý các bài toán lớn thiên về tổ chức cấu trúc cơ sở dữ liệu thì nên dùng các tool (công cụ) như bạn nói - còn trái lại chỉ là cố gắng sử dụng các tiểu xảo mà thôi, vì Clean Data không phải là mục đích chính , bước chính của các tool này - nếu cố ép chỉ là gượng gạo.
 
Lần chỉnh sửa cuối:
ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.

Nên VBA hay Power Query cũng chỉ là một phần rất nhỏ của xử lý dữ liệu thôi.



ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.

Nên VBA hay Power Query cũng chỉ là một phần rất nhỏ của xử lý dữ liệu thôi.

Bạn lôi cả python và R nữa thì là hết rồi
Các bài viết tôi chỉ muốn nói, không nên lạm dụng hay tôn thừa 1 công cụ xử lý hết các vấn đề, Thậm chí cả Python và R cũng vậy vẫn có những hạn chế của nó. Thậm chí cả Excel sẽ có đến lúc cũng phải thay đổi. Khi xử lý các bài toán lớn thiên về tổ chức cấu trúc cơ sở dữ liệu thì nên dùng các tool (công cụ) như bạn nói - còn trái lại chỉ là cố gắng sử dụng các tiểu xảo mà thôi, vì Clean Data không phải là mục đích chính của các tool này.
vâng anh ạ,
Tinh thần ở đây chủ thớt chỉ hỏi về ADO, mà mọi người đang bàn tới cả VBA, PQ, DAX...
Cho nên thực tế 1 bài toán có nhiều cách giải, miễn là cho kết quả đúng, người làm cảm thấy happy là được ạ.
 
ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.

Nên VBA hay Power Query cũng chỉ là một phần rất nhỏ của xử lý dữ liệu thôi.



ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.

Nên VBA hay Power Query cũng chỉ là một phần rất nhỏ của xử lý dữ liệu thôi.

Bạn lôi cả python và R nữa thì là hết rồi
Các bài viết tôi chỉ muốn nói, không nên lạm dụng hay tôn thờ 1 công cụ xử lý hết các vấn đề, Thậm chí cả Python và R cũng vậy vẫn có những hạn chế của nó. Hay cả Excel sẽ có đến lúc cũng phải thay đổi lớn.

Khi xử lý các bài toán lớn thiên về tổ chức cấu trúc cơ sở dữ liệu thì nên dùng các tool (công cụ) như bạn nói - còn trái lại chỉ là cố gắng sử dụng các tiểu xảo mà thôi, vì Clean Data không phải là mục đích chính , bước chính của các tool này - nếu cố ép chỉ là gượng gạo.
Python và R chỉ là ngôn ngữ thêm vào vào các tool BI, chứ các tool đã có ngôn ngữ riêng của nó nên có cũng được không có cũng chẳng sao, tôi đã nói ở trên nhiệm vụ chính của PQ là làm sạch và làm chuẩn dữ liệu nên không hiểu ý bạn gượng gạo là gì.
Thôi, tôi dừng ở đây, nói nhiều quá loãng topic của chủ thớt mất
 
...Thôi, tôi dừng ở đây, nói nhiều quá loãng topic của chủ thớt mất
Tôi không đồng ý với bài #40. Trước khi cỡi xe Dream thì cả thế hệ tôi đã trải qua Honda Dame (C50, chế biến lại từ CUB để xuất cảng sang VN) và SS50 (về sau này các bạn gọi là Honda 67). Honda 67 chỉ có thể xoáy nòng đến độ nào thôi. Cuối cùng thì Dream vẫn thắng.
Hầu hết những gì ta cần ở ADO (*) đều có thể dùng PowerQuery để xử lý.
Học M (**) cũng đâu có khó hơn SQL?
Chung quy chỉ do cái tư tưởng nghĩ rằng lập trình (VBA) là xịn, thêm SQL nghe như lân thấy pháo.
Trên thực tế, đồ cổ thì nên bắt đầu nghĩ tới thay thế chúng là vừa. Và đó là lý do tôi xen vào thớt này.

(*) ở đây ta chỉ nói ADO trong ngữ cảnh VBA. Thực tế ADO chỉ là một COM, ngôn ngữ khác cũng có thể gọi được.

(**) M nó có 007 làm việc cho nó hữu hiệu lắm :p

(***) M có nhiều cải tiến học từ sự thất bại của LINQ. Nếu luyện đến trình độ thì lambda của các ngôn ngữ mới có thể thay thế rất nhiều vòng lặp.

ah, Bác VietMini ah, Viết trên là muốn nói ngôn ngữ lập trình nói chung thôi, còn nếu nói rộng ra nữa thì cái gì chả làm được, lại lạc lối vào việc là dùng 1 công cụ giải quyết mọi thứ. Vì dù là gì thì cuối cùng cũng là xử lý vấn đề một cái hệ thống.
...
Ngoài Delphi ra, có thể nói tôi đã trải nghiệm qua gần hết những frameworks và ngôn ngữ. Cho nên lúc nói chuyện, tôi có chú ý đến các ngôn ngữ lập trình nói chung - thế hệ 1, 2, 3, 4, 5.
 
Lần chỉnh sửa cuối:

Bài viết mới nhất

Back
Top Bottom