[THI] Tạo sổ TH NXT với tốc độ nhanh nhất, dữ liệu 65,532 dòng

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,737
Được thích
10,243
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Cuộc thi tạo sổ tổ hợp nhập xuất tồn trong Excel tốc độ nhanh nhất

MỤC ĐÍCH
Trao đổi học tập để cùng nâng cao trình độ lập trình VBA về tối ưu code chạy nhanh và rõ ràng.

ĐỐI TƯỢNG THAM GIA
Là tất cả các thành viên GPE từ thành viên thường đến các Admin của GPE
Tôi cũng tham gia. Thực tế tôi đã viết code lâu rồi để phục vụ công việc quản lý kho, bản thân thấy chạy khá nhanh nhưng vẫn tin nó chưa phải hoàn hảo.
Nếu code của ai tối ưu nhất hoặc rõ ràng nhất sẽ trình bày code và giải thích cặn kẽ kỹ thuật để làm được ra nó trong topic này để mọi người tham khảo và học hỏi.

GIẢI THƯỞNG
Giải thưởng là cho tất cả thành viên của diễn đàn GPE được các bài học tốt về lập trình VBA trong Excel trong việc làm sổ sách tổng hợp.

THỜI GIAN DỰ THI, GỬI BÀI VÀ CÔNG BỐ
Dự thi từ ngày 10/02/2014.
Bài gửi chậm nhất là 12hAM ngày 15/02/2014.
Thời gian công bố kết quả đánh giá 14h 17/02/2014
Tất cả các bài dự thi, kết quả đánh giá sẽ được upload lên trang đầu của topic này.

Các bạn nén file đáp án rồi gửi bài vào email:
duytuan@bluesofts.net hoặc email của một thành viên BQT GPE (tôi bổ sung sau)
(Tôi sẽ là người nộp sớm nhất không sợ copy của người khác :) )

ĐỀ BÀI:
Tôi cung cấp tập tin dữ liệu với 65,532 dòng cùng module chứa các hàm và thủ tục đo tốc tộ, cấu trúc lệnh.
Bảng dữ liệu:
dlkho.jpg
Nếu các bạn thắc mắc về phương pháp lập sổ tôi sẽ giải thích bài sau
Cấu trúc code:
[GPECODE=vb]Sub DoThoiGian()
Dim T1@, T2@, Freq@, Overhead@
QueryPerformanceFrequency Freq
QueryPerformanceCounter T1
QueryPerformanceCounter T2
Overhead = T2 - T1
QueryPerformanceCounter T1

'Thủ tuc của bạn

LapSo 'Thủ tuc của bạn phải làm

'Kết thúc chạy, đo thời gian thực hiện
QueryPerformanceCounter T2
'Debug.Print (T2 - T1 - Overhead) / Freq * 1000; "milliseconds(ms)"
MsgBox "milliseconds(ms): " & (T2 - T1 - Overhead) / Freq * 1000
End Sub[/GPECODE]


DoThoiGian là thủ tục mẹ được gán vào nút lệnh "Thực hiện" trên bảng tính. Nội dung trong thủ tục này bạn không được sửa. Bạn cần phải tạo thủ tục LapSo để lập sổ tổng hợp NXT.

[GPECODE=vb]Sub LapSo()
'Code của bạn để tạo ra sổ
End Sub[/GPECODE]

Kết quả thực hiện phải ra được sổ có cấu trúc và dữ liệu như sau
thnxt.jpg

Lưu ý, sổ mẫu đã được định dạng vì vậy bạn không cần viết code để định dạng để giảm các yếu tốt ảnh hưởng tới tốc độ của code.

(Nếu bạn không biết lập trình VBA có thể lập công thức Excel thông thường. Tuy nhiên nó có thể được dùng để so sánh giữa lập trình VBA "thiện chiến" thế nào với cách lập công thức Excel thông thường mà thôi).

