Przejdź do głównej zawartości

Konwersja tekstu na datę

Witajcie po dłuższej przerwie. Niektórzy pytają czy nadal zajmuje się Crystal Reports. Odpowiadam, że TAK! Tylko, że oprócz tworzenia raportów zajmuję się również rozwojem aplikacji w .NET i z braku czasu trochę zaniedbałem swojego bloga. Ale postaram się to nadrobić, zwłaszcza że nadchodzi nowy Crystal Reports 2016 o którym napiszę w kolejnym poście.

Ale do rzeczy...

Czasami zdarza się, że data zapisana jest w naszej bazie danych w postaci tekstu. Osobiście unikam takich rozwiązań, ale pomysłowość programistów nie zna granic ;-)

Generalnie do konwersji ciągu znaków na datę służy funkcja Date. Wystarczy jako argument przekazać pole date({Invoices.OrderDate}) i gotowe!

Ale to działa tylko w przypadku gdy data zapisana jest zgodnie ze standardem czyli na przykład z myślnikami: 2016-02-11

Ale w bazach danych, jeśli już ktoś zdecyduje się na przechowywanie daty jako tekst, to najczęściej stosowany jest zapis w formacie YYYYMMDD, który zajmuje mniej miejsca np. 20160211.

W takim przypadku funkcja Date już nie zadziała...

Ale nie ma się co poddawać! Dotychczas w takich przypadkach wycinałem poszczególne fragmenty daty: rok, miesiąc, dzień i podstawiałem do funkcji Date:


Takie rozwiązanie zadziała, ale przyznacie że ta formuła nie jest zbyt czytelna zwłaszcza dla początkujących adeptów Crystal Reports. Jeszcze gorzej jeśli zmieni się nazwa pola i musimy ją poprawić w kilku miejscach. Uff, ciężkie jest życie projektanta...

Ale ostatnio podczas prowadzenia szkolenia wpadłem na nowy pomysł: a gdyby tak odpowiednio sformatować datę, żeby funkcja Date ją rozumiała?

Przypomniało mi się, że w Crystalu istnieje funkcja Picture. Jej nazwa jest trochę myląca. Nie służy ona do formatowania obrazków, lecz do formatowania tekstu za pomocą tzw. maski.

Na przykład:
Picture({Customer.PostalCode}, "xx-xxx")

Idąc tym tropem wykorzystałem ją do sformatowania daty z myślnikami i podstawiłem pod funkcję Date:


Proste i piękne nieprawdaż?

Polecam :)

Komentarze

Popularne posty z tego bloga

Konwersja daty w CDN Optima

Crystal Reports jest bardzo często zintegrowany z popularnymi aplikacjami. Przykładem jest system CDN Optima . Początkujących użytkownikom sprawiają kolumny z datą, bo data nie jest zapisana jako datetime lecz jako liczba. Otóż data w CDN Optima zapisana jest w formacie Clarion, czyli liczba dni, które upłynęły od daty 1800-12-28 . (Czy ktoś wie co to za data w historii?) Dlatego jeśli chcemy użyć takiego pola na raporcie, pierwsze co powinniśmy zrobić to dokonać konwersji liczby na datę. W innym przypadku Crystal Reports nie będzie wiedział, że jest to data i żadne formatowanie dat, grupowanie po okresach nie będzie działać. Formuła do konwersji formatu Clarion na datę : Jeśli mamy wiele takich pól to najlepiej utworzyć własną funkcję:

Zamiana daty i czasu na data-czas

Kolejne szkolenie u klienta i kolejne wyzwanie za mną... Chodziło o wygenerowanie raportu czasu pracy z uwzględnieniem, że zmiana następuje o godz. 6:00 a nie o północy. To znaczy, że godziny do 6:00 powinny być jeszcze zaliczane do dnia poprzedniego. Dodatkowym utrudnieniem u klienta był fakt, że data w bazie danych była rozbita na 2 pola: data w formacie: yyyy-mm-dd 00:00:00 godzina w formacie: 1900-01-01 HH:mm W takim razie do dzieła! Załóżmy, że mamy następującą tabelę: 1. Tworzymy formułę która zamieni 2 osobne pola z datą i czasem w jedno pole typu datetime: W ten sposób otrzymamy jedną wartość w formacie yyyy-mm-dd HH:mm 2. Następnie od tak utworzonej daty odejmujemy 6 godzin: Otrzymamy w rezultacie coś takiego: Kolumna WorkDate wyświetla datę do której została zakwalifikowana pozycja. Na podstawie tak utworzonej formuły można utworzyć grupowanie na raporcie.

Koszmar z limitem

Witajcie po dłuższej przerwie. Jakiś czas temu prowadziłem szkolenie w firmie i z jakiegoś powodu nie chciały nam się wyświetlać się wszystkie tabele z ich bazy danych. Na początku myślałem, że to kwestia uprawnień ale okazało się, że użytkownicy mają prawa do odczytu wszystkich tabel a problem wynika z czegoś innego... Okazało się, że winowajcą jest sam Crystal Reports, który ma ustawiony limit(!) na ilość obiektów pobieranych elementów ze struktury bazy danych, czyli tabel, widoków i procedur składowanych razem wziętych. Domyślnie jest to  8000 . Większość baz danych nie przekracza tego limitu, więc możecie spać spokojnie, ale przy większym systemie może nadejść koszmar, który zerwie Was na równe nogi. Pamiętajcie wówczas o moim blogu -  ten limit można zmienić (w praktyce podwyższyć). Niestety nie ma do tego opcji w Crystal Reports, trzeba pogrzebać w rejestrach windows: Zamykamy Crystal Reports Uruchamiamy aplikację Edytor rejestru , z linii poleceń: ...