Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Help] Lưu tổng giao dịch từng tháng của khách hàng vào table
#1
Mình đang viết 1 chương trình bán hàng có table để lưu tổng số tiền hàng của mỗi khách hàng đã mua theo từng tháng. Hiện thuật toán mình đã nghĩ ra nhưng viết code bị lỗi mà k biết sửa, mong mọi người hướng dẫn.

Sơ lược về cách mình làm:
- Trên form tạo 2 textbox: txtthang và txtnam để nhập tháng năm cần thống kê. Kèm thêm 1 nút bấm Thực hiện.
- Khi click vào nút bấm sẽ rà soát từng khách hàng trong table thongtinhhv. Với mỗi khách hàng, ta sẽ lọc các giao dịch từ ngày đầu tháng đến ngày cuối tháng (dựa vào txtthang và txtnam nhập vào) của Khách hàng đó và dùng TongHH để cộng dần lại. Sau đó ghi vào table PhatHH các thông tin Mshv, thang, nam, tongHH.

Và đây là code nút bấm của mình:

Mã:
Private Sub Command8_Click()
    Dim Ngaydauthang As Date
    Dim Ngaycuoithang As Date
    Dim rs As Recordset
    Dim rs1 As Recordset
    Dim CauSQL As String
    Dim CauSQL1 As String
    Dim CauSQL2 As String
    Dim tongHH1 As Integer
    
    Ngaydauthang = DateSerial(Me.txtnam, Me.txtthang, 1)
    Ngaycuoithang = DateAdd("m", 1, Ngaydauthang) - 1


    CauSQL = "Select Mshv from Thongtinhv"
    Set rs = CurrentDb.OpenRecordset(CauSQL)
    If rs.RecordCount > 0 Then
        rs.MoveFirst
        Do Until rs.EOF
        tongHH1 = 0
        CauSQL1 = "Select * from Giaodich Where MST1 ='" & rs & "' and NgaythangGD<=Ngaycuoithang and NgaythangGD>=Ngaydauthang"
        
        Set rs1 = CurrentDb.OpenRecordset(CauSQL1)
        If rs1.RecordCount > 0 Then
        rs1.MoveFirst
        Do Until rs1.EOF
            tongHH1 = rs1!Soluong * rs1!HH1
            rs1.MoveNext
        Loop
        End If
        CauSQL2 = "INSERT INTO PhatHH VALUES (rs, txtthang, txtnam, TgHHT1)"
        DoCmd.RunSQL CauSQL2
        
         rs.MoveNext
        Loop
    Else: MsgBox "Khong co Hoi vien de thong ke", vbDefaultButton1, "Thong bao"
    End If
    
  
    rs.Close
    rs1.Close
End Sub

Và mình còn thêm 2 thắc mắc nữa:
- Vì mỗi lần giao dịch có nhiều sản phẩm do đó Mỗi giao dịch đều lưu thành 2 table. Vậy khi lựa chọn giao dịch theo ngày tháng như trên phải viết cú pháp như thế nào cho ổn ^^!
- Trong khi chạy code nếu có 1 dữ liệu đã có sẵn thì bắt lỗi để update dữ liệu đã có của Khách hàng đó như thế nào. Ví dụ: khi chạy code, Khách hàng A đã có tongHH của tháng 3/2013 trong table thì sẽ cập nhật lại.

Mình gửi kèm file cho mọi ng tiện tham khảo Download