[TIP]Hướng dẫn tính toán
Các thành viên lưu ý. Sheet "Setting" có thông tin về ngày lập sổ: Từ ngày...đến ngày với các name NGAY1, NGAY2. Điều kiện để lập sổ phải dựa vào thời gian và Loại_phieu

Lượng Tồn đầu = lượng nhập với ngày < NGAY1 - lượng xuất với ngày < NGAY1
Lượng Nhập trong kỳ = lượng nhập với ngày >= NGAY1 và ngày <= NGAY2
Lượng Xuất trong kỳ = lượng xuất với ngày >= NGAY1 và ngày <= NGAY2
Lượng tồn cuối = Lượng Tồn đầu + Lượng Nhập trong kỳ - Lượng Xuất trong kỳ

Tương tự khi tính giá trị...[/TIP]

TIÊU CHÍ ĐÁNH GIÁ
Tìm ra các code đạt tốc độ nhanh nhất. Các bài làm cố gắng trình bày dễ hiểu và kèm comment trong code để giải thích.
Tất cả các bài với các phương pháp khác nhau cũng sẽ đăng lên để chúng ta học được nhiều phương pháp từ đó có thể vận dụng linh hoạt trong các việc khác.

Xin nói trước với các bạn là ta có thể đánh giá ở mức tương đối. Tất cả các code sẽ chạy trên một máy tính. Excel sẽ được khởi động lại với mỗi code mới, mỗi code được chạy 3 lần rồi lấy tốc độ trung bình. Tất cả các bài dự thi được upload lên đây để tất cả mọi người tham khảo.

Với tinh thần cầu thị, tạo sân chơi chung cho mọi người tôi rất mong chúng ta cùng tham gia. Mong các thành viên đừng e ngại về trình độ của mình thế này thế khác, cứ xác định tham gia để học để biết mình đã làm được gì và cần cải tiến cái gì về lập trình VBA.

-----------------
Đã có bài tổng hợp kết quả test và các file có mã nguồn của các tác giả gửi. Các thành viên xem bài #175 để download.
-----------------
 

File đính kèm

  • THNXT_FAST_dulieu.rar
    1.2 MB · Đọc: 419
  • THNXT_FAST - Nguyen Duy Tuan.rar
    1.2 MB · Đọc: 474
Lần chỉnh sửa cuối:
Bị... biết là có nộp bài cũng thua nên khỏi nộp cho nó chắc
Ẹc... Ẹc...
E nghĩ thầy k để ý nhiều đến chuyện thắng thua đâu.Và cái e mong đợi không phải xem ai là người giỏi nhất,e mong thấy giải thuật của thầy thế nào.Vì e thấy ai nộp bài ở đây điều là giỏi và có kiến thức cả rồi .Hi vọng thầy cũng tham gia để mọi người cùng trao đổi thầy nhé.
 
Upvote 0
mình đã nhận được bài của bạn lê duy thưởng. Tốc độ code trong thủ tục "an_gian" rất nhanh :). Mình có chút góp ý mong bạn chỉnh thêm.

Trong sổ thnxt, nếu người dùng xóa từ dòng 12 đến một số dòng nào đó thì code sẽ báo lỗi. Có thể trong sheet thnxt bạn đã "iểm bùa" pivot table? Nếu là pivot table cũng là một giải pháp nhưng ta nên làm nhứ sau trong code để không bị "gian".
Viết code kiểm tra pivot đã tồn tại chưa? Nếu chưa thì tạo nó. Trước khi chạy "thực hiện" để đo tốc độ sheet thnxt phải chưa có pivot.
Trong một chương trình ứng dụng, nếu mỗi báo cáo ta lưu cấu trúc pivot dung lượng file sẽ nặng, vậy trước khi lệnh save được thực hiện cần xóa pivot (một trong các yếu tốt quan trọng làm cho file excel chạy nhanh và dung lượng nhẹ là xóa liên kết, công thức). Vậy nên trong thực tế ứng dụng theo cách tạo pivot, lần đầu tạo sổ thnxt sẽ bị chậm vì phải tạo, còn lần sau (khi chưa lưu) chạy sẽ rất nhanh.
cảm ơn anh đã gợi ý.tôi đã viết code và gửi lại bài hy vọng vẫn còn lỗi để anh góp ý thêm.

