Przejdź do głównej zawartości

Posty

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ń: ...

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ę:

Wskaźnik

W Crystal Reports brakuje opcji, która umożliwia wyświetlenia wartości w postaci graficznego wskaźnika tak jak to potrafi Excel. Na szczęście istnieje pewien sposób aby uzyskać efekt jak poniżej... Załóżmy, że mamy pole w tabeli, które posiada wartość procentową zapisaną w postaci ułamka 0..1 Skrypt do założenia przykładowej tabeli: Umieść pole Progress na raporcie Zaznacz opcję Size and Position i przy parametrze Width wpisz formułę: Dzięki temu rozmiar pola będzie uzależniony od wartości procentowej. Tajemnicza stała 1440 to coś podobnego do rozdzielczości DPI - więcej na ten temat znajdziesz w moim starym wpisie . Zaznacz pole, wybierz opcję Highlighting Expert , wpisz progi i określ formatowanie: Zaznacz pole, wybierz opcję Format Field , przejdź na zakładkę Common i w opcji Display String wpisz formułę: Gotowe!

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.

Łączenie wierszy w jedno pole tekstowe - cd 2

Witam po dłuższej przerwie. Ostatnio podczas zamkniętego szkolenia Crystal Reports dla zaawansowanych prezentowałem rozwiązanie łączenia kilku wierszy w jedno pole tekstowe, które opublikowałem w poprzednim poście. Opisany sposób bardzo się spodobał uczestnikom kursu, ale padło pytanie jak to zrobić w przypadku wielu pól? Mamy na przykład tabelę Artykuly (artykuły w sensie prawniczym a nie produkty) z następującymi kolumnami: Artykuł, Paragraf oraz Punkt. W wyniku mamy otrzymać następujący zapis prawniczy: 148 §2 pkt. 2, 172 §2 pkt. 1, 148 §1 pkt. 1. No to do dzieła! Na początek skrypt do utworzenia przykładowej tabeli wraz z danymi Następnie zabieramy się za raport. 1. Formuła Init 2. Formuła Calculate 3. Formuła Display Rezultat: Oczywiście takie rozwiązanie można zastosować do różnych przypadków. Na koniec dygresja: Każde szkolenie wnosi coś nowego do mojego warsztatu pracy dlatego tak lubię je prowadzić :)

Łączenie wierszy w jedno pole tekstowe - cd

W poprzednim poście opublikowałem rozwiązanie problemu połączenia wartości z kilku wierszy w jedno pole tekstowe. Okazało się, że to rozwiązanie nie działa w przypadku gdy numery zamówień się powtarzają. Czyli cytując mojego matematyka z podstawówki można powiedzieć: " Prawie dobrze, ale jeszcze niedostatecznie ". W takim razie pochyliłem się raz jeszcze nad tym problemem... i pomyślałem, że najlepiej będzie sprawdzać czy bieżący numer zamówienia jest już w tablicy. Ale w Crystal Reports nie ma takiej funkcji. Ale zaraz zaraz...  tablica elementów to zbiór. Skoro jest to zbiór to mogę zastosować operator  in oraz jego negację  not in . Bingo! Czyli za pomocą operatora  in sprawdzamy czy element istnieje już w tablicy. Jeśli nie to wstawiamy a w przeciwnym wypadku go pomijamy, a funkcję RecordNumber zastępujemy własnym licznikiem. Rozwiązanie: 1. Formuła Iinit // Deklaracja tablicy tekstowej shared StringVar array items; // Deklaracja licznika s...

Łączenie wierszy w jedno pole tekstowe

Witam, Co pewien czas na forach Crystalowych  np. GoldenLine powraca pytanie w jaki sposób połączyć wiele wierszy w jedno pole tekstowe. Postanowiłem raz a dobrze opisać uniwersalną metodę, którą będziecie mogli zastosować w swoich raportach. Mamy na przykład raport z listą dokumentów z kilkoma kolumnami (numer dokument, data wystawienia, itd): Przychodzi szef i prosi, abyśmy na końcu tego raportu dołożyli pole, które wyświetli wszystkie powyższe numery dokumentów w jednym ciągu np. SO43659, SO43660, SO43661, ..... Zamykając drzwi dodaje  To ma być na jutro gotowe!" Szybko odkrywamy, że nie da się tego wyklikać i rzeczywiście to jest prawda... Do tego będziemy potrzebować całą skrzynię z narzędziami, a w niej: formuły, zmienne i tablice. Jesteście gotowi? Zaczynamy! 1. Tworzymy formułę Init // Deklaracja tablicy tekstowej shared StringVar array items; // Ustawiamy wielkość tablicy na podstawie ilości rekordów Redim items [count({SalesO...

Crystal Reports for Visual Studio 2015

