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ń: regedit  Odna
Najnowsze posty

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 shared numberva