Toàn bộ code tôi để trong module "angian". Do không có trường lớp nghĩ sao viết vậy. Hy vọng học thêm được ít nữa trong topic này--=0--=0
 

File đính kèm

  • HINH TEST5.jpg
    HINH TEST5.jpg
    237.7 KB · Đọc: 104
Upvote 0
Mình viết theo kiểu VBA căn bản thì ra thế này. Biết không phải là đối thủ nên hỏng dám bon chen thi thố. Thôi thì post code lên mọi người góp ý giúp thôi. Hic cái hình có chút xíu

Untitled.gif
 

File đính kèm

  • Untitled.jpg
    Untitled.jpg
    20 KB · Đọc: 45
  • Untitled.jpg
    Untitled.jpg
    20.3 KB · Đọc: 26
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mình viết theo kiểu VBA căn bản thì ra thế này. Biết không phải là đối thủ nên hỏng dám bon chen thi thố. Thôi thì post code lên mọi người góp ý giúp thôi. Hic cái hình có chút xíu

- Khi định dạng hình sau khi PrintScreen thì cho nó đuôi JPG thì sẽ cho ra ảnh lớn.

- Với code chạy 435 ms thì thuộc hàng khủng rồi, nộp bài đi anh Hải ơi.
 
Upvote 0
Sao máy của bạn nhanh thế? Máy của tôi là quãng 4200
------------
..............
Như thế sai số có thể là 20 ms. Vậy thì chả lý gì lại phải dùng QueryPerformanceFrequency + QueryPerformanceCounter. Với sai số cỡ đó thì dùng GetTickCount là đủ.

---
Vả lại nếu cần so sánh 2 gói đường mà chúng khác nhau ít nhất là cỡ 1 gam thì chả cần dùng cân có độ chính xác là 1 phần trăm (phần nghìn) gam

thế máy tính của bác hơi chậm thật, hihii, máy tính của bac bate còn có khoảng 845

Đúng là GetTickcount là đủ, đã dùng thử timer thường thấy cũng giống nhau cả

