Hỏi : Cách lập Bảng CĐTK từ 1 Table chuẩn?

  • Thread starter Bechai
  • Ngày gửi
B

Bechai

Thành viên sơ cấp
27/10/05
10
0
1
Hồ Chí Minh
#1
Xin chào các bạn!
Mình có 1 vướng mắc lớn mà nghĩ hoài ko có kết quả khi lập BCĐTKhoản có số liệu từ 2 Table chuẩn 1 chứa DMTKhoản, 2 chứa số liệu tổng hợp như sau

* Table 1 "DMTK" : Field (MaTK;TenTK;....)
2 "TongHop" :Field (NgayCT;SoCT;...TKNo;TKCo;SoTien..) Số liệu 1 năm
Mình muốn lập BCĐTK từ "TuNgay" đến "DenNgay":

*Cách mình đã làm như sau:
- Số dư đầu : mình lấy tổng số liệu từ đầu năm đến < "TuNgay"
DDNo = Sum(SoTien) bên Nợ - Sum(SoTien) bên Có nếu > 0
DDCo = Sum(SoTien) bên Có - Sum(SoTien) bên Nợ nếu > 0
- Số PS : mình lấy số liệu từ "TuNgay" đến "DenNgay"
PSNo = Sum(SoTien) bên Nợ
PSCo = Sum(SoTien) bên Có
- Số dư cuối :
DCNo = (DDNo + PSNo) - (DDCo + PSCo) nếu > 0
DCCo = (DDCo + PSCo) - (DDNo + PSNo) nếu > 0

Ý mình là vậy nhưng sao làm khó quá!:wall: Khó nhất là cách lấy số dư đầu. Mong các bạn cùng thao khảo và hướng dẫn.
Xin Cảm ơn!!!
 
B

Bechai

Thành viên sơ cấp
27/10/05
10
0
1
Hồ Chí Minh
#3
Mình đã thao khảo nhưng ko phù hợp...

Xin chào anh Tuanktcdcn!
Em đã thao khảo nhưng ko phù hợp, vì "TongHop" chứa cả số dư đầu của các TK và cả phát sinh trong năm. Nên toàn bộ số liệu trong "ST_CDTK" gồm: SDDK, SPS và SDCK đều từ "TongHop" mà ra cả, chứ không phải từ DMTK. Điều này sẽ có lợi vì số liệu sẽ liên tục cho nhiều năm và ko cần chuyển số dư bằng tay sang năm sau. Nên cách viết Code có khác. Em viết như sau:

Function DuDauTK(TuNgay As Date, DenNgay As Date)
Dim dbs As Database
Dim rstTH As Recordset, rstTK As Recordset, rstCD As Recordset
Set dbs = CurrentDb
Set rstTH = dbs.OpenRecordset("TongHop", dbOpenTable)
Set rstTK = dbs.OpenRecordset("ST00_TaiKhoan", dbOpenTable)
Set rstCD = dbs.OpenRecordset("ST_CDTK", dbOpenTable)
DoCmd.RunSQL "Delete*From[ST_CDTK]"

' Tinh so du dau Tai khoan
If rstTH.RecordCount > 0 Then
rstTK.MoveFirst ' tính từ TK đầu tiên
Do Until rstTK.EOF
Let CongNo = 0: CongCo = 0: NoDKy = 0: CoDKy = 0
rstTH.MoveFirst
TaiKhoan = rstTK!TaiKhoan
Do Until rstTH.EOF
If rstTH!NgayCT = TuNgay Then Exit Do
If rstTH!TKNo = TaiKhoan Then
CongNo = CongNo + rstTH!Quydoi: CongCo = CongCo
Else
If rstTH!TKCo = TaiKhoan Then
CongCo = CongCo + rstTH!Quydoi: CongNo = CongNo
End If
End If
rstTH.MoveNext
Loop
If CongNo <> 0 And CongCo <> 0 Then
rstCD.AddNew
rstCD!TaiKhoan = TaiKhoan
If CongNo >= CongCo Then
rstCD!NoDKy = CongNo - CongCo: rstCD!CoDKy = 0
Else
rstCD!CoDKy = CongCo - CongNo: rstCD!NoDKy = 0
End If
rstCD.Update
End If
rstTK.MoveNext 'Tính đến TK kế tiếp.
Loop
End If

rstTK.Close
rstTH.Close
rstCD.Close
End Function

Khi chạy thì trong ST_CDTK chỉ có hiển thị số dư đầu của TK 1111 duy nhất. Các TK khác ko thấy đấu!? Code này có lỗi gì ko?
Anh có thuể cho em số ĐT có thể liên lạc đc ko?
 
S

Song Huong

Thành viên thân thiết
#4
Bechai nói:
Xin chào anh Tuanktcdcn!
Em đã thao khảo nhưng ko phù hợp, vì "TongHop" chứa cả số dư đầu của các TK và cả phát sinh trong năm. Nên toàn bộ số liệu trong "ST_CDTK" gồm: SDDK, SPS và SDCK đều từ "TongHop" mà ra cả, chứ không phải từ DMTK. Điều này sẽ có lợi vì số liệu sẽ liên tục cho nhiều năm và ko cần chuyển số dư bằng tay sang năm sau. Nên cách viết Code có khác. Em viết như sau:
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

Thân mến
 
T

Tuanktcdcn

Lão già ham vui
18/6/04
548
51
28
41
Hà Nội
www.bluesofts.net
#5
Bechai nói:
Xin chào anh Tuanktcdcn!
Em đã thao khảo nhưng ko phù hợp, vì "TongHop" chứa cả số dư đầu của các TK và cả phát sinh trong năm. Nên toàn bộ số liệu trong "ST_CDTK" gồm: SDDK, SPS và SDCK đều từ "TongHop" mà ra cả, chứ không phải từ DMTK. Điều này sẽ có lợi vì số liệu sẽ liên tục cho nhiều năm và ko cần chuyển số dư bằng tay sang năm sau...

Anh có thuể cho em số ĐT có thể liên lạc đc ko?
Trong ví dụ mình gửi là có hai cách: lấy dữ liệu trên một table và lấy trên DMTK. Bechai xem kỹ lại coi?

ĐT của mình 0904210337
 

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

Không có thành viên trực tuyến.

Xem nhiều