Przejdź do głównej treści

Pole typu Lookup


Pole to wygląda jak ComboBox. Różnica polega na tym, że wyszukiwanie odbywa się tylko za pomocą „lupki”, a wartością pola będzie dana pobrana z bazy pod kluczem {valueField}. Wartość prezentowaną w polu określamy w parametrze ** labelField**.

Kolumna clsnam w zapytaniu spowoduje pokazanie ikony „i” umożliwiającej otwarcie formularza obiektu powiązanego z danym clsnam (np. 'CONTACT' as clsnam, contid AS keyval - da możliwość otwarcia panelu klienta). Klucz użyty do otwarcia obiektu pobrany zostanie z zapytania z kolumny keyval lub jeśli nie podano to z kolumny wskazanej w valueField.

  • Znacznik {SEARCH_TEXT} zostanie zastąpiony wpisanym w pole tekstem.
  • Znacznik {FILTER_STRING} zostanie zastąpiony wartością z parametru „sql_filter”.

Przepis

Lookup
Lookup

Efekt

Lookup
Lookup

Zawartość pola Parametry

{
  "sql": "SELECT usr_id, lasfir || COALESCE(' - ' || ndenam,'') AS orlasfir FROM orgtree_view WHERE NOT is_del AND ent_id = {ENT_ID} AND orunid > 0 AND ndetpe = 'POST' AND {FILTER_STRING} ORDER BY 2",
  "sql_filter": "(firnam ~* E'^{SEARCH_TEXT}' OR lasnam  ~* E'^{SEARCH_TEXT}')",
  "valueField": "usr_id",
  "labelField": "orlasfir",
  "defaultValue": "{SQL::SELECT {LOGGED_USR_ID}}"
}

Powyższy przykład jest dla listy pracowników.

Przykłady

Lista urządzeń

{
  "sql": "SELECT devcid, name__ || ' - ' || COALESCE(sernum) AS device FROM cregisters.creg_devices WHERE {FILTER_STRING}",
  "sql_filter": "sernum ~* E'^{SEARCH_TEXT}' OR name__ ~* E'^{SEARCH_TEXT}'",
  "valueField": "devcid",
  "labelField": "device"
}

Lista klientów

{
  "sql": "SELECT contid,  name_1 || ' - ' || f_addr AS caption, 'CONTACT' as clsnam, contid AS keyval FROM contacts_view WHERE is_del IS FALSE AND {FILTER_STRING[AND]} ORDER BY caption",
  "sql_filter": "(name_1 || ' ' || name_2) ~* E'{SEARCH_TEXT}'",
  "valueField": "contid",
  "labelField": "caption"
}

Lista MPK

{
  "sql": "SELECT place_, COALESCE(place_, '')||COALESCE(' '||dscrpt, '') AS searchresult FROM places_of_vcosts_view WHERE {FILTER_STRING} AND is_del IS NOT TRUE AND year__ = extract(year FROM CURRENT_DATE) AND is_act IS NOT FALSE AND ent_id = {ENT_ID} ORDER BY place_, dscrpt",
  "sql_filter": "(dscrpt ~* E'{SEARCH_TEXT}' OR place_ ~* E'{SEARCH_TEXT}')",
  "valueField": "place_",
  "labelField": "searchresult"
}

Przykład dla wyszukiwania po kilku frazach rozdzielonych spacjami.

Parametr „sql_filter” zostanie powtórzony dla każdej frazy.

{
  "sql": "SELECT usr_id, lasfir || COALESCE(' - ' || ndenam,'') AS orlasfir FROM orgtree_view WHERE NOT is_del AND ent_id = {ENT_ID} AND orunid > 0 AND ndetpe = 'POST' AND {FILTER_STRING[AND]} ORDER BY 2",
  "sql_filter": "(firnam ~* E'{SEARCH_TEXT}' OR lasnam ~* E'{SEARCH_TEXT}')",
  "valueField": "usr_id",
  "labelField": "usrnam"
}

Wynikowy SQL dla powyższego przykładu i wyszukiwanego tekstu „jan kow”:

SELECT usr_id, lasfir || COALESCE(' - ' || ndenam, '') AS orlasfir
FROM orgtree_view
WHERE NOT is_del
  AND ent_id = {ENT_ID}
  AND orunid
    > 0
  AND ndetpe = 'POST'
  AND ((firnam ~* E'jan'
   OR lasnam ~* E'jan')
  AND (firnam ~* E'kow'
   OR lasnam ~* E'kow'))
ORDER BY lasfir

Własne ikony

Do lookup'u możemy dodawać dodatkowe ikony (przyciski). Zastosowania mogą być różne. Jedno z nich prezentujemy poniżej.

Przypuśćmy, że mamy słownik (dowolny rejestr lub inna podstawowa tabela), który wyświetlamy na formatce rejestru, ale chcemy mieć możliwość uzupełniania go z poziomu tej właśnie formatki. Podobne działania ma podstawowy lookup np. kontaktów (klientów) z plusikiem.

Realizacja tego odbywa się poprzez własną klasę.

Wymagane jest, aby definicja pola w rejestrze została wzbogacona o parametr:

{
  "manager": {
    "class": "MyCustomSListBoxManager",
    "path": "./scripts/MyCustomSListBoxManager.inc"
  }
}

Natomiast pełna definicja prezentuje się następująco:

{
  "sql": "SELECT usr_id, lasfir || COALESCE(' - ' || ndenam,'') AS orlasfir FROM orgtree_view WHERE NOT is_del AND ent_id = {ENT_ID} AND usr_id IS NOT NULL AND ndetpe = 'POST' AND {FILTER_STRING} ORDER BY 2",
  "sql_filter": "(firnam ~* E'^{SEARCH_TEXT}' or lasnam ~* E'^{SEARCH_TEXT}')",
  "valueField": "usr_id",
  "labelField": "orlasfir",
  "manager": {
    "class": "MyCustomSListBoxManager",
    "path": "./scripts/MyCustomSListBoxManager.inc"
  }
}

Zadaniem klasy MyCustomSListBoxManager jest dodanie ikon jak poniżej


    final public static function manage(SListBox $lookup, $params = array()) {

        $lookupName = $lookup->getName();

        $dHWND = Application::registerDialog(Application::getShortName($lookupName.'CustomAsyncTreeDialog'), 'CustomAsyncTreeDialog', './scripts/CustomAsyncTreeDialog.inc');

        $newContactIcon = new ImgFormButton(array(
            'name'      => $lookupName.'_NewContactIcon',
            'submit'    => FALSE,
            'image' => IMG_PATH.'toolbarIcons/list.png',
            'title'     => Translator::translate('Dodaj z listy')
        ));

        $newContactIcon->script = 'App.openDialogEx(\''.$dHWND.'\', null, ({onAdd:\'App.'.$lookupName.'onAdd\'}).toJSONString())';

        $lookup->addIcon($newContactIcon);

        JScript::add('
            App.'.$lookupName.'onAdd = function(povcid) {
                $(\''.$lookupName.'v\').value = povcid;            
                asyncLibrary.execute(\'./scripts/MyCustomSListBoxManager.inc\',\'MyCustomSListBoxManager\', \'\', \'setByPKey\', ({povcid:povcid,name__:\''.$lookupName.'\'}).toJSONString(), \'if(text) {DOMO.replaceWithHTML($(\\\''.$lookupName.SListBox::INPUT_PREFIX.'\\\'), text);}\', null,FAST);
            }
        ');

    }

Cała klasa możesz pobrać poniżej.

Opis dodatkowych parametrów do json