QuangHai, HoangTrongNhia, PTM sao không thử test thời gian (bài #64) tại máy tính các bạn chạy code , để hình dung xem tốc độ thử code thế nào???
 
Upvote 0
Mình test code của bài 64, bấm 10 lần cho ra số 869.666. Nhưng thật tình chẳng hiểu gì ráo nghen.
 
Upvote 0
Mình test code của bài 64, bấm 10 lần cho ra số 869.666. Nhưng thật tình chẳng hiểu gì ráo nghen.

Xem thêm bài #66 , sẽ hiểu thui,

Vì nếu có 2 người cùng công bố các 2 con số (số mls của code, số mls của Sub test thời gian (sub này giống nhau) ) thì sẽ có thể suy luận so sánh tương đối về tốc độ code của 2 người dù dùng 2 máy tính khác nhau
 
Upvote 0
thế máy tính của bác hơi chậm thật, hihii, máy tính của bac bate còn có khoảng 845

Đúng là GetTickcount là đủ, đã dùng thử timer thường thấy cũng giống nhau cả

QuangHai, HoangTrongNhia, PTM sao không thử test thời gian (bài #64) tại máy tính các bạn chạy code , để hình dung xem tốc độ thử code thế nào???
Bấm 10 nhát, kết quả trung bình: 2407.578

Thấp nhất: 1792.88671770278

Cao nhất: 3014.64899019987
 
Lần chỉnh sửa cuối:
Upvote 0
Bấm 10 nhát, kết quả trung bình: 2407.578

Thấp nhất: 1792.88671770278

Cao nhất: 3014.64899019987


Thế thì hoặc con số có vấn đề hoặc là HTN chạy test thời gian khi đang chạy cùng nhiều chương trình khác (chi phối CPU) nên con số quá dao động, thiếu chính xác

Thường các con số 10 lần không khác nhau nhiều đâu thường dao động +-20mls

Nên tắt các chương trình khác, và theo các hướng dẫn trên của NDT khi test thời gian
 
Lần chỉnh sửa cuối:
Upvote 0
Thế thì hoặc con số có vấn đề hoặc là HTN chạy test thời gian khi đang chạy cùng nhiều chương trình khác (chi phối CPU) nên con số quá dao động, thiếu chính xác

Thường các con số 10 lần không khác nhau nhiều đâu thường dao động +-20mls

Nên tắt các chương trình khác, và theo các hướng dẫn trên của NDT khi test thời gian

Khởi động máy, không mở bất cứ gì khác, kể cả rút khỏi cục 3G, mở Excel và bấm 10 nhát:

MIN: 1781.816599

MAX: 2365.375199

AVG: 2038.719
 
Upvote 0
nhờ anh tuân add cho dòng màu đỏ nhé.
do copy thiếu
Sub PIVOT_ADD()
Application.ScreenUpdating = 0
Application.DisplayAlerts = 0
On Error Resume Next
Sheets("PV").Visible = True
Sheets("PV").DELETE

ct ="Từ ngày " & TEXT(NGAY1,"dd/mm/yy") & " đến " & TEXT(NGAY2,"dd/mm/yy") bị value
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi không có thì giờ sửa lại để tối ưu, nên post luôn lên đây sau khi comment:

PHP:
Sub LapSo()

    Application.ScreenUpdating = False
    Dim ListArr, sArr, TmpArr, RArr
    Dim Dic1 As Object, EndR As Long, ListCt As Long
    Dim DataCt As Long, ListEndR As Long, Date1 As Long, Date2 As Date
    Dim i As Long, j As Long, k As Long, Check As Double

    ListEndR = Sheet1.[A100].End(xlUp).Row
    Set Dic1 = CreateObject("Scripting.Dictionary")

    'Lay danh muc vao mang'
    ListArr = Sheet1.Range("A4:C" & ListEndR).Value
    ListCt = UBound(ListArr, 1)

    'Nap mang danh muc vao Dic'
    For i = 1 To ListCt
        Dic1.Add ListArr(i, 1), i
    Next

    'Xác dinh dong cuoi cua data va nap vao mang'
    EndR = Sheet20.Cells(4, 1).End(xlDown).Row
    sArr = Sheet20.Range("A4:K" & EndR).Value
    DataCt = EndR - 3

    ' gan gia tri cho bien'
    ReDim TmpArr(1 To ListCt, 1 To 7)
    Date1 = Sheet3.[B1]
    Date2 = Sheet3.[B2]

   ' Duyet mang Data'
    For i = 1 To DataCt
            ' Xac dinh dong chua ma HH trong danh muc, gan vao cot 1 cua KQ tam'
            j = Dic1.Item(sArr(i, 7))
            TmpArr(j, 1) = j
       'Neu ngay < ngay bat dau, tinh 2 cot ton dau'
        If sArr(i, 2) < Date1 Then
            If sArr(i, 10) = "N" Then
                'Cong nhap'
                TmpArr(j, 2) = TmpArr(j, 2) + sArr(i, 8)
                TmpArr(j, 3) = TmpArr(j, 3) + sArr(i, 11)
            Else
                'Tru xuat'
                TmpArr(j, 2) = TmpArr(j, 2) - sArr(i, 8)
                TmpArr(j, 3) = TmpArr(j, 3) - sArr(i, 11)
            End If
        'Neu ngay trong khoang bao cao'
        ElseIf sArr(i, 2) <= Date2 Then
            'Neu loai chung tu là N, tinh 2 cot Nhap'
            If sArr(i, 10) = "N" Then
                TmpArr(j, 4) = TmpArr(j, 4) + sArr(i, 8)
                TmpArr(j, 5) = TmpArr(j, 5) + sArr(i, 11)
            'Neu loai chung tu la X, tinh 2 cot xuat'
            Else
                TmpArr(j, 6) = TmpArr(j, 6) + sArr(i, 8)
                TmpArr(j, 7) = TmpArr(j, 7) + sArr(i, 11)
            End If
        End If
    'Ket thuc vong lap, Mang KQ tam co 12 dong'
    Next

    'Khai bao  Mang KQua'
    ReDim RArr(1 To ListCt, 1 To 12)
    k = 0

    'Duyet mang KQ tam'
    For i = 1 To ListCt
            'Kiem tra dong co du lieu'
            Check = TmpArr(i, 2) + TmpArr(i, 3) + TmpArr(i, 4) + _
            TmpArr(i, 5) + TmpArr(i, 6) + TmpArr(i, 7)
        'Neu co dulieu, them vao mang KQua'
        If Check > 0 Then
            k = k + 1
            '4 cot thong so Hang hoa'
            RArr(k, 1) = k
            RArr(k, 2) = ListArr(i, 1)
            RArr(k, 3) = ListArr(i, 2)
            RArr(k, 4) = ListArr(i, 3)
            '6 cot Ton, nhap, xuat'
            For j = 5 To 10
               RArr(k, j) = TmpArr(i, j - 3)
            Next
            '2 cot Ton cuoi'
            RArr(k, 11) = RArr(k, 5) + RArr(k, 7) - RArr(k, 9)
            RArr(k, 12) = RArr(k, 6) + RArr(k, 8) - RArr(k, 10)
          
        End If
    Next

   ' Gan ket qua xuong sau khi xoa'
    Sheet26.[B12].Resize(12, 12).ClearContents
    Sheet26.[B12].Resize(k, 12) = RArr
Set Dic1 = Nothing
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi không có thì giờ sửa lại để tối ưu, nên post luôn lên đây sau khi comment:

Mã:
Sub LapSo()

    Dim DataCt As Long, ListEndR As Long, [COLOR=#0000ff][B]Date1 As [/B][/COLOR][COLOR=#ff0000][B]Long[/B][/COLOR][COLOR=#0000ff][B], Date2 As [/B][/COLOR][COLOR=#00ff00][B]Date[/B][/COLOR][COLOR=#0000ff][/COLOR]
    Dim i As Long, j As Long, k As Long, Check As Double

    ListEndR = Sheet1.[A100].End(xlUp).Row
    Set Dic1 = CreateObject("Scripting.Dictionary")

    ‘‘Lay danh muc vao mang
    ListArr = Sheet1.Range("A4:C" & ListEndR).Value
    ListCt = UBound(ListArr, 1)

[COLOR=#ff0000]    ‘‘Nap mang danh muc vao Dic
    For i = 1 To ListCt
        Dic1.Add ListArr(i, 1), i
    Next
[/COLOR]
    ‘‘Xác dinh dong cuoi cua data va nap vao mang
    EndR = Sheet20.Cells(4, 1).End(xlDown).Row
    sArr = Sheet20.Range("A4:K" & EndR).Value
    DataCt = EndR - 3

    ‘‘ gan gia tri cho bien
    ReDim TmpArr(1 To ListCt, 1 To 7)
    [COLOR=#0000ff]Date1 = Sheet3.[B1]
    Date2 = Sheet3.[B2][/COLOR]

''........

End Sub

Lâu lâu mình làm nhà phê bình cái coi!

1) 2 biến đều nhận giá trị là DATE, nhưng có 1 biến LONG, 1 biến DATE

2) Dict chạy toàn bộ mảng nguồn, đồng thời add toàn bộ như thế có bị xem là hao phí hay không, trong khi người ta chỉ chặn ĐẾN NGÀY, giả sử người ta chỉ lấy từ 1/1/2005 đến 31/12/2005 thì nó vẫn Add luôn cả những năm sau à?

3) Sau khi xuất ra kết quả, không có dòng Total thì vẫn chưa đạt yêu cầu!

Người ta thường nói:

Cười người hôm trước, hôm sau người cười

Vậy tại sao mình "không cười người hôm trước, nếu không cười thì hôm sau còn đâu cơ hội mà cười" kakaka.
 
Upvote 0
Lâu lâu mình làm nhà phê bình cái coi!

1) 2 biến đều nhận giá trị là DATE, nhưng có 1 biến LONG, 1 biến DATE

2) Dict chạy toàn bộ mảng nguồn, đồng thời add toàn bộ như thế có bị xem là hao phí hay không, trong khi người ta chỉ chặn ĐẾN NGÀY, giả sử người ta chỉ lấy từ 1/1/2005 đến 31/12/2005 thì nó vẫn Add luôn cả những năm sau à?

