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

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

Kody kreskowe w Crystal Reports 2008

Crystal Reports 2008 posiada wbudowaną obsługę kodów kreskowych. Niestety w standardzie otrzymujemy tylko Code 39. Jeśli chcemy skorzystać z innych kodów, np. Code 128 narzędzie kieruje nas na stronę firmy Azalea, gdzie możemy dokupić pakiet innych kodów. Czy to jedyne rozwiązanie? Na szczęście nie. Znalazłem stronę francuską poświęconą kodom kreskowych: http://grandzebu.net/index.php?page=/informatique/codbar-en/ean13.htm Strasznie stary wygląd strony, ale zawiera wiele cennych linków: Code 128 w postaci darmowej czcionki TTF: http://grandzebu.net/informatique/codbar/code128.ttf Code 128 w postaci darmowej funkcji UFL do Crystal Reports: http://grandzebu.net/informatique/codbar/code128_Crystal%20reports.zip Co więcej, tych rozwiązań można również użyć w starszych wersjach Crystal Reports.

Słownie złotych

Czasami na raportach, na przykład na fakturach, zachodzi potrzeba zamiany liczby na słownie złotych. Crystal to umożliwia ale tylko na język ang. Dlatego napisałem funkcję UFL do CR, która to realizuje. Jest to funkcja typu Crystal Reports UFL (User Function Libraries) i korzysta sie z niej tak samo jak z wbudowanych funkcji Crystal Reports. Obecny zakres liczb od 0 do biliona. Opis instalacji 0. Pobierz 1. Rozpakować archiwum i skopiować plik CRUFLslw.dll do np. katalogu C:\WINDOWS\system32 2. Uruchomić linię poleceń: CMD 3. Przejść do katalogu z plikiem: CD C:\WINDOWS\system32 3. Uruchomić polecenie rejestracji biblioteki: regsvr32 CRUFLslw.dll Powinno wyświetlić się okno z informacją "DllRegisterServer in CRUFLslw.dll succeeded." 4. Uruchomić Crystal Reports 5. Utworzyć nową formułę i wpisać np. slownie(123.45) Przetestowałem również z Crystal Reports 2008 i działa.