Jeśli jesteś programistą i używasz, tak jak ja, najnowszej wersji Visual Studio 2015 to warto wiedzieć, że oficjalne wsparcie Crystal Reports jest dopiero od Service Pack 15. Jeśli zatem zainstalujesz starszą wersję Crystal Reports for Visual Studio to nie będzie chciała się zintegrować ze środowiskiem. Zatem pamiętajcie aby instalować od razu Crystal Reports for Visual Studio Service Pack 15 lub w zwyż - na chwilę obecną Service Pack 16. Strona ze wszystkimi Service Packami jest tutaj . Polecam Wam również zapoznanie z notatkami od wydawcy, bo niosą one wiele cennych informacji. Swoją drogą "podoba mi się" forma przekazywania ważnych informacji - ostrzeżenia, dopiski, różne czcionki, czerwony kolor - prawie jak w moim brudnopisie projektowym :) Ale mam nadzieję, że się w tym odnajdziecie ;-)

Licencjowanie komponentów Crystal Reports

Dzisiejszy wpis przeznaczony jest dla programistów, którzy budują rozwiązania z użyciem komponentów programistycznych Crystal Reports. Jednak tym razem nie będę pisać o aspektach technicznych lecz chciałem zwrócić waszą uwagę na kwestie licencjonowania komponentów programistycznych Crystal Reports bo to nie jest łatwa sprawa. Jeśli posiadamy płatną licencję na Visual Studio lub używamy darmowej wersji Community to ze strony SAP'a możemy pobrać za darmo  Crystal Reports for Visual Studio . Przypominam, że darmowa wersja Visual Studio Express nie wspiera Crystal Reports. Swoją drogą jeśli ktoś z Was używa jeszcze wersji Express to niech czym prędzej ją odinstaluje(!) i zainstaluje w to miejsce wersję Community. To w pełni funkcjonalne Visual Studio niemal jak wersja Professional a do tego darmowa! Jeszcze do niedawna Microsoft kazał sobie płacić za to około 2000 PLN. Ale wróćmy do licencjonowania Crystal Reports. Niespodzianki mogą pojawić się z chwilą wdrożenia naszego rozwiąz...

Crystal Reports na wielu monitorach

Często pracuję z Crystal Reports na dodatkowym monitorze lub na szkoleniach z podłączonym projektorem. Wszystko ładnie pięknie działa, aż do czasu gdy wrócimy do podstawowej konfiguracji z jednym monitorem. Crystal Reports wraca na swoje miejsce, ale niektóre opcje zachowują się tak jakby Crystal Reports się zawiesił(!). Okazuje się, że Crystal Reports wcale się nie zawiesił, lecz okna dialogowe pamiętają stare położenie na odłączonym monitorze. Wyświetlają się ale w sposób niewidoczny na użytkownika na drugim monitorze którego nie ma i czekają na naciśnięcie OK :) Zazwyczaj są to okna modalne, które blokują interfejs użytkownika aż do zatwierdzenia i wygląda tak jakby Crystal Reports się zawieszał. Na szczęście z pomocą przychodzi " tajna kombinacja klawiszy" , systemu Windows która umożliwia przesunięcie okna pomiędzy ekranami: ⊞  Win + ← / →   Teraz wszystko wraca do normy :) Mam nadzieję, że w przyszłej wersji Crystala zostanie to naprawione. Ale moim ma...

Crystal Reports 2016 nadchodzi...

Dzięki uprzejmości  Marka Wawrzynczyka i pamięci o mnie (uczestnik mojego szkolenia)  dotarła do mnie informacja, że będzie nowy  Crystal   Reports   2016 ! Od razu jak lew rzuciłem się na dokument opisujący nadchodzące zmiany. Choć szczerze mówiąc, nie spodziewałem się zbyt wiele. Myślałem, że będzie to znów kosmetyczna zmiana, nowy numer, nowe logo tak jak było z wersjami Crystal Reports 2011 i 2013. Sam wciąż używam Crystal Reports 2008 i nie widziałem sensu przesiadania się na nowsze wersje :) Nieźle się ubawiłem gdy przeczytałem, że jeden z Crystalowych guru niejaki Ken Hamady również używa CR 2008 http://kenhamady.com/cru/archives/2703 :)  Ale przejdźmy do konkretów.  Cóż takiego możemy się spodziewać w nowej wersji? - wyrównywanie w pionie  NARESZCIE!!! Jedna z najbardziej brakujących opcji. Gdy miłośnikom Excela mówiłem na swoich szkoleniach, że Crystal Reports nie posiada wyrównania w pionie to nie dowierzali. Teraz będę ...

Zalogowany użytkownik

Prowadząc konsultacje u moich klientów spotkałem się z takim pytaniem w jaki sposób wyświetlić nazwę aktualnie zalogowanego użytkownika na raporcie. To pomaga w ustaleniu kto drukował dany raport. Niestety Crystal Reports nie posiada gotowej funkcji. Co prawda są pola specjalne Current CE User ID , Current CE User Name , ale one działają tylko w przypadku gdy posiadamy produkt Crystal Reports Server. Ale na szkoleniu dla zaawansowanych wpadłem wspólnie z uczestnikami na bardzo proste rozwiązanie. Należy utworzyć wyrażenie SQL (SQL Expression) a w jej treści wpisać CURRENT_USER i takie pole na raporcie. Tylko tyle! Raport wywoła funkcję SQL Server i pobierze aktualnie zalogowanego użytkownika do bazy danych. Uwaga - nie do domeny! No chyba, że mamy włączoną autentyfikację Windows. Oczywiście to idealnie zadziała tylko w przypadku gdy każdy posiada inny login do bazy danych lub używamy wspomnianej autentykacji windowsowej. Jeśli wszyscy pracujemy na jednym koncie - mam nadzi...

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 tak...

