Pagina 1 din 1

Cum sa calculez .... Varsta din CNP

MesajScris: Vin Ian 15, 2010 8:38 pm
de cvmircea
Se poate afla varsta unei persoane cunoscind doar cnp-ul? O interogare din care sa rezulte o lista cu persoanele care isi vor serba ziua de nastere saptamina urmatoare?

Re: Cum sa calculez .... Varsta din CNP

MesajScris: Sâm Ian 16, 2010 11:26 am
de Dr.Windows
Pentru calcularea varstei, cred ca partea "grea" este doar extragerea datei de nastere din CNP, iar mai jos ai o functie care face acest lucru:

Cod: Selectaţi tot
Function GetDateFromCNP(ByVal vCNP) As Date
    'testeaza tipul de CNP trimis ca parametru
    Select Case VarType(vCNP)
        Case vbInteger, vbLong, vbDouble
            lcCNP = Trim(Str(vCNP))
        Case vbString
            lcCNP = Trim(vCNP)
        Case Else
            lcCNP = ""
    End Select
   
    'Daca nu este de fix 13 caractere returneaza o data invalida
    If Len(lcCNP) <> 13 Then
        GetDateFromCNP = DateSerial(1000, 1, 1)
        Exit Function
    End If
   
    'Verifica AN
    nChkAn = Val(Mid(lcCNP, 1, 1))
    Select Case nChkAn
        Case 1, 2
            lnSecol = 1900
        Case 3, 4
            lnSecol = 1800
        Case 5, 6
            lnSecol = 2000
        Case Else
            lnSecol = 1000
    End Select
   
    'Extrage data nasterii
    lnAn = Val(Mid(lcCNP, 2, 2))
    lnLuna = Val(Mid(lcCNP, 4, 2))
    lnZi = Val(Mid(lcCNP, 6, 2))
   
    If lnSecol = 1000 Then
        ldData = DateSerial(1000, 1, 1)
    Else
        ldData = DateSerial(lnSecol + lnAn, lnLuna, lnZi)
    End If
   
    GetDateFromCNP = ldData
End Function


Desi la "limita", daca crezi ca nu vei avea date inainte de 1900, ai putea sa ai data nasterii doar printr-un simplu DATESERIAL:

Cod: Selectaţi tot
DateSerial(Val(Mid(lcCNP, 2, 2)),Val(Mid(lcCNP, 4, 2)),Val(Mid(lcCNP, 6, 2)))


Dupa care, folosind functia DATEDIFF din Access (detalii DateDiff Function) poti calcula varsta in ani, luni , zile, etc...

Cat despre un query care sa-ti returneze o lista de "viitori" sarbatoriti un exemplu simplu ar fi

Cod: Selectaţi tot
SELECT Table1.Nume, Table1.CNP
FROM Table1
WHERE (VAL(MID(Table1.CNP,4,2)) BETWEEN 1 and 2);


din care vei obtine o lista cu persoanele care sunt sarbatorite in lunile ianuarie si februarie...

Pe acelasi "model" poti extinde conditia WHERE sa ii aleaga pe cei din luna curenta si care isi vor serba ziua in urmatoarele 7 zile:

Cod: Selectaţi tot
WHERE (((Val(Mid([Table1].[CNP],4,2)))=Month(Date())) AND ((Val(Mid([Table1].[CNP],6,2))-Day(Date())) Between 1 And 7));

Problema cu aceasta conditie este ca ti-i va arata doar pe cei din luna curenta... datorita primei parti din conditie (=Month(Date()))

Si atunci poti face un alt artificiu: sa transformi datele de nastere din CNP in date "curente"... adica ca si cum s-ar naste in anul curent:

Cod: Selectaţi tot
dateserial(year(date()), Val(Mid([Table1].[CNP],4,2)), Val(Mid([Table1].[CNP],6,2)))

si atunci conditia ar fi si mai aproape de ce vrei tu... adica

Cod: Selectaţi tot
WHERE datediff("d", date(), dateserial(year(date()), Val(Mid([Table1].[CNP],4,2)), Val(Mid([Table1].[CNP],6,2)))) between 0 and 7