Xin hỏi cách lập bảng cân đối tài khoản trên M.Access

Thảo luận trong 'Ứng dụng Access' bắt đầu bởi nguyentronguyen, 8 Tháng ba 2006.

10,175 lượt xem

  1. nguyentronguyen

    nguyentronguyen Thành viên sơ cấp

    Bài viết:
    19
    Đã được thích:
    0
    Lại phiền các bạn lần nữa:
    Tôi đang làm kế toán HCSN trên M.Access các sổ sách, phiếu thu, chi ... đều làm được riêng bảng cân đối tài khoản thì chịu chết cứ phải xuất sang Excel dùng SumIIf mới giải quyết được. Bạn nào có thể chỉ cho tôi cách làm trên Access được không?
    Tôi có 2 table:
    Table 1: DANH MUC TAI KHOAN có các field MATK(Mã Tài khoản của Bộ Tài chính), TEN TK (Tên tài khoản của Bộ Tài chính), NODKY (Dư Nợ đầu kỳ), CODKY (Dư Có đầu kỳ).
    Table 2: NHAT KY có các field TKNO (Tài khoản ghi nợ), TKCO (Tài khoản ghi có), SOTIEN (Ghi số tiền phát sinh).

    Ghi chú: Toàn bộ các tài khoản trên 2 table trên đều sử dụng tài khoản cấp 1.
    Xin trân trọng cảm ơn.
     
    #1
  2. VAS

    VAS Thành viên hoạt động

    Bài viết:
    30
    Đã được thích:
    1
    Nơi ở:
    www.danketoan.com
    Dear NguyenTrongUyen,

    Theo VAS b?n nên thêm một table " Số Dư" để quản lý số dư theo kỳ.

    Vì bạn không cần theo dõi theo kỳ nên bạn có thể làm don giản như sau

    1/ Thêm 4 cột NOPS, COPS, NOCK, COCK vào Table DMTK ( Ðã có sẵn NODKY & CODKY)

    2/ Chạy đọan code sau

    Để đọan code chạy bạn nhớ tham chiếu tới DAO Library

    Function CDTK()

    Set MAIN = CurrentDb
    Dim PSNO As Recordset
    SQLPSNO = "SELECT [NHAT KY].TKNO, Sum([NHAT KY].SOTIEN) AS SOTIEN FROM [NHAT KY] GROUP BY [NHAT KY].TKNO;"
    Set PSNO = MAIN.OpenRecordset(SQLPSNO, dbOpenDynaset)

    Dim PSCO As Recordset
    SQLPSCO = "SELECT [NHAT KY].TKCO, Sum([NHAT KY].SOTIEN) AS SOTIEN FROM [NHAT KY] GROUP BY [NHAT KY].TKCO;"
    Set PSCO = MAIN.OpenRecordset(SQLPSCO, dbOpenDynaset)

    Dim DMTK As Recordset
    Set DMTK = MAIN.OpenRecordset("DANH MUC TAI KHOAN", dbOpenTable)
    DMTK.Index = "MATK"

    Dim DUNO As Double
    Dim DUCO As Double

    ' Xu ly PS No
    If PSNO.RecordCount > 0 Then
    PSNO.MoveFirst
    Do Until PSNO.EOF
    DMTK.Seek "=", PSNO!TKNO
    If Not DMTK.NoMatch Then
    DMTK.Edit
    DMTK!NOPS = Nz(DMTK!NOPS) + Nz(PSNO!sOtIEN)
    DMTK.Update
    DMTK.Bookmark = DMTK.LastModified
    Else
    DMTK.AddNew
    DMTK!MATK = PSNO!TKNO
    DMTK!NOPS = Nz(PSNO!sOtIEN)
    DMTK.Update
    DMTK.Bookmark = DMTK.LastModified
    End If
    PSNO.MoveNext
    Loop
    End If

    'Xu ly PS co
    If PSCO.RecordCount > 0 Then
    PSCO.MoveFirst
    Do Until PSCO.EOF
    DMTK.Seek "=", PSCO!TKCO
    If Not DMTK.NoMatch Then
    DMTK.Edit
    DMTK!COPS = Nz(DMTK!COPS) + Nz(PSCO!sOtIEN)
    DMTK.Update
    DMTK.Bookmark = DMTK.LastModified
    Else
    DMTK.AddNew
    DMTK!MATK = PSCO!TKCO
    DMTK!COPS = Nz(PSCO!sOtIEN)
    DMTK.Update
    DMTK.Bookmark = DMTK.LastModified
    End If
    PSCO.MoveNext
    Loop
    End If

    'Tinh cuoi ky
    If DMTK.RecordCount > 0 Then

    DMTK.MoveFirst
    Do Until DMTK.EOF
    DMTK.Edit

    DUNO = Nz(DMTK!NODKY) + Nz(DMTK!NOPS) - Nz(DMTK!COPS)
    DUCO = Nz(DMTK!CODKY) + Nz(DMTK!COPS) - Nz(DMTK!NOPS)

    If Nz(DUNO) > Nz(DUCO) Then
    DMTK!NOCKY = DUNO
    Else
    DMTK!COCKY = DUCO
    End If

    DMTK.Update
    DMTK.MoveNext
    Loop
    End If

    MsgBox " Finished !!!"

    PSNO.close
    PSCO.close
    DMTK.close
    MAIN.close

    End Function


    Hi vọng giúp được cho bạn,

    Nếu không được gởi mail file data cho VAS, VAS sẽ làm rồi gởi lại.

    Thân
     
    Last edited: 9 Tháng ba 2006
    #2
  3. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Theo mình thì dùng cách RelationShip:

    B1) Tạo các Query:
    1- "TH PSNO theo TK" có Key là MATK
    2- "TH PSCO theo TK" có Key là MATK

    B2) Tạo Query CDTK ghép từ 3 sổ khoá liên kết là MATK

    "DMTK "
    "TH PSNO theo TK" có Key là MATK
    "TH PSCO theo TK" có Key là MATK

    Hai cột DuNo và DuCo bạn sẽ dùng Exprestion Buider dùng hàm IIf và IsNull là ra.

    B3) Tạo một Report có dùng Query CDTK
     
    #3
  4. VAS

    VAS Thành viên hoạt động

    Bài viết:
    30
    Đã được thích:
    1
    Nơi ở:
    www.danketoan.com
    Dear Tuanktcdcn,

    Tuanktcdcn thử làm theo cách Tuanktcdcn hướng dẫn chưa? Hình như có một chút vấn đề

    1/ VD lỡ người nhập nhập một tài khỏan chưa có trong danh mục tài khỏan thì query của bạn sẽ không chạy đúng.
    2/ Sẽ sảy ra trường hợp Dkyno(Co) /PSno(Co) nằm trên ba dòng khác nhau
    TK DKyNo PSNo PSco
    1111 200
    1111 50
    1111 30

    3/Union query sẽ làm cho file access chậm

    Cheers

    VAS
     
    Last edited: 16 Tháng ba 2006
    #4
  5. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Mình đã làm rồi rất Ok. Mình sẽ gửi file lên không hiểu sao hôm nay không upload được lên WKT->Sẽ gửi sau.

    Như thế là người nhập dữ liệu không đúng chứ không phải Query. Nguyên tắc quản lý thông tin trên máy tính là thông qua mã, mã này bắt buộc phải có trong Danh mục trước tiên. Danh mục là nguồn thông tin phục vụ cho hệ thống báo cáo khác chứ không phải chỉ cho một báo cáo.

    Đây là do cách làm Query sai!

    Hình như không phải thể ? Bạn có thể làm rõ hơn là vì sao không?
     
    #5
  6. VAS

    VAS Thành viên hoạt động

    Bài viết:
    30
    Đã được thích:
    1
    Nơi ở:
    www.danketoan.com
    Dear Tuanktcdcn,

    1/ Mình sẽ chờ file của bạn, thanks trước. Nếu Tuanktcdcn nói TK nhập khi chưa được khai báo là do lỗi người nhập liệu-> VAS không còn gì để nói. Vì có một số nơi hạch tóan trên excell sau đó import vô access...Chuyện sai xót la có thể.

    2/ Nếu Tuanktcdcn sử dụng file access cỡ 100 MB thì bạn sẽ thấy được điều VAS nói là đúng đối với Union query. VAS chỉ là IT (I tờ chứ không phải "Ai Ti") nên không trả lời được câu hỏi tại sao dùng Union Query thì file bị chậm đi. nhưng đây là điều VAS học được từ những trang trên Internet VD : Expertexchange.com ; Blueclaw-db.com... và qua trải nghiệm thật tế thấy nó rất đúng.

    3/ Đây là box Access và Kế tóan của WKT, VAS nghĩ không phải ai cũng là "Cao thủ" nên phiền bạn Tuanktcdcn nếucó hướng dẫn thì hướng dẫn chi tiết một chút đừng hướng dẫn << tạo 1-2-3 query rồi "GHÉP LẠI"...>> để tránh trường hợp làm sai như VAS lại quay lại bảo cách của Tuanktcdcn có vấn đề.

    Cheers

    VAS
     
    #6
  7. nguyentronguyen

    nguyentronguyen Thành viên sơ cấp

    Bài viết:
    19
    Đã được thích:
    0
    Cảm ơn các bạn, mấy bữa nay cấp trên yêu cầu tôi đi học chính trị nên ít lên net được. Tôi vẫn chưa thử nghiệm các bài hướng dẫn của các bạn được mong các bạn thông cảm.
    Riêng bài hướng dẫn của bạn VAS tôi mới chạy thử một lần thì thấy báo lỗi ở chỗ này:

    If Not DMTK.NoMatch Then - Ngay chỗ .NoMatch

    Có lẽ tại tôi chưa biết cách tạo liên kết "DAO Library" mong bạn chỉ cụ thể giúp.
    Tôi định gửi file nhờ bạn sửa giúp nhưng file lớn quá nên không biết gửi thế nào.
    Xin trân trọng cảm ơn
     
    Last edited: 17 Tháng ba 2006
    #7
  8. luckytranquan

    luckytranquan Thành viên hoạt động

    Bài viết:
    31
    Đã được thích:
    0
    Nơi ở:
    HCM
    DEAR ALL!
    Mình thấy đoạn code cũng hay hay. Mình cũng lập được bảng CD Tài Khoản nhưng phải sử dụng bằng Query liên tục. Thấy mệt quá, nên mình muốn viết đoạn code như thế cho hay. Nhưng mình phải thử đã.
    Hy vọng sẽ thành công.

    Bye.
    Have you a good day
     
    #8
  9. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
  10. VAS

    VAS Thành viên hoạt động

    Bài viết:
    30
    Đã được thích:
    1
    Nơi ở:
    www.danketoan.com
    Dear Tuanktcdcn,

    1/Bạn đã thành công khi dùng 5 query để lập BCDSPS.
    2/ " Demo PP Lap Bang CDPS NO VBA". :)
    3/ Nếu ai đó nhập sai 1 tk hoặc nhập 1 tk không có trong DMTK thì ...ráng chịu.
    4/ Thanks vì share file của bạn

    Dear Nguyentronguyen,

    Tại cưả sổ Microsoft Visual Basic bạn chọn
    Tool/References/Chọn Microsoft DAO 3.6 Object Library

    Cheers,

    VAS
     
    #10
  11. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Phần mềm phải có nghĩa vụ validate if not exist in master data --> Thông báo không tồn tại và có thể hỏi xem khách hàng có nhập mới TK đó hay không. Bất kỳ thông tin gì cũng nằm trong master data thì mới quản lý thông tin hiệu quả được. Vì thế, chẳng ai phải ráng chịu cả bạn ạ.
     
    #11
  12. VAS

    VAS Thành viên hoạt động

    Bài viết:
    30
    Đã được thích:
    1
    Nơi ở:
    www.danketoan.com
    Chao Anh hai2hai,

    Đúng như anh nói bất kỳ phần mềm nào thì cũng có nghĩa vụ <<validate if not exist in master data>> và not in list event cua Access thì dễ dàng ngăn chặn điều đó ( Khỏi phải ... Ráng chịu).

    Nhưng nếu lỡ người nhập liệu nhập tại excel và import vo access thì sử dụng " Query + No VBA" như bạn Tuantcdcn sẽ không hiệu quả. Tại sao VAS lại đặt vấn đề như vậy? Vì qua câu hỏi của bạn nguyentronguyen VAS thấy bảng số dư cuối kỳ trước ( Đầu kỳ này) và HTTK là nằm trên cùng một table nghĩa là mỗi một kỳ mới phải tạo 1 file DMTk + số dư --> nên công tác "Thủ công" ở đây còn hơi nhiều. Việc mọi thứ đều đươc khai báo ờ master file trước khi dùng hình như hơi khó. Hoặc giả một I tờ như VAS đang có file trên excel, import vô access làm query như bạn Tuantcdcn sau đó chạy báo cáo nó không cân thì hic hic ...

    Cheers,

    VAS
     
    #12
  13. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Đúng là như VAS nói, nếu import kiểu "under-control" đó thì phải có kiểu làm khác (nếu Access có Outner Join thì chắc vẫn ổn).

    Thường thì tớ ko Import kiểu "tự nhiên" đâu mà có wizard đàng hoàng, chọn nguồn, cột, format, v.v... tử tế và có logging lại những phần tử nào là No-Match hoặc Invalid và với sự phân tích của chương trình, hệ thống sẽ thông báo cho user biết "vấn đề" để ra quyết định tiếp tục là có sử lý tự động cái đống "No-Match hay Invalid" đó đi ko. Vì dù sao ko thể báo cáo cái gì mà ko tồn tại trong master data được. Đó là lý thuyết của sự toàn vẹn dữ liệu rồi.

    Cách làm của VAS cũng hay đấy.

    Các bạn tiếp tục bàn tiếp các chủ đề khác nữa nhé. Hay VAS giới thiệu vấn đề giao dịch phát sinh, hệ thống sổ kế toán và gửi kèm ví dụ để mọi người tham khảo đi.


    Cheers!
     
    #13
  14. nguyentronguyen

    nguyentronguyen Thành viên sơ cấp

    Bài viết:
    19
    Đã được thích:
    0
    Cảm ơn bạn Tuanktcdcn bạn đã gửi file để mọi người tham khảo, phương phấp này không phải viết code rất phù hợp cho những người làm kế toán mà không phải dân IT, tuy nhiên bạn đã nhầm một chỗ quan trọng là query nợ và có đầu kỳ không đúng (bạn lấy số dư đầu kỳ là số phát sinh) nên file này mới chạy, tôi làm thử như bạn nhưng lấy số dư đầu kỳ từ bảng Danh muc tài khoản thì file của bạn không chạy. Nó báo lỗi ngay từ chỗ IIf đầu tiên.
    Bạn có thể sửa lại và uploade cho anh em học tập được không.
     
    #14
  15. nguyentronguyen

    nguyentronguyen Thành viên sơ cấp

    Bài viết:
    19
    Đã được thích:
    0
    Cảm ơn bạn đã chỉ cách liên kết.
    Việc nhập sai tài khoản như bạn thì làm gì có bởi vì trong liên kết các bảng các mã tài khoản có key one - to - many gì đó mà.
     
    #15
  16. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Theo CSDL mà mình gửi lên. Số dư đầu mình không đặt ở DMTK. Số dư đầu mình ghi (định khoản một vế) lên sổ/Table "Nhật ký" với ngày 31/07/05, làm như vậy thì việc tổng hợp được tập trung và gọn. Các nghiệp vụ từ ngày 01/08/05 được hiểu là phát sinh.
    Với cách ghi vào sổ trên thì theo phương pháp của mình là Ok, cho phép bạn lập cân đối theo từng khoảng thời gian.

    Nếu số dư của bạn ghi trong DMTK thì trong Query "CandoiTK" xóa bỏ liên kết của 2 Query : DuCo_DK và DuNo_DK và thay vào là DMTK, đưa 2 cột/Field NợDK và CóĐK vào là Ok.

    Mình gửi lên file "KetoanAssess2" làm theo 2 cách: Số dư trong DMTK và số dư trong sổ Nhatky các bạn tham khảo.
     

    Các file đính kèm:

    #16
  17. nguyentronguyen

    nguyentronguyen Thành viên sơ cấp

    Bài viết:
    19
    Đã được thích:
    0
    Gửi Tuancdcn:
    Tôi làm theo bạn chỉ dẫn mà vẫn chưa được, khi dùng hàm IIf mở rộng thêm cột dư nợ cuối kỳ như của bạn thì máy báo lỗi như sau:
    The Expression you enterd contains in valid suyntax
    You may have enterd an operand without an operator.
    Tôi nghĩ bộ Ac của mình bị hư nên đã cài lại office nhưng không có kết quả.
    Kể cả file ketoan của bạn gửi cũng bị báo lỗi nếu như tôi để chuột vào phần này.
    Bạn có thể cho biết lỗi tại sao không.
    Xin trân trọng cảm ơn.
     
    #17
  18. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    File Ketoan mình gửi là chạy tốt rồithìmới gửi lên.


    Lỗi này là do tên trường (Fieldname) hoặc tên Table của bạn có dấu cách hoặc có các ký tự có dấu. Cách khắc phụ bạn phải dùng hai ký tự [] để bao quanh.
    Cấu trúc:
    [Tên table]![Tên trường]
    Ví dụ
    =IIF(Isnull([Cân đối TK]![PSNợ]),0,[Cân đối TK]![PSNợ])
    Nếu trong Query của bạn tên các trương khác nhau thì không cần phải chỉ tên table nữa. VD
    =IIF(Isnull([PSNợ]),0,[PSNợ]) cũng đúng

    Nếu làm như sau thì sẽ bị thông báo lỗi "The Expression you enterd contains in valid suyntax"

    =IIF(Isnull(Cân đối TK!PSNợ),0,Cân đối TK!PSNợ)

    Nếu bạn chưa làm được thì có thể send cho tôi, tôi sẽ giúp bạn.
     
    #18
  19. nguyentronguyen

    nguyentronguyen Thành viên sơ cấp

    Bài viết:
    19
    Đã được thích:
    0
    Gửi Tuancdcn:
    Tôi đã gửi file nhờ bạn sử giúp (theo đường email)
    Xin trân trọng cảm ơn.
     
    #19
  20. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    Tôi đã làm vở gửi vào mail cho bạn rồi.
     
    #20

Chia sẻ trang này