Nhờ chỉ giùm Code tính tồn

Thảo luận trong 'Ứng dụng Access' bắt đầu bởi Nina, 21 Tháng một 2007.

5,571 lượt xem

  1. Nina

    Nina Thành viên thân thiết

    Bài viết:
    68
    Đã được thích:
    0
    Nơi ở:
    Đâu đó trên WKT.
    Chào các anh chị !Em mới học Access nên chưa thể viết code được cho table tồn VD:Table thu chi gồm có THu,chi,tồn.có ai biết chỉ giùm em nhe.Em cảm ơn nhiều
     
    #1
  2. nguoiconxunui

    nguoiconxunui Khách vãng lai

    Bài viết:
    1,255
    Đã được thích:
    219
    Nơi ở:
    Bình Định
    mới học access mà lo viết code. hihi đúng là khó thiệt
     
    #2
  3. ĐỖ SƠN HẢI

    ĐỖ SƠN HẢI Thành viên thân thiết

    Bài viết:
    130
    Đã được thích:
    0
    Nơi ở:
    Phan Thiết
    Mình giup ban nha :
    doan code 1:
    Dim C01 As Recordset
    Set C01 = CurrentDb.OpenRecordset("SOQUY", dbOpenTable)
    Do Until C01.EOF
    If C01.RecordCount > 0 Then
    C01.Delete
    End If
    C01.MoveNext
    Loop
    C01.Close
    Dim TB As Recordset
    Dim Dd As Database
    Dim NEWQR As QueryDef
    Set Dd = CurrentDb
    Set NEWQR = Dd.CreateQueryDef("TAOLAO")
    NEWQR.SQL = "SELECT THUCHI.NGAY, THUCHI.MA, THUCHI.PHIEUCHI, THUCHI.DIENGIAI, THUCHI.SOTIENTHU, THUCHI.PHIEUNHAP, THUCHI.SOTIENCHI, THUCHI.CONG, THUCHI.MAKH, THUCHI.[NO], THUCHI.CO, THUCHI.PHIEUTHU, [NGAY] & [ma] AS hu, THUCHI.CHIPHI FROM THUCHI WHERE (((THUCHI.NGAY) Between [tungay] And [denngay]))ORDER BY [NGAY] & [ma];"

    NEWQR.Close
    Set TB = CurrentDb.OpenRecordset("SOQUY")
    Dim q09 As QueryDef
    Dim X09 As Recordset
    TB.Index = "PRIMARYKEY"
    Set q09 = CurrentDb.QueryDefs("TAOLAO")
    q09.Parameters("tungay") = TUNGAY.Value
    q09.Parameters("denngay") = DENNGAY.Value
    'q09.Parameters("TAIKHOAN") = taikhoan.Value
    Set X09 = q09.OpenRecordset()
    If X09.RecordCount > 0 Then
    X09.MoveFirst
    Do Until X09.EOF
    'On Error Resume Next
    TB.Seek "=", maMOI
    If TB.NoMatch Then
    TB.AddNew
    TB!NGAY = X09!NGAY
    TB!MA = X09!hu
    TB!PHIEUCHI = X09!PHIEUCHI
    TB!DIENGIAI = X09!DIENGIAI
    TB!SOTIENTHU = X09!SOTIENTHU
    TB!PHIEUNHAP = X09!PHIEUNHAP
    TB!SOTIENCHI = X09!SOTIENCHI
    TB!CONG = X09!CONG
    TB!no = X09!no
    TB!co = X09!co
    TB!PHIEUTHU = X09!PHIEUTHU
    TB!CHIPHI = X09!CHIPHI

    'TB!TONDAU = 0
    'TB!TONCUOI = 0
    'On Error Resume Next
    TB.UPDATE
    TB.Bookmark = TB.LastModified
    End If
    TB.Edit
    TB.UPDATE: X09.MoveNext
    Loop
    End If
    Dd.QueryDefs.Delete "TAOLAo"
    'Dim T07 As Recordset, DAUKY As Variant
    'Set T07 = CurrentDb.OpenRecordset("TONQUY", dbOpenTable)
    'THANG As Variant
    'THANG = Month(TUNGAY)
    'Do Until T07.EOF
    'T07.Seek
    'RunCommand acCmdSelectRecord
    Dim T7 As Recordset, TH As Integer
    Set T7 = CurrentDb.OpenRecordset("TONQUY", dbOpenTable)
    'TH As Variant
    TH = Month(TUNGAY)
    Dim A As Variant
    T7.MoveFirst
    Do Until T7.EOF
    If T7!THANG = TH Then A = T7!SOTIEN
    'End If
    T7.MoveNext
    Loop
    T7.Close
    Dim Dd1 As Database
    Dim mn As QueryDef
    Set Dd1 = CurrentDb
    Set mn = Dd1.CreateQueryDef("TAOLAO")
    mn.SQL = "SELECT THUCHI.NGAY, Sum(THUCHI.SOTIENTHU) AS THU, Sum(THUCHI.SOTIENCHI) AS CHI FROM THUCHI GROUP BY THUCHI.NGAY HAVING (((THUCHI.NGAY) < [TUNGAY]))"
    mn.Close
    'Set TB = CurrentDb.OpenRecordset("SOQUY")
    Dim q091 As QueryDef
    Dim X091 As Recordset
    'TB.Index = "PRIMARYKEY"
    Set q091 = CurrentDb.QueryDefs("TAOLAO")
    q091.Parameters("tungay") = TUNGAY.Value
    'q09.Parameters("denngay") = DENNGAY.Value
    'q09.Parameters("TAIKHOAN") = taikhoan.Value
    Set X091 = q091.OpenRecordset()
    B = 0
    Do Until X091.EOF
    If X091.RecordCount > 0 Then
    A = A + X091!thu
    B = B + X091!chi
    End If
    X091.MoveNext
    Loop
    'TB.Close
    X091.Close
    Dd1.QueryDefs.Delete "TAOLAo"
    C = A - B
    'X09.MoveFirst
    'Do Until X09.EOF
    'On Error Resume Next
    'TB.Seek "=", maMOI
    'If TB.NoMatch Then
    'TB!PHIEUTHU = X09!PHIEUTHU
    'X09.MoveNext
    'Loop
    Dim T06 As Recordset, DAUKY As Variant
    Set T06 = CurrentDb.OpenRecordset("SOQUY", dbOpenTable)
    If T06.RecordCount = 0 Then
    MsgBox " Xem lai ngay nhap lieu ?": Exit Sub
    Else
    T06.Index = "PRIMARYKEY": T06.MoveFirst
    NGAYDAU = T06!NGAY: LUADAU = T06!tondau
    'DAUKY = InputBox("SO DAU KY NGAY " & NGAYDAU & vbCr & "(" & LUASAU & ")", "TINH QUY LIEN TUC")
    'If DAUKY = "" Or Val(DAUKY) = 0 Then DAUKY = T06!TONDAU
    DAUKY = C
    tondau.Value = C
    Do Until T06.EOF
    T06.Edit: T06!tondau = DAUKY
    T06!TONCUOI = DAUKY + T06!SOTIENTHU - T06!SOTIENCHI
    T06.UPDATE: DAUKY = T06!TONCUOI
    T06.MoveNext
    Loop
    End If
    T06.Close: Me.Requery: Me.Refresh
    x.Value = DAUKY
    Y.Value = C
    DoCmd.OpenReport "soquy", acViewPreview

    doan code 2

    Public Function soquy()
    Dim C01 As Recordset
    Set C01 = CurrentDb.OpenRecordset("THUCHI", dbOpenTable)
    Do Until C01.EOF
    If C01.RecordCount > 0 Then
    C01.Delete
    End If
    C01.MoveNext
    Loop
    C01.Close
    Dim TB As Recordset
    Dim Dd As Database
    Dim NEWQR As QueryDef
    Set Dd = CurrentDb
    Set NEWQR = Dd.CreateQueryDef("TAOLAO")
    NEWQR.SQL = "SELECT vndmaphieuchitienmat.maphieu, vndmaphieuchitienmat.makhach, vndmaphieuchitienmat.ngay, vndmaphieuchitienmat.diengiai, vndmaphieuchitienmat.tenkhach, vndmaphieuchitienmat.phanloai, vndmaphieuchitienmat.sotien, vndmaphieuchitienmat.Cong, vndmaphieuchitienmat.chungtukem, 'PC' & [MAPHIEU] AS MAMOI, Left([MAPHIEU],3) AS PHIEUCHI, 1111 AS TAICO FROM vndmaphieuchitienmat;"
    NEWQR.Close
    Set TB = CurrentDb.OpenRecordset("THUCHI")
    Dim q09 As QueryDef
    Dim X09 As Recordset
    TB.Index = "PRIMARYKEY"
    Set q09 = CurrentDb.QueryDefs("TAOLAO")
    'q09.Parameters("tungay") = TUNGAY.Value
    'q09.Parameters("denngay") = DENNGAY.Value
    'q09.Parameters("TAIKHOAN") = taikhoan.Value
    Set X09 = q09.OpenRecordset()
    If X09.RecordCount > 0 Then
    X09.MoveFirst
    Do Until X09.EOF
    'On Error Resume Next
    TB.Seek "=", maMOI
    If TB.NoMatch Then
    TB.AddNew
    TB!NGAY = X09!NGAY
    TB!MA = X09!maMOI & "vnd"
    TB!PHIEUCHI = X09!PHIEUCHI & "vnd"
    TB!DIENGIAI = X09!DIENGIAI
    TB!SOTIENCHI = X09!SOTIEN
    TB!CONG = X09!SOTIEN
    TB!CHIPHI = X09!MAKHACH
    TB!MAKH = X09!TENKHACH
    TB!LOAICP = X09!PHANLOAI
    TB!co = X09!taico
    TB!PHIEUNHAP = X09!CHUNGTUKEM
    'On Error Resume Next
    TB.UPDATE: TB.Bookmark = TB.LastModified
    End If
    TB.Edit
    TB.UPDATE: X09.MoveNext
    Loop
    End If
    Dd.QueryDefs.Delete "TAOLAo"
    'cap nhat phieu thu
    Dim kh As Recordset
    Dim dm As Database
    Dim oldqr As QueryDef
    Set dm = CurrentDb
    Set oldqr = dm.CreateQueryDef("laotao")
    oldqr.SQL = "SELECT vndmaphieuthutienmat.maphieu, vndmaphieuthutienmat.madoanhthu, vndmaphieuthutienmat.diengiai, vndmaphieuthutienmat.ngay, vndmaphieuthutienmat.[ten khach], vndmaphieuthutienmat.diachi, vndmaphieuthutienmat.sotien, 'PT' & [MAPHIEU] AS MAPTHU, Left([MAPHIEU],2) AS PHIEUTHU, vndmaphieuthutienmat.PHANLOAI, 1111 AS TAINO FROM vndmaphieuthutienmat;"

    oldqr.Close
    Set kh = CurrentDb.OpenRecordset("THUCHI")
    Dim m09 As QueryDef
    Dim z09 As Recordset
    kh.Index = "PRIMARYKEY"
    Set m09 = CurrentDb.QueryDefs("laotao")
    'm09.Parameters("tungay") = TUNGAY.Value
    'm09.Parameters("denngay") = DENNGAY.Value
    'm09.Parameters("TAIKHOAN") = taikhoan.Value
    Set z09 = m09.OpenRecordset()
    If z09.RecordCount > 0 Then
    z09.MoveFirst
    Do Until z09.EOF
    'On Error Resume Next
    kh.Seek "=", mapthu
    If kh.NoMatch Then
    kh.AddNew
    kh!NGAY = z09!NGAY
    kh!MA = z09!mapthu & "vnd"
    kh!PHIEUTHU = z09!PHIEUTHU & "vnd"
    kh!DIENGIAI = z09!DIENGIAI
    kh!SOTIENTHU = z09!SOTIEN
    kh!CONG = z09!SOTIEN
    kh!no = z09!taino
    kh!CHIPHI = z09!PHANLOAI
    'kh!PHIEUNHAP = z09!CHUNGTUKEM
    'On Error Resume Next
    kh.UPDATE: kh.Bookmark = kh.LastModified
    End If
    kh.Edit
    kh.UPDATE: z09.MoveNext
    Loop
    End If
    dm.QueryDefs.Delete "laotao"

    dm.Close

    Dim dd10 As Recordset
    Dim zz10 As Recordset
    Set dd10 = CurrentDb.OpenRecordset("ma", dbOpenTable)
    dd10.Index = "PRIMARYKEY"
    Set zz10 = CurrentDb.OpenRecordset("thuchi", dbOpenTable)
    If zz10.RecordCount > 0 Then
    zz10.MoveFirst
    Do Until zz10.EOF
    dd10.Seek "=", zz10!CHIPHI
    If Not dd10.NoMatch Then
    zz10.Edit
    zz10!no = dd10!taino
    zz10!co = dd10!taico
    zz10.UPDATE
    End If
    zz10.MoveNext
    Loop
    End If
    dd10.Close
    zz10.Close
    End Function

    chuc thanh cong
     
    #3
  4. Nina

    Nina Thành viên thân thiết

    Bài viết:
    68
    Đã được thích:
    0
    Nơi ở:
    Đâu đó trên WKT.
    Cảm ơn anh Sơn

    Em cảm ơn anh Sơn nhiều nha.Để em tai về và làm theo anh ,có gì em hỏi anh tiếp nhe.Chúc anh năm mới có nhều niềm vui,dồi dào sức khỏe ,hạnh phúc và thành đạt.Hẹn gặp lại anh.
     
    #4
  5. phoenixking

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

    Bài viết:
    11
    Đã được thích:
    0
    Nơi ở:
    thành phố hồ chí minh
    ông viết vậy cho người mới học thi e.c em nó làm theo hiểu hết or không hiểu thì không seo nhưng lở mà không hiêu lắm mà sử dụng dể bị tẩu hỏa nhâp ma à nghe .
     
    #5
  6. ĐỖ SƠN HẢI

    ĐỖ SƠN HẢI Thành viên thân thiết

    Bài viết:
    130
    Đã được thích:
    0
    Nơi ở:
    Phan Thiết
    ban lam theo cac buoc sau
    1. tao table thu (ngay, mathu,maphieu, noidung, sotienthu)
    2. tao table chi (ngay , machi, maphieu, noidung, sotienchi)
    3. tao table thuchi (ngay,phieuthu,phieuchi, thu , chi, ton, diengiai)
    4. tao table soquy giong table thuchi chi de lay du lieu ngay can xem
    VND : ban cho xem ton quy tu ngay .... den ngay....
    luc do thứ tự lập trình như sau
    lấy toàn bộ dữ liệu trong pham vi xem chuyển sang table thuchi sau đó lọc và chuyển sang table sổ quỹ (table thuchi và sổ quỹ bạn có thể tự tạo bằng code hoặt bạn có thể tạo cố định)

    chúc ban học giỏi access
     
    #6
  7. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    Có lẽ bạn chỉ cần Union 2 cái table thu/chi với nhau thì thành cái sổ quỹ ngay thôi mà. Khi Union nhớ trong câu SQL có bổ sung fake field nhé vì Union chỉ cho phép làm việc với cấu trúc đồng nhất.

    Ví dụ:


    strSQL_Condition = "WHERE ngay BETWEEN '...' AND '...' "

    strSQL = "SELECT ngay, maphieu AS maphieuthu, '' AS maphieuchi, noidung, sotien AS tien_thu, null AS tien_chi FROM tb_thu " & strSQL_Condition
    strSQL = strSQL & vbcrlf & " UNION ALL "
    strSQL = strSQL & "SELECT ngay, '' AS maphieuthu, maphieu AS maphieuchi, noidung, null AS tien_thu, sotien AS tien_chi FROM tb_chi " & strSQL_Condition

    Đại khái là như thế.

    Thực ra các loại chứng từ kế toán như: hóa đơn mua/bán, trả lại, bán lẻ, nhập, xuất, thu, chi, phiếu thanh toán, v.v... người ta đều gọi là các giao dịch (financial/inventory,... transactions). Hàng ngày các transactions được tạo ra từ các chứng từ kế toán phát sinh (financial/inventory... documents) và được lưu vào sổ nhật ký (journals). Sổ nhật ký này bản chất là lưu các giao dịch theo tuần tự thời gian. Các chứng từ này sẽ được Ghi sổ (Posted) sang sổ cái tùy theo tính chất của từng loại nghiệp vụ.

    Như vậy, về bản chất, cái mà các bạn gọi là sổ quỹ thực ra chỉ cần tổ hợp của 2 loại giao dịch (có thể gọi là 4 loại cũng được) là thu/chi (tiền mặt/tiền gửi). Tất cả đều nằm trong cái mà mình hay gọi là tb_T_Transactions --> tb_T_Journal. Chỉ cần phải cái câu lệnh SQL đơn giản là bạn có các sổ nhật ký các loại, sỗ quỹ, sổ xyz ngay.

    Hope that helps!
     
    #7
  8. ĐỖ SƠN HẢI

    ĐỖ SƠN HẢI Thành viên thân thiết

    Bài viết:
    130
    Đã được thích:
    0
    Nơi ở:
    Phan Thiết
    Ban chú ý cấu trúc lập trình nếu chỉ tạo query khó cụ thể
    bạn muốn chạy sổ quỹ từ ngày 15/10/2007 đến ngày 25/10/2007 thỉ bạn phải tính tồn kho đến ngày 14/10/2007 sau đó mới mới lấy dữ liệu tiếp tục
    thể hiện lên sổ quỹ báo cáo . Thêm vào đó còn tùy thuộc vào loại báo cáo xếp yêu cầu nếu chỉ báo cáo tồn quỹ thì đơn giản nhưng nếu xếp yếu câu báo cáo như sau thì làm thế nào :

    ngay...... P.thu......P.chi ......dien giai........no....co......thu........chi.....ton
    .....................................................................tồn đầu.................1
    1/1 ..........1.......................xxxx.............111....xxx....1.................. 2
    1/2 .......................1..........xxxx..............xxx....111...............0.5......1.5

    nếu có cách nào không lập trình chỉ dùng querry chỉ giúp mình .
     
    Last edited: 9 Tháng hai 2007
    #8
  9. hai2hai

    hai2hai VNUNI Makes a difference

    Bài viết:
    2,012
    Đã được thích:
    128
    Nơi ở:
    Hà nội
    1. Có lẽ Sơn dùng từ sai. Trong sổ quỹ thì ko có khái niệm "Tồn kho". (Người ta gọi là dư đầu kỳ của tài khoản (dư đầu kỳ của 111 chẳng hạn).

    2. Trong trường hợp kỳ là FromDate - ToDate thì phải xác định dư đầu kỳ của FromDate (là thời điểm T0 = Month(FromDate)) + phát sinh tăng - phát sinh giảm (trong khoảng từ T0 đến FromDate) và gọi kết quả đó là T1 (Dư đầu tới tính thời điểm FromDate).

    (Ở các phần mềm tốt, bao giờ fiscal year cũng được chia thành các accounting periods (ở VN thì hay dùng tháng làm acc periods chứ bọn nước ngoài thì nhiều loại fiscal year và accounting periods lắm). Và sau mỗi kỳ thì người ta thực hiện động tác Closing (mình hay gọi là khóa kỳ kế toán ấy) và bao giờ tại 1 đầu kỳ mới cũng có giá trị là số dư ban đầu cho tất cả các đối tượng như tài khoản, khách hàng, hàng hóa, v.v....)

    3. Còn cái đoạn PS tăng (thu), PS giảm (chi) trong khoảng fromdate - todate ở dưới thì quá dễ rồi.

    4. Kết hợp 3 cái đó và vận dụng Fake fields ở 3 sub-queries trước khi Union thì ổn thôi. Chỉ có điều là có biết vận dụng hay ko thôi.

    Mấy cái sql tớ viết cách đây hơn 8 năm rồi ko chỉ áp dụng cho mỗi tính số dư tài khoản mà còn tính dư tồn kho (về lượng) nữa. Tất cả chỉ là vận dụng cách viết pl sql thôi. (à, bạn đừng nghĩ là ai từng viết PM, từng biết tới DB thì biết viết SQL ngon nhé. 80% SQL trong các SP hiện nay ở VN đều chưa chắc đã là optimized sql đâu)

    Mà thôi, bạn viết kiểu gì cũng được. Miễn là nó chạy. Tớ giải thích mấy món này mệt lắm. Tớ cũng chỉ có sức viết đến thế thôi.
     
    Last edited: 9 Tháng hai 2007
    #9
  10. nguyendinhhieu

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

    Bài viết:
    10
    Đã được thích:
    0
    Nơi ở:
    Ha noi
    Tính tồn kho không cần code VB

    Các bác muốn tính tồn thì vào query của access mà làm, cần gì dùng code làm gì, vừa chậm, vừa phức tạp
    chỉ cần dùng
    1. Total query
    2. Union query
    3. Select query

    Kết hợp ba cái loại này là tính được

    Nhanh, gọn
     
    #10
  11. huydungktv

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

    Bài viết:
    1
    Đã được thích:
    0
    Nơi ở:
    kien giang
    Xin Chào Các Bạn!!!! (Mình là thành viên mới)
    Các bạn giúp mình cái này nhe. Bây giờ mình có hai Table: nhap(Ngaynhap, Masp, Soluong,...) và xuat(ngayxuat, Masp, Soluong,...)

    Dữ liệu bên trong của từng table như sau:

    Table Nhap:
    Masp Soluong
    01 | 100
    02 | 50
    04 | 50

    Table Xuat:
    Masp Soluong
    01 | 50
    02 | 50
    03 | 100

    Kết quả mong muốn của mình là:

    Masp SoluongTon
    01 | 50
    02 | 0
    03 | -100
    04 | 50

    Do không phải chuyên ngành nên mình không thể viết lệnh SQL để giải quyết vấn đề này được, nếu bạn nào có thể giúp được mình xin cám ơn nhiều.

    Nếu có thể gửi kết quả cho mình nhe. Đây là Y!M của mình: huydung_1987
     
    #11

Chia sẻ trang này