Crystal Reports Blog
Porady dla użytkowników i programistów Crystal Reports
wtorek, 6 grudnia 2011
Znikające obrazki
Postanowiłem wykorzystać to narzędzie do drukowania certyfikatów dla uczestników moich szkoleń.
Umieściłem na raporcie obrazek przygotowany przez grafika i dodałem kilka pól dynamicznie pobieranych z bazy danych (imię, nazwisko, nazwa szkolenia itp). Certyfikat był gotowy!
Jakież było moje zaskoczenie gdy po ponownym otwarciu tego raportu, obrazek zniknął! Nie było go widać ani na podglądzie ani na projekcie. Nieco podłamany przeszukałem sieć, czy ktoś również spotkał się z takim problemem.
Okazało się, że nie jestem sam na świecie, gdyż w Crystal Reports jest od dawna bug, który objawia się tym, że obrazki o dużych rozmiarach znikają. Korzystam z CR 2008 SP4 i jak widać nie został on poprawiony.
Nie poddałem się jednak i znalazłem rozwiązanie:
1. Obrazek umieściłem na publicznym serwerze http
2. Wstawiłem zastępczą, małą grafikę na raporcie (Insert | Picture)
3. Wybrałem Format Graphic oraz zakładkę Picture
3. W opcji Graphic Location podałem URL obrazka (np. http://domena/plik.png)
Od tego momentu grafika nie jest osadzona w pliku, lecz pobierana za każdym razem z sieci.
Oczywiście należy pamiętać, że przy takim rozwiązaniu musimy mieć dostęp do internetu, ale obecnie to coraz mniejszy problem. Dodatkowym plusem jest to, że plik rpt jest bardzo małych rozmiarów, gdyż grafika jest dociągana z sieci.
Field Explorer
Zdarzyło mi się jednak dzisiaj całkowicie zagubić Field Explorer i powyższa opcja nie dawała żadnego skutku. Rozgorączkowany tym faktem i wizją utraty możliwości wytwórczych przeszukałem sieć.
Okazało się, że trzeba zaznaczyć Toolbox i wybrać opcję Reset all toolbars and explorers on next restart, a następnie uruchomić Crystal Reports ponownie. Uff, Field Explorer powrócił na swoje miejsce. Mogę znów tworzyć raporty...
środa, 19 października 2011
Funkcje warunkowe
Okazuje się, że Crystal Reports posiada wiele różnych konstrukcji warunkowych, które warto znać i dobierać do konkretnego przypadku.
Funkcja if-else-then
To podstawowa i najczęściej stosowana funkcja warunkowa w Crystal Reports.
Przykład:
if {Orders Detail.Quantity} <> 1 then "wiele wartości" else "wartość pojedyncza"
Pamiętajcie, że typ formuły jest określany na podstawie pierwszej zwracanej wartości. W związku z tym nie możemy mieszać typów w jednej formule.
Przykład niepoprawny:
if {Orders Detail.Quantity} <> 0 then {Orders Detail.Quantity} else "nothing"
Taka formuła wyświetli błąd, gdyż Crystal spodziewa się wartości numerycznej na podstawie pierwszej pierwszej wartości. Zatem musimy dokonać jawnej konwersji typu.
Przykład poprawny:
If {Orders Detail.Quantity} <> 0 Then ToText({Orders Detail.Quantity}) Else "nothing"
Funkcje if-then-else można zagnieżdżać, ale lepiej zachować umiar.
Przykład:
if {Taxes.Description}='Kategoria 23%' then '23' else
if {Taxes.Description}='Kategoria 8%' then '8' else
if {Taxes.Description}='Kategoria 0%' then '0' else
if {Taxes.Description}='Kategoria BEZVAT' then 'BezVat' else 0
Funkcja IIF
Bardzo podobną konstrukcją do if-else-then jest funkcja IIF i różni się tylko składnią.
Przykład:
IIF ({Orders Detail.Quantity} <> 1,"wiele wartości","wartość pojedyncza" )
Funkcja Switch
Funkcja switch umożliwia zastąpienie wielu zagnieżdżonych funkcji if-then-else jedną zgrabną konstrukcją. Dzięki temu nasza formuła stanie się bardziej czytelna i możemy uniknąć błędów.
Przykład
Switch (
{Orders.Order Amount} > 5000, "large",
{Orders.Order Amount} < 1000, "medium",
True, "small")
Funkcja select-case
To bardzo słabo udokumentowana funkcja (brak opisu w helpie) ale może bardzo uprościć nasze formuły.
Przykład:
select {Taxes.Description}
case 'Kategoria 23%': '23'
case 'Kategoria 8%': '8'
case 'Kategoria 0%': '0'
case 'Kategoria BEZVAT': 'BezVat'
default: '0'
Funkcja Choose
Jeszcze na koniec jedna ciekawa funkcja Choose, która na podstawie pierwszego argumentu, który musi być liczbą, zwraca określony element z listy. Oczywiście może być stosowana tylko w bardzo specyficznych sytuacjach.
Przykład
Choose (3, "poniedziałek", "wtorek", "środa", "czwartek")
zwraca "środa".
Co ciekawe, można również zwracać zakresy danych.
Przykład
Choose (2, 10 To 20, 100 To 200, 60 To 70)
zwraca zakres liczb od 100 do 200.
czwartek, 6 października 2011
Dynamiczna zmiana rozmiaru i położenia
Podczas jednego z moich szkoleń, spotkałem się z pytaniem, w jaki sposób przesuwać pola zależnie od wartości.
Otóż na każdym obiekcie (pole, grafika, itd.) pod prawym przyciskiem jest opcja Size and Position, która wyświetli okno:
Jak widzicie, można tutaj wpisać dokładne położenie oraz rozmiar obiektu z ręki, ale co więcej, przy atrybutach X i Width można wpisać formułę. I tutaj napotykamy problem... Wpisując tam przykładowe wartości rzędu 10, 20 wydaje się, że to w ogóle nie działa. Obiekt ani drgnie... Myślałem swego czasu, że to bug, i że poprawią to w kolejnym Service Packu, aż wreszcie uważnie wczytałem się w dokumentację...
Okazuje się, że wszystko jest OK. Po prostu wartość wpisana za pomocą formuły, przesuwa w prawo (X) lub poszerza pole (Width) względem położenia obiektu, a nie raportu. Ale to nie wszystko... Wartości tych nie podajemy w centymetrach ani pikselach, lecz w ... twipsach! Cóż to takiego???
Twip to taka specjalna jednostka miary, używana w druku: 1440 twipsów przypada na 1 cal czyli 1cm = 566 twips. Więcej na jej temat można przeczytać na Wikpedii http://en.wikipedia.org/wiki/Twip. Czyli pozostaje nam tylko przeliczyć centymetry na twips'y i wpisać warunek!
Jeśli zatem chcemy zależnie od daty przesunąć wartość do następnej kolumny, to możemy użyć formuły jak poniżej: If (Orders.Ship Date) < CDateTime (2004, 01, 01, 02, 10, 11) then 4320
Proste prawda? Nie mam pojęcia dlaczego w tym jednym miejscu jest inna jednostka niż w pozostałej części Crystal Reports. Na szczęście działa! Idę teraz dynamicznie przesuwać i poszerzać obiekty na raporcie. Wkrótce pokażę wam praktyczne zastosowanie tej funkcji.
środa, 28 września 2011
Crystal Reports 2008 Service Pack 4
Żegnajcie stare wersje
piątek, 19 sierpnia 2011
Crystal Reports REST API
Dla niewtajemniczonych SAP Idea Place to takie miejsce gdzie zarejestrowani użytkownicy mogą zgłaszać swoje pomysły do kolejnych wersji Crystal Reports i głosować na inne.
Ku mojemu zaskoczeniu otrzymałem odpowiedź z SAP'a, że pracują nad nowym API do Crystal Reports opartym o REST i JavaScript. Częścią nowego API będzie też kilka nowych natywnych przeglądarek do raportów. Jedna z nich będzie przeznaczona dla Silverlight.
Nowe API umożliwi również tworzenie raportów na podstawie źródła danych OData.
Niestety nie podali daty wypuszczonego nowego API, ale czekam z niecierpliwościa zwłaszcza na Viewera.
Linki do pomysłów:
Crystal Reports Viewer for SilverLight
Open Data Protocol (OData)
Zapraszam do komentowania, głosowania oraz zgłaszania własnych pomysłów.
Widać, że ktoś z SAP'a to czyta i wyciąga wnioski :)
