Przejdź do głównej zawartości

Łą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({SalesOrderHeader.SalesOrderID})];

// Formuła musi coś zwracać zatem wyświetlimy wartość true, którą później możemy ukryć za pomocą opcji Suppress
true

i umieszczamy ją w nagłówku raportu (Report Header).

Uwaga: Crystal Reports ma ograniczenie do 1000 elementów w tablicy! Czyli przy większej ilości dokumentów otrzymamy błąd i przedstawione rozwiązanie nie zadziała.

2. Tworzymy formułę Calculate

/// Ponowna deklaracja zmiennej tablicowej
shared StringVar array items;

// Wstawiamy bieżący numer dokumentu do tablicy
items[recordnumber] := {SalesOrderHeader.SalesOrderNumber};


i umieszczamy ją w sekcji szczegółów (Details):

3. Tworzymy formułę Display

// Ponowna deklaracja zmiennej tablicowej
shared stringVar array items; 

// Określamy separator
stringVar separator := ', ';

// Łączymy elementy tablicy w jeden ciąg tekstowy. 
join(items, separator);

i umieszczamy ją w stopce raportu (report footer)

W rezultacie w stopce raporty zostaną wyświetlone numery dokumentów rozdzielone przecinkami (Summary):



Gotowe! :)

Moje rozwiązanie można potraktować jako ogólny przepis na rozwiązywanie tego typów problemów w Crystal Reports. Wystarczy tylko zmienić typ pola przy deklarowaniu tablicy i podmienić pola.
To tylko prosty przykład łączenia elementów w jedno pole tekstowe. Można pójść jeszcze dalej...
Niegdyś zastosowałem podobne rozwiązanie to obliczania funkcji finansowej NPV

Miłego tworzenia raportów.

UPDATE: Powyższy przykład nie zadziała w przypadku gdy numery zamówień się powtarzają. Rozwiązanie tego problemu umieściłem w kolejnym wpisie


Komentarze

Popularne posty z tego bloga

Lista funkcji Crystal Reports po polsku

Opracowałem kiedyś skróconą listę funkcji Crystal Reports po polsku, aby mieć podręczną ściągawkę podczas tworzenia formuł. Pewnie i Wam się przyda dlatego ją teraz publikuję. To oczywiście tylko kilkadziesiąt funkcji spośród kilkuset, które znajdują się w Crystal Reports. Dlatego zamierzam stworzyć kompletną listę funkcji CR 2008.

Postaram się również dodać kolumnę z wersją Crystal Reports od której jest dostępna funkcja, bo wciąż są użytkownicy starszych wersji.

Czekam na sugestie, komentarze i ewentualnie propozycje lepszych tłumaczeń.

Na początek pytanie - jaki format preferujecie? PDF, HTML a może HTML Help z możliwą wyszukiwania?

Jak używać SQL Expression?

SQL Expression to taka formuła, której treścią jest zapytanie SQL do bazy danych.

Niestety, bezpośrednie wklejenie zapytania SQL kończy się najczęściej błędem"Error in compiling SQL Expression : Failed to retrieve data from the database".

Większość użytkowników w tym momencie kończy przygodę z SQL Expression, gdyż podręcznik użytkownika niewiele mówi na ich temat i nie przytacza żadnego przykładu.

Rozwiązanie jest na wyciągnięcie ręki...

Treść zapytania SQL musi być otoczone nawiasem! - to taki pomysł twórców Crystala.

Zapytania musi zwracać wartość skalarną! - czyli musi zwracać pojedynczą wartość, a nie zestaw rekordów. Najczęściej jakąś funkcję agregującą np. sumę

Oto przykład:

Gotowe! Taką formułę można umieścić na raporcie lub wykorzystać do dalszego przetwarzania.


To również bardzo dobry sposób na optymalizację raportu, zwłaszcza w przypadku gdy posiadamy w raporcie podraporty, które służą tylko pobieraniu pojedynczej wartości. Niestety trzeba znać chociażby podstawy jęz…

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