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 |
/// 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} |
// Ponowna deklaracja zmiennej tablicowej | |
shared stringVar array items; | |
// Łączymy elementy tablicy w jeden ciąg tekstowy. | |
join(items, ", ") + "."; | |

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