Zmiany pomiędzy wersją początkową i wersją 1 dla DeployerGuide/AdvancedConfiguration/CustomRegisters

Pokaż
Ignoruj:
Data i czas:
06/21/14 10:23:18 (10 years temu)
Autor:
JP (IP: 213.227.67.33)
Komentarz:

--

Legend:

Bez zmian
Dodane
Usunięte
Zmienione
  • DeployerGuide/AdvancedConfiguration/CustomRegisters

    v1 v1  
     1 
     2= Rejestry = 
     3 
     4== Tworzenie rejestru == 
     5Aby założyć rejestr w module rejestry musimy rozpocząć od założenia tabeli. Tabelę tworzymy za pomocą komendy ''create table''. 
     6 
     7Przykład założenia tabeli 
     8{{{ 
     9-- Table: cregisters.creg_r_imi 
     10 
     11-- DROP TABLE cregisters.creg_r_imi; 
     12 
     13CREATE TABLE cregisters.creg_r_imi 
     14( 
     15-- Odziedziczony from table cregisters.register_entry:  id____ integer NOT NULL DEFAULT nextval('cregisters.register_entry_id_____seq'::regclass), 
     16-- Odziedziczony from table cregisters.register_entry:  cregid integer, 
     17-- Odziedziczony from table cregisters.register_entry:  uid___ text, 
     18-- Odziedziczony from table cregisters.register_entry:  is_del boolean NOT NULL DEFAULT false, 
     19-- Odziedziczony from table cregisters.register_entry:  adduid integer, 
     20-- Odziedziczony from table cregisters.register_entry:  adddat timestamp with time zone DEFAULT now(), 
     21-- Odziedziczony from table cregisters.register_entry:  lm_uid integer, 
     22-- Odziedziczony from table cregisters.register_entry:  lm_dat timestamp with time zone DEFAULT now(), 
     23-- Odziedziczony from table cregisters.register_entry:  doc_id integer, 
     24-- Odziedziczony from table cregisters.register_entry:  prc_id integer, 
     25-- Odziedziczony from table cregisters.register_entry:  cre_id integer, 
     26  vorgnr character varying(25) NOT NULL, 
     27  rwa character varying(20) NOT NULL, 
     28  zrodlo character varying(50), 
     29  rodzaj character varying(50), 
     30  terminod timestamp without time zone, 
     31  termindo timestamp without time zone, 
     32  nazwa character varying(250), 
     33  ulica character varying(80), 
     34  budnr character varying(10), 
     35  kwota double precision, 
     36  archiv boolean NOT NULL DEFAULT false, 
     37  status smallint NOT NULL DEFAULT 0, 
     38  edtuser character varying(50), 
     39  edtdate timestamp without time zone, 
     40  id serial NOT NULL 
     41-- Odziedziczony from table :  tpstid integer, 
     42-- Odziedziczony from table :  stcuid integer, 
     43-- Odziedziczony from table :  stcdat timestamp with time zone 
     44) 
     45INHERITS (cregisters.register_entry) 
     46WITH ( 
     47  OIDS=FALSE 
     48); 
     49ALTER TABLE cregisters.creg_r_imi 
     50  OWNER TO edokumenty; 
     51GRANT ALL ON TABLE cregisters.creg_r_imi TO edokumenty; 
     52GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE cregisters.creg_r_imi TO http; 
     53GRANT SELECT, UPDATE ON TABLE cregisters.creg_r_imi TO useraspbip; 
     54}}} 
     55 
     56'''Uwaga ! Pola używane przez eDokumenty są dziedziczone - nie trzeba ich zakładać. Są to pola: 
     57{{{ 
     58id____, cregid, uid___, is_del, adduid, adddat, lm_uid, lm_dat, doc_id, prc_id, cre_id, tpstid, stcuid, stcdat 
     59}}} 
     60''' 
     61 
     62'''Uwaga ! Nie zapominamy o nadaniu uprawnień do tabeli dla edokumenty, useraspbip oraz http''' 
     63 
     64Następnie w module rejestry zakładamy nowy rejestr, a w polu nazwa tabeli wprowadzamy nazwę założonej tabeli. System będzie od nas żądać, aby nazwa tabeli rozpoczynała się od "creg_". 
     65 
     66== Tworzenie raportu == 
     67Po utworzeniu tabeli w schema cregisters rozpoczynającej się od ciągu creg_ należy utworzyć raport np: 
     68 
     69{{{ 
     70SELECT ('CREGISTER_ENTRY') AS clsnam, cd.id____ AS keyval, cd.* 
     71FROM cregisters.creg_ddm_dokumenty cd 
     72INNER JOIN cregisters.creg_archiv_formularz af ON cd.menuid = af.formularz 
     73WHERE {FILTER_STRING} AND cd.is_del IS NOT true 
     74{ORDER_BY} 
     75{LIMIT} 
     76}}} 
     77 
     78 
     79 
     80Raport należy podlinkować do rejestru ustawiając w tabeli registers pole rep_id. 
     81 
     82== Ważne tabele == 
     83 
     84{{{ 
     85registers (klucz główny: ) 
     86registers_entry (klucz głowny: , klucz obcy: ) 
     87register_fields (klucz główny: , klucz obcy: ) 
     88}}} 
     89 
     90Uwaga! Kluczem obcym w registers_entry referujacym do rejestru jest XXXX 
     91 
     92== Rejestr jako lista w dokumencie == 
     93 
     94Definiujemy powiązanie rejestru z typem dokumentu (jeżeli na to być lista a nie formularz to ustawiamy parametr ''collection'' na ''true''): 
     95{{{ 
     96INSERT INTO cregisters.register_links (cregid, keyval, clsnam, params)  
     97VALUES ({cregisters.register.id____}, {types_of_documents.dctpid}, 'DOCUMENT', '{"collection":true}') 
     98}}} 
     99== Podrejestr w rejestrze == 
     100Aby zbudować strukturę hierarchiczną rejestru wystarczy zlinkować odpowiednio 2 wcześniej utworzone rejestry. Pierwszy ze wskazanych zacznie się pojawiać jako lista rekordów w formatce rejestru nadrzędnego. 
     101{{{ 
     102INSERT INTO cregisters.register_links (cregid, keyval, clsnam, params)  
     103VALUES ({cregisters.register.id____}, {cregisters.register.id____}, 'CREGISTER', '{"collection":true}') 
     104}}} 
     105''' 
     106Uwaga! Id podrejestru jest wprowadzany w insercie jako pierwsze, następny jest id rejestru do którego będzie należeć podrejestr.''' 
     107 
     108W raporcie w podrejestrze za filtrowanie rekordów odpowiada makro {FILTER_STRING}, które dokleja do zapytania warunek po atrybucie cre_id (cre_id wskazuje na rekord rejestru nadrzędnego). 
     109 
     110== Definicje pól dla rejestru == 
     111 
     112=== Ustawianie wartości domyślnych === 
     113 
     114Jeżeli chcemy aby pole było listą wyboru, to definiujemy w parametrach (register_fields.params) domyślną wartość (defaultValue): 
     115 
     116{{{ 
     117-- Id tworzącego dokument 
     118{"defaultValue":"{SQL::SELECT adduid FROM documents WHERE doc_id = {doc_id}}"} 
     119 
     120-- domyślne dane zalogowanego użytkownika 
     121{"defaultValue":"{SQL::SELECT o.firnam || ' ' || o.lasnam || ' (' || COALESCE(o.orunsm, '') || ' - ' || o.ndenam || ')' AS wytworzyl FROM orgtree_view o WHERE o.usr_id = {LOGGED_USR_ID}}"} 
     122 
     123}}} 
     124 
     125Możliwe jest też ustawienie wartości wyliczanej za każdym razem gdy dokonujemy zapisu rejestru (dla pól ukrytych): 
     126 
     127{{{ 
     128-- Imię i nazwisko dokonującego zmian w rejestrze 
     129{"value":"{SQL::select firnam || ' ' || lasnam from users where usr_id={LOGGED_USR_ID}}"} 
     130}}} 
     131 
     1321. '''defaultValue''' jest parsowane tylko dla formularza nowego wpisu w rejestrze (na akcji Open oraz Save).[[BR]] 
     1332. '''value''' jest parsowane zawsze na akcji Save niezależnie od trybu (edycja, nowy) wyłącznie dla pól: 
     134 a. ukrytych poprzez definicję pola (register_fields.hidden = TRUE) 
     135 b. ukrytych poprzez parametr visible (register_fields.params = {"visible":false}) 
     136 c. nieaktywnych (register_fields.params = {"enabled":false}) 
     137 
     138 
     139=== Pole jako lista wyboru === 
     140 
     141Jeżeli chcemy aby pole było listą wyboru, to definiujemy w parametrach (register_fields.params) zapytanie zwracające rekordy typu (klucz,wartość), dodatkowo ustawiamy domyślną wartość (defaultValue): 
     142 
     143{{{ 
     144{"sql":"SELECT usr_id,usrnam FROM users WHERE is_del IS NOT TRUE", "defaultValue":"{SQL::SELECT adduid FROM documents WHERE doc_id = {doc_id}}"} 
     145}}} 
     146Parametry: sql, defaultValue, są objęte standardowym mechanizmem parsowania [http://support.edokumenty.eu/trac/wiki/DeployerGuide/Customization#a3.5Parametry parametrów] (tak jak np. w przypisaniach w [http://support.edokumenty.eu/trac/wiki/DeployerGuide/Customization/ProcessAutomation workflow]). 
     147 
     148=== Pole tekstowe typu HTML === 
     149 
     150{{{ 
     151{"type":"html"} 
     152}}} 
     153 
     154=== Pole tekstowe typu !ComboBox === 
     155 
     156 
     157{{{ 
     158{"type":"combobox","autoSearch":2,"sql":"SELECT usr_id,usrnam FROM users WHERE is_del IS NOT TRUE AND (firnam ~* E'^{SEARCH_TEXT}')"} 
     159}}} 
     160Znacznik {SEARCH_TEXT} zostanie zastąpiony wpisanym w pole tekstem[[BR]] 
     161 1. autoSearch - ilosc znaków po których wpisaniu zostanie uruchomione wyszukiwanie / podpowiadanie (wartość -1 spowoduje wyłączenie automatycznego wyszukiwania i pokazanie ikony lupki) 
     162 
     163 
     164=== Pole jako status === 
     165 
     166W definicji pola, w polu Alias wpisujemy "tpstid" 
     167 
     168 
     169=== Disablowanie pola === 
     170Jeśli pole ma być tylko do odczytu to należy dla niego określić atrybut enabled: 
     171{{{ 
     172{"enabled":false} 
     173}}} 
     174 
     175=== !ToolBar === 
     176 
     177{{{ 
     178{"type":"toolbutton","icon":"new.gif","visible":1,"doRefresh":true,"onclick":["moj_skrypt.inc","MojaKlasa1","mojaFunkcja",{"parametr_1":"aqq","parametr_2":"{register_entry.adddat}"}]} 
     179}}} 
     180 1. icon: plik ikony bez ścieżki która wskazuje domyślnie na ./img/toolbarIcons/24x24/ 
     181Skrypt "app/edokumenty/scripts/moj_skrypt.inc" 
     182 2. doRefresh: wartość true spowoduje przeładowanie formularza wpisu w rejestrze 
     183 
     184{{{ 
     185<?php 
     186class MojaKlasa1 { 
     187 
     188    public function __construct() { 
     189    } 
     190 
     191    public function mojaFunkcja($params) { 
     192        $params = json_decode($params,TRUE); 
     193         
     194        jscript::alert(json_encode($params)); 
     195    } 
     196} 
     197?> 
     198}}} 
     199 
     200Wywołanie / otwarcie formularza poprzez clsnam i keyval (np. otwarcie tego samego wpisu w nowym oknie czyli edycja): 
     201{{{ 
     202{"type":"toolbutton","icon":"edit.gif","enabled":1,"onclick":["","Application","openDialogByCls","","CREGISTER_ENTRY","SQL::SELECT {cregisters.creg_przykladowy_rejestr.id____}"]} 
     203}}} 
     204 
     205Usuń wpis z rejestru: 
     206{{{ 
     207{"type":"toolbutton","icon":"del.gif","enabled":1,"onclick":["","Application","openDialogByCls",{"mode":"del"},"CREGISTER_ENTRY","SQL::SELECT {cregisters.creg_przykladowy_rejestr.id____}"]} 
     208}}} 
     209 
     210== Filtrowanie listy == 
     211Dla rejestru można ustawić stały filtr w parametrach (cregisters.register.params) 
     212{{{ 
     213{"FILTER_STRING":"is_del IS TRUE"} 
     214}}} 
     215 
     216 
     217== Modyfikacje JSON bezpośrednio w bazie danych == 
     218 
     219Sposób na zmianę wartości jednego pola w obiekcie typu JSON ('''dla PostgreSQL v9.3+'''): 
     220{{{ 
     221CREATE OR REPLACE FUNCTION "json_set_value"( 
     222  "json"          json, 
     223  "key_to_set"    TEXT, 
     224  "value_to_set"  anyelement 
     225) 
     226  RETURNS json 
     227  LANGUAGE sql 
     228  IMMUTABLE 
     229  STRICT 
     230AS $function$ 
     231SELECT COALESCE( 
     232  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}') 
     233     FROM (SELECT * 
     234             FROM json_each("json") 
     235            WHERE "key" <> "key_to_set" 
     236            UNION ALL 
     237           SELECT "key_to_set", to_json("value_to_set")) AS "fields"), 
     238  '{}' 
     239)::json 
     240$function$; 
     241 
     242UPDATE cregisters.register_field SET params = json_set_value(params, 'doRefresh', true) WHERE id____ = 1; 
     243 
     244UPDATE cregisters.register_field SET params = json_set_value(params, 'value', 'SQL::SELECT ''tekst "kolo"''') WHERE id____ = 1; 
     245}}} 
     246 
     247 
     248== Migracja rejestrów z innej bazy == 
     249 
     250[wiki:UserGuide/AdvancedConfiguration/CustomRegisters/Import Import rejestrów] 
     251 
     252== Przydatne konstrukcje i zapytania == 
     253{{{ 
     254-- użycie w parametrach do przycisków i pól wartości {DOC_ID} powoduje błąd po wejściu na rekord rejestru jeśli jest pusty. Aby temu zapobiec należy obłożyć {DOC_ID} konstukcją NULLIF i COALESCE. 
     255select pprosm from documents where doc_id = COALESCE(NULLIF('{DOC_ID}',''),'0')::int 
     256 
     257}}}