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