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

Thảo luận trong 'Ứng dụng Access' bắt đầu bởi Bechai, 2 Tháng mười một 2006.

2,363 lượt xem

  1. Bechai

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

    Bài viết:
    10
    Đã được thích:
    0
    Nơi ở:
    Hồ Chí Minh
    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!!!
     
    #1
  2. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

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

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

    Bài viết:
    10
    Đã được thích:
    0
    Nơi ở:
    Hồ Chí Minh
    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?
     
    #3
  4. Song Huong

    Song Huong Thành viên thân thiết

    Bài viết:
    875
    Đã được thích:
    2
    Nơi ở:
    Hỏi quê, rằng mộng ban đầu đã xa
    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
     
    #4
  5. Tuanktcdcn

    Tuanktcdcn Lão già ham vui

    Bài viết:
    548
    Đã được thích:
    50
    Nơi ở:
    Hà Nội
    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
     
    #5

Chia sẻ trang này