Xem nhanh database
Chữ ký của hatashibl
Reply
Những người đã cảm ơn
#2
mình đang cần gấp ^^ Mọi ng xem giúp mình với.
Chữ ký của hatashibl
Reply
Những người đã cảm ơn
#3
1/ Lý do tại sao phải lưu thành 2 table?
2/ Trong table Tổng hợp ngoài những dữ liệu cần update, những dữ liệu còn lại ở đâu ra?
3/ CSDL cần thiết kế cho hôp lý, khi đó việc tổng hợp sẽ thuận lợi hơn
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn hatashibl
#4
@:Xuân Thanh
1. Vì mỗi 1 lần giao dịch số lượng hàng hóa và nhiều loại hàng khác nhau. Do đó mình dùng Table Giaodich để lưu số thứ tự giao dịch, ngày tháng, người giao dịch. Còn table HHGD dùng để lưu các Loại hàng, tên hàng, số lượng căn cứ vào số thứ tự giao dịch từ Table Giao dich.
2. Các dữ liệu còn lại là từ các table khác đưa vào, mình đã cắt đi vì các bạn rối thêm. Vì code mình đang bị lỗi chỉ tập trung trong phần dữ liệu đó.
3. Vì hoa hồng là mình trả sau cho các nhân viên phụ thuộc vào giao dịch của khác hàng. Nên do đó mình tạo Table PhatHH để tổng kết số lượng giao dịch có liên quan đến nhân viên đó (MSNGT1) trong từng tháng và lưu vào Table PhatHH. Đồng thời việc trả Hoa hồng cũng theo từng tháng nên mình tạo thêm Field Danhan để lưu số tiền đã trả được mỗi tháng.

Nhờ bạn xem giúp mô tả và code mình đãng làm bên trên và sửa giúp mình với.
Chữ ký của hatashibl
Reply
Những người đã cảm ơn
#5
vấn đề của bạn đơn giản nên viết code sẽ lu bu lắm, sử dụng sức mạnh của Query đi bạn.

việc của bạn có phải là khi nhập vào tháng và năm thì chương trình sẽ đi tính lại tiền cho từng khách hàng trong khoảng thời gian đó phải không?

cách gảii quyết:
- sau khi nhập tháng và năm: xóa những record trong table: PhatHH trong khoảng thời gian này (dùng lệnh hoạc Query để xóa)
- Dùng Query Append tính lại tiền của từng khách hàng trong khoảng thời gian này.

tạo query xóa:
[Hình: rimjis]

tạo query tính lại tiền:
[Hình: rimjuq]

và khi nút Thực hiện được Click sẽ thực hiện 2 Query trên:

Private Sub Command8_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery "QXoa"
DoCmd.OpenQuery "QThem"
DoCmd.SetWarnings True
MsgBox "Da thuc hien xong..."
End Sub
015
DEMO

P/s: trước khi bạn upfile lên, bạn nên chạy lệnh Compact and Repair... cho nó nhỏ lại dung lượng nhé!!014
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn hatashibl
#6
@: bomnhauag

Cảm ơn sự giúp đỡ của bạn. Cách bạn làm rất hay và mình đã test thành công.
Nhưng mình vẫn còn 1 khúc mắc nhờ bạn giúp đỡ thêm:
- Vì MST1 đều từ Mshv của table Thongtinhv mà có, do đó nếu trong txtthang và txtnam điều kiện ta xét nếu Mshv đó không có phát sinh thì ghi vào table PhatHH các giá trị ("MSHV",txtthang, txtnam, 0) thì phải làm cách nào vậy bạn.

- Nếu thực hiện Query xóa thì dữ liệu ở các field còn lại như Danhan, Thoigiannhan, Hinhthucnhan cũng bị xóa theo. Vì mục đích mình tạo table PhatHH dùng để tổng cộng số tiền mỗi tháng của từng người để tiện thống kê theo dõi, đồng thời các field Danhan, Thoigiannhan, Hinhthucnhan để ghi lại số tiền đã thanh toán của người đó 1 lần vào cuối mỗi tháng. Việc thanh toán có thể thừa hoặc thiếu nên mình gộp chung vào table PhatHH cho tiện theo dõi.
Chữ ký của hatashibl
Reply
Những người đã cảm ơn
#7
- Ý bạn là mấy Khách hàng kô phát sinh giao dịch trong tháng (Tổng tiền=0) thì có đưa vào PhatHH hay kô?

- Yêu cầu giữ lại thông thin như trên thì bạn viết code như sau:

Mã:
Private Sub Command8_Click()
    Dim s As String
    thucHien
    MsgBox "Da thuc hien xong..."
End Sub

