Hàm tính số ngày lưu công kho bãi

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Chào các anh chị
Em đang bi bô tập viết Fucntion (rất ngu ngơ xin các huynh đừng cười chê
PHP:
Function luucont(loaicont As Byte, Optional ngaybatdau As Date = 0, Optional ngayketthuc As Date = 0, Optional giamtru As Byte = 7) As Long
    Application.Volatile (False)
    Set songay = Round(ngayketthuc - ngaybatdau - ngaygiamtru, 0)
     Select Case loaicont
        Case loaicont = 20
            If songay >= 1 And songay <= 5 Then
                luucont = songay * 2
                Else: luucont = songay * 4
            End If
        Case loaicont = 40
            If songay >= 6 Then
                luucont = songay * 4
                Else: luucont = songay * 6
            End If
       
    End Select
End Function
)
Ý của em như sau
- Ở bãi sẽ có 02 loại cont (Cont 20 phít, và cont 40phít) tạm gọi thế
Bình thường khách hàng sẽ được miễn 7 ngày lưu cont tại bãi. Nếu
Số ngày lưu bãi (sau khi đã trừ đi số ngày miễn)
trong khoảng từ 1 đến 5 ngày
-Số tiền phải thu là :
cont 20' = số ngày lưu bãi x 2$
cont 40' = số ngày lưu bãi x 4$
Bắt đầu từ 6 ngày trở đi
- Số tiền phải thu là
cont 20' = số ngày lưu bãi x 4$
cont 40' = số ngày lưu bãi x 6$

Xin Anh chị chỉ dạy cho em đôi điều

Rất cám ơn
 

File đính kèm

