Grupa docelowa
- Programiści aplikacji
Opis
- Zestaw kolumn
- Możliwość konfigurowania
- Wyszukiwanie szczegółowe
- Model programowania
- Aplikacje działające w tle
- Eksport i usługi sieciowe RESTful
Zestaw kolumn
Możliwość konfigurowania
Wyszukiwanie szczegółowe
Model programowania
Wizualizacja
Filtr
Aplikacje działające w tle
- Obiekty wybrane w obszarze roboczym są przenoszone do aplikacji działającej w tle
- Właściwości wyszukiwania wprowadzone w nagłówku aplikacji typu Lista w momencie wywołania akcji są przenoszone do aplikacji działającej w tle, z którą wykonywane jest zapytanie do bazy danych w momencie uruchomienia aplikacji działającej w tle. Wynik tego zapytania może różnić się od tego, które zostało już wykonane w aplikacji. W związku z tym, użytkownik niekoniecznie widział wcześniej wynik wyszukiwania, a liczba obiektów do przetworzenia może nieświadomie skutkować niezamierzonym zakresem.
- Zarówno obiekty wybrane w obszarze roboczym, jak i charakterystyki wyszukiwania z nagłówka listy są przesyłane do aplikacji działającej w tle. W czasie wykonywania aplikacji w tle wykonywane jest zapytanie do bazy danych z funkcjami wyszukiwania, ale w tym przypadku wszystkie obiekty wybrane w obszarze roboczym są pomijane (lista negatywna).
Eksport i usługi sieciowe RESTful
Obiekty deweloperskie
Typy obiektów deweloperskich Search i Search extension
Zakładka From/Where: Zapytanie do bazy danych
com.cisag.app.edu.obj.Book BOOK LEFT OUTER JOIN com.cisag.app.general.obj.Partner EMPLOYEE ON BOOK:employee = EMPLOYEE:guid
Klucze obce
REMOVABLE JOIN
SELECT BOOK:code FROM com.cisag.app.edu.obj.Book BOOK REMOVABLE LEFT OUTER JOIN com.cisag.app.general.obj.Partner EMPLOYEE ON BOOK:employee = EMPLOYEE:guid
SELECT BOOK:code FROM com.cisag.app.edu.obj.Book BOOK
Automatyczna optymalizacja
SELECT BOOK:code, EMPLOYEE:number FROM com.cisag.app.edu.obj.Book BOOK LEFT OUTER JOIN com.cisag.app.general.obj.Partner EMPLOYEE ON BOOK:employee = EMPLOYEE:guid
SELECT BOOK:code, BOOK:employee FROM com.cisag.app.edu.obj.Book BOOK
Partner partner = om.getObject( Partner.getPrimaryKey(rs.getGuid(2)); String number = partner.getNumber();
Zakładka Atrybuty: Zestaw kolumn
Kolumna Nazwa
- Nazwa musi być unikalna w ramach wyszukiwania
- Nazwa służy jako identyfikacja kolumny i jest również używana poza własnym obiektem deweloperskim, np. w interfejsach programowania oraz zapisanych układach i wzorcach wyszukiwania
- Aby móc przenieść wyrażenie filtru do aplikacji typu Lista jako parametr aplikacji, nazwa kolumny musi być używana jako nazwa parametru
Kolumna Wyrażenie
- Odniesienie do atrybutu obiektu biznesowego (składnia: ALIAS:Nazwa atrybutu)
- Wyrażenie obliczane przez bazę danych (patrz rozdział Kolumny obliczane)
- Odniesienie do obiektu biznesowego (patrz rozdział Złożone typy danych)
- Puste, jeśli dotyczy atrybutu wirtualnego (patrz rozdział Pole wyboru: Wirtualnie)
BO:a - BO:b BO:a + BO:b + BO:c SUM(BO:a) - SUM(BO:b) SUM(BO:a) - BO:b // niedostępne
- Funkcje agregujące często mogą być lepiej obliczane w bazie danych
- Proste obliczenia mogą być wykonywane bez wirtualnych kolumn i nie wymagają specjalnych rendererów
- Kolumny mogą być filtrowane i sortowane w bazie danych (nie dotyczy funkcji agregujących)
- Atrybuty wirtualne i renderery są nadal wymagane dla Special Parts
- Baza danych może dawać inne wyniki dla niektórych operacji niż wyspecjalizowane logiki w Comarch ERP Enterprise (np. reguły uruchamiania)
- Długość wyrażenia jest ograniczona do 100 znaków
Złożone typy danych
Parts lub całe obiekty biznesowe mogą być również zawarte w zestawie kolumn pod następującymi warunkami:
- Do wizualizacji (obszar wyświetlania) wymagany jest odpowiedni FormatFactory lub RendererFactory
- Filtrowanie i sortowanie jest możliwe tylko z dodatkowymi (wirtualnymi) atrybutami (wyjątek: Special parts są oferowane przez system)
- Parts są wybierane w edytorze wyszukiwania jak zwykłe atrybuty
- W przypadku obiektów biznesowych w polu Wyrażenie określa się tylko alias (bez nazwy atrybutu). Pole wyboru Obiekt biznesowy musi być również aktywowane.
Pole wyboru: Wirtualnie
Nazwa | Wyrażenie | Wirtualnie | Logiczny typ danych |
vstatus | X | ..SalesOrderStatus | |
vstatus.attr1 | SO:attr2 | ||
vstatus.attr2 | SO:attr2 | ||
… | … |
Pole wyboru: Obiekt biznesowy
Pole wyboru: Zaprogramowany filtr
Pole wyboru: Możliwość filtrowania
Pole wyboru: Możliwe sortowanie
Pole wyboru: Możliwy do wyświetlenia
Pole wyboru: Klucz zwrotu
- transfer i dostęp z przetwarzania w tle
- atrybuty do łączenia szczegółowych wyszukiwań
- atrybuty, które są sprawdzane podczas analizy wybranych lub zaznaczonych wierszy
Logiczny typ danych
Zalecenia dotyczące zestawu kolumn
Etykieta
Znacznik usuwania
Zakładka Układy
Zakładka Ustawienia
Hook
Baza danych
- Zestaw kolumn zawiera już jeden lub więcej atrybutów, które razem zapewniają unikalną identyfikację obiektu (np. klucz podstawowy obiektu biznesowego). Te atrybuty oznaczone jako klucz zwrotu w zestawie kolumn są zawsze zawarte w klauzuli SELECT. Ze względu na unikalność klucza zwrotu, żadne zduplikowane obiekty nie mogą wystąpić w wyniku, a dodatkowe DISTINCT tylko niepotrzebnie obciążyłoby bazę danych.
- Jeśli to możliwe, relacje Do-N powinny być zlecane wyszukiwaniom szczegółowym
- W klauzuli SELECT automatycznie uwzględniany jest nie tylko klucz zwrotu, ale także wszystkie właściwości sortowania i grupowania. Wynik zależy zatem również od tego, czy i które kolumny są używane do sortowania i grupowania.
Typ obiektu deweloperskiego Search extension
Typ obiektu deweloperskiego Application
Typ obiektu deweloperskiego Application extension
Typ obiektu deweloperskiego Data description
- Pełna etykieta i pomoc kontekstowa
- FormatFactory
- RendererFactory
- FilterExpressionEditorFactory
- DataDescriptionFilter
- Typ zawartości (dla stringów)
Pełna etykieta i pomoc kontekstowa
Factory
Obiekty biznesowe proxy
Obiekty konfiguracyjne
Namespace: com.cisag.sys.configuration.obj
Oryginalny | Proxy |
User | ProxyUser |
UserGroup | ProxyUserGroup |
UserGroupAssignment | ProxyUserGroupAssignment |
Obiekty repozytorium
Oryginalny | Proxy |
ObjectDirEntr | ProxyObjectDirEntry |
Version | ProxyVersion |
Aktualizacja danych
Interfejsy programowania Java
CisCustomisableCockpit
Metody hook
Metoda | Objaśnienie |
getSearchContext() | Aplikacje typu Lista muszą zmienić tę metodę, aby odpowiedni kontekst wyszukiwania był dostępny dla pól wyszukiwania. |
@Odrzucony od V5R0M0-PD-03
Od V5R0M0-PD-03 aplikacja typu Lista jest powiązana z wyszukiwaniem bezpośrednio w obiekcie deweloperskim Application. W związku z tym, zmiana tej metody jest konieczna tylko wtedy, gdy w aplikacji nie wprowadzono żadnego wyszukiwania. W takim przypadku należy zwrócić w pełni kwalifikowaną nazwę wyszukiwania.
|
|
preInit() | Jest wywoływana raz przed rozpoczęciem wewnętrznego inicjalizacji. |
postInit() | Jest wywoływana raz po zakończeniu wewnętrznej inicjalizacji. Aplikacje typu Lista powinny zmienić tę metodę, aby wykonać własne inicjalizacje (np. zarejestrować akcje do przetwarzania w tle, patrz rozdział Rejestrowanie akcji). |
preSearch() |
Jest wywoływana przed wykonaniem wyszukiwania w bazie danych. Aplikacje typu Lista mogą zmienić tę metodę, aby zmienić kryteria wyszukiwania (np. ustawić wartości dla zaprogramowanych filtrów). Uwaga Zamiast zmiany tej metody można również zarejestrować implementację com.cisag.pgm.search.SearchHook w obiekcie deweloperskim Search (patrz rozdział Hook). Ta procedura jest szczególnie zalecana, jeśli wyszukiwanie może być również używane w innym kontekście. |
postSearch() | Jest wywoływana po przeprowadzeniu wyszukiwania w bazie danych. Aplikacje typu Lista mogą zmienić tę metodę, aby reagować na informacje z wyniku wyszukiwania. |
validateFilter() |
Aplikacje typu Lista mogą zmienić tę metodę, aby zaimplementować dodatkowe sprawdzanie filtrów. Filtry są automatycznie sprawdzane przed wykonaniem wyszukiwania.
Użytkownicy mogą to sprawdzić, wybierając przycisk [Weryfikuj].
Programiści mogą wywołać metodę validateFilter() w klasie GridSearchSupport, aby zainicjować sprawdzanie (patrz rozdział GridSearchSupport).
Metoda musi zwracać wartość true, jeśli podczas sprawdzania nie wykryto żadnych błędów. Jeśli błędy zostały wykryte, metoda musi zwrócić false i wcześniej wysłać odpowiednie komunikaty za pomocą GridSearchSupport#sendMessage().
|
clearResult() |
Jest wywoływana po usunięciu wyniku wyszukiwania. Aplikacje typu Lista mogą zmienić tę metodę, aby reagować na zmiany wyniku wyszukiwania. Wynik wyszukiwania jest automatycznie usuwany przed każdym nowym wyszukiwaniem.
Użytkownicy mogą wyczyścić wynik wyszukiwania, klikając przycisk [Nowy].
Programiści mogą wywołać metodę clearResult() w klasie GridSearchSupport, aby wyczyścić wynik wyszukiwania (patrz rozdział GridSearchSupport).
|
resetFilter() |
Jest wywoływana po zresetowaniu wszystkich filtrów do ich wartości domyślnych. Aplikacje typu Lista mogą zmienić tę metodę, aby ustawić własne wartości domyślne, ale oryginalne wartości domyślne nie powinny być zmieniane. Filtry są inicjowane automatycznie tylko za pomocą akcji [Otwórz puste]. Użytkownicy mogą wyczyścić wynik wyszukiwania, klikając przycisk [Nowy].
Programiści mogą wywołać metodę clearResult() w klasie GridSearchSupport, aby wyczyścić wynik wyszukiwania (patrz rozdział GridSearchSupport).
|
Dalsze metody
Metoda | Objaśnienie |
setExecuteActions(List<Action>) | Wszystkie akcje zarejestrowane za pomocą tej metody są podsumowywane na standardowym pasku przycisku w przycisku menu [Wybierz akcję] powszechnie używanym w aplikacji typu Lista. Metoda ta powinna zostać wywołana raz podczas inicjalizacji aplikacji (patrz metoda postInit()). |
load(boolean record) | Metoda ta może być używana do wyzwalania otwierania (aktualizacji) obiektów bezpośrednio poprzez programowanie. |
refreshUi() | Za pomocą tej metody można odświeżyć wyświetlane wyniki bez ponownego otwierania obiektów. |
getGridSearchSupport() | Metoda ta zwraca instancję klasy GridSearchSupport, która umożliwia rozszerzony dostęp do konfiguracji i kontroli. (Patrz rozdział: GridSearchSupport). |
getBatchApplicationParameters() | Wyszukuje obiekty, które muszą zostać przekazane do przetwarzania w tle. |
Akcje i przetwarzanie w tle
- były dołączane do przycisku akcji na standardowym pasku przycisków
- bieżące kryteria wyszukiwania i wybór użytkownika były przesyłane jako parametry do aplikacji działającej w tle, a parametry te były używane w aplikacji działającej w tle do iteracji po wybranych obiektach
Rejestrowanie akcji
@Override protected void postInit() { Action action1 = new Action(...); Action action2 = new Action(...); List<Action> actions = new ArrayList<Action>(); actions.add(testBatch1Action); actions.add(testBatch2Action); setExecuteActions(actions); }
Przekazanie parametrów do aplikacji działającej w tle
protected void performAction(Action action) { switch (action.getId()); case ... CisBatchJob batch = ... CisParameterList params = getBatchApplicationParameters(); batch.setParameters(params); : : }
Zapytanie ResultSet w aplikacji działającej w tle
public CisParameterList run(int action, CisParameterList parms) { CisBatchJobSearchStatement stmt = om.getBatchJobSearchStatement(parms); CisResultSet rs = stmt.execute(); int position = stmt.getResultPosition("bookGuid"); try { while (rs.next()) { byte[] guid = rs.getGuid(position); : } } catch (SQLException ex) { throw new RuntimeException(ex); } finally { rs.close(); } : }
AbstractOrderCockpit
- Baza i pozycje
- Łańcuch dokumentów powiązanych
- Uprawnienia (uprawnienia do treści)
- Znacznik usuwania
- SearchContext
- Wyszukiwanie szczegółowe
- com.cisag.app.sales.cockpit.ui.CustomerProposalCockpitBase
- com.cisag.app.sales.cockpit.ui.CustomerProposalCockpitDetail
- com.cisag.app.purchasing.cockpit.ui.RequestForProposalCockpitBase
SearchView
- Klasa reprezentuje konkretną klasę, która może być również używana bezpośrednio, tj. bez wyprowadzania oddzielnej klasy. Derywacja jest konieczna tylko wtedy, gdy metody takie jak preSearch() mają zostać zmienione.
- Link do powiązanego obiektu deweloperskiego Search jest tworzony przez wywołanie tej metody: init(String searchName)
- Do przypisania tytułu do komponentu można użyć następujących metod: setTitle(String) i setTitleFrom(…)
- Należy użyć następującej metody, aby określić, czy komponent zapewnia zakres zapytań: setAllowFilter(boolean)
- Szczegółowe wyszukiwania nie są oferowane
- Następująca metoda może być użyta do kontrolowania, gdzie przechowywane są widoki (układy) zdefiniowane dla tego komponentu: should.setStorageLocation(StorageLocation)
- Te wartości są dostępne do wyboru:
- StorageLocation.SEARCH — jest wartością domyślną i oznacza, że widoki są zapisywane w odniesieniu do obiektu deweloperskiego Search. W tym przypadku zapisane widoki są współdzielone przez wszystkie aplikacje typu Lista i SearchViews, które odnoszą się do tego samego obiektu deweloperskiego Search.
- StorageLocation.APPLICATION. — SearchViews, które są używane jako edytor w aplikacji z konfigurowalnym interfejsem użytkownika, mogą alternatywnie używać wartości StorageLocation.APPLICATION. W takim przypadku widoki są przechowywane jako część odpowiednich widoków aplikacji i są niezależne od innych zastosowań obiektu deweloperskiego Search.
GridSearchSupport
Konfiguracja
Metoda | Objaśnienie |
getSearch() | Wyszukuje w pełni kwalifikowaną nazwę bieżącego wyszukiwania głównego. |
setSearch(String) | Umożliwia ponowną inicjalizację z nowym wyszukiwaniem. |
addDetailSearch(…) | Dodaje kolejne wyszukiwanie szczegółowe (patrz rozdział Wyszukiwanie szczegółowe). |
addHeaderElement(VisualElement) | Dodaje VisualElement do paska narzędzi nad listą wyników. |
getShowFilterPanel()
setShowFilterPanel()
|
Określa, czy wyświetlany jest nagłówek |
isMultipleRowSelectionEnabled()
setMultipleRowSelectionEnabled()
|
Określa, czy dozwolony jest wielokrotny wybór. Ustawienie dotyczy tylko wyszukiwania głównego. Jeśli wybór wielokrotny jest włączony, na początku każdego wiersza wyświetlane jest pole wyboru, którego użytkownik może użyć do wybrania poszczególnych wierszy. |
getAllowEditFilterExpression()
setAllowEditFilterExpression()
|
Określa, czy użytkownicy mogą zmieniać wyrażenie filtru dla określonej kolumny. |
getDoubleClickAction()
setDoubleClickAction()
|
Umożliwia rejestrację akcji, która jest wykonywana po dwukrotnym kliknięciu wiersza. |
getRendererFactory()
setRendererFactory()
|
Umożliwia zmianę RendererFactory określonego za pomocą logicznego typu danych dla określonej kolumny. |
getFilterExpressionEditorFactory()
setFilterExpressionEditorFactory()
|
Umożliwia zmianę FilterExpressionEditorFactory określonego za pomocą logicznego typu danych dla określonej kolumny. |
getSearchContextProvider()
setSearchContextProvider()
|
Umożliwia zmianę SearchContextProvider dla wyszukiwania. Uwaga SearchContextProvider jest zwykle dostarczany przez aplikację (poprzez implementację tego interfejsu). |
Filtrowanie
Metoda | Objaśnienie |
getFilterExpression()
setFilterExpression()
|
Umożliwia odczyt lub ustawienie wyrażeń filtrujących dla określonej kolumny. |
getFilterExtension()
setFilterExtension()
|
Umożliwia odczyt lub ustawienie specjalnych rozszerzeń filtrów dla wyszukiwania głównego lub określonego wyszukiwania szczegółowego (patrz rozdział FilterExtension). |
resetFilter() |
Resetuje wszystkie wyrażenia filtra do wartości domyślnych.
Uwaga Wartości domyślne są definiowane poprzez widok dla obszaru filtra. Ponadto metoda hook o tej samej nazwie jest wywoływana w klasie CisCustomisableCockpit, która w razie potrzeby może wprowadzić dalsze zmiany w wyrażeniach filtra. Więcej informacji można znaleźć w rozdziale CisCustomisableCockpit. |
validateFilter()
|
Sprawdza wszystkie wyrażenia filtru pod kątem poprawności składniowej.
|
sendMessage(CisMessage, String…) | Umożliwia wysyłanie wiadomości dla jednej lub więcej kolumn. Tej metody należy użyć, jeśli mają być wysyłane komunikaty z niestandardowej implementacji funkcji validateFilter(). |
Wynik wyszukiwania
Metoda | Objaśnienie |
clearResult() | Usuwa listę wyników. |
getRowCount() | Zwraca liczbę znalezionych obiektów (tylko wyszukiwanie główne). |
getBatchApplicationParameters() |
Zwraca obiekty, które muszą zostać przekazane do przetwarzania w tle.
Uwaga Klasa CisCustomisableCockpit wywołuje tę metodę wewnętrznie i zwraca ten sam wynik. Zobacz ten rozdział: CisCustomisableCockpit. |
Wybór
Metoda | Objaśnienie |
clearSelection() | Resetuje bieżący wybór. |
selectAll() |
Wybiera wszystkie wyświetlane obiekty głównego wyszukiwania. Uwaga Jeśli wielokrotny wybór nie jest dozwolony, metoda nie ma żadnego efektu. |
getFocusedDetailSearch() | Zwraca nazwę (alias) wyszukiwania szczegółowego, które należy do aktualnie zogniskowanego wiersza. Metoda zwraca wartość null, jeśli fokus znajduje się w głównym wyszukiwaniu. |
getFocusedRowData(String…) |
Zwraca wartości określonych kolumn dla aktualnie zogniskowanego wiersza.
Uwaga Określone kolumny muszą być zgodne z aktualnie skoncentrowanym wyszukiwaniem (patrz: getFocusedDetailSearch()) i być oznaczone jako Klucz zwrotu w obiekcie deweloperskim Search (patrz rozdział Pole wyboru: Klucz zwrotu). |
getSelectedRowCount()
|
Zwraca liczbę aktualnie wybranych obiektów. Uwaga Wybór zawsze odnosi się do głównego wyszukiwania. Jeśli wielokrotny wybór nie jest dozwolony dla głównego wyszukiwania, wybór zawsze odpowiada aktualnie zogniskowanemu wierszowi. |
getSelectedRowData(String…) |
Zwraca wartości określonych kolumn dla aktualnie wybranych wierszy. Uwaga Wybór zawsze odnosi się do głównego wyszukiwania. Określone kolumny muszą być oznaczone jako Klucz zwrotu w obiekcie deweloperskim Search (patrz rozdział Pole wyboru: Klucz zwrotu). |
Filtrowanie obiektów
Wartości domyślne
Przykład
@Overwrite protected void resetFilter() { // Inicjalizacja z zapisanymi wartościami super.resetFilter(); GridSearchSupport gss = getGridSearchSupport(); // Nie zmieniaj już zdefiniowanych wartości if (gss.getFilterExpression("partnerNumber") == null) { gss.setFilterExpression("partnerNumber", StringFilterExpressionList.create( "com.cisag.app.edu:CockpitEmployeeNumber.lt", "A*"); } }
Manipulowanie zapytaniem do bazy danych
- Zmiana metody preSearch() klasy CisCustomisableCockpit (lub SearchView)
- Implementacja SearchHook
Wyszukiwanie szczegółowe
GridSearchSupport.addDetailSearch( String parent, // tylko dla wyszukiwania szczegółowego String alias, String searchName, Action action, String[] parentColumnNames, String[] detailColumnNames)
Parametr | Objaśnienie |
parent | Alias wyszukiwania parent musi być zawsze określony jako nadrzędny. Jeśli wyszukiwanie szczegółowe jest połączone bezpośrednio z wyszukiwaniem głównym, należy użyć wartości null dla parent. |
alias | Unikalny alias musi być przypisany do każdego dodanego wyszukiwania szczegółowego. |
searchName | W pełni kwalifikowana nazwa powiązanego obiektu deweloperskiego Search musi być wprowadzona jako searchName. |
action | Jako akcję należy przekazać instancję com.cisag.pgm.gui.Action, która zapewnia tekst dla przycisku do pokazywania i ukrywania wyszukiwania szczegółowego. |
parentColumnNames | Jako parentColumnNames należy przekazać tablicę z nazwami kolumn z wyszukiwania nadrzędnego, za pośrednictwem których ma zostać utworzone łącze do wyszukiwania szczegółowego. Określone kolumny muszą być oznaczone jako klucz zwrotu w wyszukiwaniu nadrzędnym (patrz rozdział Pole wyboru: Klucz zwrotu). |
detailColumnNames |
Tablica z nazwami kolumn z wyszukiwania szczegółowego ma zostać przekazana jako detailColumnNames, za pośrednictwem której ma nastąpić połączenie z wyszukiwaniem nadrzędnym. Określone kolumny muszą być oznaczone jako klucz zwrotu w wyszukiwaniu szczegółowym (patrz rozdział Pole wyboru: Klucz zwrotu). Ponadto, określone kolumny muszą być oznaczone jako możliwe do filtrowania w wyszukiwaniu szczegółowym (patrz ten rozdział: Pole wyboru: Możliwość filtrowania), a także powinny być oznaczone jako Zaprogramowane filtry (patrz rozdział Pole wyboru: Zaprogramowany filtr)
Liczba i typy danych określonych kolumn muszą być zgodne z liczbą i typami danych kolumn określonych w parentColumnNames.
|
Przykład
Nazwa | Wyświetlanie | Zaprogramowany filtr | Możliwość filtrowania | Klucz zwrotu |
guid | M:guid | X | ||
code | M:name | |||
description | M:description |
Nazwa | Wyświetlanie | Zaprogramowany filtr | Możliwość filtrowania | Klucz zwrotu |
guid | D:guid | X | ||
parent | D:parent | X | X | X |
code | D:name | |||
description | D:description |
Nazwa | Wyświetlanie | Zaprogramowany filtr | Możliwość filtrowania | Klucz zwrotu |
guid | S:guid | X | ||
parent | S:parent | X | X | X |
code | S:name | |||
description | S:description |
Action a1 = new Action(0, "com.example.search.DetailAction1"); Action a2 = new Action(0, "com.example.search.DetailAction2"); String[] parentColumnNames = {"guid"}; String[] detailColumnNames = {"parent"}; GridSearchSupport gss = getGridSearchSupport(); gss.addDetailSearch(null, "D1", "com.example.search.Detail", a1, parentColumnNames, detailColumnNames); gss.addDetailSearch("D1", "D2", "com.example.search.Subdetail", a2, parentColumnNames, detailColumnNames);
Format
public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos); public Object parseObject(String source, ParsePosition pos);
FormatFactory
public Format createFormat(DataDescription dataDescription);
Konkretne klasy implementujące ten interfejs powinny wykorzystywać informacje z przekazanego Data description do parametryzacji tworzonej instancji klas Format.
FormatFactoryRegistry
Kolumny wirtualne
public public StringBuffer format(Object value, StringBuffer toAppendTo, FieldPosition pos) { if (value instanceof Map) { Map values = (Map) value; Object attr1 = values.get("attr1"); Object attr2 = values.get("attr2"); ... } return toAppendTo; }
Renderer
RendererFactory
public Renderer createRenderer(byte[] guid, DataDescription dataDescription)
Konkretne klasy implementujące ten interfejs powinny wykorzystywać informacje z przekazanego Data description do parametryzacji tworzonej instancji Renderera.
RendererFactoryRegistry
TextRenderer
public String getText(Object value);
public class SimpleTextRendererFactory implementuje RendererFactory { public Renderer createRenderer(byte[] guid, DataDescription dataDescription) { return new SimpleTextRenderer(); } private class SimpleTextRenderer implementuje Renderer.TextRenderer { public String getText(Object value) { if (value != null) { return String.valueOf(value); } return null; } } }
IconRenderer
public Icon getIcon(Object value);
public class DocumentKindRendererFactory
implementuje RendererFactory {
private final Icon iconDocument = Icon.getIcon(...);
private final Icon iconNote = Icon.getIcon(...);
public Renderer createRenderer(byte[] guid,
DataDescription dataDescription) {
return new DocumentKindRenderer();
}
private class DocumentKindRenderer
implementuje Renderer.IconRenderer {
public Icon getIcon(Object value) {
if (value != null) {
switch ((Short) value) {
case DocumentKinds.DOCUMENT:
return iconDocument;
case DocumentKinds.NOTE:
return iconNote;
}
}
return null;
}
}
}
LayeredIconRenderer
public Icon[] getIcons(Object value);
ToolTipRenderer
public Icon[] getIcons(Object value);
URIRenderer
public URI getUri(Object value);
public URI getUri(Object value) { if (value != null) { CisObject obj = ... // przekonwertuj parametr "value" na CisObject BusinessEntityLink link = LinkUtili-ty.createBusinessEntityLink( LinkUtility.DEFAULT_FLAGS, env.getDatabaseGuid(), o); if (link != null) { return URI.create(LinkUtility.toUrlString(link)); } } return null; }
VisualElementRenderer
public VisualElement getVisualElement(Object value);
Kolumny wirtualne
public String getText(Object value) { if (value instanceof Map) { Map values = (Map) value; Object attr1 = values.get("attr1"); Object attr2 = values.get("attr2"); ... return ... } return null; }
FilterExpression
FilterExpressionList
SingleExpression
- EQUALS
- UNEQUAL (<>)
- LESS (<)
- GREATER (>)
- LESS_EQUAL (<=)
- GREATHER_EQUAL (>=)
RangeExpression
InvalidExpression
StringFilterExpressionList
ByteFilterExpressionList, ShortFilterExpressionList, IntegerFilterExpressionList, LongFilterExpressionList i DecimalFilterExpressionList
- ByteFilterExpressionList
- ShortFilterExpressionList
- IntegerFilterExpressionList
- LongFilterExpressionList
- DecimalFilterExpressionList
FilterExpression expr = IntegerFilterExpressionList.create(path, 1);
FilterExpression expr = IntegerFilterExpressionList.create(path, 1, 3, 5);
FilterExpression expr = IntegerFilterExpressionList.createRange(path, 1, 9);
FilterExpression expr = IntegerFilterExpressionList.createRange(path, 1, null);
FilterExpression expr = IntegerFilterExpressionList.create(path, IntegerFilterExpressionList.createSingleExpression( ExpressionType.UNEQUAL, 0
DateAndTimeFilterExpressionList
CisEnvironment.getInstance().getContext().getCisCalendar()
QuantityFilterExpressionList, DurationFilterExpressionList
DomesticAmountFilterExpressionList, ForeignAmountFilterExpressionList
BinaryFilterExpressionList, GuidFilterExpressionList
BooleanFilterExpressionList
CompoundFilterExpression
FilterExpression attr1 = .... FilterExpression attr2 = ... Map<String, FilterExpression> map = new HashMap<String, FilterExpression>(); map.put("attr1", attr1); map.put(" FilterExpression attr1 = … FilterExpression attr2 = … Map<String, FilterExpression> map = new HashMap<String, FilterExpression>(); map.put("attr1", attr1); map.put("attr2", attr2); String path = … FilterExpression vattr = CompoundFilterExpression.create(path, map);
DeleteStateFilterExpression
String path = "com.cisag.pgm.objsearch:DeleteState.lt"; FilterExpression expression = DeleteStateFilterExpression.create(path, DeleteStateFilterExpression.MARKED_FOR_DELETION);
ValueSetFilterExpression
import com.cisag.app.edu.Format; ... FilterExpression expr = ValueSetFilterExpression.create( "com.cisag.app.edu:Format.lt", Format.CD, Format.DVD); gridSearchSupport.setFilterExpression("bookFormat", expr);
gridSearchSupport.setFilterExpression("bookFormat", null);
FilterExpressionEditor
Metoda | Objaśnienie |
VisualElement getVisualElement() |
Zwraca VisualElement dostarczony przez edytor. Metoda ta jest wywoływana przez infrastrukturę aplikacji typu Lista, a dostarczony element jest następnie dodawany do nagłówka tego typu aplikacji. |
void initVisualElement() | Ta metoda może być użyta przez edytor do zainicjowania dostarczonego elementu. Infrastruktura aplikacji typu Lista wywołuje tę metodę bezpośrednio po dodaniu elementu dostarczonego przez edytor. |
T getValue(); | Zadaniem getValue() jest konwersja aktualnie wyświetlanej wartości dostarczonego elementu VisualElement na instancję FilterExpression, która odpowiada typowi danych powiązanej kolumny (patrz ten rozdział: FilterExpression).
Uwaga Metoda musi zwrócić wartość null, jeśli w dostarczonym VisualElement nie wprowadzono żadnego filtra lub wybrano opcję Wszystkie. |
setValue (T value); |
Zadaniem metody setValue() jest wyświetlenie przekazanego FilterExpression w dostarczonym VisualElement (patrz ten rozdział: FilterExpression).
Uwaga Wartość zero jest równoważna wartości Brak lub Wszystkie. |
package com.example; import com.cisag.pgm.datatype.Guid; import com.cisag.pgm.dialogue.model.DataDescription; import com.cisag.pgm.dialogue.model.DefaultDataDescription; import com.cisag.pgm.gui.ValueSetField; import com.cisag.pgm.gui.VisualElement; import com.cisag.pgm.search.filter.ValueSetFilterExpression; import com.cisag.pgm.search.gui.FilterExpressionEditor; import com.cisag.pgm.search.gui.FilterExpressionEditorFactory; public class ValueSetFilterExpressionEditorFactory implements FilterExpressionEditorFactory { public ValueSetFilterExpressionEditorFactory() { } public FilterExpressionEditor createFilterExpressionEditor( byte[] guid, DataDescription dataDescription) { return new ValueSetFilterExpressionEditor(guid, dataDescription); } private class ValueSetFilterExpressionEditor implements FilterExpressionEditor<ValueSetFilterExpression> { private final String path; private final ValueSetField field; private ValueSetFilterExpressionEditor(byte[] guid, DataDescription dataDescription) { this.path = (String) dataDescription.getValue(DataDescription.PATH); field = new ValueSetField(Guid.toHexString(guid), dataDescription); field.setSelectionMode(true); } public VisualElement getVisualElement() { return field; } public void initVisualElement() { } public ValueSetFilterExpression getValue() { short[] values = (short[]) field.getSelection(); if ( values != null && values.length > 0 ) { boolean allEntriesSelected = false; short[] entries = field.getEntries(); if (entries != null && entries.length == values.length) { allEntriesSelected = true; for (int i = 0; i < values.length; i++) { boolean found = false; for (int j = 0; j < entries.length; j++) { if (values[i] == entries[j]) { found = true; break; } } if (!found) { allEntriesSelected = false; break; } } } if (!allEntriesSelected) { return ValueSetFilterExpression.create(path, values); } } return null; } public void setValue(ValueSetFilterExpression value) { if (value != null) { short[] values = value.getSelection(); field.setSelection(values); } else { field.setSelection(new short[0]); } } } }
FilterExpressionEditorFactory
public FilterExpressionEditor createFilterExpressionEditor( byte[] guid, DataDescription dataDescription)
FilterExpressionEditorFactoryRegistry
Kolumny wirtualne
package com.example; import com.cisag.pgm.datatype.Guid; import com.cisag.pgm.dialogue.model.DataDescription; import com.cisag.pgm.gui.MultiValueSetField; import com.cisag.pgm.gui.VisualElement; import com.cisag.pgm.search.filter.CompoundFilterExpression; import com.cisag.pgm.search.filter.FilterExpression; import com.cisag.pgm.search.filter.ValueSetFilterExpression; import com.cisag.pgm.search.gui.FilterExpressionEditor; import java.util.HashMap; import java.util.Map; public class VAttrFilterExpressionEditor implementuje FilterExpressionEditor< CompoundFilterExpression<FilterExpression<?>> { private final String path; private final MultiValueSetField field; public VAttrFilterExpressionEditor(byte[] guid, DataDescription dataDescription) { this.path = (String) dataDescription.getValue(DataDescription.PATH); this.field = new MultiValueSetField(Guid.toHexString(guid), path); } public VisualElement getVisualElement() { return field; } public void initVisualElement() { field.addValueSet("com.example:ValueSet1.lt"); field.addValueSet("com.example:ValueSet2.lt"); } public CompoundFilterExpression<FilterExpression<?>> getValue() { short[][] selection = field.getValue(); if (selection != null && selection.length > 0) { Map<String, FilterExpression<?>> map = new HashMap<String, FilterExpression<?>>(); if (selection[0] != null && selection[0].length > 0) { map.put("attr1", ValueSetFilterExpression.create( "com.example:ValueSet1.lt", selection[0]); } if (selection[1] != null && selection[1].length > 0) { map.put("attr2", ValueSetFilterExpression.create( "com.example:ValueSet2.lt", selection[1]); } return CompoundFilterExpression.create(path, map); } return null; } public void setValue( CompoundFilterExpression<FilterExpression<?>> value) { if (value != null) { short[][] selection = new short[2][]; ValueSetFilterExpression expr1 = (ValueSetFilterExpression) value.getExpression("attr1"); if (expr1 != null) { selection[0] = expr1.getSelection(); } else { selection[0] = ... // TODO dodać wszystkie wartości VS1 } ValueSetFilterExpression expr2 = (ValueSetFilterExpression) value.getExpression("attr2"); if (expr2 != null) { selection[1] = expr2.getSelection(); } else { selection[1] = ... // TODO dodać wszystkie wartości VS2 } field.setValue(selection); } else { field.setValue(null); } } }
FilterExtension
new FilterExtension("{attr1} OR {attr2}");
new FilterExtension("book:employee is not null");
FilterExtension ext = new FilterExtension ("book:employee = {paramEmploy-eeGuid}"); ext.setGuid("paramEmployeeGuid", partnerLogic.getCurrentPartnerGuid());
SearchHook
public class BookSearchHook extends SearchHook { public BookSearchHook() { this(0, 0); } protected BookSearchHook(int activeHooks, intactiveHooks) { super(activeHooks|PRE_SEARCH, inactiveHooks); } @Override public void preSearch(SearchInterface si) { super.preSearch(si); PartnerLogic partnerLogic = PartnerLogic.getInstance(); FilterExtension ext = new FilterExtension("book:employee = {paramEmployeeGuid}"); ext.setGuid("paramEmployeeGuid", partnerLogic.getCurrentPartnerGuid()); si.setFilterExtension(ext); } }
BusinessObjectRegistryHook
public class BusinessObjectRegistryHookImpl implementuje BusinessObjectRegistryHook { public BusinessObjectRegistryHookImpl() { } public void initialise(BusinessObjectRegistry registry) { registry.registerValueSetComplete( SalesOrderDetail.class, "accountOriginType"); } }
DataDescriptionFilter
public class ExampleDataDescriptionFilter implements DataDescriptionFilter { public DataDescriptionModification getModification( DataDescription dataDescription) { CisSystemManager sm = CisEnvironment.getInstance().getSystemManager(); if (sm.isAvailable("com.example.Example")) { return DataDescriptionModification.UNMODIFIED; } else { return DataDescriptionModification.EXCLUDED; } }
DataDescriptionModification
Wartość | Stała | Objaśnienie |
UNMODIFIED | UNMODIFIED | Bez zmian. Obowiązują ustawienia zdefiniowane w opisie danych. |
HIDDEN | HIDDEN | Atrybut lub kolumna nie jest wyświetlana w interfejsie użytkownika. |
DISABLED | DISABLED | Atrybut lub kolumna są wyświetlane jako nieaktywne w interfejsie użytkownika. |
READ_ONLY | READ_ONLY | Atrybutu lub kolumny nie można zmienić w interfejsie użytkownika. |
REQUIRED | REQUIRED | Dla atrybutu wymagany jest wpis. |
EXCLUDED | EXCLUDED | Podobnie jak HIDDEN, ale z tym znaczeniem, że dany atrybut jest ogólnie niedostępny, podczas gdy w przypadku HIDDEN tylko wyświetlanie jest wyłączone. |
RepositoryOnly
Ustawienia
Uprawnienia
Capability | Objaśnienie |
com.cisag.sys.objsearch.IgnoreSearchTimeout | Użytkownik może również wykonać wyszukiwanie, jeśli jego czas wykonania przekracza określoną wartość maksymalną (wartość domyślna: 1 minuta). |
com.cisag.sys.search.ChangeSettingsForAllUsers | Użytkownik może tworzyć, zmieniać i usuwać widoki na poziomie bazy danych. |
com.cisag.sys.search.ChangeMetadata | Użytkownik może rozszerzyć lub zmniejszyć zestaw kolumn. |
Właściwości
Właściwość | Objaśnienie |
com.cisag.pgm.search.gui.GridSearchSupport.
defaultBufferSize
|
Maksymalna liczba rekordów danych wyświetlanych jako wynik w aplikacji typu Lista.
Domyślną wartością dla liczby obiektów jest 1000. Wartości większe niż 1000 powinny być używane tylko wtedy, gdy serwer aplikacji ma wystarczające zasoby, tj. procesory i pamięć główną, aby obsłużyć dodatkowe obciążenie.
|
com.cisag.pgm.search.gui.GridSearchSupport.
asynchBufferSize
|
Maksymalna liczba obiektów otwieranych podczas Aktualizuj (w tle). Domyślna wartość liczby obiektów to 100000. |
com.cisag.pgm.search.
gui.GridSearchSupport.maximumDetailRows
|
Maksymalna liczba obiektów danych szczegółowych, które są otwierane na obiekt główny. Domyślną wartością liczby obiektów jest 10. |
com.cisag.pgm.gui.DefaultExportLimit
|
Maksymalna liczba obiektów, które może wyeksportować użytkownik bez uprawnień administratora. Wartość domyślna to 231-1, ale nie więcej niż wartość MaximumExportLimit. |
com.cisag.pgm.gui.
MaximumExportLimit
|
Maksymalna liczba obiektów, które można wyeksportować z aplikacji typu Lista (niezależnie od uprawnień użytkownika). Wartość domyślna to 231-1. |
Debugowanie
dbgcls -class:com.cisag.sys.kernel.caching.CisComplexOqlCache