wtorek, 6 grudnia 2011

Znikające obrazki

Ostatnio spotkała mnie niemiła niespodzianka w Crystal Reports.

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

Podczas pracy z Crystal Reports zdarza się, że przez przypadek zamkniemy sobie podstawowe narzędzie pracy czyli Field Explorer. Wystarczy wówczas wybrać z menu View | Field Explorer i pracujemy dalej.

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

W większości raportów w formułach stosujemy 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

Właśnie zainstalowałem najnowszy Service Pack 4 do Crystal Reports 2008 oznaczony jako 12.4.0.966. Niestety nigdzie nie udało mi się znaleźć informacji co zostało poprawione. Mam tylko nadzieję, że będzie się mniej wieszał i wykresy będą sprawiały mniej problemów. Co ciekawe, automatyczne sprawdzanie aktualizacji nie wykryło tego nowego Service Packa. Musiałem osobiście (na szczęście zdalnie) odwiedzić witrynę SAP'a i pobrać odpowiedni plik. W razie czego podaję linka.

Żegnajcie stare wersje

Mam do przekazania niezbyt przyjemną informację dla użytkowników starych wersji Crystal Reports. SAP wycofał nagle ze sprzedaży Crystal Reports 10/9/8.5, które jeszcze do niedawna można było kupić w sklepie online lub u dostawców. SAP tłumaczy to tym, że świat się rozwija i trzeba iść do przodu. Niestety wiele aplikacji ma zintegrowany Crystal Reports Viewer w starej wersji i mogą się pojawić problemy z wyświetlaniem raportów jeśli bedą tworzone w nowszych wersjach. CR XI jest nadal w sprzedaży, ale podejrzewam, że za jakiś czas również zostanie wycofany ze sprzedaży, dlatego warto pomyśleć o migracji do nowszych wersji. Cóż, z sentymentem odkurzę stare płytki z trialami Crystal Reports 7/8.5/9.0/10 ....

piątek, 19 sierpnia 2011

Crystal Reports REST API

Jakiś czas temu na SAP Idea Place umieściłem kilka propozycji, a przede wszystkim stworzenia przeglądarki raportów dla Silverlight oraz wsparcie dla protokołu OData jako źródła danych.

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