Wprowadzenie
Obiekt biznesowy typu Supplement może być użyty do rozszerzenia obiektu biznesowego innego typu o atrybuty biznesowe. Ten rozszerzony obiekt biznesowy jest zazwyczaj jednostką biznesową. Obiekt zależny może również zostać rozszerzony przez supplement, ale supplement nie może rozszerzyć supplementu.
Rozszerzenie jednostki biznesowej za pomocą supplementu w porównaniu z obiektem deweloperskim o typie Extension ma następujące zalety:
- brak technicznych zależności między jednostką biznesową a supplementem. Dzięki czemu zmniejsza się ilość zadań konfliktowych
- obiekty biznesowe aplikacji nie mogą być rozszerzane za pomocą obiektu deweloperskiego typu Extension, ale mogą być rozszerzane za pomocą supplementów.
- Suplement pozwala na wyprowadzenie danych, co skutkuje zmniejszeniem szerokości tabeli.
Supplement często pojawia się w interfejsie użytkownika i może być używany w rozszerzeniach wyszukiwania lub w filtrze obiektów w aplikacjach Eksport danych i Import danych. W tym celu dostępne są gotowe mechanizmy automatyzujące. Alternatywnie do supplementów można również użyć własny obiekt biznesowego.
W artykule Obiekt deweloperski: Business object znajduje się opis wprowadzania i edytowania obiektów biznesowych.
Typowym przypadkiem użycia dodatków jest dodanie atrybutu do istniejącej aplikacji dialogowej. W artykule opisano prosty przykład rozwoju, który pokazuje, jakie obiekty należy zarejestrować i w jaki sposób to zrobić.
Grupa docelowa
- Programiści
Tworzenie supplementu
Supplement tworzy się zawsze na podstawie obiektu biznesowego typu Business Entity lub Dependent, do którego supplement ma się odnosić. Aby utworzyć dodatek w aplikacji Obiekty deweloperskie, należy użyć akcji związanej z aplikacją Utwórz Dependent lub Supplement. Postępuj zgodnie z poniższymi instrukcjami.
Instrukcja:
- Otworzyć aplikację Obiekty deweloperskie
- W nagłówku należy wybrać w polu Typ opcję: Business Object, na zakładce Edytor w polu Typ wybrać jedną z opcji do której będzie tworzony dodatek:
- Business entity
- Dependent
- Na standardowym pasku narzędzi należy wskazać zadanie deweloperskie, na podstawie którego zostanie utworzony dodatek.

