• Giúp mình cập nhật đơn giá bình quân gia quyền
  • Giúp mình cập nhật đơn giá bình quân gia quyền

    thucgia > 12-09-15, 04:33 PM

    Mình có cái database access như cái link dưới, bi giờ mình muốn tạo một cái form tabular chẳng hạn, để khi sửa đổi thông tin một dòng nào đó thì lập tức nguyên một tabular form sẽ được cập nhật lại đơn giá bình quân gia quyền và cập nhật lại cột thành tiền thì làm thế nào hả các bạn?
    thk you...

    qlkho




    Có bạn nào chuyên gia kế toán cho mình hỏi với

    Theo mình biết thì Đơn giá bình quân gia quyền được tính như sau:

    Don gia BQGQ=(Giá trị hàng tồn / Số lượng hàng tồn)

    => Đơn giá BQGQ thay đổi sau khi nhập mặt hàng có đơn giá khác với giá cũ

    Vậy sau khi xuất một mặt hàng có đơn giá BQGQ thì Đơn giá mặt hàng đó có thay đổi hay không?

    Mình nghĩ câu trả lời là không, Các bạn thấy đúng không?



    [url=https://drive.google.com/file/d/0B7kM2os_eKc5N0UwelFLSjZHWGM/view?usp=sharing][/url]
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    ongke0711 > 13-09-15, 09:52 PM

    007  Tôi không phải chuyên gia kế toán nhưng cũng có biết chút ít nên chia sẽ ý kiến như sau:
    - Công thức tính GBQGQ của bạn gần đúng.
    - Khi xuất hàng với giá BQGQ thì không làm thay đổi đơn giá BQ.


    Tối biết có mấy các tính BQGQ như sau:
    1. BQGQ cuối kỳ: đến cuối kỳ mới tính giá vốn hàng xuất. Cách này dễ tính nhưng dồn đến cuối tháng mới tính nên sẽ không phản ánh giá ngay lúc phát sinh nghiệp vụ
          GBQGQ= (Giá trị hàng tồn đầu kỳ + Giá trị hàng nhập trong kỳ) / (Số lượng hàng tồn ĐK+ Số lượng hàng nhập TK)

    2. Tính GBQGQ sau mỗi lần nhập: khi có phát sinh nhập hàng là tính trước khi xuất hàng. Phải dùng phần mềm để tính vì phải tính toán liên tục khi nghiệp vụ nhập xuất phát sinh.
          GBQGQ = (Giá trị hàng tồn đầu kỳ + Giá trị hàng nhập trước khi xuất) / (Số lượng hàng tồn ĐK+ Số lượng hàng nhập trước khi xuất)

    3. Tính GBQGQ cuối kỳ trước: cách này dễ tính. Dựa vào số lượng tồn kho cuối kỳ trước để tính ra giá xuất. Phương pháp này sẽ không phản ánh đúng giá thực của vật tư nhập trong kỳ này.
          GBQGQ= (Giá trị hàng tồn cuối kỳ trước) / (Số lượng hàng tồn cuối kỳ trước)
    (công thức bạn gần đúng ở chỗ này)

    Mỗi phương pháp có ưu nhược điểm, bạn nghiên cứu thêm nhé. Tôi thì thích dùng phương pháp 2.
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    tranthanhan1962 > 13-09-15, 10:07 PM

    Mình thấy bài bạn post lên mấy ngày nay. Nhưng suy nghĩ mãi mà không biết phải hỗ trợ bạn như thế nào. Khác với excel, BQGQ trên access không hề đơn giản. khi chạy BQGQ không thể xử lý bằng cách thay đổi 1 record là nó chạy ngay ra kết quả được. Vì không khéo nó rất dễ bị lỗi “Out Of Memory”.
    Thông thường báo cáo tài chính có 2 báo cáo sử dụng đơn giá BQGQ là báo cáo kho (tháng, năm) và sổ hàng hóa.
    Công thức của nó cho từng loại hàng hóa là:
    Đơn giá BQGQ = (Giá trị tồn đầu + Giá trị nhập) / (Số lượng tồn đầu + Số lượng nhập)
    Vì vậy chỉ khi hàng nhập là có đơn giá khác với đơn giá BQGQ cũ thì đơn giá BQGQ mới sẽ thay đổi ngay. Hàng hóa xuất trong khoảng giữa hai lần nhập sẽ lấy đơn giá vốn chính là đơn giá BQGQ giữa 2 lần nhập. Lý do số lượng nhập xuất trong năm rất nhiều dễ bị thiếu bộ nhớ khi chạy code.
    Một điều nữa nếu trong tháng có một loại hàng hóa nào không được nhập xuất thì trên bảng báo cáo kho sẽ không có tên hàng đó. Vì vậy, trên table để tính BQGQ bạn phải bổ sung thêm một record có các giá trị = 0 cho các hàng hóa không có nhập xuất nếu là BC tháng.
    Bạn không thể xử lý một Báo cáo chung cho cả ứng dụng mà phải xử lý ngắt ra từng năm. Lấy các số liệu tồn cuối của năm trước làm tồn đầu năm sau để tránh lỗi thiếu bộ nhớ.
    Thêm nữa nếu chỉ xử lý đơn giản thì sẽ xảy ra rất nhiều chuyện. Lỗi khi hết hàng, âm hàng. Số lượng hàng hóa đã hết mà giá trị hàng hóa vẫn còn (do đơn giá BQGQ là số lẽ khi nhân với số lượng bán sẽ nhỏ hơn giá trị tồn).
    Vì vậy cách xử lý của tôi rất phức tạp, tôi đưa nhiều đoạn mã vào nhiều event xử lý từng phần để bảo đảm tốc độ của phần mềm. Tôi chỉ có thể gởi cho bạn một đoạn code chung để hỗ trợ cho bạn. Đoạn code này chỉ có giá trị tham khảo. Còn cách xử lý là do bạn quyết định. Đoạn code này sẽ căn cứ vào một table đã được sắp xếp lại theo thứ tự nhập xuất theo ngày để xử lý tạo sổ hàng hóa. Tất cả các record phát sinh của một loại hàng hóa / ngày trong được cộng lại trên một record (Nếu báo cáo tháng của sổ hàng hóa sẽ bổ sung record có giá trị 0 cho loại hàng nào không có phát sinh, nếu báo cáo năm thì không cần) – Đối với báo cáo hàng tồn kho thì gom các phát sinh hàng hóa trong tháng thành 1 record cho từng loai hàng bổ sung hàng không phát sinh trong tháng.
    Chú giải trong code SOHANGHOACHITIET là table. Table SOHANGHOACHITIET được sắp xếp như sau:
    Các record trong cùng 1 loại hàng sắp liên tục theo ngày, hết loại hàng này mới đến loại hàng khác.
    Các field của SOHANGHOACHITIET.
    [TT] = Thứ tự
    [TENHANG] = Tên hàng
    [BQTK] = Đơn giá bình quân trong kỳ
    [SLTDK] = Số lượng tồn đầu kỳ
    [GTTDK] = Giá trị tồn đầu kỳ
    [SLNTK] = Số lượng nhập trong kỳ
    [GTNTK] = Giá trị nhập trong kỳ
    [SLXTK] = Số lượng xuất 
    [GTXTK] = Giá trị xuất trong kỳ
    [SLHTK] = Số lượng hao hụt trong kỳ (Nếu không có hao hụt thì bỏ phần này)
    [GTHTK] = Giá trị hao hụt trong kỳ
    [SLTCK] = Số lượng tồn cuối kỳ
    [GTTCK] = Giá trị tồn cuối kỳ
    Các tham số trong code
    MAHANG = Tham số cho tên hàng
    SLT = Tham số số lượng tồn cuối
    GTT = Tham số giá trị tồn cuối
    BQT = Tham số đơn giá bình quân
    STT = Tham số cho Số thứ tự

    Code này xử lý trên form Form_NXTHANGHOA. Trong table SOHANGHOACHITIET có các giá trị tồn đầu của record đầu tiên / từng loại hàng hóa được lấy từ giá trị tồn cuối kỳ trước, và trên record đầu tiên của từng loại hàng không tính các giá trị tồn đầu. 


    Mã:
    Private Sub XEM_Click()
    On Error GoTo Biloi
    Dim stDocName As String
    Dim CSDL As Database
    Dim BangHH As Recordset 
    Dim MAHANG As String  
    Dim SLT, GTT, BQT As Double  
    Dim STT As Integer

    Set CSDL = CurrentDb
    Set BangHH = CSDL.OpenRecordset("SOHANGHOACHITIET", DB_OPEN_DYNASET)
    SLT = 0
    GTT = 0
    STT = 0
    MAHANG = ""
    BangHH.MoveFirst
    Do While Not BangHH.EOF
        BangHH.Edit
        BangHH![TT] = STT + 1
        If BangHH![TENHANG] = MAHANG Then
        BangHH![SLTDK] = SLT
        BangHH![GTTDK] = GTT
        BangHH![GTXTK] = BangHH![SLXTK] * BangHH![BQTK]
        BangHH![SLTCK] = BangHH![SLTDK] + BangHH![SLNTK] - BangHH![SLXTK] - BangHH![SLHTK]
        BangHH![GTHTK] = BangHH![SLHTK] * BangHH![BQTK]
        BangHH![GTTCK] = BangHH![GTTDK] + BangHH![GTNTK] - BangHH![GTXTK] - BangHH![GTHTK]
        SLT = BangHH![SLTCK]
        GTT = BangHH![GTTCK]
        Else
        If BangHH![NGAY] < Form_NXTHANGHOA.NGAYDAU.Value Then
        BangHH![GTTDK] = BangHH![SLTDK] * BangHH![BQDK]
        BangHH![GTXTK] = BangHH![SLXTK] * BangHH![BQTK]
        BangHH![GTHTK] = BangHH![SLHTK] * BangHH![BQTK]
        BangHH![GTTCK] = BangHH![SLTCK] * BangHH![BQCK]
        SLT = BangHH![SLTCK]
        GTT = BangHH![GTTCK]
        Else
        BangHH![GTTDK] = BangHH![SLTDK] * BangHH![BQDK]
        BangHH![GTXTK] = BangHH![SLXTK] * BangHH![BQTK]
        BangHH![SLTCK] = BangHH![SLTDK] + BangHH![SLNTK] - BangHH![SLXTK] - BangHH![SLHTK]
        BangHH![GTHTK] = BangHH![SLHTK] * BangHH![BQTK]
        BangHH![GTTCK] = BangHH![GTTDK] + BangHH![GTNTK] - BangHH![GTXTK] - BangHH![GTHTK]
        SLT = BangHH![SLTCK]
        GTT = BangHH![GTTCK]
        End If
        End If
        STT = BangHH![TT]
        MAHANG = BangHH![TENHANG]
        BangHH.Update
    BangHH.MoveNext
    Loop
    BangHH.Close

        stDocName = "RNXTONHANGCHITIET"
        DoCmd.OpenReport stDocName, acPreview


    Biloi:
        
    End Sub
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    thucgia > 13-09-15, 11:15 PM

    (13-09-15, 10:07 PM)tranthanhan1962 Đã viết: Mình thấy bài bạn post lên mấy ngày nay. Nhưng suy nghĩ mãi mà không biết phải hỗ trợ bạn như thế nào. Khác với excel, BQGQ trên access không hề đơn giản. khi chạy BQGQ không thể xử lý bằng cách thay đổi 1 record là nó chạy ngay ra kết quả được. Vì không khéo nó rất dễ bị lỗi “Out Of Memory”.
    Thông thường báo cáo tài chính có 2 báo cáo sử dụng đơn giá BQGQ là báo cáo kho (tháng, năm) và sổ hàng hóa.
    Công thức của nó cho từng loại hàng hóa là:
    Đơn giá BQGQ = (Giá trị tồn đầu + Giá trị nhập) / (Số lượng tồn đầu + Số lượng nhập)
    Vì vậy chỉ khi hàng nhập là có đơn giá khác với đơn giá BQGQ cũ thì đơn giá BQGQ mới sẽ thay đổi ngay. Hàng hóa xuất trong khoảng giữa hai lần nhập sẽ lấy đơn giá vốn chính là đơn giá BQGQ giữa 2 lần nhập. Lý do số lượng nhập xuất trong năm rất nhiều dễ bị thiếu bộ nhớ khi chạy code.
    Một điều nữa nếu trong tháng có một loại hàng hóa nào không được nhập xuất thì trên bảng báo cáo kho sẽ không có tên hàng đó. Vì vậy, trên table để tính BQGQ bạn phải bổ sung thêm một record có các giá trị = 0 cho các hàng hóa không có nhập xuất nếu là BC tháng.
    Bạn không thể xử lý một Báo cáo chung cho cả ứng dụng mà phải xử lý ngắt ra từng năm. Lấy các số liệu tồn cuối của năm trước làm tồn đầu năm sau để tránh lỗi thiếu bộ nhớ.
    Thêm nữa nếu chỉ xử lý đơn giản thì sẽ xảy ra rất nhiều chuyện. Lỗi khi hết hàng, âm hàng. Số lượng hàng hóa đã hết mà giá trị hàng hóa vẫn còn (do đơn giá BQGQ là số lẽ khi nhân với số lượng bán sẽ nhỏ hơn giá trị tồn).
    Vì vậy cách xử lý của tôi rất phức tạp, tôi đưa nhiều đoạn mã vào nhiều event xử lý từng phần để bảo đảm tốc độ của phần mềm. Tôi chỉ có thể gởi cho bạn một đoạn code chung để hỗ trợ cho bạn. Đoạn code này chỉ có giá trị tham khảo. Còn cách xử lý là do bạn quyết định. Đoạn code này sẽ căn cứ vào một table đã được sắp xếp lại theo thứ tự nhập xuất theo ngày để xử lý tạo sổ hàng hóa. Tất cả các record phát sinh của một loại hàng hóa / ngày trong được cộng lại trên một record (Nếu báo cáo tháng của sổ hàng hóa sẽ bổ sung record có giá trị 0 cho loại hàng nào không có phát sinh, nếu báo cáo năm thì không cần) – Đối với báo cáo hàng tồn kho thì gom các phát sinh hàng hóa trong tháng thành 1 record cho từng loai hàng bổ sung hàng không phát sinh trong tháng.
    Chú giải trong code SOHANGHOACHITIET là table. Table SOHANGHOACHITIET được sắp xếp như sau:
    Các record trong cùng 1 loại hàng sắp liên tục theo ngày, hết loại hàng này mới đến loại hàng khác.
    Các field của SOHANGHOACHITIET.
    [TT] = Thứ tự
    [TENHANG] = Tên hàng
    [BQTK] = Đơn giá bình quân trong kỳ
    [SLTDK] = Số lượng tồn đầu kỳ
    [GTTDK] = Giá trị tồn đầu kỳ
    [SLNTK] = Số lượng nhập trong kỳ
    [GTNTK] = Giá trị nhập trong kỳ
    [SLXTK] = Số lượng xuất 
    [GTXTK] = Giá trị xuất trong kỳ
    [SLHTK] = Số lượng hao hụt trong kỳ (Nếu không có hao hụt thì bỏ phần này)
    [GTHTK] = Giá trị hao hụt trong kỳ
    [SLTCK] = Số lượng tồn cuối kỳ
    [GTTCK] = Giá trị tồn cuối kỳ
    Các tham số trong code
    MAHANG = Tham số cho tên hàng
    SLT = Tham số số lượng tồn cuối
    GTT = Tham số giá trị tồn cuối
    BQT = Tham số đơn giá bình quân
    STT = Tham số cho Số thứ tự

    Code này xử lý trên form Form_NXTHANGHOA. Trong table SOHANGHOACHITIET có các giá trị tồn đầu của record đầu tiên / từng loại hàng hóa được lấy từ giá trị tồn cuối kỳ trước, và trên record đầu tiên của từng loại hàng không tính các giá trị tồn đầu. 


    Mã:
    Private Sub XEM_Click()
    On Error GoTo Biloi
    Dim stDocName As String
    Dim CSDL As Database
    Dim BangHH As Recordset 
    Dim MAHANG As String  
    Dim SLT, GTT, BQT As Double  
    Dim STT As Integer

    Set CSDL = CurrentDb
    Set BangHH = CSDL.OpenRecordset("SOHANGHOACHITIET", DB_OPEN_DYNASET)
    SLT = 0
    GTT = 0
    STT = 0
    MAHANG = ""
    BangHH.MoveFirst
    Do While Not BangHH.EOF
        BangHH.Edit
        BangHH![TT] = STT + 1
        If BangHH![TENHANG] = MAHANG Then
        BangHH![SLTDK] = SLT
        BangHH![GTTDK] = GTT
        BangHH![GTXTK] = BangHH![SLXTK] * BangHH![BQTK]
        BangHH![SLTCK] = BangHH![SLTDK] + BangHH![SLNTK] - BangHH![SLXTK] - BangHH![SLHTK]
        BangHH![GTHTK] = BangHH![SLHTK] * BangHH![BQTK]
        BangHH![GTTCK] = BangHH![GTTDK] + BangHH![GTNTK] - BangHH![GTXTK] - BangHH![GTHTK]
        SLT = BangHH![SLTCK]
        GTT = BangHH![GTTCK]
        Else
        If BangHH![NGAY] < Form_NXTHANGHOA.NGAYDAU.Value Then
        BangHH![GTTDK] = BangHH![SLTDK] * BangHH![BQDK]
        BangHH![GTXTK] = BangHH![SLXTK] * BangHH![BQTK]
        BangHH![GTHTK] = BangHH![SLHTK] * BangHH![BQTK]
        BangHH![GTTCK] = BangHH![SLTCK] * BangHH![BQCK]
        SLT = BangHH![SLTCK]
        GTT = BangHH![GTTCK]
        Else
        BangHH![GTTDK] = BangHH![SLTDK] * BangHH![BQDK]
        BangHH![GTXTK] = BangHH![SLXTK] * BangHH![BQTK]
        BangHH![SLTCK] = BangHH![SLTDK] + BangHH![SLNTK] - BangHH![SLXTK] - BangHH![SLHTK]
        BangHH![GTHTK] = BangHH![SLHTK] * BangHH![BQTK]
        BangHH![GTTCK] = BangHH![GTTDK] + BangHH![GTNTK] - BangHH![GTXTK] - BangHH![GTHTK]
        SLT = BangHH![SLTCK]
        GTT = BangHH![GTTCK]
        End If
        End If
        STT = BangHH![TT]
        MAHANG = BangHH![TENHANG]
        BangHH.Update
    BangHH.MoveNext
    Loop
    BangHH.Close

        stDocName = "RNXTONHANGCHITIET"
        DoCmd.OpenReport stDocName, acPreview


    Biloi:
        
    End Sub

    Giải pháp của bạn là cập nhật table nhập xuất bằng code mình thấy rất hay cám ơn bạn.
    Mình nẩy ra một ý là cần phải viết một
       function tính đơn giá bình quân tại thời điểm (hang_id as string, ngay as date)
       Sau đó kết hợp với cái loop update của bạn là ok., rất hay

    Mã:
    Public Sub CapNhat_nhap_xuat()
       Dim rs As DAO.Recordset
       Dim st As String
       Set rs = CurrentDb.OpenRecordset("nhap_xuat", dbOpenDynaset)
       Do While Not rs.EOF
          rs.Edit
          If (rs!loai = "N") Then
               'do nothing
          Else
               rs!don_gia = thekho.don_gia_bq_ngay(rs!hang_id, rs!ngay)
          End If
          rs!tien = rs!solg * rs!don_gia
          rs.Update
          rs.MoveNext
       Loop
       Set rs = Nothing
    End Sub


    Tôi không phải là dân kế toán, nhưng lại đang gặp vấn đề này và thấy bài toán có vẻ hay nên định viết một cái đễ xài.
    làm bằng cái excel thấy có vẻ vớ vẫn quá.

    Theo bạn thì CSDL của tôi đưa ra là có hợp lý không?
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    tranthanhan1962 > 13-09-15, 11:41 PM

    Mã:
    Public Sub CapNhat_nhap_xuat()
      Dim rs As DAO.Recordset
      Dim st As String
      Set rs = CurrentDb.OpenRecordset("nhap_xuat", dbOpenDynaset)
      Do While Not rs.EOF
         rs.Edit
         If (rs!loai = "N") Then
              'tại dây bạn không thể do nothing mà phải xử lý đơn giá bình quân mới nếu có nhập. Nhưng nếu chỉ có thekho.don_gia_bq_ngay thì bạn sẽ không đủ tham số để tính đơn giá bình quân mới. (thekho.don_gia_bq_ngay mới sẽ thay đổi khi có hàng hóa nhập mới)
         Else
              rs!don_gia = thekho.don_gia_bq_ngay(rs!hang_id, rs!ngay)
         End If
         rs!tien = rs!solg * rs!don_gia
         rs.Update
         rs.MoveNext
      Loop
      Set rs = Nothing
    End Sub
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    thucgia > 14-09-15, 09:13 AM

    (13-09-15, 11:41 PM)tranthanhan1962 Đã viết:
    Mã:
    Public Sub CapNhat_nhap_xuat()
      Dim rs As DAO.Recordset
      Dim st As String
      Set rs = CurrentDb.OpenRecordset("nhap_xuat", dbOpenDynaset)
      Do While Not rs.EOF
         rs.Edit
         If (rs!loai = "N") Then
              'tại dây bạn không thể do nothing mà phải xử lý đơn giá bình quân mới nếu có nhập. Nhưng nếu chỉ có thekho.don_gia_bq_ngay thì bạn sẽ không đủ tham số để tính đơn giá bình quân mới. (thekho.don_gia_bq_ngay mới sẽ thay đổi khi có hàng hóa nhập mới)
         Else
              rs!don_gia = thekho.don_gia_bq_ngay(rs!hang_id, rs!ngay)
         End If
         rs!tien = rs!solg * rs!don_gia
         rs.Update
         rs.MoveNext
      Loop
      Set rs = Nothing
    End Sub

    À, tại mình qui định là khi input phiếu nhập thì cho phép gõ đơn giá, còn khi ra phiếu xuất thì máy sẽ tự cấp đơn giá
    vì vậy nếu dòng có loại="N" sẽ không bị sửa đơn giá

    còn cái hàm   don_gia_bq_ngay(rs!hang_id, rs!ngay)
    có nhiệm vụ xác định đơn giá bình quân trước ngày hiện tại đang xét trong vòng loop

    hix bài toán này hay!!!!
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    tranthanhan1962 > 14-09-15, 12:58 PM

    Cho dù bạn nhập đơn giá nhập và số lượng nhập bằng input box hay lấy từ đâu, thì cũng phải có công thức tính lại đơn giá bình quân mới [Đơn giá BQGQ mới = (Giá trị hàng tồn ? + giá trị hàng mới nhập) / (Số lượng hàng tồn ? + số lượng hàng mới nhập)]. Thiếu GT hàng tồn và SL hàng tồn bạn sẽ không xử lý được đơn giá BQGQ mới.
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    thucgia > 14-09-15, 07:26 PM

    (14-09-15, 12:58 PM)tranthanhan1962 Đã viết: Cho dù bạn nhập đơn giá nhập và số lượng nhập bằng input box hay lấy từ đâu, thì cũng phải có công thức tính lại đơn giá bình quân mới [Đơn giá BQGQ mới = (Giá trị hàng tồn ? + giá trị hàng mới nhập) / (Số lượng hàng tồn ? + số lượng hàng mới nhập)]. Thiếu GT hàng tồn và SL hàng tồn bạn sẽ không xử lý được đơn giá BQGQ mới.

    Để tranh luận về vấn đề này tôi tóm tắc lại nhé:
    Đề bài:
    Viết chương trình quản lý kho có các chức năng sau
    1. Cho phép nhập hàng (add phiếu)
        -Để đơn giản cho lý luận, phiếu nhập chỉ yêu cầu nhập 1 mặt hàng
        -Đơn giá được nhập bởi người dùng
        -Ngày phiếu nhập phải lớn hơn ngày max ( tôi định nghĩa bên dưới)
    2. Cho phép xuất hàng (add phiếu)
       - Chỉ cần xuất 1 mặt hàng
       - Đơn giá được tính từ chương trình theo bình quân gia quyền
       - Ngày phiếu xuất phải lớn hơn ngày max ( tôi định nghĩa bên dưới)
    3. Cho phép sửa chửa bất kỳ phiếu nhập, xuất
      - Để đơn giản Không cần xét vấn đề âm kho (Khi sửa sẽ có thể bị âm kho!!!!)

    B.Phân tích:

    B.1.Định nghĩa từ ngữ và phương thức
    - gọi ngay_max : là ngày lớn nhất trong quá trình nhập xuất
    - gọi ngay_min : là ngày nhỏ nhất trong quá trinh nhập xuất

    Theo tôi có 2 phương thức quan trọng cần được soát xét
    - function don_gia_bq(hang_id)
              Đây là func xác định đơn giá bình quân của một mặt hàng để tính toán trong phiếu xuất
              Thực sự đây là DGBQ trước ngày max của một mặt hàng
    - function don_gia_bq_truoc_ngay(hang_id,ngay)
            Để sử dụng khi ta edit một phiếu nhập hoặc xuất
            Là DGBQ của một mặt hàng trước một ngày xác đinh

    B.2. Thực hiện chức năng

    1. Chức năng 1: Chỉ cần kiểm tra ngày lớn hơn ngay max nếu ok sẽ thêm dòng vào bảng nhập xuất --OK?
    2. Chức năng 2: Dùng function don_gia_bq(hang_id) để tính đơn giá + kiểm tra ngày xuất nếu ok -> thêm dòng xuất vào bảng nx
    3. Chức năng 3:
         Khi người dùng chỉnh sửa một dòng của bảng nhập xuất ta sẽ bắt sự kiện after update và chạy cái sub đã đề cập trên

    Mã:
    Public Sub CapNhat_nhap_xuat()
     Dim rs As DAO.Recordset
     Dim st As String
     Set rs = CurrentDb.OpenRecordset("nhap_xuat", dbOpenDynaset)
     Do While Not rs.EOF
        rs.Edit
        If (rs!loai = "N") Then
             'tại dây bạn không thể do nothing mà phải xử lý đơn giá bình quân mới nếu có nhập. Nhưng nếu chỉ có thekho.don_gia_bq_ngay thì bạn sẽ không đủ tham số để tính đơn giá bình quân mới. (thekho.don_gia_bq_ngay mới sẽ thay đổi khi có hàng hóa nhập mới)
             'with me this is must do nothing!!!!
        Else
             rs!don_gia = thekho.don_gia_bq_truoc_ngay(rs!hang_id, rs!ngay)
        End If
        rs!tien = rs!solg * rs!don_gia
        rs.Update
        rs.MoveNext
     Loop
     Set rs = Nothing
    End Sub
             
    Mình suy nghĩ thế, có gì cứ tiếp tranh luận nhé..
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    tranthanhan1962 > 14-09-15, 11:06 PM

    Hì hì! Chiều nay trời mưa tầm tã. Nhưng có hẹn với mấy anh em cục thuế đi nhậu. Phải đi thôi. Đồng thời hẹn anh em ngày mai chuyển mail bảng excel hàng tồn cho anh em kiểm tra (trùng hợp quá nhỉ). Về mở máy thấy bạn phán một câu: Mình suy nghĩ thế, có gì cứ tiếp tranh luận nhé… Sorry. Mình không cần phải tranh luận với bạn đâu. Phương pháp hạch toán hàng tồn kho là do Tổng cục thuế quy định. Khi kinh doanh bạn phải đăng ký với đơn vị báo cáo thuế (cục hay chi cục tùy theo ngành nghề) Phương pháp tính giá trị hàng tồn kho. Có mấy cách hạch toán như sau:
    1/ Phương pháp tính theo giá đích danh.
    2/ Phương pháp bình quân gia quyền.
    3/ Phương pháp nhập trước xuất trước (FIFO).
    4/ Phương pháp nhập sau xuất trước (LIFO).
    Vậy thôi. Chương trình của bạn chạy như thế nào không biết. Khi cơ quan thuế kiểm tra. Bạn in report cho bộ phận kiểm tra. Nhưng bổng nhiên bộ phận kiểm tra báo với bạn: Chuyển cho tôi thành file excel báo cáo tồn kho của anh. Bạn phải biến report của bạn thành file excel (chỉ cần số liệu không có công thức cũng được). Nhưng nếu report của bạn có số liệu không đúng với phương pháp hạch toán bạn đã đăng ký thì bạn phải xuất toán, bạn phải nộp phạt.
    Vì vậy. Công thức hàng tồn kho tính giá vốn (giá vốn là giá xuất kho, căn cứ vào giá xuất kho cơ quan thuế sẽ xác định lãi gộp, và bạn sẽ nộp thuế % hoặc theo tỷ lệ ngàng nghề = % nào đó trên lãi ròng [lãi ròng = lãi gộp – chi phí]) nếu theo đơn giá bình quân gia quyền sẽ = (giá trị hàng tồn + cộng giá trị hàng nhập) / (số lượng hàng tồn + số lượng hàng nhập). Nếu bạn không chứng minh được số liệu của bạn đúng công thức này là bạn sẽ bị phạt (căn cứ theo cơ quan thế tính). Vì vậy, ngoài chuyện bạn tính đúng hay sai. Bảng kế toán hàng tồn của bạn phải có đầy đủ các cột theo quy định.
    Đơn giá bình quân trong kỳ – Giá trị tồn đầu – số lượng tồn đầu –  Giá trị nhập – số lượng nhập – Số lượng xuất – Giá trị xuất – Số lượng tồn cuối – Giá trị tồn cuối.
    Những cái bạn cảm thấy tưởng như hợp lý trong các bài bạn đã post lên đều không thể ra được một report như thế.
    Thực sự mình không dám nói bạn làm sai (thực ra là thiếu) nhưng rõ ràng kiểu tính của bạn không đủ để thực hiện một báo cáo bình quân gia quyền hàng tồn kho. Bạn không thể tranh luận với cơ quan thuế. Bạn chỉ có một quyền khẳng định với cơ quan thuế là “tôi làm đúng công thức”, Nếu bạn không khẳng định được điều đó là bạn sai và bạn sẽ bị phạt theo luật thuế. Vì vậy, Điều quan trọng là từ cách tính của bạn có tạo được một report như thế không. Với cách tính của bạn chắc chắn là không!
    Sorry! Nếu có gì làm bạn mất lòng.
  • RE: Giúp mình cập nhật đơn giá bình quân gia quyền

    thucgia > 15-09-15, 12:23 AM

    (14-09-15, 11:06 PM)tranthanhan1962 Đã viết: Hì hì! Chiều nay trời mưa tầm tã. Nhưng có hẹn với mấy anh em cục thuế đi nhậu. Phải đi thôi. Đồng thời hẹn anh em ngày mai chuyển mail bảng excel hàng tồn cho anh em kiểm tra (trùng hợp quá nhỉ). Về mở máy thấy bạn phán một câu: Mình suy nghĩ thế, có gì cứ tiếp tranh luận nhé… Sorry. Mình không cần phải tranh luận với bạn đâu. Phương pháp hạch toán hàng tồn kho là do Tổng cục thuế quy định. Khi kinh doanh bạn phải đăng ký với đơn vị báo cáo thuế (cục hay chi cục tùy theo ngành nghề) Phương pháp tính giá trị hàng tồn kho. Có mấy cách hạch toán như sau:
    1/ Phương pháp tính theo giá đích danh.
    2/ Phương pháp bình quân gia quyền.
    3/ Phương pháp nhập trước xuất trước (FIFO).
    4/ Phương pháp nhập sau xuất trước (LIFO).
    Vậy thôi. Chương trình của bạn chạy như thế nào không biết. Khi cơ quan thuế kiểm tra. Bạn in report cho bộ phận kiểm tra. Nhưng bổng nhiên bộ phận kiểm tra báo với bạn: Chuyển cho tôi thành file excel báo cáo tồn kho của anh. Bạn phải biến report của bạn thành file excel (chỉ cần số liệu không có công thức cũng được). Nhưng nếu report của bạn có số liệu không đúng với phương pháp hạch toán bạn đã đăng ký thì bạn phải xuất toán, bạn phải nộp phạt.
    Vì vậy. Công thức hàng tồn kho tính giá vốn (giá vốn là giá xuất kho, căn cứ vào giá xuất kho cơ quan thuế sẽ xác định lãi gộp, và bạn sẽ nộp thuế % hoặc theo tỷ lệ ngàng nghề = % nào đó trên lãi ròng [lãi ròng = lãi gộp – chi phí]) nếu theo đơn giá bình quân gia quyền sẽ = (giá trị hàng tồn + cộng giá trị hàng nhập) / (số lượng hàng tồn + số lượng hàng nhập). Nếu bạn không chứng minh được số liệu của bạn đúng công thức này là bạn sẽ bị phạt (căn cứ theo cơ quan thế tính). Vì vậy, ngoài chuyện bạn tính đúng hay sai. Bảng kế toán hàng tồn của bạn phải có đầy đủ các cột theo quy định.
    Đơn giá bình quân trong kỳ – Giá trị tồn đầu – số lượng tồn đầu –  Giá trị nhập – số lượng nhập – Số lượng xuất – Giá trị xuất – Số lượng tồn cuối – Giá trị tồn cuối.
    Những cái bạn cảm thấy tưởng như hợp lý trong các bài bạn đã post lên đều không thể ra được một report như thế.
    Thực sự mình không dám nói bạn làm sai (thực ra là thiếu) nhưng rõ ràng kiểu tính của bạn không đủ để thực hiện một báo cáo bình quân gia quyền hàng tồn kho. Bạn không thể tranh luận với cơ quan thuế. Bạn chỉ có một quyền khẳng định với cơ quan thuế là “tôi làm đúng công thức”, Nếu bạn không khẳng định được điều đó là bạn sai và bạn sẽ bị phạt theo luật thuế. Vì vậy, Điều quan trọng là từ cách tính của bạn có tạo được một report như thế không. Với cách tính của bạn chắc chắn là không!
    Sorry! Nếu có gì làm bạn mất lòng.

    hix, đây chỉ là thuật giải trong khuôn khổ đề bài của mình 014 để mình làm cái demo anh kiểm tra giúp nhé.? anh có xài cái access 2010 không vậy?
    Kế toán quả là một môn khoa học.!!!! mình chỉ muốn dùng nó để điều hành và quyết định.