Przejdź do głównej zawartości

Łą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

CREATE TABLE [dbo].[Artykuly](
[ArtykulId] [int] IDENTITY(1,1) NOT NULL,
[Artykul] [nvarchar](50) NULL,
[Paragraf] [nvarchar](50) NULL,
[Punkt] [nvarchar](50) NULL,
CONSTRAINT [PK_Artykuly] PRIMARY KEY CLUSTERED
(
[ArtykulId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Artykuly] ON
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (1, N'148', N'2', N'2')
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (2, N'172', N'2', N'1')
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (3, N'200', N'1', N'1')
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (4, N'65', N'1', N'1')
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (5, N'172', N'1', N'5')
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (6, N'148', N'1', N'1')
GO
INSERT [dbo].[Artykuly] ([ArtykulId], [Artykul], [Paragraf], [Punkt]) VALUES (7, N'148', N'1', N'1')
GO
SET IDENTITY_INSERT [dbo].[Artykuly] OFF
GO

Następnie zabieramy się za raport.

1. Formuła Init
// Deklaracja tablic
shared StringVar array items;
// Deklaracja liczników
shared numbervar counter:=1;
// Ustawiamy wielkość tablicy na podstawie ilości rekordów w grupie
redim items [distinctcount({@ArtykulParagraf}, {Orzeczenia.OrzeczenieId})];
// Formuła musi coś zwracać zatem wyświetlimy wartość true, którą później możemy ukryć za pomocą opcji Suppress
true
view raw cr-one-row-Init hosted with ❤ by GitHub
2. Formuła Calculate
/// Ponowna deklaracja zmiennej tablicowej
shared StringVar array items;
// Ponowna deklaracja liczników
shared numbervar counter;
// Sprawdzamy czy artykuł i paragraf jest w tablicy
if not({@ArtykulParagraf} in items)
then
(
items[counter] := {@ArtykulParagraf};
counter := counter + 1;
);
{@ArtykulParagraf}
3. Formuła Display
// Ponowna deklaracja zmiennej tablicowej
shared stringVar array items;
// Łączymy elementy tablicy w jeden ciąg tekstowy.
join(items, ", ") + ".";
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ć :)

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

Funkcje Crystal Reports

Crystal Reports posiada bardzo dużo funkcji (ok. 200) do operacji na tekstach, liczbach, datach itd. Można się z nimi zapoznać przeglądając drzewo Funkcje (Functions) w Edytorze Formuł (Formula Editor) i czytając helpa. Warto je znać, aby nie wyważać otwartych drzwi.  Problem w tym, że trzeba wiedzieć czego się szuka.   Dla wielu osób dodatkową barierą może być język angielski, bo nawet w polskiej wersji Crystala, help, o przepraszam.... pomoc jest w języku Szekspira. Dlatego stworzyłem niegdyś listę funkcji Crystal Reports w języku polskim, którą otrzymywali uczestnicy moich szkoleń w formacie PDF.  Teraz postanowiłem  opublikować ją w sieci, aby była zawsze była pod ręką i dostępna dla szerszego grona.  Lista funkcja dostępna jest tutaj . Lista funkcji nie jest jeszcze w pełni kompletna, więc będę ją na bieżąco aktualizować. Czekam na wasze komentarze i uwagi, zwłaszcza propozycje lepszych tłumaczeń. Miłego korzystania!

Zamiana daty i czasu na data-czas

Kolejne szkolenie u klienta i kolejne wyzwanie za mną... Chodziło o wygenerowanie raportu czasu pracy z uwzględnieniem, że zmiana następuje o godz. 6:00 a nie o północy. To znaczy, że godziny do 6:00 powinny być jeszcze zaliczane do dnia poprzedniego. Dodatkowym utrudnieniem u klienta był fakt, że data w bazie danych była rozbita na 2 pola: data w formacie: yyyy-mm-dd 00:00:00 godzina w formacie: 1900-01-01 HH:mm W takim razie do dzieła! Załóżmy, że mamy następującą tabelę: 1. Tworzymy formułę która zamieni 2 osobne pola z datą i czasem w jedno pole typu datetime: W ten sposób otrzymamy jedną wartość w formacie yyyy-mm-dd HH:mm 2. Następnie od tak utworzonej daty odejmujemy 6 godzin: Otrzymamy w rezultacie coś takiego: Kolumna WorkDate wyświetla datę do której została zakwalifikowana pozycja. Na podstawie tak utworzonej formuły można utworzyć grupowanie na raporcie.