maidinhdan > 19-03-21, 03:14 PM
(18-03-21, 11:02 PM)tranthanhan1962 Đã viết:(18-03-21, 08:58 PM)maidinhdan Đã viết: - Có thể em có câu trả lời cho cách xử lý theo yêu cầu của anh, nhưng phải cho em xem code công thức duyệt của anh.Thực là khó khi phải đưa cho Dân xủ lý 1 phần mềm không có dữ liệu mà vấn đề nó lại nằm trong số lượng record của dữ liệu. Tất nhiên dữ liệu kế toán của 1 công ty là bí mật riêng của công ty đó và không ai có quyền tự ý chia sẽ. Nhưng trong trường hợp này nếu không có dữ liệu thì làm mất thời gian của Dân, nên anh dã xin phép Xếp của công ty này cho phép chuyển dữ liệu đến forum. Tất nhiên cũng có chỉnh sửa một số. Về code thì do đây là một chương trình hoàn chỉnh nên việc tách riêng phần BQGQ của kho rất phức tạp và mất nhiều thời gian. Vả lại anh cũng không phải là người có thói quen dấu code. Nên anh sẽ chuyển lên đây toàn bộ phần mềm này (kể cả fornt end và back end)
- Có Demo càng tốt, em em viết trên đó để test cách xử lý cho anh. Không cần phải đính dữ liệu.
Gửi vào mail này: maidinhdan@gmail.com
https://www.mediafire.com/file/h0wxv280a...0.rar/file
Có điều do độ phức tạp của phần mềm nên nói thêm.
Mỗi khi cần thực hiện tính lại BQGQ nó sẽ chạy Sub N_X_Ton (không phải N_X_T) trông form F07NHATKYPHATSINH, Mỗi lần mở form này nó sẽ chạy lại Sub MODAU và từ sub này nó sẽ thực hiện lại sub N_X_Ton nó sẽ xử lý lại giá trị của table NXT_HANGHOA và NXT_HANGHOAHOTRO. Table NXT_HANGHOAHOTRO có nhiệm vụ cắt các đợt Do While ra thành từng tháng để giảm số lượng record cho vòng lập nếu không có lỗi này thì chỉ cần chạy vòng lập 1 phát trên table NXT_HANGHOA mà không cần đến NXT_HANGHOAHOTRO. Anh cũng có những chương trình khác xủ lý nhanh hơn. Tức là không phải mỗi lần mở form F07NHATKYPHATSINH là phải chạy code N_X_Ton. Mà khi có sự thay đỗi từ form F07CHITIETNHAPXUAT thì khi Unload form F07NHATKYPHATSINH nó mới chạy lại code để chương trinh có thể nhanh hơn một chút. Bù lại code của nó phức tạp hơn nên chuyển cái này lên cho Dân nghiên cửu thử xem. Thank.
Sorry. pass là thao.
Bảng tổng hợp Nhập Xuất Tồn đươc chuyển thành report được chọn trên form BAOCAO hơcj BAOCAOTHANG
Sub N_X_Ton()
Dim CSDL As Database
Dim B01 As Recordset
Dim DKT As String
Dim MAHANG As String
Dim SLT, GTT, GTTB, BQT, BQTB, TONGGIAXUAT As Double
Set CSDL = CurrentDb
Set B01 = CSDL.OpenRecordset("NXT_HANGHOAHOTRO", DB_OPEN_DYNASET)
MAHANG = ""
B01.MoveFirst
Do While Not B01.EOF
If B01![TENHANG] = MAHANG Then
B01.Edit
B01![SLTDK] = SLT
B01![GTTDK] = GTT
B01![BQDK] = BQT
If SLT + B01![SLNTT] = 0 Then
B01![BQTT] = 0
Else
B01![BQTT] = (GTT + B01![GTNTT]) / (SLT + B01![SLNTT])
End If
If B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT] <> 0 Then
TONGGIAXUAT = Round(B01![BQTT] * (B01![SLXTT] + B01![SLHTT]), 0)
If B01![SLXTT] + B01![SLHTT] > 0 Then
B01![BQTT] = TONGGIAXUAT / (B01![SLXTT] + B01![SLHTT])
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
End If
B01![SLTCK] = B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT]
B01![GTTCK] = B01![GTTDK] + B01![GTNTT] - B01![GTXTT] - B01![GTHTT]
B01![BQCK] = B01![GTTCK] / B01![SLTCK]
Else
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
B01![GTTCK] = 0
End If
B01.Update
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
Else
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
End If
'MsgBox (MAHANG)
'DoEvents
B01.MoveNext
Loop
B01.Close
End Sub
ongke0711 > 19-03-21, 04:13 PM
ongke0711 > 19-03-21, 07:44 PM
tranthanhan1962 > 20-03-21, 01:01 AM
(19-03-21, 07:44 PM)ongke0711 Đã viết: Bị lỗi lạ!Mình cũng không biết tại sao! máy mình vẫn chạy OK. còn 2003 thì không chạỵ được là phải rồi. Mình cũng có phiên bản 2003. Mình post lên đây cho bạn tham khảo nội dung cũng thế
Khi mở file của anh tranthanhan1962 trên Office 2013 32bit (bản lụi) thì lại bị lỗi code quá chừng: mất luôn tên mấy cái Sub, các chuỗi SQL thì bị lỗi nối chuỗi. Khi mở trên Office 2016 - 64bit (bản quyền) thì không bị lỗi mất tên Sub/Function nhưng bị lỗi các chuỗi SQL.
Không biết nguyên nhân sao luôn???
ongke0711 > 20-03-21, 07:44 AM
maidinhdan > 20-03-21, 06:16 PM
Bat dau: 5:02:30 PM
5:02:41 PM Mau tin thu: 5109
5:02:52 PM Mau tin thu: 10219
5:03:02 PM Mau tin thu: 15328
5:03:13 PM Mau tin thu: 20442
5:03:23 PM Mau tin thu: 25546
5:03:34 PM Mau tin thu: 30653
5:03:44 PM Mau tin thu: 35763
5:03:54 PM Mau tin thu: 40871
5:04:05 PM Mau tin thu: 45987
5:04:15 PM Mau tin thu: 51098
5:04:26 PM Mau tin thu: 56207
5:04:36 PM Mau tin thu: 61316
5:04:47 PM Mau tin thu: 66421
5:04:57 PM Mau tin thu: 71629
5:05:07 PM Mau tin thu: 76736
5:05:18 PM Mau tin thu: 81844
5:05:28 PM Mau tin thu: 86949
5:05:39 PM Mau tin thu: 92060
5:05:50 PM Mau tin thu: 97166
5:06:01 PM Mau tin thu: 102273
5:06:11 PM Mau tin thu: 107384
5:06:22 PM Mau tin thu: 112494
5:06:33 PM Mau tin thu: 117599
5:06:44 PM Mau tin thu: 122705
5:06:55 PM Mau tin thu: 127811
Ket thuc: 5:07:06 PM Mau tin thu: 132800
' --------------------------------------------------------------------------------------------------------
' Ten Modules/Class: ModNhapXuatTon
' Ten ham/thu tuc : N_X_Ton2
' Tao tren may PC : DAN_ACERV5
' Author/ Tac gia : maidinhdan@gmail.com , Ngay, gio tao: 20/03/2021 4:39:18 PM
' Parameters/Tham so :
' Cu phap/ Purpose :
' Pham vi ap dung : Mau tin tren tram ngan dong; Mat 10giay/5000 mau tin
' --------------------------------------------------------------------------------------------------------
Public Sub N_X_Ton2()
On Error GoTo Loi
Dim CSDL As Database
Dim B01 As Recordset
Dim DKT As String
Dim MAHANG As String
Dim SLT, GTT, GTTB, BQT, BQTB, TONGGIAXUAT As Double
Dim TenTable As String
TenTable = "NXT_HANGHOA"
Set CSDL = CurrentDb
Set B01 = CSDL.OpenRecordset(TenTable, DB_OPEN_DYNASET)
MAHANG = ""
' Chay proges_________________________________________________________________________________________
'Dem tong so mau tin
Dim cRst As Double, ii As Double, SoDong As Long
ii = 0
B01.MoveLast
cRst = B01.RecordCount
Dim clsPg As clsProgess
Set clsPg = New clsProgess
'Hien thi Tieu de len form
clsPg.Title = "H" & ChrW(7879) & " th" & ChrW(7889) & "ng " & ChrW(273) & "ang n" & ChrW(7841) & "p d" & ChrW(7919) & " li" & ChrW(7879) & "u" & vbNewLine & "cho Table:[" & TenTable & "]"
clsPg.Capnhatcongviec 0, "Chu" & ChrW(7849) & "n b" & ChrW(7883) & " quét Database" '"Chuan bi So sanh"
clsPg.Show
clsPg.Capnhatcongviec 0, "B" & ChrW(7855) & "t " & ChrW(273) & ChrW(7847) & "u n" & ChrW(7841) & "p d" & ChrW(7919) & " li" & ChrW(7879) & "u cho Table:[ " & TenTable & " ]: 1 trong " & cRst
' Chay proges_________________________________________________________________________________________
Debug.Print "Bat dau: " & Time
B01.MoveFirst
Do While Not B01.EOF
' Bat dau chay Proges
ii = ii + 1
If B01![TENHANG] = MAHANG Then
B01.Edit
B01![SLTDK] = SLT
B01![GTTDK] = GTT
B01![BQDK] = BQT
If SLT + B01![SLNTT] = 0 Then
B01![BQTT] = 0
Else
B01![BQTT] = (GTT + B01![GTNTT]) / (SLT + B01![SLNTT])
End If
If B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT] <> 0 Then
TONGGIAXUAT = Round(B01![BQTT] * (B01![SLXTT] + B01![SLHTT]), 0)
If B01![SLXTT] + B01![SLHTT] > 0 Then
B01![BQTT] = TONGGIAXUAT / (B01![SLXTT] + B01![SLHTT])
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
End If
B01![SLTCK] = B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT]
B01![GTTCK] = B01![GTTDK] + B01![GTNTT] - B01![GTXTT] - B01![GTHTT]
B01![BQCK] = B01![GTTCK] / B01![SLTCK]
Else
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
B01![GTTCK] = 0
End If
Sleep 0.0001 ' Toc do chay cua thanh trang thai
clsPg.Capnhatcongviec ii / cRst, ChrW(272) & "ang n" & ChrW(7841) & "p d" & ChrW(7919) & " li" & ChrW(7879) & "u " & ChrW(273) & ChrW(7871) & "n" & ":[" & ii & " trong " & cRst & "]"
B01.Update
If SoDong = 5000 Then ' 5000 dong thi dung lai 0,5 giay
Debug.Print Time, "Mau tin thu: " & ii
SoDong = 0
Sleep 500 'dung lai 0,5 giay
Else
SoDong = SoDong + 1
End If
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
Else
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
End If
'MsgBox (MAHANG)
'DoEvents
B01.MoveNext
Loop
'_______________________Thanh Proges__________________________________________-
' Cap nhat cao Tieude da thanh cong
clsPg.Title = "Thành công" & vbNewLine & "D" & ChrW(7919) & " li" & ChrW(7879) & "u n" & ChrW(7841) & "p hoàn t" & ChrW(7845) & "t cho Table:[" & TenTable & "]"
'Xoa bo nho
ThoatLoi:
Debug.Print "Ket thuc: " & Time, "Mau tin thu: " & ii
Set clsPg = Nothing
' dong rs, cnn va giai phong bo nho
Set B01 = Nothing
Exit Sub
Loi:
'Neu loi phat sinh trong qua trinh cap nhat se chay cac doan lenh duoi day
Resume ThoatLoi
End Sub
ongke0711 > 20-03-21, 10:53 PM
Sub N_X_Ton()
Dim DKT As String
Dim MAHANG As String
Dim SLT, GTT, GTTB, BQT, BQTB, TONGGIAXUAT As Double
Dim cn As New ADODB.Connection
Dim B01 As ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT * FROM NXT_HANGHOA ORDER BY [TENHANG],[NAMTHANG];"
Set B01 = New ADODB.Recordset
Debug.Print "Time start: " & Time
With B01
.Source = strSQL
.ActiveConnection = CurrentProject.Connection
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open
'Debug.Print B01.RecordCount
End With
MAHANG = ""
B01.MoveFirst
Do While Not B01.EOF
If B01![TENHANG] = MAHANG Then
B01![SLTDK] = SLT
B01![GTTDK] = GTT
B01![BQDK] = BQT
If SLT + B01![SLNTT] = 0 Then
B01![BQTT] = 0
Else
B01![BQTT] = (GTT + B01![GTNTT]) / (SLT + B01![SLNTT])
End If
If B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT] <> 0 Then
TONGGIAXUAT = Round(B01![BQTT] * (B01![SLXTT] + B01![SLHTT]), 0)
If B01![SLXTT] + B01![SLHTT] > 0 Then
B01![BQTT] = TONGGIAXUAT / (B01![SLXTT] + B01![SLHTT])
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
End If
B01![SLTCK] = B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT]
B01![GTTCK] = B01![GTTDK] + B01![GTNTT] - B01![GTXTT] - B01![GTHTT]
B01![BQCK] = B01![GTTCK] / B01![SLTCK]
Else
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
B01![GTTCK] = 0
End If
B01.Update
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
Else
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
End If
B01.MoveNext
Loop
Debug.Print "Time end: " & Time
B01.Close
Set B01 = Nothing
End Sub
tranthanhan1962 > 21-03-21, 12:51 AM
(20-03-21, 10:53 PM)ongke0711 Đã viết: Tôi cũng mới test cái Sub N_X_Ton và dùng ADODB Recordset nhưng tôi không chia nhỏ dữ liệu ra mà nạp hết 132k dòng vào bộ nhớ luôn.Thank bạn. Mình cũng vừa chuyễn sang ADO và chạy thử ngay trên table NXT_HANGHOA luôn bỏ qua không sử dụng table NXT_HANGHOAHOTRO. Máy mình RAM 16 GB nên chạy cũng nhanh lắm. Mình không kiểm tra thời gian, nhưng nhanh hơn cái cũ nhiều. Với lại mình viết thêm code để nó chỉ chạy trước 1 tháng khi có thêm bớt chỉnh sửa dữ liêu nên cực kỳ nhanh luôn (ví dụ có thay đổi dữ liệu tháng 1/2021 thì nó sẽ chạy từ tháng 12/2020 cho đến tháng hiện tại) nên cực kỳ nhanh. Mình đang nghiên cứu viết thêm code chỉ cho chạy những tên hàng có sự thay đổi và bỏ qua nhưng tên hàng không có biến động chắc chắn tốc độ còn cải thiện nhiều nữa.
Nó xử lý cũng hết 2 phút mấy.
- Chip: i5 1.4 - 4 lõi, RAM 8G
- Chưa thiết lập tăng PageFile của Access.
Vấn đề còn lại là xem dữ liệu có kết quả đúng hay không thôi.
Cách của anh tranthanhan1962 chạy chậm có thể là do phải tốn thêm thao tác tách dữ liệu, ghi xuống, cập nhật rồi chép lại nên tốn thêm thời gian tương tác với Table.
Mã PHP:Sub N_X_Ton()
Dim DKT As String
Dim MAHANG As String
Dim SLT, GTT, GTTB, BQT, BQTB, TONGGIAXUAT As Double
Dim cn As New ADODB.Connection
Dim B01 As ADODB.Recordset
Dim strSQL As String
strSQL = "SELECT * FROM NXT_HANGHOA ORDER BY [TENHANG],[NAMTHANG];"
Set B01 = New ADODB.Recordset
Debug.Print "Time start: " & Time
With B01
.Source = strSQL
.ActiveConnection = CurrentProject.Connection
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open
'Debug.Print B01.RecordCount
End With
MAHANG = ""
B01.MoveFirst
Do While Not B01.EOF
If B01![TENHANG] = MAHANG Then
B01![SLTDK] = SLT
B01![GTTDK] = GTT
B01![BQDK] = BQT
If SLT + B01![SLNTT] = 0 Then
B01![BQTT] = 0
Else
B01![BQTT] = (GTT + B01![GTNTT]) / (SLT + B01![SLNTT])
End If
If B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT] <> 0 Then
TONGGIAXUAT = Round(B01![BQTT] * (B01![SLXTT] + B01![SLHTT]), 0)
If B01![SLXTT] + B01![SLHTT] > 0 Then
B01![BQTT] = TONGGIAXUAT / (B01![SLXTT] + B01![SLHTT])
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
End If
B01![SLTCK] = B01![SLTDK] + B01![SLNTT] - B01![SLXTT] - B01![SLHTT]
B01![GTTCK] = B01![GTTDK] + B01![GTNTT] - B01![GTXTT] - B01![GTHTT]
B01![BQCK] = B01![GTTCK] / B01![SLTCK]
Else
B01![GTXTT] = B01![BQTT] * B01![SLXTT]
B01![GTHTT] = B01![BQTT] * B01![SLHTT]
B01![GTTCK] = 0
End If
B01.Update
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
Else
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
MAHANG = B01![TENHANG]
End If
B01.MoveNext
Loop
Debug.Print "Time end: " & Time
B01.Close
Set B01 = Nothing
End Sub
ongke0711 > 21-03-21, 10:15 AM
(21-03-21, 12:51 AM)tranthanhan1962 Đã viết: Thank bạn. Mình cũng vừa chuyễn sang ADO và chạy thử ngay trên table NXT_HANGHOA luôn bỏ qua không sử dụng table NXT_HANGHOAHOTRO. Máy mình RAM 16 GB nên chạy cũng nhanh lắm. Mình không kiểm tra thời gian, nhưng nhanh hơn cái cũ nhiều.
...
Phần mềm này mình làm cũng lâu rồi, Từ hồi access 97. Sau này chỉ cải tiến và thay đổi biểu mẫu của tổng cục thuế. Trong đó có nhiều code thừa. mỗi lần điều chỉnh sợ nó bị đụng, bị lỗi nên có những cái không mạnh dạn cải tiến.
tranthanhan1962 > 21-03-21, 03:00 PM