Cum sa calculez .... Varsta din CNP

Informatii despre cum se utilizeaza Microsoft Access 2007. Baze de date, Interogari, Formulare, Rapoarte, etc
cvmircea
Moderator
Moderator
Mesaje: 402
Membru din: Lun Aug 03, 2009 7:25 pm
Localitate: Alba Iulia
Contact:

Cum sa calculez .... Varsta din CNP

Mesaj de cvmircea » Vin Ian 15, 2010 8:38 pm

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?

Dr.Windows
Site Admin
Site Admin
Mesaje: 4519
Membru din: Vin Iul 31, 2009 7:32 am

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

Mesaj de Dr.Windows » Sâm Ian 16, 2010 11:26 am

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

Scrie răspuns

Înapoi la “Intrebari despre Access 2007”