-
Tính Bình Quân Gia Quyền
tranthanhan1962 > 08-12-21, 09:32 PM
Bạn tuanhungkcs vừa gởi file nhờ mình xử lý về Bình quân gia quyền. Nhưng Ổ chứa HĐH win 7 (có cài office 2003) của mình mới bị hỏng. Win chính của mình là win 11 (office 2019). Nên chưa thể hỗ trợ cho bạn ấy được. Nhờ ongke0711, maidinhdan và cac bạn hỗ trợ dùm
https://drive.google.com/u/0/uc?id=1D8qM...t=download -
RE: Tính Bình Quân Gia Quyền
ongke0711 > 11-12-21, 12:23 PM
Chắc phải mấy bữa nữa mới xem được anh Ân. Giờ đang bận một số việc nên chưa ngồi xem, phân tích cái CSDL này được. Bạn nào khác có cách làm thì đưa lên luôn nhé. -
RE: Tính Bình Quân Gia Quyền
Noname > 13-12-21, 10:34 AM
Bình quân gia quyền lại chia 2 cách: Bình quân cả kỳ và bình quân theo thời điểm (mỗi lần nhập xuất kho).
Theo mình thì nên dùng cách 2 tận dụng sức mạnh máy tính.
Nhìn dữ liệu bạn này thấy đang có để 1 table tồn đầu, 1 table nhập, 1 table xuất
Như vậy phương pháp mình gợi ý như sau:
Dùng Union để join 3 table lại, nhất thiết phải có các cột cơ bản: Ngày , mã hàng, tên hàng, Số lượng, đơn giá
Tồn đầu có thể gán ngày là ngày đầu kỳ
Số lượng của table nhập giữ nguyên, table xuất thì nhân -1
.
Giá bình quân 1 mã hàng theo thời điểm = sum (số lượng*đơn giá) /sum(số lượng) where ngày=<[ngày thời điểm cần tính] and [mã hàng] = [mã hàng cần tìm]
Chi tiết thì phải tốn thời gian sửa chương trình nên lười. -
RE: Tính Bình Quân Gia Quyền
tranthanhan1962 > 14-12-21, 12:10 AM
Mình vừa mới mở file của bạn tuanhungkcs xem trong office 2019. Có mốt số ý kiến như sau:
Như bác Noname đã nói dữ liệu trong database chưa đủ để xử lý BQGQ được. từ các table trên phải xử lý chuyển về thành 1 table với đầy đủ các field như sau:
Ở đây như bác Noname nói có 2 cách xử lý, 1 là thời điểm, 2 là giai đoạn. Tôi chọn cách 2 vì báo cáo kế toán theo giai đoạn hàng tháng, hàng năm.
Cách này sẽ có 1 điểm sẽ xảy ra chuyện khuyết dữ liệu hàng hóa tháng nếu tháng đó không phát sinh (không nhập, không xuất) cần phải bổ sung (nhập = 0, xuất = 0)
Field [NAMTHANG] (Năm tháng) tôi chuyển sang dạng text dưới dạng yyyymm để dễ dàng sắp xếp không ảnh hưởng gì đến việc tạo report báo cáo, các field khác gồm có:
TENHANG (Tên hàng)-DVT(Đơn vị tính)-GTTDK(Giá trị tồn đầu kỳ)-SLTDK(Số lượng tồn đầu kỳ)-GTNTT(Giá trị nhập trong kỳ)-SLNTT(Số lượng nhập trong kỳ)-GTXTT(Giá trị xuất trong kỳ)-SLXTT(Số lượng xuất trong kỳ)-GTTCK(Giá trị tồn cuối kỳ)-SLTCK(Số lượng tồn cuối kỳ), Ngoài ra còn bổ sung các field BQDK(Bình quân đầu kỳ)-BQTT(Bình quân trong tháng)-BQCK(Bình quân cuối kỳ) . Trong đó các field: GTNTT, SLNTT, SLXTT là các giá trị thực tế phát sinh được cập nhật, các field khác sẽ do code chương trình tính toán
Đặc điểm của code tính toán do nhiều loại hàng hóa, mỗi loại chạy nhiều tháng liên tục nên table phải được sắp xêp từ A->Z ưu tiên là tên hàng kế tiếp là năm tháng. Code sẽ chạy hết tên hàng này đến tên hàng khác và tuần tự từ record tháng đầu tiên đến record thàng cuối cùng sau đó chuyển sang tên hàng khác.
Một vài lưu ý: Một lưu ý, do mỗi năm có 12 tháng số lượng record = số lượng tên hàng x 12 x số năm nên khi chạy code sẽ có số lương record có thể rất lớn news chạy trên access 2003 khi chạy toàn bộ record có thể gây lỗi do giới hạn record, giới hạn bộ nhớ, trong trường hợp này phải xử lý nhiều cách chia ra nhiều đợt chạy code khống chế chạy giới hạn trong khoảng record bị thay đổi giá trị (do mỗi database xử lý mỗ khác nên không thể đưa ra một phương pháp chung được) tốt nhất chuyển từ mdb sang accdb và máy mạnh hơn (ví dụ core i5 - ram 4g) có thể chạy thẳng 1 mạch từ record đầu -> record cuối một cách OK.
Dưới đây là code để y BQGQ:
Sub BQGQ()
Dim CSDL As Database
Dim B01 As DAO.Recordset ' Khai báo với accdb, nếu mdb: Dim B01 As Recordset
Dim MAHANG As String
Dim SLT, GTT, BQT As Double ' SLT (số lượng tồn), GTT (giá trị tồn), BQT (bình quân tồn)
Set CSDL = CurrentDb
Set B01 = CSDL.OpenRecordset("table_NHAPXUAT", DB_OPEN_DYNASET) ' table_NHAPXUAT là bảng nhập xuất hàng hóa
SLT = 0
GTT = 0
MAHANG = ""
B01.MoveFirst
Do While Not B01.EOF ' Chạy vòng lập
If B01![TENHANG] = MAHANG Then ' Nếu Tên hàng = Mã cũ thì tính theo Công thức dưới đây
B01.Edit
B01![BQTK] = BQT
B01![SLTDK] = SLT
B01![GTTDK] = GTT
If B01![SLTDK] + B01![SLNTT] = 0 Then ' Nếu bị lỗi 0/0 thì = 0
B01![BQTK] = 0
Else
B01![BQTK] = (B01![GTTDK] + B01![GTNTT]) / (B01![SLTDK] + B01![SLNTT])
End If
B01![GTXTT] = B01![BQTK] * B01![SLXTT]
B01![SLTCK] = B01![SLTDK] + B01![SLNTT] - B01![SLXTT]
B01![GTTCK] = B01![GTTDK] + B01![GTNTT] - B01![GTXTT]
B01![BQCK] = B01![BQTK]
B01.Update
Else
If B01![SLNTT] > 0 Then
B01.Edit
B01![BQTK] = B01![GTNTT] / B01![SLNTT]
B01![GTXTT] = B01![BQTK] * B01![SLXTT]
B01![SLTCK] = B01![SLNTT] - B01![SLXTT]
B01![GTTCK] = B01![GTNTT] - B01![GTXTT]
B01![BQCK] = B01![BQTK]
B01.Update
End If
End If
MAHANG = B01![TENHANG]
BQT = B01![BQCK]
SLT = B01![SLTCK]
GTT = B01![GTTCK]
B01.MoveNext
Loop
B01.Close
End Sub
Chúc bạn thành công. Chú ý Không đưa giá trị đầu kỳ vào các field tồn đầu mà phải tạo một record nhập tồn đầu kỳ rồi đưa giá trị vào các field nhập
Đ/c nào có p/p hay hơn góp ý dùm. -
RE: Tính Bình Quân Gia Quyền
Xuân Thanh > 21-12-21, 02:12 PM
Dùng Query đi cho nhanh -
RE: Tính Bình Quân Gia Quyền
Xuân Thanh > 21-12-21, 02:34 PM
Xem lại đoạn code của đ/c Ân thấy có vài vấn đề sau
1/ Hình như là tính cho mỗi lần nhập xuất?
2/ Nếu chỉ xuất mà không nhập thì xem lại cái Else (vì chỉ xét hàng nhập)
3/ Làm BQGQ kiểu này chắc kế toán chạy đứt hơi
4/ Giải quyết theo kiểu của Noname là đúng nhất và hay nhất(Tính Sum cho từng thời điểm)
Thân mến -
RE: Tính Bình Quân Gia Quyền
tranthanhan1962 > 22-12-21, 12:24 AM
(21-12-21, 02:34 PM)Xuân Thanh Đã viết: Xem lại đoạn code của đ/c Ân thấy có vài vấn đề sau
Thực ra cái này mình gom lại tổng xuất nhập cho từng tháng (xem như mỗi tháng gom thành 1 record - vì báo cáo BQGQ cụ thể là báo cáo tháng), đây là code chuẩn để viết BQGQ. Ngoài ra sẽ có việc những hàng hóa trong tháng nếu không có nhập xuất phải bổ sung record hàng hóa đó nhập =0, xuất =0, nếu không tên hàng đó sẽ không xuất hiện trên báo cáo cho dù có hàng tồn. Khi chạy toàn bộ các record nếu CSDL lưu trữ thời gian dài chắc chắn phải đi uống cà phê. Nhưng nếu sử dụng ngay từ đầu khi viết code cho form sẽ chỉ chạy giá trị từ record của tháng trước nên code chỉ chạy 2 tháng (tháng trước và tháng hiện tai và tự động chạy khi unload form nhập dữ liệu nên cũng rất nhanh), tất nhiên khi chỉnh sửa dữ liệu nó sẽ phải chạy từ tháng trước tháng chỉnh sửa 1 tháng nên lâu hay mau tùy thuộc thời gian chỉnh sửa so với tháng hiện tại(Nói chung không thể sử dùng phương pháp của Noname cho Báo cáo BQGQ hàng tháng đươc - Tên chính thức của bảng này là Bảng cân đối hàng hóa).
1/ Hình như là tính cho mỗi lần nhập xuất?
2/ Nếu chỉ xuất mà không nhập thì xem lại cái Else (vì chỉ xét hàng nhập)
3/ Làm BQGQ kiểu này chắc kế toán chạy đứt hơi
4/ Giải quyết theo kiểu của Noname là đúng nhất và hay nhất(Tính Sum cho từng thời điểm)
Thân mến
Còn cũng phải sử dụng p/p của Noname cho cái gọi Sổ hàng hóa. Sổ này sẽ chạy từng loại hàng riêng và chỉ chạy chi tiết khi có phát sinh.
Thực ra code này tôi chỉ tách phần chuẩn cho Báo cáo nhập xuất tồn BQGQ, Khi tôi viết 1 đoạn code thực sự cho BQGQ còn phức tạp hơn, sẽ còn field hao hụt (hao hụt cũng là xuâts), quan trong hơn nữa là giá trị BQGQ luôn luôn lẻ nên sau khi chạy nhiều record sẽ bị lệch nên:
GIÁ VỐN = SỐ LƯỢNG * (B01![GTTDK] + B01![GTNTT]) / (B01![SLTDK] + B01![SLNTT]) sẽ được thay bằng:
GIÁ VỐN = Round(SỐ LƯỢNG * (B01![GTTDK] + B01![GTNTT]) / (B01![SLTDK] + B01![SLNTT])) => Giá trị tồn kho cũng sẽ là số nguyên.
Kinh nghiệm do lúc đầu không tính Round nên cuối năm luôn phải viết báo cáo điều chỉnh mấy đồng bạc lệch cho cơ quan thuế. Thực ra viết code cho BQGQ cho vốn hàng hóa còn nhẹ hơn viết giá vốn cho nhập trươc xuất trước nhập sau xuất sau nhiều. Nói chung báo cáo kế toán bằng access tất cả đều ưu việt hơn excel trừ báo cáo giá vốn