- Wybrać akcję Utwórz Dependent lub Supplement dostępną pod przyciskiem na pasku narzędzi [Utwórz dodatkowe obiekty].
- Otwarte zostanie okno dialogowe Utwórz elementy zależne
- Należy wybrać wartość Supplement w polu Typ. Odpowiednie dane są domyślnie ustawianie w polach Nazwa i Oznaczenie.
- Jeśli suplement ma być używany w określonym interfejsie, należy go wprowadzić w polu Interfejs.
- Wybrać przycisk [OK]. Okno dialogowe zostanie zamknięte, a obiekt biznesowy typu Supplement zostanie utworzony z wprowadzonymi danymi. Ma on status Nowy i jest przypisany do wcześniej wybranego zlecenia deweloperskiego. Ustawienia są przyjmowane przez jednostkę biznesową (lub Dependent), do którego supplement ma się odnosić.
- Tworzona jest relacja _businessObject z jednostką biznesową.
- Klucz podstawowy supplementu jest generowany zgodnie z kluczem podstawowym powiązanej jednostki biznesowej.
- Należy wprowadzić atrybuty, które mają zostać dodane do encji biznesowej.
- Wybrać przycisk [Zapisz] na standardowym pasku narzędzi. Suplement zostanie zapisany w wybranym zleceniu deweloperskim.
Tworzenie widoku obiektu
Z reguły atrybuty supplementu powinny być również edytowalne w interfejsie użytkownika w odpowiedniej aplikacji. Tryb projektowania jest dostępny dla modyfikowalnej aplikacji, której można użyć do dostosowania układu do własnych wymagań. Wymagany jest obiekt deweloperski typu Data view, aby można było dodać atrybuty do aplikacji w trybie projektowania. Konwencja nazewnictwa służy do tworzenia widoku obiektu, jak pokazano w poniższym przykładzie.
com.<prefiks deweloperski>.app.general.obj.ItemSupplement
Jeśli widok obiektu dla suplementu posiada następującą w pełni kwalifikowaną nazwę, zostanie on automatycznie zaoferowany w trybie projektowania odpowiedniej aplikacji w dokowanym oknie Tryb projektowania, np. na zakładce Struktura, ponieważ składnik nazwy obj został zastąpiony przez model:
com.<prefiks deweloperski>.app.general.model.ItemSupplement.
Aby otworzyć okno dokowane Tryb projektowania, należy:
- Wejść w tryb projektowania rozwijając opcję Wybierz i organizuj widoki w wybranej aplikacji np. Artykuły
- Na pasku zadań w menu użytkownika należy wybrać przycisk [Tryb projektowania]
Jeśli suplement i widok obiektu zostaną zapisane z identycznymi w pełni kwalifikowanymi nazwami z wyjątkiem komponentów obj i model, widok obiektu jest automatycznie oferowany do wyboru w trybie projektowania dostosowywanej aplikacji z jej atrybutami.
Widok obiektu nadal wymaga informacji o klasie implementującej. Można użyć m.inm. następującej nadklasy:
com.cisag.pgm.base.DataSupplement
W konstruktorze można jako „parent” wskazać widok obiektu, który zostanie w ten sposób skutecznie rozszerzony, jednocześnie wykluczając inne widoki. Dzięki temu widoki obiektów dziedziczą ustawienia z określonego widoku głównego.
Na przykład, jeśli główny widok nie jest edytowalny w określonych warunkach, to warunek ten automatycznie dotyczy również widoku obiektu suplementu. W zależności od wymagań projektu może być również zasadne użycie jako DataObject standardowego obiektu danych pgm.
Więcej informacji na temat widoków obiektów można znaleźć w artykule Obiekt deweloperski: Data view.
Przestrzeganie konwencji nazewnictwa lub zintegrowanie suplementu za pomocą hooków powoduje, że widok obiektu staje się dostępny w trybie projektowania aplikacji.
Jest on widoczny zgodnie z następującym wzorcem nazewnictwa (przy wcześniejszych przykładowych danych):<prefiks_deweloperski>_ItemSupplement.
Implementacja
- applyDefaults
- validate
DataObject
Aby móc zarejestrować widok obiektu, potrzebny jest obiekt DataObject. W najprostszym przypadku implementacja wygląda następująco:
public class ItemSupplementDataObject extends DataSupplement<ItemSupplement, ItemView> { public ItemSupplementDataObject(ItemSupplement obj, ItemView parentView) { super(obj, parentView); } }
Hooki
Hook Contract
<?xml version="1.0" encoding="UTF-16"?> <HookContract xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="HookXMLSchema.xsd"> <!– Don’t change this line and the lines above! –> <HOOK_IMPLEMENTATION> <contract> <hook> <interface> com.cisag.app.general.item.hook.log.ItemApplyDefaultsHook </interface> <implementation> com.<development prefix>.app.general.ItemHookImpl </implementation>. </hook> <hook> <interface> com.cisag.app.general.item.hook.log.hook.ItemValidateHook </interface> <implementation> com.<development prefix>.app.general.ItemHookImpl </implementation>. </hook>. </kontrakt> </HOOK_IMPLEMENTATION> </HookContract>
applyDefaults
Poniżej znajduje się przykładowa implementacja hooka applyDefaults.
import com.cisag.pgm.base.Path; public class ItemHookImpl implements ItemApplyDefaultsHook<Item, ItemAccess.Full>{ public void applyDefaults(Full full, ItemView itemView){ ItemSupplement suppObj = ItemSupplement.newTransientInstance(); suppObj.setYourAttribute(...) // twój atrybut byte[] org = Company.getCompanyGuid(); CisObjectInitialiser.getInstance(ItemSupplement.class).init(suppObj, org); ItemSupplementDataObject itemSupplementDataObject = new ItemSupplementDataObject(suppObj, itemView); CisDataViewManager dvm = CisEnviron-ment.getInstance().getDataViewManager(); ItemSupplementAccess access = dvm.create(ItemSupplementView.class, itemSupplementDataObject); Path suppPath = Path.getSupplementInstance(ItemView.class, ItemSupple-mentView.class); full.setValue(suppPath, access); } }
validate
Poniżej znajduje się przykładowa implementacja hooka validate:
import com.cisag.pgm.base.Path; public class ItemHookImpl implements ItemValidateHook<Item, ItemAccess.Full> public void validate(ItemView itemView){ Path suppPath = Path.getSupplementInstance(ItemView.class, ItemSupple-mentView.class); Path append = supp-Path.append(ItemSupplementView.Attribute.$yourAttribute); ItemSupplementView value = itemView.getValue(suppPath); CisMessageManager mm = CisEnvironment.getInstance().getMessageManager(); mm.setProgramMessagePath(suppPath); if (value.getYourAttribute()!=null){ // insert validation here } }
Interfejs programistyczny
Jeśli zostaną zaimplementowane odpowiednie hooki, zazwyczaj nie ma potrzeby ingerencji programistycznej. Jeśli jednak np. aplikacja nie jest dostosowywalna lub dostępne hooki nie są wystarczające do określonych celów, możliwe jest bezpośrednie uzyskanie dostępu do supplementu.
Aby uzyskać dostęp programistyczny, dostępne są następujące metody w CisObject
:
-
get_Supplement(Supplement.class)
– umożliwia uzyskanie obiektu suplementu zapisanego wCisObject
, jeśli taki istnieje. Jeśli obiekt supplementu nie jest dostępny, zostanie zwrócona wartość null. set_Supplement(Supplement.instanz)
– umożliwia ustawienie instancji suplementu wCisObject
.
Trwałość (Persistence)
Zaleca się otwieranie i zapisywanie suplementu wyłącznie za pośrednictwem Business Entity. Na podstawie zapisanych metadanych w aplikacji Obiekty deweloperskie, tj. relacji _businessObject, rozpoznawane są suplementy należące do Business Entity (lub zależnych obiektów). Suplementy są następnie automatycznie otwierane i dodawane do instancji Business Entity. Można je następnie zapytać za pomocą następującej metody:
get_Supplement(Supplement.class)
Jeśli do instancji Business Entity nie należy żadna instancja suplementu, zwracana jest wartość null.
Podobnie przy zapisywaniu: zapisuje się Business Object. W ramach tej operacji usługa persystencji sprawdza, czy do tej instancji należy instancja suplementu. Jeśli tak, instancja suplementu zostaje również zapisana w ramach tej samej transakcji.
Skutki
Jeśli zostanie zachowana konwencja nazewnictwa suplementów, jak opisano powyżej, suplement lub widok obiektu na nim oparty będzie dostępny w trybie projektowania.
Dostępne są również następujące funkcje automatyczne:
- w aplikacjach Import danych i Eksport danych supplement jest automatycznie dostępny. Nie ma potrzeby rozszerzania kontrolera. Jeśli supplement zostanie nazwany zgodnie z przykładem ItemSupplement i będzie należał do obiektu biznesowego Item, w filtrze dla obiektu biznesowego Item pojawi się relacja do supplementu. Nazwa relacji to <Prefiks deweloperski>_ItemSupplement, analogicznie do trybu projektowania. Tutaj <Prefiks deweloperski> to prefiks deweloperski systemu.
- w ten sam sposób supplement jest dostępny w konfigurowalnych wyszukiwaniach i aplikacjach typu lista.
- mie jest wymagane ręczne programowanie wsparcia dla języków (NLS). Jeśli w supplemencie znajduje się atrybut obsługujący NLS, to dzięki standardowej implementacji zostanie on automatycznie obsłużony.