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

  • Thread starter nguyentronguyen
  • Ngày gửi
N

nguyentronguyen

Thành viên sơ cấp
12/5/04
19
0
0
#1
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.
 
V

VAS

Thành viên sơ cấp
#2
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
 
Sửa lần cuối:
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#3
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
 
V

VAS

Thành viên sơ cấp
#4
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
 
Sửa lần cuối:
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#5
VAS nói:
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 đề
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.

VAS nói:
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.
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.

VAS nói:
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
Đây là do cách làm Query sai!

VAS nói:
3/Union query sẽ làm cho file access chậm
VAS
Hình như không phải thể ? Bạn có thể làm rõ hơn là vì sao không?
 
V

VAS

Thành viên sơ cấp
#6
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
 
N

nguyentronguyen

Thành viên sơ cấp
12/5/04
19
0
0
#7
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
 
Sửa lần cuối:
L

luckytranquan

Thành viên sơ cấp
3/5/05
31
0
0
38
HCM
#8
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
 
V

VAS

Thành viên sơ cấp
#10
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
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
44
Hà nội
vnuni.net
#11
VAS nói:
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.
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 ạ.
 
V

VAS

Thành viên sơ cấp
#12
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
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
44
Hà nội
vnuni.net
#13
Đú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!
 
N

nguyentronguyen

Thành viên sơ cấp
12/5/04
19
0
0
#14
Tuanktcdcn nói:
Mình gửi file các bạn tham khảo.
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.
 
N

nguyentronguyen

Thành viên sơ cấp
12/5/04
19
0
0
#15
VAS nói:
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
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à.
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#16
nguyentronguyen nói:
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.
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.
 

Đính kèm

N

nguyentronguyen

Thành viên sơ cấp
12/5/04
19
0
0
#17
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.
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#18
File Ketoan mình gửi là chạy tốt rồithìmới gửi lên.

nguyentronguyen nói:
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.
...
Bạn có thể cho biết lỗi tại sao không.
Xin trân trọng cảm ơ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.
 
N

nguyentronguyen

Thành viên sơ cấp
12/5/04
19
0
0
#19
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.
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#20
nguyentronguyen nói:
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.
Tôi đã làm vở gửi vào mail cho bạn rồi.
 

Thành viên trực tuyến

  • tranhoai9293
  • thuylinhlinh20490
  • mrtrong178
  • NgocNguyen.s2

Xem nhiều