Private Sub thucHien()
    Dim r As DAO.Recordset
    Dim s As String
    
    'tao truy van tinh tong tien cua tung khach trong thang va nam duoc chon
    s = "SELECT Giaodich.MST1, Sum(([Soluong]*[Gia])) AS SoTien "
    s = s & "FROM Giaodich INNER JOIN HHGD ON Giaodich.STTGD = HHGD.STTGD "
    s = s & "WHERE (((Month([NgaythangGD])) = Cint(" & txtthang & ")) And ((Year([NgaythangGD])) = Cint(" & txtnam & "))) "
    s = s & "GROUP BY Giaodich.MST1;"
    
    Set r = CurrentDb.OpenRecordset(s)
    If r.EOF And r.BOF Then     'truong hop trong thoi gian do ko co phat sinh giao dich
        MsgBox "Thang nay ko co phat sinh tien bac j het ah"
    Else    'co giao dich thi duyet tung giao dich
        r.MoveFirst
        While Not r.EOF
            'kiem xem trong PhatHH co thang Khach hang nay trong thoi gian do chua
            s = Nz(DLookup("Mshv", "PhatHH", "Mshv='" & r("MST1") & "' And Thang=" & txtthang & " And Nam=" & txtnam), "")
            'neu co mat no trong do thi sua lai noi dung can sua
            If s <> "" Then
                s = "UPDATE PhatHH SET PhatHH.HHtang1 = " & r("SoTien") & " WHERE (((PhatHH.Mshv)='" & r("MST1") & "') AND ((PhatHH.Thang)=" & txtthang & ") AND ((PhatHH.Nam)=" & txtnam & "));"
                CurrentDb.Execute s
            Else    ' neu no klhong co trong PhatHH thi them cai mat moc cua no vo
                s = "INSERT INTO PhatHH ( Mshv, HHtang1, Thang, Nam )SELECT '" & r("MST1") & "' , " & r("SoTien") & ", " & txtthang & ", " & txtnam & ";"
                CurrentDb.Execute s
            End If
            r.MoveNext
        Wend
    End If
    r.Close
    Set r = Nothing
End Sub
034

DEMO015
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn hatashibl
#8
@: bomnhauag.

Cảm ơn bạn rất nhiều. Đúng là mình muốn các Khách hàng k phát sinh giao dịch trong tháng đó thì Lưu cả Mshv, txtthang, txtnam và tổng tiền = 0 vào table PhatHH.
Nhờ bạn sửa giúp mình luôn phần đó nhé.
Chữ ký của hatashibl
Reply
Những người đã cảm ơn
#9
(08-05-13, 11:19 AM)hatashibl Đã viết: @: bomnhauag.

Cảm ơn bạn rất nhiều. Đúng là mình muốn các Khách hàng k phát sinh giao dịch trong tháng đó thì Lưu cả Mshv, txtthang, txtnam và tổng tiền = 0 vào table PhatHH.
Nhờ bạn sửa giúp mình luôn phần đó nhé.

Vậy bạn phải sửa lại như sau:
- Tạo 1 cái Query tính tiền cho các cha Khách nào có giao dịch trong tháng
- Tạo recordset Lấy hết danh sách khách hàng và liên kết 1 chiều với cái Query vừa rồi (giống cái hình bên dưới nè). Rồi lấy câu lệnh SQL của nó mang vào mần Code tiếp ^^
[Hình: riyfqv]

Mã:
Private Sub Command8_Click()
    Dim s As String
    thucHien
    MsgBox "Da thuc hien xong..."
End Sub

