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


Prześlij komentarz

Popularne posty z tego bloga

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…

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?

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…