Konwersja w SQL Expression

Ostatnio musiałem skorzystać z wyrażeń SQL Expression, które opisałem  tutaj , ale dodatkowo dokonać jeszcze konwersji typu. W edytorze wyrażeń SQL Expression odnalazłem funkcję Convert, która niestety nie jest opisana w dokumentacji. Na szczęście poprzez analogię do funkcji dostępnej w TSQL, doszedłem jak z niej korzystać: {fn Convert("Persons"."Age", SQL_CHAR)} Ale pozostał jeszcze problem w jakim formacie podawać typy danych.  Metodą prób i błędów doszedłem jakie typy są obsługiwane: SQL_VARCHAR SQL_CHAR SQL_DATE SQL_NUMERIC SQL_BIT

Crystal Reports for Visual Studio SP 8

Uwaga programiści! SAP wydał kolejnego, już ósmego(!) Service Packa do Visual Studio 2010/2012. Warto zatem zaktualizować swoje developerskie maszynki, bo usuwają kilka bugów. Jeśli do instalacji swojej aplikacji używacie technologii clickonce to koniecznie pobierzcie dodatkowego patch'a  link Ci którzy przesiedli się na Visual Studio 2013 jeszcze muszą chwilę poczekać, bo dopiero kolejny Service Pack będzie wspierał najnowszą wersję Visual Studio, który ma się ukazać w 1 kwartale 2014 roku.

Zalogowany użytkownik

Często na moich szkoleniach spotykam się z pytaniami od uczestników w jaki sposób wyświetlić na raporcie nazwę zalogowanego użytkownika. A jeszcze lepiej, żeby można było po tym filtrować. Owszem, Crystal Reports posiada standardowe funkcje CurrentCEUserID i CurrentCEUserName, które zwracają identyfikator lub nazwę aktualnego użytkownika ale działają tylko gdy logujemy się do Crystal Reports Server (Crystal Enterprise). A co jeśli posiadamy zwykłego Crystal Reports i logujemy się do domeny lub do bazy danych? Niestety od dawna brakuje takiej funkcji. Ale przy odrobinie sprytu możemy odpytać o to bazę danych! Nadszedł wreszcie czas aby użyć SQL Expression o których pisałem wcześniej . Wystarczy w nawiasach (koniecznie!) wpisać nazwę funkcji SQL Server: (SYSTEM_USER) i umieścić pole na raporcie lub wykorzystać w warunku filtrującym! W przypadku innych baz danych, np. Oracle musimy użyć odpowiednio innej funkcji. Powodzenia!

Commands - dobre rady

Po dłuższej przerwie w blogowaniu postanowiłem napisać k ilka dobrych rad przy stosowaniu Command: 1. Nie należy łączyć ze sobą kilku Command lub Command z tabelą/widokiem bezpośrednio crystalu. Zamiast tego należy przepisać zapytanie ze złączenia do jednego command. Dzięki temu zapytaniem zajmie się motor bazy danych i prześle tylko wynikowe dane. W przeciwnym razie to Crystal Reports pobiera dane z poszczególnych źródeł i ostro walczy na komputerze klienta co objawia się bardzo wolnym generowaniem raportu. 2. Nie filtrować command za pomocą standardowej opcji Selection Formula. Zamiast tego należy dodać where do zapytania SQL w Command. Dzięki temu filtrowanie będzie po stronie bazy danych z użyciem indeksów (jeśli istnieją). W przeciwnym Crystal Reports pobiera wszystkie dane z Command i filtruje lokalnie, co najczęściej prowadzi do bardzo wolnego generowania raportu i zapychania łączą. 3. Nie używać standardowych parametrów do filtrowania Command . W Command jest osobna opcja do ...

Could not load file or assembly crdb_adoplus.dll

Jeśli tworzymy aplikację w .NET, która posiada raporty Crystal Reports oparte o źródło danych DataSet lub kolekcję obiektów (IEnumerable) to po jej uruchomieniu otrzymamy zaskakujący błąd: Could not load file or assembly 'file:///C:Program Files\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet1\crdb_adoplus.dll' or one of its dependencies. The system cannot find the file specified: C:\Program Files\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\win32_x86\dotnet1\crdb_adoplus.dll. Na szczęście rozwiązanie jest bardzo proste - wystarczy do pliku konfiguracyjnego dopisać: <startup useLegacyV2RuntimeActivationPolicy="true">   <supportedRuntime version="v4.0"/> </startup>