3) Sau khi xuất ra kết quả, không có dòng Total thì vẫn chưa đạt yêu cầu!

Người ta thường nói:

Cười người hôm trước, hôm sau người cười

Vậy tại sao mình "không cười người hôm trước, nếu không cười thì hôm sau còn đâu cơ hội mà cười" kakaka.

Muốn cười thì cứ cười.
1. 1 Date, 1 Long, không thấy là tôi cố tình sao?
2. Dict làm gì chạy toàn bộ mảng data nguồn? đọc lại cho kỹ vào: Chạy toàn bộ bảng danh mục 12 dòng. Thậm chí không test If exist. Vả lại ngày tháng trong data không được sort, nếu không có bảng danh mục cũng phải duyệt 65000 dòng như thường.
3. Dòng total có sẵn, đóng khung riêng, format bold, theo mẫu của chủ topic, không yêu cầu thêm vào. Nếu là tôi thì sau khi loại dòng không có tồn và nhập xuất, k <> ListCt, tôi xóa dữ liệu cũ, gán dữ liệu mới, giả sử 4 dòng, thì dòng tổng sẽ nằm ở dòng thứ 5 chứ không phải dòng 13 như vậy.

Cười được thì cứ cười. Còn tôi trước giờ không cười ai, chỉ góp ý. Tôi sai thì cứ góp ý. Được góp ý mà cãi tầm bậy mơi xấu.
 