Private Sub thucHien()
    Dim r As DAO.Recordset
    Dim s As String
    
    'tao truy van tinh tong tien cua tung khach trong thang va nam duoc chon
    's = "SELECT Giaodich.MST1, Sum(([Soluong]*[Gia])) AS SoTien "
    's = s & "FROM Giaodich INNER JOIN HHGD ON Giaodich.STTGD = HHGD.STTGD "
    's = s & "WHERE (((Month([NgaythangGD])) = Cint(" & txtthang & ")) And ((Year([NgaythangGD])) = Cint(" & txtnam & "))) "
    's = s & "GROUP BY Giaodich.MST1;"
    
    s = "SELECT Thongtinhv.Mshv AS MST1, QThem1.SoTien "
    s = s & "FROM Thongtinhv LEFT JOIN QThem1 ON Thongtinhv.Mshv = QThem1.MST1 "
    s = s & "WHERE (((QThem1.Thang)=Cint(" & txtthang & ")) AND ((QThem1.Nam)=Cint(" & txtnam & "))) OR (((QThem1.SoTien) Is Null));"

    Set r = CurrentDb.OpenRecordset(s)
    If r.EOF And r.BOF Then     'truong hop trong thoi gian do ko co phat sinh giao dich
        MsgBox "Thang nay ko co phat sinh tien bac j het ah"
    Else    'co giao dich thi duyet tung giao dich
        r.MoveFirst
        While Not r.EOF
            'kiem xem trong PhatHH co thang Khach hang nay trong thoi gian do chua
            s = Nz(DLookup("Mshv", "PhatHH", "Mshv='" & r("MST1") & "' And Thang=" & txtthang & " And Nam=" & txtnam), "")
            'neu co mat no trong do thi sua lai noi dung can sua
            If s <> "" Then
                s = "UPDATE PhatHH SET PhatHH.HHtang1 = " & Nz(r("SoTien"), 0) & " WHERE (((PhatHH.Mshv)='" & r("MST1") & "') AND ((PhatHH.Thang)=" & txtthang & ") AND ((PhatHH.Nam)=" & txtnam & "));"
                CurrentDb.Execute s
            Else    ' neu no klhong co trong PhatHH thi them cai mat moc cua no vo
                s = "INSERT INTO PhatHH ( Mshv, HHtang1, Thang, Nam )SELECT '" & r("MST1") & "' , " & Nz(r("SoTien"), 0) & ", " & txtthang & ", " & txtnam & ";"
                CurrentDb.Execute s
            End If
            r.MoveNext
        Wend
    End If
    r.Close
    Set r = Nothing
End Sub

xong bạn viết code như trên là ok rồi!

p/s: tự xem code nhé bạn... hì007
DEMO016
ღღღღღTài sản của bomnhauag (View All Items) ღღღღღ
Reply
Những người đã cảm ơn hatashibl
#10
@Bomnhauag.

Cảm ơn sự nhiệt tình giúp đỡ của bạn. Mình còn gà hỏi nhiều nên ngại quá^^!

Mình vừa test code mới hình như vẫn chưa chính xác. Mình ví dụ về cái file access mình gửi lên có tổng cộng 9 khách hàng cả thảy. Khi ta nhập tháng 5/2013 vào thì chỉ Khách hàng có mã số HV3 thỏa điều kiện có Số tiền = 300.000đ như vậy các Khách hàng còn lại (8 Khách hàng) đều phải có số tiền = 0 tại tháng 5/2013.
Khi chạy code trên thì table PhatHH chỉ có thông tin của 6 Khách hàng, bao gồm cả Kháng hàng Hv3 có phát sinh.

Bạn xem lại giúp mình nhé ^^
Chữ ký của hatashibl
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Sựa khác nhau giữa Module và Class Module, phạm vi áp dụng của từng loại. MinhnHang 6 299 29-11-16, 09:11 PM
Bài mới nhất: ongke0711
Question [Help] Link tất các table trong một file.mdb bằng VBA MinhnHang 6 145 29-11-16, 05:18 PM
Bài mới nhất: MinhnHang
  [Hỏi] Số Thứ Tự Theo Nhóm Hàng Hóa Trong Access pherotao 2 141 02-11-16, 03:05 PM
Bài mới nhất: pherotao
  [Help] Tính lãi suất vay ngân hàng dangh5 2 172 31-05-16, 12:25 AM
Bài mới nhất: dangh5
  [Thủ Thuật] Tạo Form đánh giá 1 - 5 sao cho từng Record ongke0711 0 117 03-05-16, 06:51 PM
Bài mới nhất: ongke0711

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