Dodałem do makra kontrolę daty.
Edytowano1:
Dodałem do Tabeli1 pola "DataUrodzin" oraz "Plec", oraz umieściłem je w formularzu. Zmodyfikowałem makro PolePesel tak, aby to ono wpisywało poprawne wartości do tych dwóch pól.
Edytowano2:
Poprawiłem nieco kod makra, do obliczeń roku, miesiąca i dnia wykorzystałem formuły zastosowane przez @Jermora
Edytowano3:
Jeśli ktoś chce, to dodałem w pliku kontrolę nr Pesla przy pomocy kwerend, bez użycia makra.
Założenie jest takie, że użytkownik będzie wprowadzał dane do tabeli przy pomocy formularza. Pole wzorca nie pozwoli na wpisane znaków innych niż jedenastu cyfr, a zastosowana maska znaków będzie pokazywała znak "_" jeśli tych cyfr będzie za mało. W przypadku zapisania rekordu z mniejszą ilością cyfr kwerendy "ogłupieją" - nie będą potrafiły wykonać jakiejś operacji liczbowej na znaku "_". Można by zrobić dodatkowe zabezpieczenie wykrywające taki znak, ale nie chciałem bardziej komplikować kodu kwerend. Pod tym względem uważam, że makro daje lepszą kontrolę nad wynikiem.
Dodatkowe zabezpieczenie widziałbym w np. w ten sposób, że wszystkie obliczane wartości rok, miesiąc, dzień, płeć i suma kontrolna z kwerendy OdczytajPesel wsadziłbym do takiego wyrażenia JEŻELI:
Kod: Zaznacz cały
casewhen (LOCATE ('_',"Pesel")>0 , '*', wyrażenie) as "NazwaPola"
UWAGA: W przypadku pola SumaKontrolna nie można użyć gwiazdki - to musi być jakaś liczba, proponuję -1
Funkcja LOCATE mówi na której pozycji w peselu jest jakiś znak (tutaj jest nim '_'), jeśli go niema to zwróci 0. Jeżeli wartość otrzymaną z LOCATE będzie >0 to w polu kwerendy pojawi się znak "*", w przeciwnym razie pojawi się wartość z wyrażenia.
Następnie w kwerendzie SprawdźPesel (SprawdźPesel2) do pola Poprawność również trzeba będzie dopisać na początku jeszcze jeden warunek :
Kod: Zaznacz cały
CASE WHEN LOCATE ('_',"Pesel")>0 THEN FALSE
WHEN CAST( "miesiac" AS INTEGER ) NOT BETWEEN 1 AND 12 THEN FALSE
WHEN CAST( "dzien" AS INTEGER ) NOT BETWEEN 1 AND 31 THEN FALSE
WHEN "dzien" = '31' AND "miesiac" IN ( '02','04', '06', '09', '11' ) THEN FALSE
WHEN "miesiac" = '02' and "dzien" = '30' THEN FALSE
WHEN not( ( MOD( "rok", 4 ) = 0 AND MOD( "rok", 100 ) = 0 ) OR MOD( "rok", 400 ) = 0 ) AND "dzien" = '29'and "miesiac" = '02' THEN FALSE
WHEN MOD( "SumaKontrolna", 10 ) = 0 AND SUBSTR( "Pesel", 11, 1 ) = 0 THEN TRUE
WHEN 10 - MOD( "SumaKontrolna", 10 ) = SUBSTR( "Pesel", 11, 1 ) THEN TRUE
ELSE FALSE END AS "Poprawnosc"
Edytowano4:
Nowa wersja, Kwerenda OdzczytajPesel_0 jest niepotrzebna zostawiłem ją aby pokazać "głupawkę", kwerendy SprawdźPesel i SprawdźPesel2 są równoznaczne ze sobą - różnią się tylko źródłem danych. SprawdźPesel nie potrzebuje do działania kwerendy OdzczytajPesel (jej zapytanie jest zdefiniowane jako źródło).
W makrze PolePesel dodałem możliwość wyczyszczenia pola daty.
Edytowano5:
Kwerenda SprawdzPesel oblicza dodatkowo wiek osoby.
Poprawiłem makro - poprzednie zgłaszało błąd podczas zapisywania nowego rekordu