Przejdź do głównej zawartości

Łączenie wierszy w jedno pole tekstowe - cd

W poprzednim poście opublikowałem rozwiązanie problemu połączenia wartości z kilku wierszy w jedno pole tekstowe.

Okazało się, że to rozwiązanie nie działa w przypadku gdy numery zamówień się powtarzają.

Czyli cytując mojego matematyka z podstawówki można powiedzieć: "Prawie dobrze, ale jeszcze niedostatecznie".

W takim razie pochyliłem się raz jeszcze nad tym problemem... i pomyślałem, że najlepiej będzie sprawdzać czy bieżący numer zamówienia jest już w tablicy. Ale w Crystal Reports nie ma takiej funkcji. Ale zaraz zaraz...  tablica elementów to zbiór. Skoro jest to zbiór to mogę zastosować operator in oraz jego negację not in. Bingo!

Czyli za pomocą operatora in sprawdzamy czy element istnieje już w tablicy. Jeśli nie to wstawiamy a w przeciwnym wypadku go pomijamy, a funkcję RecordNumber zastępujemy własnym licznikiem.

Rozwiązanie:

1. Formuła Iinit

// Deklaracja tablicy tekstowej
shared StringVar array items; 

// Deklaracja licznika
shared numbervar counter:=1;

// Ustawiamy wielkość tablicy na podstawie ilości rekordów
Redim items [DistinctCount({SalesOrderHeader.SalesOrderID})];

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



2. Formuła Calculate

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

// Ponowna deklracja licznika
shared numbervar counter;

// Sprawdzamy czy numer zamówienia jest w tablicy
if not({SalesOrderHeader.SalesOrderNumber} in items)
then
(
    
// Wstawiamy bieżący numer dokumentu do tablicy
items[counter] := {SalesOrderHeader.SalesOrderNumber};

// Inkrementacja licznika
    counter := counter + 1; 
);

// Wyświetlamy wartość
{SalesOrderHeader.SalesOrderNumber}




3. Formuła Display
bez zmian.

// Ponowna deklaracja zmiennej tablicowej
shared stringVar array items; 

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

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



Przykład:



Powyższe rozwiązanie zadziała w każdym warunkach i dopiero takie rozwiązanie można uznać za dobre i uniwersalne.

I jeszcze jedno:
Po przeniesieniu formuły Display do stopki raportu należy zaznaczyć opcję Can Grow, aby przy większej ilości zamówień nie obcięło nam pola.


Prześlij komentarz

Popularne posty z tego bloga

Łączenie wierszy w jedno pole tekstowe - cd 2

Witam po dłuższej przerwie. Ostatnio podczas zamkniętego szkolenia Crystal Reports dla zaawansowanych prezentowałem rozwiązanie łączenia kilku wierszy w jedno pole tekstowe, które opublikowałem w poprzednim poście. Opisany sposób bardzo się spodobał uczestnikom kursu, ale padło pytanie jak to zrobić w przypadku wielu pól? Mamy na przykład tabelę Artykuly (artykuły w sensie prawniczym a nie produkty) z następującymi kolumnami: Artykuł, Paragraf oraz Punkt. W wyniku mamy otrzymać następujący zapis prawniczy: 148 §2 pkt. 2, 172 §2 pkt. 1, 148 §1 pkt. 1. No to do dzieła! Na początek skrypt do utworzenia przykładowej tabeli wraz z danymi
Następnie zabieramy się za raport. 1. Formuła Init 2. Formuła Calculate 3. Formuła Display Rezultat:
Oczywiście takie rozwiązanie można zastosować do różnych przypadków. Na koniec dygresja: Każde szkolenie wnosi coś nowego do mojego warsztatu pracy dlatego tak lubię je prowadzić :)

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?