Przejdź do treści

Filtrowanie danych i przekazywanie kontekstu do okna

Często uruchamiając jakieś okno chcesz z góry założyć jakiś filtr, aby ograniczyć dziedzinę danych programowo, a nie poprzez wybór parametrów filtracji wewnątrz okna. Np. z poziomu kartoteki klientów chcesz pokazać okno z listą faktur z rejestru SPR dla konkretnego klienta. W Neosie w tym celu używa się nie filtru, ale tzw. kontekstu.

Kontekstem nazywamy listę par <pole,wartość> i zakładamy go w następujący sposób:

Contexts c = new Contexts();
c.Add("KLIENT",this.REF);
c.Add("REJESTR","SPR");

Użycie kontekstu w kodzie

Kontekstu możemy użyć w wielu metodach C#, np w metodzie ShowForm(...):

ShowForm("SENTE.NAGFAK","BROWSE",c);

Uruchomienie formy z kontekstem wpływa na nią w następujący sposób:

  • Kontekst założony na pola danych nakłada filtr na dane. Kontekst z przykładu powyżej generuje filtr: KLIENT='12345' AND REJESTR='SPR (12345 to przykładowa wartość otrzymana z this.REF).
  • Jeśli w oknie, na które nałożono kontekst wywołamy akcję dodania nowego rekordu, to kontekst na pola danych powoduje inicjację wartości pól. W powyższym przykładzie, naciśnięcie przycisku dodawania nowej faktury spowoduje otwarcie okna edycyjnego faktury, przy czym pole KLIENT przyjmie już wartość 12345 a pole REJESTR - wartość SPR. Nowa faktura zakładana jest wiec w tej dziedzinie, w której się poruszamy. Inicjacja wartości pól z kontekstu może nie zadziałać, jeśli pola posiadają metodę na inicjalizację, gdyż takie metody są uruchamiane i pole otrzymuje wartość zwracaną przez te metody.

Kontekst możesz zakładać nie tylko na pola danych, ale także na parametry. Jeśli w obiekcie SENTE.NAGFAK posiadasz parametry _rejfilter i _typfilter, które pokazane są w oknie BROWSE jako pola COMBO służące do filtracji faktur w oknie, możesz wywołać to okno w następujący sposób:

Contexts c = new Contexts();
c.Add("KLIENT",this.REF);
c.Add("_rejfilter","SPR");
c.Add("_typfilter","FAK");
ShowForm("SENTE.NAGFAK","BROWSE",c);

Spowoduje to pokazanie okna przeglądania faktur przefiltrowanego do wybranego klienta, a także ustawienie filtrów na rejestr SPR i typ FAK. Oczywiście zmiana rejestru i typu będzie możliwa w oknie, natomiast użytkownik nie jest w stanie zdjąć filtracji z wybranego klienta.

Zmiana i zdjęcie kontekstu w kodzie

Kontekst możesz także ustawić na działającym oknie. Np aby zmienić kontekst na innego klienta, możesz napisać:

    SetContext("KLIENT",_nowyrefklienta);

Aby zdjąć kontekst nałożony programowo, należy go ustawić na wartość NULL. Czyli:

    SetContext("KLIENT",null);

Nałożenie kontekstu na pustą wartość tekstową nie usuwa kontekstu, gdyż pusta wartość jest traktowana tak samo jak każda inna wartość.

Niejawne wykorzystanie mechanizmu kontekstu

Jeśli w modelu danych definiujesz w polu relację do słownika i użyjesz tzw. dodatkowych warunków złączenia, to wywołanie okna słownika zakłada na słownik kontekst wynikający właśnie z dodatkowych warunków złączenia. Dzięki temu słownik jest filtrowany tymi warunkami, a zakładanie nowego rekordu słownika automatycznie odbywa się w zawężonej dziedzinie.

Pokazanie okna edycji rekordu odbywa się przy pomocy metody ShowRecord(...). Metoda ta nie musi jawnie otrzymywać kontekstu, gdyż sama tworzy kontekst z wszystkich pól klucza głównego bieżącego rekordu. Dzięki temu, jeśli jesteś w oknie przeglądania kartoteki klientów i chcesz wyświetlić okno edycji bieżącego klienta, uruchamiana jest metoda ShowRecord(...), która sama założy w nowym oknie kontekst na pole REF, które stanowi klucz główny tej kartoteki.

Wyświetlanie kilku kopii tego samego okna