Upvote 0
Muốn cười thì cứ cười.
1. 1 Date, 1 Long, không thấy là tôi cố tình sao?
2. Dict làm gì chạy toàn bộ mảng data nguồn? đọc lại cho kỹ vào: Chạy toàn bộ bảng danh mục 12 dòng. Thậm chí không test If exist. Vả lại ngày tháng trong data không được sort, nếu không có bảng danh mục cũng phải duyệt 65000 dòng như thường.
3. Dòng total có sẵn, đóng khung riêng, format bold, theo mẫu của chủ topic, không yêu cầu thêm vào. Nếu là tôi thì sau khi loại dòng không có tồn và nhập xuất, k <> ListCt, tôi xóa dữ liệu cũ, gán dữ liệu mới, giả sử 4 dòng, thì dòng tổng sẽ nằm ở dòng thứ 5 chứ không phải dòng 13 như vậy.

Cười được thì cứ cười. Còn tôi trước giờ không cười ai, chỉ góp ý. Tôi sai thì cứ góp ý. Được góp ý mà cãi tầm bậy mơi xấu.

Câu 1: Cố tình? Tại sao?

Câu 2: ý nói là thay vì duyệt cột đó có điều kiện, đằng này lại add hết mã hàng kể cả mã hàng không cần thiết vào Dict. Nếu Sư phụ đã từng xem danh mục phụ tùng xe gắn máy của một đại lý thì Sư phụ sẽ ngất đi, 36000 dòng! Khiếp!

