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

Guest
12/5/04
19
0
0
Trân trọng cảm ơn bạn. Tôi đã làm được rồi.
 
Khóa học Quản trị dòng tiền
S

Song Huong

Cao cấp
nguyentronguyen nói:
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.

Gia su ban co 03 bang nhu sau:

Create Table CoA
(
Acct Varchar(10),
Descr Varchar(60),
BegDrAmt Float,
BegCrAmt Float
)

Create Table TrialBal
(
Acct Varchar(10),
Descr Varchar(60),
BegDrAmt Float,
BegCrAmt Float,
DrAmt Float,
CrAmt Float,
EndDrAmt Float,
EndCrAmt Float
)

Create Table GLTran
(
TranDate SmallDateTime,
DrAcct Varchar(10),
CrAcct Varchar(10),
TranAmt Float
)

Ban lap Can doi phat sinh cho ky ke toan tu '01-08-2008' den '31-08-2008'

-- Tao view v_GLTran
Create View v_GLTran As
Select Acct, '2006-07-31' As TranDate, BegDrAmt As DrAmt, BegCrAmt As CrAmt From Coa
Union All
Select DrAcct As Acct, TranDate, TranAmt As DrAmt, 0 As CrAmt From gltran
Where TranDate Between '2006-08-01' And '2006-08-31' And DrAcct In (Select Acct From COA)
Union All
Select CrAcct As Acct, TranDate, 0 As DrAmt, TranAmt As CrAmt From gltran
Where TranDate Between '2006-08-01' And '2006-08-31' And CrAcct In (Select Acct From COA)

-- Insert du lieu vao bang TrialBal, Group theo tai khoan
Insert Into TrialBal(Acct, Descr, BegDrAmt, BegCrAmt, DrAmt, CrAmt, EndDrAmt, EndCrAmt)
Select g.Acct, Max(a.Descr),
Sum(Case When g.TranDate < '2006-08-01' Then g.DrAmt Else 0 End) As BegDrAmt,
Sum(Case When g.TranDate < '2006-08-01' Then g.CrAmt Else 0 End) As BegCrAmt,
Sum(Case When g.TranDate BetWeen '2006-08-01' And '2006-08-31' Then g.DrAmt Else 0 End) As DrAmt,
Sum(Case When g.TranDate BetWeen '2006-08-01' And '2006-08-31' Then g.CrAmt Else 0 End) As CrAmt,
0 As EndDrAmt, 0 As EndCrAmt

From v_GLTran g Inner Join CoA a On g.Acct = a.Acct
Group By g.Acct

-- Tinh lai so du dau ky va cuoi ky
Update TrialBal
Set
BegDrAmt = Case When (BegDrAmt - BegCrAmt)>0 Then (BegDrAmt - BegCrAmt) Else 0 End,
BegCrAmt = Case When (BegDrAmt - BegCrAmt)<=0 Then (BegCrAmt - BegDrAmt) Else 0 End,
EndDrAmt = Case When (BegDrAmt - BegCrAmt + DrAmt - CrAmt) > 0 Then (BegDrAmt - BegCrAmt + DrAmt - CrAmt) Else 0 End,
EndCrAmt = Case When (BegDrAmt - BegCrAmt + DrAmt - CrAmt) <= 0 Then (BegCrAmt - BegDrAmt - DrAmt + CrAmt) Else 0 End

-- Bang tao Report tu bang TrialBal
 
Sửa lần cuối:
S

Song Huong

Cao cấp
VAS nói:
Dear Tuanktcdcn,
...
3/Union query sẽ làm cho file access chậm

Cheers

VAS

Bạn dùng Union All thì query sẽ không bị chậm và đầy đủ dữ liệu.
Khi dùng Union thì CSDL phài loại bỏ những record trùng. Đây cũng là lý do làm cho query chậm.
Thân mến.
 
D

DoHung

Guest
1/1/04
211
0
0
47
Hanoi
Truy cập trang
Tuanktcdcn 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.

Chào bạn,
Trong điều kiện ">=[Forms]![Xác định ngày báo cáo]![TuNgay] And <=[Forms]![Xác định ngày báo cáo]![DenNgay]"
Bạn có thể thay thế bằng "Between" sẽ chạy nhanh hơn. Theo khuyến cáo của Microsoft nhé, mình không tự nghĩ ra đâu.
 