Góp ý với em chút!
Về câu lệnh:
1.
Mã:
[FONT=Courier New][COLOR=#0000bb]Set songay [/COLOR][COLOR=#007700]= [/COLOR][COLOR=#0000bb]Round[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]ngayketthuc [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]ngaybatdau [/COLOR][COLOR=#007700]- [/COLOR][COLOR=#0000bb]ngaygiamtru[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000bb]0[/COLOR][/FONT][COLOR=#007700][FONT=Courier New]) [/FONT][/COLOR]
thì không dùng SET (SET dùng cho đối tượng)
và sai biến ngaygiamtru ==> đúng phải là giamtru (theo biến đặt trong hàm).
2.
Mã:
[FONT=Courier New][COLOR=#0000bb]Select [/COLOR][COLOR=#007700]Case [/COLOR][/FONT][FONT=Courier New][COLOR=#0000bb]loaicont [/COLOR][/FONT]
[FONT=Courier New][COLOR=#007700]Case [/COLOR][COLOR=#0000bb]loaicont [/COLOR][COLOR=#007700]= [/COLOR][/FONT][COLOR=#0000bb][FONT=Courier New]20 [/FONT][/COLOR]
câu lệnh trên chỉ cần dùng Case 20 (tương tự Case 40) hoặc Case Is= 20
3.
Nếu Số ngày lưu bãi (sau khi đã trừ đi số ngày miễn)
trong khoảng từ 1 đến 5 ngày
-Số tiền phải thu là :
cont 20' = số ngày lưu bãi x 2$
cont 40' = số ngày lưu bãi x 4$
Bắt đầu từ 6 ngày trở đi
- Số tiền phải thu là
cont 20' = số ngày lưu bãi x 4$
cont 40' = số ngày lưu bãi x 6$
Em nên xem lại thuật toán
Tham khảo nhé:
Mã:
Option Explicit
Function LuuCont(loaicont As Byte, Optional ngaybatdau As Date = 0, Optional ngayketthuc As Date = 0, Optional giamtru As Byte = 7) As Long
    'Application.Volatile (False)
    Dim songay
    songay = Round(ngayketthuc - ngaybatdau - giamtru, 0)
     Select Case loaicont
        Case Is = 20
            If songay >= 1 And songay <= 5 Then
                LuuCont = songay * 2
            ElseIf songay > 5 Then
                LuuCont = 5 * 2 + (songay - 5) * 4
            End If
        Case Is = 40
            If songay >= 1 And songay <= 5 Then
                LuuCont = songay * 4
            ElseIf songay > 5 Then
                LuuCont = 5 * 4 + (songay - 5) * 6
            End If
    End Select
End Function
P/S: Nên khai báo Option Explicit ở đầu để dễ quả lý sai sót về biến...
(Đi Offline rủ anh với nhé! :-=)
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn tham khảo thêm hàm này

PHP:
Option Explicit
Const NgGiam As Integer = 7
Function LuuCont(NgDau As Date, Optional NgCuoi As Date, Optional BonChuc As Boolean = _
                 True) As Double
 Dim SoNgay As Integer
 If NgCuoi = 0 Then NgCuoi = Date
 SoNgay = NgCuoi - NgDau - NgGiam
 If SoNgay < 1 Then
    LuuCont = 0
 ElseIf BonChuc Then
    LuuCont = IIf(SoNgay < 6, SoNgay * 4, 20 + SoNgay * 6)
 ElseIf Not BonChuc Then
    LuuCont = IIf(SoNgay < 6, SoNgay * 2, 10 + SoNgay * 4)
 End If
End Function
 
Upvote 0
Còn một vấn đề nữa em chưa thấy ai quan tâm trong code trên cả:
Từ ngày 01/01/2009 đến ngày 18/01/2009 tính là 17 ngày hay 18 ngày !?
 
Lần chỉnh sửa cuối:
Upvote 0
Còn một vấn đề nữa em chưa thấy ai quan tâm trong code trên cả:
Từ ngày 01/01/2009 đến ngày 18/01/2009 tính là 17 ngày hay 18 ngày !?
Tính là bi nhiêu là do Giám đốc quyết;
Như trong khách sạn là người ta tính tăng đó;
Nhưng thời buổi kinh tế đang xuống dốc, thì còn tùy.

Nói vậy thôi, chứ trong ba rem GĐ chắc đã quy định & giải thích cho nhân viên rồi!
 
Upvote 0
Tính là bi nhiêu là do Giám đốc quyết;
Như trong khách sạn là người ta tính tăng đó;
Nhưng thời buổi kinh tế đang xuống dốc, thì còn tùy.

Nói vậy thôi, chứ trong ba rem GĐ chắc đã quy định & giải thích cho nhân viên rồi!
Chắc hổng phải do Giám Đốc quyết định đâu bác ơi! Có lẽ phải do Bên hãng tàu hay quản lý bãi lưu cont quyết mới đúng! Mà họ quyết thì làm gì có chuyện có lợi cho mình!
Xem ví dụ này nữa sẽ thấy sự khác biệt là 1 trời một vực:
Từ ngày 01/01/2009 đến ngày 08/01/2008 là 7 ngày hay 8 ngày
 
Upvote 0
Tính tổng số tiền lưu cont

Ý của em như sau
- Ở bãi sẽ có 02 loại cont (Cont 20 phít, và cont 40phít) tạm gọi thế
Bình thường khách hàng sẽ được miễn 7 ngày lưu cont tại bãi. Nếu
Số ngày lưu bãi (sau khi đã trừ đi số ngày miễn)
trong khoảng từ 1 đến 5 ngày
-Số tiền phải thu là :
cont 20' = số ngày lưu bãi x 2$
cont 40' = số ngày lưu bãi x 4$
Bắt đầu từ 6 ngày trở đi
- Số tiền phải thu là
cont 20' = số ngày lưu bãi x 4$
cont 40' = số ngày lưu bãi x 6$
Bạn xem thử đoạn code này nhé! Mình tính: ngày tính lưu cont sẽ lấy ngày cuối - ngày đầu +1
PHP:
Function LuuCont(BegDate As Date, EndDate As Date, Optional ContType As Byte = 20, Optional mDeduct As Byte = 7) As Double
Dim mDays As Double
mDays = Round(EndDate - BegDate - mDeduct + 1,0)
LuuCont = Choose(Abs((mDays >= 1) + (mDays > 5)) + 1, 0, _
                 mDays * Choose(Abs((ContType >= 20) + (ContType >= 40)), 2, 4), _
                 Choose(Abs((ContType >= 20) + (ContType >= 40)), _
                            (mDays - 5) * 4 + 10, (mDays - 5) * 6 + 20))
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn các Anh tận tình chỉ giúp. Về code em đã vỡ ra thêm tí rồi. Chỉ mong có một cuốn VBA thôi nhưng đen quá, mãi không gặp Anh NVSON mua được...Hic Hic (anh Sơn giúp em vụ này nhé, đảm bảo em hậu tạ tới nơi tới chốn)

Còn một vấn đề nữa em chưa thấy ai quan tâm trong code trên cả:
Từ ngày 01/01/2009 đến ngày 18/01/2009 tính là 17 ngày hay 18 ngày !?
Dear Anh Kiệt
Khác với khách sạn (Nghỉ qua đêm họ tính là một ngày rồi). Còn bên hãng tàu họ tính (ví dụ: 26/02 --> 27/02 là 01 ngày)

Một lần nữa cám ơn các anh rất nhiều
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom