Przejdź do treści

Dziedziczenie standardowych metod

Część metod klasy CustomObject można bardzo łatwo dziedziczyć. Aby móc przeglądać i zarządzać tymi metodami, po założeniu nowego obiektu biznesowego, musimy przejść do zakładki z metodami interfejsu, a następnie w filtrze nad listą zaznaczyć checkbox dziedziczone. Metody te są domyślnie wyszarzone, aby przypisać im kod należy w edytorze kliknąć w następujący link.

Dziedziczenie służy do kastomizacji standardowych zachowań obiektu. Oto lista metody podlegających dziedziczeniu:

  • AfterDelete()
  • AfterPost() - wykonywana automatycznie po udanym zatwierdzeniu rekordu po jego edycji lub dodaniu nowego
  • PostRecord() - zatwierdza bieżący rekord po jego edycji lub dodaniu nowego. W przypadku, gdy baza danych jest obsługiwana po stronie klienta, funkcja nie zwraca informacji, czy Post się udał czy nie. Dlatego aby wykonać jakiś kod po udanym zatwierdzeniu rekordu należy użyć funkcji AfterPost()
  • GetGridViewLabel() - metoda zwraca wartość etykiety nad gridem widocznej w oknach MasterBROWSE. Pozwala na dynamiczne generowanie etykiety, którą statyczną wartość możemy ustawić poprzez dodanie etykiety, na kontrolce "Table". Aby możliwe było wygenerowanie dynamicznej wartość najpierw musimy ustawić statyczną wartość etykiety na kontrolce "Table".
  • RefreshByF5() - metoda umożliwia wykonanie niestandardowych operacji podczas odświeżania danego obiektu, poprzez kliknięcie przycisku F5. Dzięki temu rozwiązaniu jesteśmy w stanie zaimplementować odświeżenie np. innych źródeł danych, które nie są ściśle powiązane z tym konkretnym obiektem biznesowym.

Uwaga!

Metoda zadziała tylko dla kienta Desktop.

Działanie: - Nieprzeciążona metoda nie wykonuje żadnej operacji po stronie serwera i zwraca false, dzięki temu klient desktop wie o tym, że po stronie serwera nic się nie dzieje i to właśnie klient musi wykonać standardowe odświeżanie. - Jeżeli przeciążymy metodę i zwrócimy tylko true, bez implementacji odświeżenia po stronie serwera, to klient również nie wykona odświeżania standardowego. - Jeżeli przeciążymy metodę, zaimplementujemy odświeżanie w ramach tej metody i zwrócimy false, to oprócz operacji wykonanych przez nas, klient automatycznie odświeży dane standardowym mechanizmem. - Jeżeli przeciążymy metodę, zaimplementujemy odświeżanie w ramach tej metody i zwrócimy true, to podczas odświeżania wykona się tylko kod metody.

Przykład wykorzystania mechanizmu:

Dobrym przykładem do wykorzystania tego mechanizmu jest odświeżenie dwóch źródeł danych, które są powiązane ze sobą biznesowo i osadzone na jednym oknie. Podczas przeglądania danych na jednym z obiektów, dokonujemy zmian, które mogą wpłynąć na drugi zbiór danych. Aby nie trzeba było przełączać się pomiędzy tabelami, możemy wykorzystać właśnie ten mechanizm, który umożliwi odświeżenie obu źródeł, niezależnie na której tabeli jesteśmy aktualnie ustawieni. W standardzie dobrym miejscem do zastosowania mechanizmu, jest okno zleceń magazynowych. Na tym oknie mamy osadzone dwa źródła danych: zlecenia magazynowe i pozycje zleceń. Poniżej prezentuje kroki, jakie trzeba wykonać, aby będąc na tabeli pozycji zleceń, można było odświeżyć tabelę ze zleceniami i na odwrót.

Część pierwsza: Odświeżenie tabeli zleceń magazynowych podczas odświeżania tabeli pozycji zleceń. 1. Przechodzimy do obiektu biznesowego reprezentującego pozycje zleceń (W tym przypadku będzie to MWSACTS). 2. Przełączamy się na widok edytora kodu dla tego obiektu. Jeżeli jesteśmy na zakładce pojedynczego obiektu, to przechodzimy do zakładki metod interfejsowych. 3. W filtrze nad listą metod zaznaczamy metody dziedziczone. 4. Wyszukujemy metodę o nazwie RefreshByF5 i klikamy w link, aby ją przeciążyć. 5. W ciele przeciążonej metody dodajemy następujący kod:

public bool RefreshByF5()
{
  this.ParentObject?.RefreshData();
  return base.RefreshByF5();
}
Trzecia linia to nic innego jak odświeżenie obiektu rodzica. Możemy wykorzystać właśnie odwołanie do obiektu rodzica, ponieważ obiekt odpowiedzialny za pozycje zlecenia, jest osadzony na obiekcie odpowiedzialnym za zlecenia. Takie rozwiązanie ma jednak wadę, podczas odświeżania metoda tak zaimplementowana wywoła RefreshData() na każdym obiekcie, na jakim zagnieździmy obiekt pozycji zleceń. Co ogranicza, nam możliwość wykorzystania danego obiektu. W tym przypadku z punktu biznesowego nie powinno mieć to znaczenia, jednakże możemy w takiej metodzie tak zaimplementować kod, żeby odświeżał tylko konkretny typ rodzica. Zmodyfikowany kod powinien wyglądać następująco: public bool RefreshByF5() { this.RefreshData("MWSORDS", "F"); return base.RefreshByF5(); }

Czwarta linia jest potrzebna po to, by przekazać klientowi Desktop, aby oprócz dodatkowej akcji wykonał również standardowe odświeżenie, jeżeli tego nie chcemy to, zamiast tej linii powinniśmy zwrócić wartość true.

Część druga: Odświeżenie tabeli pozycji zleceń podczas odświeżania tabeli zleceń magazynowych. 1. Przechodzimy do obiektu biznesowego reprezentującego zlecenia magazynowe (W tym przypadku będzie to MWSORDS). 2. Przełączamy się na widok edytora kodu dla tego obiektu. Jeżeli jesteśmy na zakładce pojedynczego obiektu, to przechodzimy do zakładki metod interfejsowych. 3. W filtrze nad listą metod zaznaczamy metody dziedziczone. 4. Wyszukujemy metodę o nazwie RefreshByF5 i klikamy w link, aby ją przeciążyć. 5. W ciele przeciążonej metody dodajemy następujący kod:

public bool RefreshByF5()
{
  this.RefreshData("MWSACTS", "F");
  return base.RefreshByF5();
}
Jak widać, w tym przypadku kod jest identyczny jak poprzednio, jedyną istotną różnicą jest to, że nie ma prostego wskazania na kolekcję obiektów, które są zagnieżdżone na naszym obiekcie zleceń magazynowych.