Dla okien wolnych oraz MDI, kontekst przekazywany do okna ma wpływ także na to, czy Neos powołuje nową kopię okna, czy aktywuje już istniejącą kopię, która już jest otwarta w aplikacji. Jeśli np okno EDIT obiektu KLIENCI zmienisz z modalnego na wolne lub MDI, to będziesz mógł jednocześnie wyświetlić kilka okien edycyjnych kilku różnych klientów i trzymać je otwarte tak długo, jak chcesz. Jednak gdy wybierzesz po raz drugi klienta, którego okno już otworzyłeś, to nie otrzymasz nowej kopii okna, ale aplikacja automatycznie przełączy się na uprzednio otwarte okno tego konkretnego klienta. Dzieje się tak, ponieważ zanim nowe okno zostanie utworzone, następuje sprawdzenie, czy dane okno z tym samym kontekstem nie jest już otwarte. Jeśli jest, to serwer nie otwiera nowego okna, ale zleca aktywację okna już istniejącego.

Na to zachowanie można wpłynąć poprzez jawne ustawianie parametru uniqueinstanceid metody ShowForm(...). Można w tym parametrze przekazać dowolny ciąg znaków, który jeśli jest niepusty, to staje się identyfikatorem danej kopii okna. Jeśli wywołamy metodę ShowForm(...) z wartością uniqueinstanceid, która do tej pory nie istniała w ramach otwartych kopii tego okna (oczywiście w ramach danego obiektu biznesowego), to powoływana jest nowa kopia okna. Natomiast jeśli ta wartość już istnieje, w którejś otwartej kopii okna, to nowe okno nie jest powoływane, ale aplikacja przełączy się na kopię z tą samą wartością uniqueinstanceid.

Filtrowanie danych przez metody filtracji

W technologii Neos istnieje kilka sposobów filtrowania danych w oknach aplikacji. Poniżej opisano trzy główne metody filtracji: metodę na filtrację obiektu, metodę na filtrację okna oraz metodę na filtrację słownika.

Metoda na filtrację obiektu

Definicja i podpięcie:

Metoda na filtrację obiektu jest definiowana bezpośrednio we właściwościach obiektu biznesowego (Zakładka Metody -> Metoda na wyrażenie SQL do filtracji danych). Jest to metoda, która pozwala na zawężenie dziedziny danych dla całego obiektu.

Użycie:

  • Używana jest do globalnego filtrowania danych w całym obiekcie.
  • Przydatna, gdy chcemy, aby wszystkie formy i okna korzystające z tego obiektu były filtrowane według określonych kryteriów.

Nie używać do:

  • Filtrowania specyficznego dla pojedynczych okien lub form, ponieważ może to prowadzić do problemów z dziedziczeniem i modyfikacją filtrów w różnych kontekstach.

Uwaga!

Metoda na filtrację obiektu, gdy jest uzależniona od pola modelu danych bądź parametru, może powodować problemy ze stanem obiektu podczas edycji i dodawania rekordów, ponieważ zmiana tych parametrów będzie wymuszać odświeżenie dziedziny.

Metoda na filtrację okna

Definicja i podpięcie:

Metoda na filtrację okna jest definiowana we właściwościach konkretnej formy (Zakładka Metody -> Metoda na wyrażenie SQL do filtracji danych). Metoda ta pozwala na filtrowanie danych wyłącznie w obrębie danego okna.

Użycie:

  • Używana jest do filtrowania danych specyficznie dla danego okna.
  • Idealna, gdy chcemy, aby tylko jedno okno było filtrowane według określonych kryteriów, niezależnie od innych okien korzystających z tego samego obiektu.

Nie używać do:

  • Globalnego filtrowania danych w całym obiekcie, ponieważ jej działanie jest ograniczone do jednego okna.

Metoda na filtrację słownika

Definicja i podpięcie:

Metoda na filtrację słownika jest definiowana w obiekcie, na którym jest pole które jest słownikowane. Jest to metoda, która pozwala na zawężenie dziedziny danych w słowniku. Aby ją zdefiniować, należy wybrać pole słownikowane i w zakładce "Metody" uzupełnić "Metoda na filtrację słownika".

Użycie:

  • Używana jest do filtrowania danych w słownikach, które są używane w polach słownikowanych.
  • Przydatna, gdy chcemy, aby słownik wyświetlał tylko określone rekordy na podstawie kryteriów.

Przykład:

public string FilterREL(WWW.GRID_DICT2 masterobject)
{
    return "WWW_GRID_DICT2.ID > " + ID;
}

Więcej o metodzie na filtrację słownika