Câu 3: Vậy thì bổ sung thêm đi chứ nhỉ?

----------------------------------------------
Lâu lâu mới bắt giò được Sư phụ của mình cũng khá vui, chứ mình bị Sư phụ trảm hoài chán chết đi được!
 
Upvote 0
Data của chủ topic không sắp xếp theo thời gian:Các năm 2005 và 2006 xen kẽ nhau: dòng 65460 là năm 2006, dòng 65461 - 65499 là năm 2005, các dòng kế lại 2006, 5 dòng cuối lại 2005.

Vậy phải giả định rằng phải duyệt hết 65000 dòng data mới lấy đủ các mặt hàng. Nhưng đã có bảng danh mục 12 dòng thì có mà ngu mới duyệt bên Data.

Danh mục có 10.000 dòng hay 36000 dòng cũng phải add cho hết. Vì phải giả định bất kỳ mặt hàng nào cũng có thể có giao dịch mua bán. Sau khi gán giá trị giao dịch vào rồi mới loại ra.

Dòng tổng chủ topic có sẵn và cố định tại dòng thứ 13 (danh mục có 12 mặt hàng), thì bổ sung bằng công thức Sum cố định vào dòng đó (trên sheet), mắc gì mỗi lần chạy code phải tính lại cho 1 vị trí cố định, công thức cố định?
 
Lần chỉnh sửa cuối:
Upvote 0
Data của chủ topic không sắp xếp theo thời gian:Các năm 2005 và 2006 xen kẽ nhau: dòng 65460 là năm 2006, dòng 65461 - 65499 là năm 2005, các dòng kế lại 2006, 5 dòng cuối lại 2005.

Vậy phải giả định rằng phải duyệt hết 65000 dòng data mới lấy đủ các mặt hàng. Nhưng đã có bảng danh mục 12 dòng thì có mà ngu mới duyệt bên Data.

Danh mục có 10.000 dòng cũng phải add cho hết. Vì phải giả định bất kỳ mặt hàng nào cũng có thể có giao dịch mua bán. Sau khi gán giá trị giao dịch vào rồi mới loại ra.

Bắt giò thì phải bắt cho đúng, thậm chí nếu bắt giò đúng mà bị phản biện cũng phải biết cách bảo vệ lý luận của mình.

OK, mỗi người có một lý do, một thuật toán để làm, vậy câu 1 tại sao cố tình đặt biến này, biến kia vậy? Hỏi để học kiểu biến này. Có gì đặc biệt nên cố tình làm thế sao Sư phụ? Nhầm lẫn thì bình thường, còn cố tình thì rất không hiểu tại sao!
 
Upvote 0
Mình thấy thuật toán bài 112 là rất hợp lý rồi. Đơn giản, dễ hiểu và tốc độ cũng cực nhanh. Mình cũng code bài này gần như giống bài 112. Tuy nhiên lúc xem cách khai báo cũng có hơi thắc mắc chút và mình nghĩ chắc là kỹ thuật là chỗ này nên code có vẻ nhanh hơn code mình nhiều.
 
Upvote 0
Các anh giải thích như thế là được rồi :). Mong các thành viên tiếp tục gửi bài nhé.
 
Upvote 0
Mình thấy thuật toán bài 112 là rất hợp lý rồi. Đơn giản, dễ hiểu và tốc độ cũng cực nhanh. Mình cũng code bài này gần như giống bài 112. Tuy nhiên lúc xem cách khai báo cũng có hơi thắc mắc chút và mình nghĩ chắc là kỹ thuật là chỗ này nên code có vẻ nhanh hơn code mình nhiều.
Ý của anh Quang Hải là biến gì vậy ạ? Còn biến LONG thay bằng biến DATE cũng vậy thôi à, vì tất cả cũng chỉ là dạng NUMBER, nhưng khai như thế nó thấy kỳ và chổi chổi thế thôi.
 
Upvote 0
Web KT

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

Back
Top Bottom