# Datapack i GuidedRow - Paczki danych Dokumentacja mechanizmu paczek danych (Datapack) służącego do grupowania powiązanych obiektów i ich synchronizacji między bazami danych. ## Czym jest Datapack? **Datapack** to struktura obiektów różnych typów powiązanych relacjami, które tworzą logiczną całość. ### Przykład: Dokument handlowy ``` DokumentHandlowy (Root) ├── PozycjaDokHandlowego[] (Child) ├── SumaVAT[] (Child) └── Platnosc[] (Child) ``` Faktura bez pozycji nie jest kompletną fakturą - wszystkie te obiekty stanowią jedną paczkę danych. ## Hierarchia klas Row i Table ``` Row (abstrakcyjna) Table (abstrakcyjna) │ └── ID: int └── GuidedTable (indeksator po Guid) │ └── State: RowState └── ExportedTable │ └── GuidedRow │ └── Guid: System.Guid │ └── Attachments │ └── FirstChangeInfo, LastChangeInfo │ └── Note │ └── ExportedRow └── Exported: bool ``` ## Atrybut guided w business.xml Atrybut `guided` w definicji tabeli określa rolę obiektu w strukturze Datapack. | Wartość | Klasa bazowa | Opis | |---------|--------------|------| | `Root` | `GuidedRow` | Główny element paczki danych. Posiada GUID. | | `Exported` | `ExportedRow` | Jak Root + flaga Exported (czy wyeksportowany) | | `Child` | `Row` | Element podrzędny w paczce. Musi mieć relację `relguided`. | | `None` | `Row` | Nie uczestniczy w mechanizmie Datapack | **Domyślnie:** `guided="Child"` ### Przykłady definicji ```xml ...
...
...
``` ## Atrybut relguided Określa relację obiektu Child do obiektu Root w strukturze Datapack. | Wartość | Opis | |---------|------| | `inner` | Obiekt podrzędny zagnieżdżony wewnątrz roota w XML | | `outer` | Obiekt podrzędny poza rootem w XML (ale powiązany) | | (puste) | Relacja nie jest częścią Datapack | ### Kiedy używać relguided ```xml delete="cascade" children="Pozycje"/> children="Pozycje"/> ``` **Reguły:** - Tabela Child może mieć **tylko jedną** kolumnę z `relguided` - Tabela Root **nie posiada** relacji `relguided` (jest korzeniem paczki) ## GuidedRow - szczegóły ### Właściwości | Właściwość | Typ | Opis | |------------|-----|------| | `Guid` | `System.Guid` | Globalnie unikalny identyfikator | | `Attachments` | `AttachmentCollection` | Kolekcja załączników | | `DefaultImage` | `Attachment` | Domyślne zdjęcie obiektu | | `Note` | `string` | Notatka tekstowa | | `FirstChangeInfo` | `ChangeInfo` | Pierwsza zmiana w historii | | `LastChangeInfo` | `ChangeInfo` | Ostatnia zmiana w historii | | `IsAdded` | `bool` | Czy nowo dodany | | `IsModified` | `bool` | Czy zmodyfikowany | | `IsDeleted` | `bool` | Czy skasowany | ### Załączniki Załączniki można podpinać **tylko** do obiektów wywodzących się z `GuidedRow`. ```csharp GuidedRow row = ...; // Dostęp do załączników foreach (Attachment att in row.Attachments) { Console.WriteLine(att.Nazwa); } // Domyślne zdjęcie Attachment img = row.DefaultImage; ``` ## ExportedRow Rozszerza `GuidedRow` o flagę `Exported`. ### Użycie Obiekty, które po eksporcie do systemów zewnętrznych **nie powinny być modyfikowane**. **Przykład:** Przelew wyeksportowany do systemu bankowego - po zaksięgowaniu nie powinien być zmieniany w ERP. ```xml ...
``` ### Właściwość | Właściwość | Typ | Opis | |------------|-----|------| | `Exported` | `bool` | `true` = obiekt wyeksportowany, nie modyfikować | ## Historia zmian (ChangeInfos) System loguje zmiany na obiektach `GuidedRow`. ### Tabela ChangeInfos | Kolumna | Opis | |---------|------| | `SourceTable` | Nazwa tabeli źródłowej | | `SourceGuid` | GUID zmodyfikowanego obiektu | | `Time` | Data i czas zmiany | | `Operator` | Kto dokonał zmiany | ### Dostęp do historii ```csharp var bm = session.GetBusiness(); // Iteracja po historii zmian kontrahenta Kontrahent knt = ...; foreach (ChangeInfo ci in bm.ChangeInfos[knt]) { Console.WriteLine($"{ci.Time}: {ci.Operator}"); } // Skróty na obiekcie Console.WriteLine($"Utworzono: {knt.FirstChangeInfo?.Time}"); Console.WriteLine($"Ostatnia zmiana: {knt.LastChangeInfo?.Time}"); ``` **Uwaga:** Zmiany na obiektach Child są rejestrowane na poziomie Root. ## Blokady Modyfikacja **dowolnego** obiektu w strukturze Datapack zakłada blokadę na poziomie **Root**. ``` DokumentHandlowy ← BLOKADA ├── PozycjaDokHandlowego (modyfikacja tutaj) └── SumaVAT ``` Nie można równolegle edytować obiektów należących do jednego Datapacka. ## GuidedTable Odpowiednik `GuidedRow` dla tabel - dodaje indeksator po GUID. ```csharp GuidedTable towary = ...; // Pobranie obiektu po GUID Guid guid = new Guid("65336878-70cf-4e64-bd72-b742cd26a657"); Towar towar = towary[guid]; ``` ## Wzorce użycia ### Definiowanie struktury Datapack ```xml
``` ## Podsumowanie atrybutów | Atrybut | Gdzie | Wartości | Opis | |---------|-------|----------|------| | `guided` | `` | Root, Exported, Child, None | Rola w Datapack | | `relguided` | `` | inner, outer, (puste) | Relacja Child→Root | | `delete` | `` | cascade, restrict, setnull | Akcja przy usuwaniu roota |