• Demo_[Hàm] Tính thâm niên như BHXH (maidinhdan)
  • Demo_[Hàm] Tính thâm niên như BHXH (maidinhdan)

    maidinhdan > 30-06-15, 04:03 PM

    Khu vực thư viện hàm trước đây có 1 bài viết của anh Xuân Thanh để tính thâm niên ( Link bài). Áp dụng ra nhưng vẫn chưa ưng ý theo nhu cầu lắm, nên xin chế ra 1 hàm mới để dùng

    Bước 1: Tạo mới 1 Modules và chép đoạn code dưới đây vào:

    Mã PHP:
    Public Function Tinhthamnien(Ngaybatdau As DateNgayketthuc As Date) As String
    ' code by maidinhdan
    Dim Sothang As Long
    Dim Nam As String
    Dim Thang As String
    Sothang = DateDiff("m", Ngaybatdau, Ngayketthuc)
    Nam = Int((Sothang) / 12) 
    Thang = (Sothang) Mod 12 
    Tinhthamnien = Nam & " Nam " & Thang & " tháng." 

    End Function 


    Bước 2: Khi nào cần sử dụng thì gõ Cú pháp sau:

    Mã PHP:
    Tinhthamnien([txt1],[txt2]) 

    Trong đó:
    - [txt1] là thời gian bắt đầu: ví dụ là ngày bắt đầu tham gia Bảo hiểm xã hội

    - [txt2] là thời gian hiện tại cần tính.

    => cú pháp theo Demo của bài mình là: Tinhthamnien([NgaythamgiaBHXH],Date())
    Hình minh họa: kết quả
    [Hình: tinhthamnien.png]

    Ghi chú: Hàm này không tính ngày nhé chỉ tính đến tháng thôi.

    Link Demo của ongke ( tính năm, tháng, ngày): http://www.mediafire.com/download/nrpp41...amNien.mdb

    Chúc các bạn thành công.
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    maidinhdan > 23-07-15, 04:20 PM

    Chúng ta có thể áp dụng code này cho một số lĩnh vực như sau:

    - Tính tổng số năm tham gia bảo hiểm xã hội;
    - Tính tổng số năm tham gia Đảng;
    - Tính tổng số năm gia nhập công đoàn;
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    bvchauthanh > 23-07-15, 05:05 PM

    Nếu xem 1 tháng có 30 ngày thì code sau đây có thể tính ra ngày (mình xin sửa code của bạn tí nhé)
    Mã PHP:
    Public Function TinhThamNien(NgayBatDau As DateNgayKetThuc As Date) As String
        On Error Resume Next
       
       Dim SoNgay 
    As Long
       Dim SoThang 
    As Long
       Dim sNgay 
    As String
       Dim sThang 
    As String
       Dim sNam 
    As String
       Dim k 
    As String
       
       SoNgay 
    DateDiff("d"NgayBatDauNgayKetThuc)
       SoThang DateDiff("m"NgayBatDauNgayKetThuc)
       k ""
       
       sNam 
    Int(SoThang 12)
       sThang SoThang Mod 12
       sNgay 
    SoNgay Mod 30
       
       If sNam 
    0 Then k sNam " nam "
       If sThang 0 Then k sThang " tháng "
       If sNgay 0 Then k sNgay " ngày"
       
       TinhThamNien 
    k
    End 
    Function 

    Ai có cách nào khác để cái số ngày phù hợp hơn không? (tức có tháng 29, 30, 31 ngày ấy)
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    maidinhdan > 23-07-15, 05:14 PM

    (23-07-15, 05:05 PM)bvchauthanh Đã viết: Ai có cách nào khác để cái số ngày phù hợp hơn không? (tức có tháng 29, 30, 31 ngày ấy)



    Cảm ơn anh bvchauthanh đóng góp thêm 1 code, việc viết thêm để tính chính xác đến số ngày rất dể, chỉ cần 1 dòng nửa thôi là ra, không có gì phức tạp cả.

    Có rất nhiều lý do em không đưa vào code của mình. Bởi tính BHXH, thâm niêm Đảng, Đoàn....không có ai yêu cầu tính chính xác đến ngày đâu. Chỉ cần năm + tháng là đủ rồi.

    Ví thế em chỉ viết có bấy nhiêu thôi.
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    maidinhdan > 23-07-15, 05:26 PM

    (23-07-15, 05:05 PM)bvchauthanh Đã viết: Nếu xem 1 tháng có 30 ngày thì code sau đây có thể tính ra ngày (mình xin sửa code của bạn tí nhé)
    Mã PHP:
    Public Function TinhThamNien(NgayBatDau As DateNgayKetThuc As Date) As String
       On Error Resume Next
       
       Dim SoNgay 
    As Long
       Dim SoThang 
    As Long
       Dim sNgay 
    As String
       Dim sThang 
    As String
       Dim sNam 
    As String
       Dim k 
    As String
       
       SoNgay 
    DateDiff("d"NgayBatDauNgayKetThuc)
       SoThang DateDiff("m"NgayBatDauNgayKetThuc)
       k ""
       
       sNam 
    Int(SoThang 12)
       sThang SoThang Mod 12
       sNgay 
    SoNgay Mod 30
       
       If sNam 
    0 Then k sNam " nam "
       If sThang 0 Then k sThang " tháng "
       If sNgay 0 Then k sNgay " ngày"
       
       TinhThamNien 
    k
    End 
    Function 

    Ai có cách nào khác để cái số ngày phù hợp hơn không? (tức có tháng 29, 30, 31 ngày ấy)

    Tác giả kiểm tra lại nhé xem hình ( Dù điền ngày nào cũng thế, không chỉ có ngày 31 hay ngày 15, 20 đâu)

    [Hình: Loi.png]
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    bvchauthanh > 23-07-15, 06:17 PM

    Chắc bạn maidinhdan hiểu nhầm ý của mình rồi.
    Thứ nhất: biết là các ứng dụng nếu cần tính ra thâm niên thì không cần đến ngày, nhưng ở đây mình chỉ mở rộng ra thôi, ai có ứng dụng được thì ứng dụng, do tôi muốn nghiên cứu, học hỏi nên tiện viết thế thôi. (code còn dỡ, mong ae bỏ qua)
    Thứ hai: code trên do trong tháng có 29, 30, 31 ngày nhưng do tính số ngày còn dư (sau khi tính tháng) xem 30 ngày là 1 tháng (chứ không có xem 1 tháng là 31 ngày đối với những tháng có 31 ngày)
    Mã PHP:
    sNgay SoNgay Mod 30 
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    ongke0711 > 23-07-15, 08:17 PM

    Chào các bác,

    Không biết mình có nhập sai định dạng ngày tháng không mà thấy sai kết quả cho khoảng thời gian giữa ngày: 31/01/2015 và 01/03/2015. KQ: 2 tháng 29 ngày.?
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    bvchauthanh > 23-07-15, 10:49 PM

    Mình đã sữa lại code mọi người test thử nhé! anh em sửa code lại như sau nhé
    Mã PHP:
    Public Function TinhThamNien(NgayBD As DateNgayKT As Date) As String
       Dim sNgay 
    As DoublesThang As DoublesNam As Double
       
       sThang 
    0
       sNam 
    0
       
       sNgay 
    DateDiff("d"NgayBDNgayKT)
       If sNgay 30 Then
           sThang 
    Int(sNgay 30)
           If sThang 12 Then
               sNam 
    Int(sThang 12)
               sThang sThang Mod 12
           End 
    If
           sNgay sNgay Mod 30
       End 
    If
       
       TinhThamNien 
    IIf(sNam 0""sNam " nam ") & IIf(sThang 0""sThang " tháng ") & sNgay " ngày"
    End Function 

    hoặc down file đính kèm
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    maidinhdan > 23-07-15, 11:50 PM

    (23-07-15, 10:49 PM)bvchauthanh Đã viết: Mình đã sữa lại code mọi người test thử nhé! anh em sửa code lại như sau nhé
    Mã PHP:
    Public Function TinhThamNien(NgayBD As DateNgayKT As Date) As String
       Dim sNgay 
    As DoublesThang As DoublesNam As Double
       
       sThang 
    0
       sNam 
    0
       
       sNgay 
    DateDiff("d"NgayBDNgayKT)
       If sNgay 30 Then
           sThang 
    Int(sNgay 30)
           If sThang 12 Then
               sNam 
    Int(sThang 12)
               sThang sThang Mod 12
           End 
    If
           sNgay sNgay Mod 30
       End 
    If
       
       TinhThamNien 
    IIf(sNam 0""sNam " nam ") & IIf(sThang 0""sThang " tháng ") & sNgay " ngày"
    End Function 

    hoặc down file đính kèm

    Code này còn nguy hiểm hơn code trên nửa....anh viết code xong phải test từ ngày 1,2,3,4,.....đến ...30..31 chứ
    Hình test code: Phần tô đỏ được tính bằng tay
    [Hình: loi2.jpg]


    Em gợi ý cho anh sửa lại cái hàm trên:
    1. Tối thiếu phải có 2 hàm: DateDiff + DateAdd
    2. Cách tìm ra số ngày chính xác: gọi X là ngày tham gia BHXH
    + Tính ra tổng số tháng...đến ngày đầu tiền, tức là ngày 01 tây của tháng hiện hành. tạm gọi là Tongthang1
    + Dùng hàm DateAdd xác định ngày đầu tiên của tháng dựa vào Tongthang1 tạm gọi là N1
    + Dùng hàm DateDiff: tính thời gian từ X đến N1 _______Ở đây cho ra Tổngngay: tạm gọi là A1
    + Dùng hàm DateDiff: tính thời gian từ X đến Date()_______Ở đây cho ra Tổngngay: tạm gọi là A2

    Cuối cùng: lấy A2-A1: đây là kết quả anh cần tìm.

    Bây nhiêu đó anh viết thêm 1 dòng là đủ. Anh lấy code của em rồi anh viết 1 hàm tính ngày thôi trên cột riêng rồi test thử xem. Rất ok.hihi
    Khi áp dụng được, anh không cần phải lo chuyện 1 tháng có 30 hay 31 ngày. Nó tính ra hết. Chỉ là, khi nó ra số âm anh phải bắt nó lấy đi 1 tháng của tháng cuối cùng, rồi trừ ngược thôi.

    Chúc anh thành công.
  • RE: [Hàm] Tính thâm niên như BHXH (maidinhdan)

    ongke0711 > 24-07-15, 02:08 AM

    Không biết bác maidinhdan có viết nhầm tên hàm không? Mình dùng DateDiff + DateSerial. Code này mình lục lại mấy file trước đây. Do trí nhớ kém nên ghi chú hơi bị nhiều ở các dòng code, nhìn hơi rối chút  007

    Mã PHP:
    Function ThamNien(NgayBatDau As DateNgayKetThuc As Date)
       
        
        
    ' Hàm cho ket qua: X nam, Y tháng, Z ngày
        ' "Tròn tháng"
    là sô ngày cua NKT >= sô ngày cua NBD hoac NBD va NKT la ngay cuoi cua thang tuong ung.
        ' Khac phuc hàm cho ket qua sai doi voi truong hop tháng có 28,29,31 ngày.
        
       Dim Nam As Long, Thang As Long, Ngay As Long
       Dim NgayXL As Date, NgayCuoiThang1 As Date, NgayCuoiThang2 As Date
        
        ' 
    Cat bo phan thoi gian (timetheo sau NgayBatDauNgayKetThuc
       NgayBatDau 
    Int(NgayBatDau)
       NgayKetThuc Int(NgayKetThuc)
        
        
    ' Kiem tra xem ngày có hop le không?
       If NgayBatDau > NgayKetThuc Then
           ThamNien = ""
           Exit Function
       End If
        
       '
    #Tìm thông sô NAM truoc, den THANG, den NGAY
       
        
    ' Kiem tra xem có cùng Nam giua 2 ngày can tìm thâm niên
       If Year(NgayKetThuc) > Year(NgayBatDau) Then
            
            ' 
    Neu khác Nam -> Kiem tra xem Tháng có giong nhau không? -> Neu cùng Tháng
            
    ' -> Ktra Ngày de xem dã tròn Nam hay chua du Nam. VD: 2014/7/23 và 2015/7/20 => chua du Nam
            
           If Month(NgayKetThuc) = Month(NgayBatDau) Then
               If Day(NgayKetThuc) >= Day(NgayBatDau) Then
                   Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc)
               Else
                   Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc) - 1   '
    Loai bo truong hop chua tròn NAMhàm DateDiff 'yyyy" vãn cho gtri = 1
               End If
                
           ' 
    Truong hop nay chac chan da qua tròn NAM
           ElseIf Month
    (NgayKetThuc) > Month(NgayBatDauThen
               Nam 
    DateDiff("yyyy"NgayBatDauNgayKetThuc)
                
           
    ' Truong hop nay chua tròn NAM
           Else
               Nam = DateDiff("yyyy", NgayBatDau, NgayKetThuc) - 1
           End If
            
       ' 
    Truong hop nay NAM giong nhau -> chac chan chua tròn NAM
       Else
           Nam 
    0
       End 
    If
        
       
    ' Tính xem bao nhiêu THÁNG. Chi lay phan Tháng chua tròn NAM (mod 12).
       Thang = (DateDiff("m", DateSerial(Year(NgayBatDau), Month(NgayBatDau), 1), _
       DateSerial(Year(NgayKetThuc), Month(NgayKetThuc), 1)) + IIf(Day(NgayKetThuc) >= _
       Day(NgayBatDau), 0, -1)) Mod 12
        
       ' 
    Tính xem bao nhiêu Ngày da quaTruong hop NKT >= NBD.
       If Day(NgayKetThuc) >= Day(NgayBatDauThen
           Ngay 
    Day(NgayKetThuc) - Day(NgayBatDau)
            
       
    ' Truong hop NKT<NBD -> phai kiem tra ngày cuôi cua Tháng
       ' 
    NgayCuoiThang1Ngày cuôi tháng truoc NgayKetThuc
       
    ' NgayCuoiThang2: Ngày cuôi cua tháng NgayKetThuc
       ' 
    NgayXLQui ve Tháng truoc cua NKT voi Ngày cua NBD
       Else
           NgayCuoiThang1 
    DateSerial(Year(NgayKetThuc), Month(NgayKetThuc), 0)
           NgayCuoiThang2 DateSerial(Year(NgayKetThuc), Month(NgayKetThuc) + 10)
           NgayXL DateSerial(Year(NgayKetThuc), Month(NgayKetThuc) - 1Day(NgayBatDau))
           
           If NgayCuoiThang2 
    NgayKetThuc Then   'NKT la ngày cuoi thang
               If Thang = 11 Then
                   Thang = 0
                   Nam = Nam + 1
               Else
                   Thang = Thang + 1
               End If
           Else
               Ngay = DateDiff("d", IIf(NgayXL > NgayCuoiThang1, NgayCuoiThang1, NgayXL), NgayKetThuc)
           End If
       End If
        
       If Nam >= 1 Then
           ThamNien = Nam & " nam, " & Thang & " tháng, " & Ngay & " ngày"
       Else
           If Thang >= 1 Then
               ThamNien = Thang & " tháng, " & Ngay & " ngày"
           Else
               ThamNien = Ngay & " ngày"
           End If
       End If
        
    End Function 

    Mượn tạm file .mdb của bạn bvchauthanh làm demo