Soneta DX Reports — wydruki DevExpress XtraReports (.repx)
Plik .repx to zserializowany do XML raport DevExpress XtraReports używany jako wydruk
w platformie Soneta (produkty enova365, Triva). Soneta osadza w nim własne komponenty
źródła danych i własne kontrolki, dlatego surowy szablon DevExpress ≠ szablon Soneta.
Runtime DevExpress w programie to 25.2, ale pliki są zapisywane w formacie serializera
Version="20.2" (metadana zgodności wstecz — nie zmieniaj jej ręcznie).
Minimalny szkielet (lista z bieżącego widoku)
<?xml version="1.0" encoding="utf-8"?>
<XtraReportsLayoutSerializer SerializerVersion="20.2.7.0" Ref="1"
ControlType="DevExpress.XtraReports.UI.XtraReport, DevExpress.XtraReports.v20.2"
Name="MojRaport" DisplayName="Mój raport" ReportUnit="TenthsOfAMillimeter"
Margins="198, 198, 200, 200" PaperKind="A4" PageWidth="2100" PageHeight="2970"
Version="20.2" DataSource="#Ref-0" Dpi="254" Font="Calibri, 9pt">
<Bands>
<Item1 Ref="2" ControlType="TopMarginBand" Name="topMargin" HeightF="200" Dpi="254" />
<Item2 Ref="3" ControlType="DetailBand" Name="detail" HeightF="80" Dpi="254">
<Controls>
<Item1 Ref="4" ControlType="XRLabel" Name="lblKod" Text="[Kod]"
SizeF="600,80" LocationFloat="0,0" Dpi="254" Padding="5,5,0,0,254" />
</Controls>
</Item2>
<Item3 Ref="5" ControlType="BottomMarginBand" Name="bottomMargin" HeightF="200" Dpi="254" />
</Bands>
<ComponentStorage>
<Item1 Ref="0" ObjectType="Soneta.Business.UI.DxReports.BusinessDataSource,Soneta.Business.UI.DxReports"
Name="BusinessSource" DataKind="CurrentList" />
<Item2 Ref="6" ObjectType="Soneta.Business.UI.DxReports.Components.BusinessContext,Soneta.Business.UI.DxReports"
Name="BusinessContext" StylesSource="standardowy" />
</ComponentStorage>
</XtraReportsLayoutSerializer>
6 rzeczy, które musisz wiedzieć zanim zaczniesz
- Referencje przez
Ref/#Ref-N. Każdy węzeł to ItemN z unikalnym Ref="N".
DataSource="#Ref-0" na raporcie/paśmie wskazuje komponent Ref="0" w ComponentStorage.
Numery Ref muszą być unikalne w całym pliku — pilnuj tego przy dodawaniu elementów.
- Jednostki: trzymaj parę
ReportUnit + Dpi spójnie. Standard produkcyjny:
ReportUnit="TenthsOfAMillimeter" + Dpi="254" → wszystkie wymiary w 0,1 mm
(A4 = 2100×2970, marginesy 198≈20 mm). Alternatywa: brak ReportUnit = piksele/96 dpi
(A4 = 827×1169). Nie mieszaj — te same liczby znaczą różne rozmiary. Zob. references/STRUCTURE-BANDS.md.
- Skąd dane:
BusinessDataSource + DataKind. To Soneta-specyficzne. CurrentList =
lista, na której wywołano wydruk (najczęstsze). Context = parametry/nagłówek/sesja
(przez DataMember). SingleRow = pojedynczy rekord. Session + DataMember="Moduł.Tabela".
Zob. references/DATA.md.
- Wiązanie danych:
ExpressionBindings to standard, DataBindings to legacy.
Najprościej — wyrażenie inline w Text="[Pole]" na komórce/etykiecie. Zob. niżej i DATA.md.
- Kontrolki: preferuj układ tabelaryczny
XRTable (nie luźne etykiety). Kwoty wstawiaj
przez AmountLabel (kontrolka Soneta), nie XRLabel. Zob. references/CONTROLS.md.
- Aby wydruk pojawił się w programie, potrzebna jest rejestracja atrybutem
[assembly: DxReport(...)] wiążącym plik z typem listy/obiektu. Zob. references/REGISTRATION.md.
- Logika niewyrażalna deklaratywnie (warunkowe sterowanie kontrolkami, obliczenia, dostarczanie
policzonych danych, parametry) mieszka w snippecie — klasie C#
NazwaWydruku.repx.cs
dziedziczącej po ReportSnippet, z wiązaniem [DxBind]. ⚠️ Uwaga licencyjna: ReportSnippet
i [DxBind] odwołują się do typów DevExpress — w kodzie dodatku wymaga to własnej licencji
DevExpress. Bez niej użyj generycznego Snippet + [Bind]. Zob. references/SNIPPET.md.
Wiązanie danych — 3 sposoby
<!-- (1) INLINE w Text — najczęstsze w komórkach tabeli. Format przez TextFormatString -->
<Item1 Ref="10" ControlType="XRTableCell" Name="c1" Text="[Netto]"
TextAlignment="MiddleRight" TextFormatString="{0:n2}" Dpi="254" />
<!-- (2) ExpressionBindings — standard; pozwala na wyrażenia, funkcje, inne właściwości -->
<Item2 Ref="11" ControlType="XRTableCell" Name="c2" Dpi="254">
<ExpressionBindings>
<Item1 Ref="12" EventName="BeforePrint" PropertyName="Text"
Expression="FormatString('{0:d}', [Data])" />
</ExpressionBindings>
</Item2>
<!-- (3) DataBindings — LEGACY, tylko proste pole -->
<Item3 Ref="13" ControlType="XRLabel" Name="lbl" Text="label" SizeF="600,60" LocationFloat="0,0">
<DataBindings>
<Item1 Ref="14" PropertyName="Text" DataMember="Kod" FormatString="{0:n2}" />
</DataBindings>
</Item3>
[Pole] = właściwość bieżącego wiersza danych. Nawigacja po relacjach kropką: [Kontrahent].[Nazwa].
EventName="BeforePrint" — moment obliczenia (praktycznie zawsze taki).
- Formaty .NET:
{0:n} (liczba 2 miejsca, separator tysięcy), {0:n0}, {0:d} (data krótka),
{0:dd.MM.yyyy}, {0:0%}, {0:c} (waluta). Pełna lista → CONTROLS.md.
Pasma (Bands) — skrót
| Pasmo |
Rola |
TopMarginBand / BottomMarginBand |
Marginesy strony — obowiązkowe, po jednym. |
DetailBand |
Powtarzane raz na każdy rekord bieżącego poziomu. Rdzeń raportu. |
DetailReportBand |
Master-detail: zagnieżdżony raport iterujący kolekcję (DataMember="Pozycje"). |
GroupHeaderBand / GroupFooterBand |
Nagłówek/stopka grupy (<GroupFields>); stopka = miejsce na sumy. |
ReportHeaderBand / ReportFooterBand |
Raz na początku / końcu całości. |
PageHeaderBand / PageFooterBand |
Na górze / dole każdej strony. |
Typowe atrybuty: HeightF (wysokość), KeepTogether="true", RepeatEveryPage="true"
(nagłówek listy na każdej stronie), StyleName. Szczegóły i master-detail → references/STRUCTURE-BANDS.md.
Podsumowania i grupowanie — skrót
<!-- suma w komórce stopki grupy/raportu (Func domyślny = Sum) -->
<Item1 Ref="20" ControlType="XRTableCell" Name="cSuma" Dpi="254">
<ExpressionBindings>
<Item1 Ref="21" EventName="BeforePrint" PropertyName="Text" Expression="sumSum([Wartosc])" />
</ExpressionBindings>
</Item1>
<!-- alternatywnie element <Summary> (bez Func = Sum) -->
<Summary Ref="22" FormatString="{0:n2}" Running="Report" IgnoreNullValues="true" />
<!-- grupowanie na GroupHeaderBand -->
<GroupFields>
<Item1 Ref="30" FieldName="Definicja" />
</GroupFields>
Funkcje agregujące w wyrażeniach: sumSum, sumRunningSum (narastająca), sumAvg,
sumRecordNumber (Lp.). Running = zakres agregacji (Report/Group/Page). Pełny
zestaw funkcji, formatowanie warunkowe (Iif na BackColor/Visible) i pola kalkulowane
→ references/DATA.md.
Kontrolki Soneta (nie ma odpowiedników XR*)
| Kontrolka |
Zamiast |
Do czego |
AmountLabel |
XRLabel |
Kwoty — obsługa formatowania kwot, SpacingForComma. |
ShrinkableLabel |
XRLabel |
Tekst zmniejszający czcionkę, by zmieścić się (MaxLenght). |
CrossCheckBox |
XRCheckBox |
Pole wyboru (deklaracje). |
ResourcePictureBox |
XRPictureBox |
Obraz z zasobu osadzonego (ImageResourceName), np. wzór deklaracji. |
Header / Footer |
(podraport) |
Szablonowy nagłówek/stopka przez ReportSourceName + Title. |
DatabaseSubReport |
XRSubreport |
Podraport zdefiniowany w bazie (ReportSourceName). |
Uwaga: Soneta nie używa XRSubreport, XRCheckBox ani XRZipCode — zastępują je
powyższe kontrolki i zagnieżdżone DetailReportBand. Szczegóły → references/CONTROLS.md.
Nagłówki, stopki, podraporty i style — wzorce współdzielone
Nagłówek/stopkę/podraport wstawiasz kontrolką Header/Footer/DatabaseSubReport z
ReportSourceName (nazwa logiczna, nie plik) — program rozwiązuje ją na wzorzec z konfiguracji, więc
klient może podmienić standardowy nagłówek własnym bez ruszania raportu. Budowa samego pliku
nagłówka/stopki (DataKind="Context", SubBand pierwszej/kolejnej strony, ReportContext.Title,
helpery ReportTools/XtraReportHelper) oraz wielosekcyjnych podraportów →
references/SUBREPORTS.md.
Formatowanie jest centralne w arkuszu .repss: kontrolki wskazują styl po nazwie (StyleName),
a raport wybiera arkusz przez StyleSheetPath/StylesSource ("standardowy"). Struktura pliku
.repss, właściwości stylów i katalog nazwanych stylów → references/STYLES.md.
Gotowe przykłady (assets)
- assets/Szkielet.repx — minimalny raport listy (
CurrentList).
- assets/ListaProsta.repx — lista w
XRTable z nagłówkiem kolumn
(GroupHeaderBand RepeatEveryPage), numeracją Lp., sumą w stopce.
- assets/Dokument.repx — master-detail: pola nagłówka dokumentu +
zagnieżdżony
DetailReportBand DataMember="Pozycje" z pozycjami i podsumowaniem.
- assets/Dokument.repx.cs — snippet (kod-behind) do powyższego:
[DxBind], GetCurrentRow(), parametry, warunkowe sterowanie kontrolką (wymaga licencji DevExpress).
- assets/DokumentGeneryczny.repx.cs — snippet bez licencji
DevExpress: generyczny
Snippet + [Bind] (SnippetLabel/SnippetCollection), gettery wartości.
Zob. references/SNIPPET.md.
Checklista przed oddaniem pliku .repx
Powiązane skille
- /soneta-programming — warstwa kodu C#, na której opiera się snippet (kod-behind). Powiązane
tematy: Klasy parametrów (
ContextBase) (tak samo konstruowane jak parametry wydruku),
Klasa Context, Sesje/transakcje (Session, ORM), Worker i Extender (obliczanie danych
raportu), Zasady bezpiecznego kodu (review snippetu), oraz typy wierszy, do których wydruk się
wiąże. Zob. też references/SNIPPET.md.
- /soneta-form-xml — formularz parametrów wydruku (
RepxParams/*.pageform.xml) pytany przed
generowaniem.
- /soneta-business-xml — definicje obiektów/pól, które wydruk odczytuje w wiązaniach.
- /soneta-config — import/eksport konfiguracji (wzorce wydruków w bazie) przez XML.
- /soneta-tools — generowanie i testowanie wydruków z wiersza poleceń.
- /soneta-erp — mapa skilli platformy Soneta.
1---2name: soneta-repx3description: Wydruki i raporty w Soneta (enova365, Triva) — pliki .repx (DevExpress XtraReports, serializowany XML). Sięgaj przy KAŻDYM zadaniu z wydrukiem/raportem: faktura, dokument, deklaracja, lista, zestawienie; utworzenie, przeróbka lub poprawa .repx (też z załącznika); pytanie „jak w wydruku zrobić X”. Typowe X: podpięcie danych (lista, dokument z pozycjami, master-detail, podraport), podział stron, kolumna Lp, tabele, grupowanie i sumy, formatowanie warunkowe, kwoty, nakładanie wartości na skan formularza, nagłówek/stopka/podpisy, arkusz stylów (.repss), rejestracja wydruku. Wyzwalają też pojęcia: XtraReportsLayoutSerializer, StyleSheetSerializer, pasma (DetailBand/DetailReportBand/GroupHeaderBand/SubBand), kontrolki (XRLabel/XRTable/AmountLabel), BusinessDataSource/DataKind, ReportContext, ExpressionBindings/Summary/CalculatedFields/FilterString, [assembly: DxReport], ReportSnippet/[DxBind]. Wystarczy „wydruk”, „raport” lub „.repx” w kontekście Soneta. NIE dla: business.xml, form.xml, SQL, Excel, Word .dotx.4---56# Soneta DX Reports — wydruki DevExpress XtraReports (.repx)78Plik `.repx` to **zserializowany do XML** raport DevExpress XtraReports używany jako wydruk9w platformie Soneta (produkty enova365, Triva). Soneta osadza w nim **własne komponenty10źródła danych i własne kontrolki**, dlatego surowy szablon DevExpress ≠ szablon Soneta.11Runtime DevExpress w programie to **25.2**, ale pliki są zapisywane w formacie serializera12**`Version="20.2"`** (metadana zgodności wstecz — nie zmieniaj jej ręcznie).1314## Minimalny szkielet (lista z bieżącego widoku)1516```xml17<?xml version="1.0" encoding="utf-8"?>18<XtraReportsLayoutSerializer SerializerVersion="20.2.7.0" Ref="1"19 ControlType="DevExpress.XtraReports.UI.XtraReport, DevExpress.XtraReports.v20.2"20 Name="MojRaport" DisplayName="Mój raport" ReportUnit="TenthsOfAMillimeter"21 Margins="198, 198, 200, 200" PaperKind="A4" PageWidth="2100" PageHeight="2970"22 Version="20.2" DataSource="#Ref-0" Dpi="254" Font="Calibri, 9pt">23 <Bands>24 <Item1 Ref="2" ControlType="TopMarginBand" Name="topMargin" HeightF="200" Dpi="254" />25 <Item2 Ref="3" ControlType="DetailBand" Name="detail" HeightF="80" Dpi="254">26 <Controls>27 <Item1 Ref="4" ControlType="XRLabel" Name="lblKod" Text="[Kod]"28 SizeF="600,80" LocationFloat="0,0" Dpi="254" Padding="5,5,0,0,254" />29 </Controls>30 </Item2>31 <Item3 Ref="5" ControlType="BottomMarginBand" Name="bottomMargin" HeightF="200" Dpi="254" />32 </Bands>33 <ComponentStorage>34 <Item1 Ref="0" ObjectType="Soneta.Business.UI.DxReports.BusinessDataSource,Soneta.Business.UI.DxReports"35 Name="BusinessSource" DataKind="CurrentList" />36 <Item2 Ref="6" ObjectType="Soneta.Business.UI.DxReports.Components.BusinessContext,Soneta.Business.UI.DxReports"37 Name="BusinessContext" StylesSource="standardowy" />38 </ComponentStorage>39</XtraReportsLayoutSerializer>40```4142## 6 rzeczy, które musisz wiedzieć zanim zaczniesz43441. **Referencje przez `Ref`/`#Ref-N`.** Każdy węzeł to `ItemN` z unikalnym `Ref="N"`.45 `DataSource="#Ref-0"` na raporcie/paśmie wskazuje komponent `Ref="0"` w `ComponentStorage`.46 Numery `Ref` muszą być **unikalne w całym pliku** — pilnuj tego przy dodawaniu elementów.472. **Jednostki: trzymaj parę `ReportUnit` + `Dpi` spójnie.** Standard produkcyjny:48 `ReportUnit="TenthsOfAMillimeter"` + `Dpi="254"` → wszystkie wymiary w **0,1 mm**49 (A4 = `2100×2970`, marginesy `198`≈20 mm). Alternatywa: brak `ReportUnit` = piksele/96 dpi50 (A4 = `827×1169`). Nie mieszaj — te same liczby znaczą różne rozmiary. Zob. [references/STRUCTURE-BANDS.md](references/STRUCTURE-BANDS.md).513. **Skąd dane: `BusinessDataSource` + `DataKind`.** To Soneta-specyficzne. `CurrentList` =52 lista, na której wywołano wydruk (najczęstsze). `Context` = parametry/nagłówek/sesja53 (przez `DataMember`). `SingleRow` = pojedynczy rekord. `Session` + `DataMember="Moduł.Tabela"`.54 Zob. [references/DATA.md](references/DATA.md).554. **Wiązanie danych: `ExpressionBindings` to standard**, `DataBindings` to legacy.56 Najprościej — wyrażenie **inline w `Text="[Pole]"`** na komórce/etykiecie. Zob. niżej i DATA.md.575. **Kontrolki: preferuj układ tabelaryczny `XRTable`** (nie luźne etykiety). Kwoty wstawiaj58 przez **`AmountLabel`** (kontrolka Soneta), nie `XRLabel`. Zob. [references/CONTROLS.md](references/CONTROLS.md).596. **Aby wydruk pojawił się w programie**, potrzebna jest rejestracja atrybutem60 **`[assembly: DxReport(...)]`** wiążącym plik z typem listy/obiektu. Zob. [references/REGISTRATION.md](references/REGISTRATION.md).617. **Logika niewyrażalna deklaratywnie** (warunkowe sterowanie kontrolkami, obliczenia, dostarczanie62 policzonych danych, parametry) mieszka w **snippecie** — klasie C# `NazwaWydruku.repx.cs`63 dziedziczącej po `ReportSnippet`, z wiązaniem `[DxBind]`. **⚠️ Uwaga licencyjna:** `ReportSnippet`64 i `[DxBind]` odwołują się do typów DevExpress — w kodzie dodatku wymaga to **własnej licencji65 DevExpress**. Bez niej użyj generycznego `Snippet` + `[Bind]`. Zob. [references/SNIPPET.md](references/SNIPPET.md).6667## Wiązanie danych — 3 sposoby6869```xml70<!-- (1) INLINE w Text — najczęstsze w komórkach tabeli. Format przez TextFormatString -->71<Item1 Ref="10" ControlType="XRTableCell" Name="c1" Text="[Netto]"72 TextAlignment="MiddleRight" TextFormatString="{0:n2}" Dpi="254" />7374<!-- (2) ExpressionBindings — standard; pozwala na wyrażenia, funkcje, inne właściwości -->75<Item2 Ref="11" ControlType="XRTableCell" Name="c2" Dpi="254">76 <ExpressionBindings>77 <Item1 Ref="12" EventName="BeforePrint" PropertyName="Text"78 Expression="FormatString('{0:d}', [Data])" />79 </ExpressionBindings>80</Item2>8182<!-- (3) DataBindings — LEGACY, tylko proste pole -->83<Item3 Ref="13" ControlType="XRLabel" Name="lbl" Text="label" SizeF="600,60" LocationFloat="0,0">84 <DataBindings>85 <Item1 Ref="14" PropertyName="Text" DataMember="Kod" FormatString="{0:n2}" />86 </DataBindings>87</Item3>88```8990- `[Pole]` = właściwość bieżącego wiersza danych. Nawigacja po relacjach kropką: `[Kontrahent].[Nazwa]`.91- `EventName="BeforePrint"` — moment obliczenia (praktycznie zawsze taki).92- Formaty .NET: `{0:n}` (liczba 2 miejsca, separator tysięcy), `{0:n0}`, `{0:d}` (data krótka),93 `{0:dd.MM.yyyy}`, `{0:0%}`, `{0:c}` (waluta). Pełna lista → CONTROLS.md.9495## Pasma (Bands) — skrót9697| Pasmo | Rola |98|---|---|99| `TopMarginBand` / `BottomMarginBand` | Marginesy strony — **obowiązkowe**, po jednym. |100| `DetailBand` | Powtarzane raz na każdy rekord bieżącego poziomu. Rdzeń raportu. |101| `DetailReportBand` | Master-detail: zagnieżdżony raport iterujący kolekcję (`DataMember="Pozycje"`). |102| `GroupHeaderBand` / `GroupFooterBand` | Nagłówek/stopka grupy (`<GroupFields>`); stopka = miejsce na sumy. |103| `ReportHeaderBand` / `ReportFooterBand` | Raz na początku / końcu całości. |104| `PageHeaderBand` / `PageFooterBand` | Na górze / dole każdej strony. |105106Typowe atrybuty: `HeightF` (wysokość), `KeepTogether="true"`, `RepeatEveryPage="true"`107(nagłówek listy na każdej stronie), `StyleName`. Szczegóły i master-detail → [references/STRUCTURE-BANDS.md](references/STRUCTURE-BANDS.md).108109## Podsumowania i grupowanie — skrót110111```xml112<!-- suma w komórce stopki grupy/raportu (Func domyślny = Sum) -->113<Item1 Ref="20" ControlType="XRTableCell" Name="cSuma" Dpi="254">114 <ExpressionBindings>115 <Item1 Ref="21" EventName="BeforePrint" PropertyName="Text" Expression="sumSum([Wartosc])" />116 </ExpressionBindings>117</Item1>118119<!-- alternatywnie element <Summary> (bez Func = Sum) -->120<Summary Ref="22" FormatString="{0:n2}" Running="Report" IgnoreNullValues="true" />121122<!-- grupowanie na GroupHeaderBand -->123<GroupFields>124 <Item1 Ref="30" FieldName="Definicja" />125</GroupFields>126```127128Funkcje agregujące w wyrażeniach: `sumSum`, `sumRunningSum` (narastająca), `sumAvg`,129`sumRecordNumber` (Lp.). `Running` = zakres agregacji (`Report`/`Group`/`Page`). Pełny130zestaw funkcji, formatowanie warunkowe (`Iif` na `BackColor`/`Visible`) i pola kalkulowane131→ [references/DATA.md](references/DATA.md).132133## Kontrolki Soneta (nie ma odpowiedników XR*)134135| Kontrolka | Zamiast | Do czego |136|---|---|---|137| `AmountLabel` | XRLabel | **Kwoty** — obsługa formatowania kwot, `SpacingForComma`. |138| `ShrinkableLabel` | XRLabel | Tekst zmniejszający czcionkę, by zmieścić się (`MaxLenght`). |139| `CrossCheckBox` | XRCheckBox | Pole wyboru (deklaracje). |140| `ResourcePictureBox` | XRPictureBox | Obraz z zasobu osadzonego (`ImageResourceName`), np. wzór deklaracji. |141| `Header` / `Footer` | (podraport) | Szablonowy nagłówek/stopka przez `ReportSourceName` + `Title`. |142| `DatabaseSubReport` | XRSubreport | Podraport zdefiniowany w bazie (`ReportSourceName`). |143144> **Uwaga:** Soneta **nie** używa `XRSubreport`, `XRCheckBox` ani `XRZipCode` — zastępują je145> powyższe kontrolki i zagnieżdżone `DetailReportBand`. Szczegóły → [references/CONTROLS.md](references/CONTROLS.md).146147## Nagłówki, stopki, podraporty i style — wzorce współdzielone148149Nagłówek/stopkę/podraport **wstawiasz** kontrolką `Header`/`Footer`/`DatabaseSubReport` z150`ReportSourceName` (nazwa logiczna, nie plik) — program rozwiązuje ją na wzorzec z konfiguracji, więc151klient może podmienić standardowy nagłówek własnym bez ruszania raportu. **Budowa** samego pliku152nagłówka/stopki (`DataKind="Context"`, `SubBand` pierwszej/kolejnej strony, `ReportContext.Title`,153helpery `ReportTools`/`XtraReportHelper`) oraz wielosekcyjnych podraportów →154[references/SUBREPORTS.md](references/SUBREPORTS.md).155156Formatowanie jest **centralne w arkuszu `.repss`**: kontrolki wskazują styl po nazwie (`StyleName`),157a raport wybiera arkusz przez `StyleSheetPath`/`StylesSource` (`"standardowy"`). Struktura pliku158`.repss`, właściwości stylów i katalog nazwanych stylów → [references/STYLES.md](references/STYLES.md).159160## Gotowe przykłady (assets)161162- [assets/Szkielet.repx](assets/Szkielet.repx) — minimalny raport listy (`CurrentList`).163- [assets/ListaProsta.repx](assets/ListaProsta.repx) — lista w `XRTable` z nagłówkiem kolumn164 (`GroupHeaderBand RepeatEveryPage`), numeracją Lp., sumą w stopce.165- [assets/Dokument.repx](assets/Dokument.repx) — master-detail: pola nagłówka dokumentu +166 zagnieżdżony `DetailReportBand DataMember="Pozycje"` z pozycjami i podsumowaniem.167- [assets/Dokument.repx.cs](assets/Dokument.repx.cs) — **snippet** (kod-behind) do powyższego:168 `[DxBind]`, `GetCurrentRow()`, parametry, warunkowe sterowanie kontrolką (wymaga licencji DevExpress).169- [assets/DokumentGeneryczny.repx.cs](assets/DokumentGeneryczny.repx.cs) — snippet **bez licencji170 DevExpress**: generyczny `Snippet` + `[Bind]` (`SnippetLabel`/`SnippetCollection`), gettery wartości.171 Zob. [references/SNIPPET.md](references/SNIPPET.md).172173## Checklista przed oddaniem pliku .repx174175- [ ] Deklaracja `<?xml version="1.0" encoding="utf-8"?>` i element główny `XtraReportsLayoutSerializer`.176- [ ] Wszystkie `Ref="N"` **unikalne**; każde `#Ref-N` wskazuje istniejący węzeł.177- [ ] `ReportUnit` spójne z `Dpi` i z wymiarami (`TenthsOfAMillimeter`+`254` → A4 `2100×2970`).178- [ ] Są `TopMarginBand` i `BottomMarginBand` (po jednym) oraz co najmniej jeden `DetailBand`.179- [ ] `ComponentStorage` zawiera `BusinessDataSource` z właściwym `DataKind`180 (oraz `BusinessContext StylesSource="standardowy"` dla stylów).181- [ ] `DataSource="#Ref-N"` na raporcie i na każdym `DetailReportBand` wskazuje właściwe źródło.182- [ ] Master-detail: `DetailReportBand` ma `DataMember` = nazwa kolekcji podrzędnej.183- [ ] Wiązania używają istniejących pól obiektu (`[Pole]`, `[Relacja].[Pole]`).184- [ ] Kwoty przez `AmountLabel`; format liczb/dat przez `TextFormatString`/`FormatString`.185- [ ] Style: kontrolki/pasma używają `StyleName` z arkusza `.repss` (+ `StylePriority Use*="false"`),186 raport ma `StyleSheetPath`/`StylesSource`. Zob. [references/STYLES.md](references/STYLES.md).187- [ ] Nagłówek/stopka/podraport: wstawiony przez `ReportSourceName` (nazwa logiczna); własny plik188 budowany wg wzorca (`DataKind="Context"`, `SubBand`, `ReportContext.*`). Zob. [references/SUBREPORTS.md](references/SUBREPORTS.md).189- [ ] Jeśli wydruk ma pojawić się w programie: przygotowana rejestracja `[assembly: DxReport(...)]`190 (lub dodanie jako wzorzec użytkownika w edytorze wydruków). Zob. REGISTRATION.md.191192## Powiązane skille193194- **/soneta-programming** — warstwa kodu C#, na której opiera się snippet (kod-behind). Powiązane195 tematy: *Klasy parametrów (`ContextBase`)* (tak samo konstruowane jak parametry wydruku),196 *Klasa `Context`*, *Sesje/transakcje* (`Session`, ORM), *Worker i Extender* (obliczanie danych197 raportu), *Zasady bezpiecznego kodu* (review snippetu), oraz typy wierszy, do których wydruk się198 wiąże. Zob. też [references/SNIPPET.md](references/SNIPPET.md).199- **/soneta-form-xml** — formularz parametrów wydruku (`RepxParams/*.pageform.xml`) pytany przed200 generowaniem.201- **/soneta-business-xml** — definicje obiektów/pól, które wydruk odczytuje w wiązaniach.202- **/soneta-config** — import/eksport konfiguracji (wzorce wydruków w bazie) przez XML.203- **/soneta-tools** — generowanie i testowanie wydruków z wiersza poleceń.204- **/soneta-erp** — mapa skilli platformy Soneta.