D

DoHung

Guest
1/1/04
211
0
0
47
Hanoi
Truy cập trang
Tuanktcdcn 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.

Chào bạn,
Trong điều kiện ">=[Forms]![Xác định ngày báo cáo]![TuNgay] And <=[Forms]![Xác định ngày báo cáo]![DenNgay]"
Bạn có thể thay thế bằng "Between" sẽ chạy nhanh hơn. Theo khuyến cáo của Microsoft nhé, mình không tự nghĩ ra đâu.

Dữ liệu đưa ra trong báo cáo cũng chư chính xác. Đặc biệt là việc cộng dồn lên TK mẹ.

Hơn nữa, việc in số liệu ra theo form báo cáo của bộ tài chính mới là bài toán hóc búa nhất. Vì trên Bảng CĐKT chuẩn có cả chỉ tiêu của tài khoản con và TK mẹ. Phương pháp này vẫn chưa giải quyết được bài toán trên.
 
D

DoHung

Guest
1/1/04
211
0
0
47
Hanoi
Truy cập trang
Tuanktcdcn 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.

Chào bạn,
Trong điều kiện ">=[Forms]![Xác định ngày báo cáo]![TuNgay] And <=[Forms]![Xác định ngày báo cáo]![DenNgay]"
Bạn có thể thay thế bằng "Between" sẽ chạy nhanh hơn. Theo khuyến cáo của Microsoft nhé, mình không tự nghĩ ra đâu.

Dữ liệu đưa ra trong báo cáo cũng chư chính xác. Đặc biệt là việc cộng dồn lên TK mẹ.
Bạn kiểm tra lại TK111 sẽ thấy ngay.

Hơn nữa, việc in số liệu ra theo form báo cáo của bộ tài chính mới là bài toán hóc búa nhất.
Vì trên Bảng CĐKT chuẩn có cả chỉ tiêu của tài khoản con và TK mẹ.
Phương pháp của bạn vẫn chưa giải quyết được bài toán này.
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,030
125
63
51
Hà nội
vnuni.net
Đó chỉ là 1 ví dụ thôi. Đã là người lập trình thì yêu cầu như thế nào cũng có cách giải quyết cả. Muốn hiển thị mẹ thì hiển thị mẹ, muốn hiển thị con thì hiển thị thêm cả con. Mấy cái đó chẳng khó gì đâu. Tuân đang bận nên ko care nhiều ví dụ trên MDB này nữa.
 
Đ

ĐỖ SƠN HẢI

Guest
10/10/06
130
0
0
46
Phan Thiết
Bạn làm như VAS là đúng rồi, tuy nhien ban phai viet them mot doan code nua cap nhat tai khoan moi vao table bang can doi phat sinh .
ban se co cac bang sau
thu , chi , nhap , xuat , so hach toan , tai khoan , can doi phat sinh.
Ban thuc hien cac buoc sau :
buoc 1 xoa bo du lieu table candoiphatsinh
buoc 2 cap nhat toan bo du lieu tu cac tai khoan tu table taikhoan
buoc 3 bam nhu ban vas
Private Sub Command6_Click()

'xoa table cdps
Dim C01 As Recordset
Set C01 = CurrentDb.OpenRecordset("cdps", dbOpenTable)
Do Until C01.EOF
If C01.RecordCount > 0 Then
C01.Delete
End If
C01.MoveNext
Loop
C01.Close
'cap nhat ma tai khoan


Dim c03 As Recordset, c04 As Recordset
Set c03 = CurrentDb.OpenRecordset("taikhoan", dbOpenTable)
Set c04 = CurrentDb.OpenRecordset("cdps", dbOpenTable)
c04.Index = "PRIMARYKEY"
If c03.RecordCount > 0 Then
c03.MoveFirst
Do Until c03.EOF
'On Error Resume Next
c04.Seek "=", c03!MAtk
If c04.NoMatch Then
c04.AddNew
c04!matk = c03!matk

'On Error Resume Next
c04.Update: c04.Bookmark = c04.LastModified
End If
c04.Edit
c04.Update: c03.MoveNext
Loop
End If

chuc ban thanh cong
 

Xem nhiều