<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wikii.int.com.pl/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
		<id>https://wikii.int.com.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Awo</id>
		<title>Motława - Wkład użytkownika [pl]</title>
		<link rel="self" type="application/atom+xml" href="https://wikii.int.com.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Awo"/>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Specjalna:Wk%C5%82ad/Awo"/>
		<updated>2026-04-06T02:57:57Z</updated>
		<subtitle>Wkład użytkownika</subtitle>
		<generator>MediaWiki 1.23.13</generator>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:_Definicja_regul_pol_obowiazkowych</id>
		<title>Code: Definicja regul pol obowiazkowych</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:_Definicja_regul_pol_obowiazkowych"/>
				<updated>2009-03-25T12:20:53Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Algorytm walidacji pól'''&lt;br /&gt;
&lt;br /&gt;
Mechanizm definiowanej walidacji pól aktywowany jest kluczem w [[Edytor_kluczy_rejestru|Rejestrze systemowym]] o nazwie '''walidacja_pol_aktywna'''.&lt;br /&gt;
&lt;br /&gt;
Procedura walidacji pobiera definicje z tabel '''sys_fld_validator_ng''' i '''sys_fld_validator_po''' dla danego coreid i przetwarza wszystkie reguły.&lt;br /&gt;
&lt;br /&gt;
Struktury tabel odpowiadających za definicje walidacji pól:&lt;br /&gt;
&lt;br /&gt;
''Tabela sys_fld_validator_ng''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; cellspacing=1 cellpadding=3 style=&amp;quot;border: 1px solid #888888; border-collapse: collapse; padding: 5px;&amp;quot;  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Field&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Null&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Key&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Default&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| [[idn]]&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| int(11)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| PRI&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NULL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| [[GUID]]&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| varchar(38)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| UNI&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| [[coreid]]&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| varchar(38)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| MUL&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| rule_operator&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| int(11)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| rule_mode&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| int(11)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  message_if_not_valid  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  text  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  comment  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(250)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Tabela sys_fld_validator_po''&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; cellspacing=1 cellpadding=3  style=&amp;quot;border: 1px solid #888888; border-collapse: collapse; padding: 5px;&amp;quot;  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Field  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Type  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Null  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Key  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Default  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  [[idn]]  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  int(11)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  PRI  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  [[GUID]]  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  UNI  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  GUID_NG  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  MUL  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  fieldname  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  rule_order  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  int(11)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  0  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  admin  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  int(11)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  0  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  validation_rule_type  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(20)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  validation_rule  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(200)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  condition_expr  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(250)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |    &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  condition_ruleset_guid  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  MUL  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  message_if_not_valid  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  text  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reguła może mieć wiele pozycji - np kontrolować wiele pól lub zakładać różne warunki na jedno pole.&lt;br /&gt;
Poszczególne reguły w danym zestawie mogą być łączone operatorem AND (rule_operator=0) - czyli wymagają spełnienia wszystkich warunków, lub operatorem OR (rule_operator=1) - czyli wystarczy spełnienie jednego z warunków.&lt;br /&gt;
&lt;br /&gt;
Rule_mode określa metodę walidacji:&lt;br /&gt;
 0 - na poziomie cds (czyli wykonywana w czasie edycji pola)&lt;br /&gt;
 1 - Before Post&lt;br /&gt;
 2 - Before Apply&lt;br /&gt;
&lt;br /&gt;
Reguła definiowana jest przez typ reguły i wartość kontrolowaną:&lt;br /&gt;
&lt;br /&gt;
Pole validation_rule_type przyjmuje wartości:&lt;br /&gt;
 NOT_NULL, - dla wszystkich typów&lt;br /&gt;
 NOT_EMPTY, - dla stringów: &amp;lt;&amp;gt;&amp;quot;&amp;quot;, dla liczb &amp;lt;&amp;gt;0, dla dat &amp;lt;&amp;gt;'0000-00-00'&lt;br /&gt;
 LENGTH_EQ, LENGTH_MAX, LENGTH_MIN - dotyczy pól stringowych - w validation_rule określona jest długość&lt;br /&gt;
 EQ, NOT_EQ, LESS, LESS_EQ, GREATER, GREATER_EQ, - porównanie z polem validation_rule&lt;br /&gt;
 DEFAULT - wartość domyślna pola określona w validation_rule&lt;br /&gt;
&lt;br /&gt;
 Przykłady:&lt;br /&gt;
  fieldname='datawystaw'&lt;br /&gt;
  validation_rule_type='GREATER_EQ'&lt;br /&gt;
  validation_rule='2009-01-01'&lt;br /&gt;
 &lt;br /&gt;
  fieldname='opis'&lt;br /&gt;
  validation_rule_type='LENGTH_MIN'&lt;br /&gt;
  validation_rule='10'&lt;br /&gt;
&lt;br /&gt;
Reguły mogą być warunkowe - patrz ''Przykład 2''.&lt;br /&gt;
W przypadku nie spełnienia warunków zawartych w regule powinien zostać wyświetlony komunikat złożony z zawartości pól &lt;br /&gt;
message_if_not_valid dla nagłówka i tych pozycji reguły, które nie zostały spełnione.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Przykładowe definicje walidacji:'''&lt;br /&gt;
&lt;br /&gt;
'''Przykład 1:'''&lt;br /&gt;
&lt;br /&gt;
 Karta kontrahenta (coreid='K_'), pole katcol0 ma być różne od 0, a długość pola NIP ma być równa 10 lub 12 lub 0 &lt;br /&gt;
 (rule_operator=1 (OR) oznacza, że  wystarczy, by jeden z warunków był spełniony).&lt;br /&gt;
 &lt;br /&gt;
 Definicja:&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt; &lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'K_rule1','K_',0,2,'Wartosc pierwszej kategorii kolumnowej musi byc okreslona! '),&lt;br /&gt;
  (0,'K_rule2','K_',1,2,'Pole NIP może mieć długość 10,12 znaków bądź być puste');&lt;br /&gt;
 &lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'K_katcol0_rule1_1','K_rule1','katcol0',0,0,'NOT_EMPTY',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
  (0,'K_nip_rule1_1','K_rule2','nip',0,0,'LENGTH_EQ','0',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
  (0,'K_nip_rule1_2','K_rule2','nip',0,0,'LENGTH_EQ','10',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
  (0,'K_nip_rule1_3','K_rule2','nip',0,0,'LENGTH_EQ','12',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Jeśli definiowane pole ma być sprawdzane tylko przy spełnieniu warunków dotyczących danego zapisu można takie warunki zdefiniować tworząc kolejny zestaw reguł i przypisując jego guid do pola condition_ruleset_guid.&lt;br /&gt;
&lt;br /&gt;
'''Przykład 2:'''&lt;br /&gt;
&lt;br /&gt;
 Edycja operacji (coreid='O_') sprzedaży (grupaoper=0), pole katcol0 ma być różne od 0.&lt;br /&gt;
 Definicja z wykorzystaniem dodatkowego warunku zdefiniowanego w regule 'O_katcol0_cond1'&lt;br /&gt;
 &lt;br /&gt;
 Definicja:&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt; &lt;br /&gt;
  # reguła walidacji&lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'O_katcol0_rule1','O_',0,2,'Wartosc pierwszej kategorii kolumnowej musi byc okreslona! '),&lt;br /&gt;
&lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'O_katcol0_rule1_1','O_katcol0_rule1','katcol0',0,0,'NOT_EMPTY',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,'O_katcol0_cond1',&amp;quot;&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
  # reguła warunku walidacji&lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'O_katcol0_cond1',&amp;quot;&amp;quot;,0,2,&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'O_katcol0_cond1_1','O_katcol0_cond1','grupaoper',0,0,'EQ','0',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Przykład 3:'''&lt;br /&gt;
&lt;br /&gt;
 Edycja operacji (coreid='O_') sprzedaży (grupaoper=0), pole katcol0 ma być różne od 0.&lt;br /&gt;
 Definicja z wykorzystaniem dodatkowego warunku zdefiniowanego w polu condition_expr&lt;br /&gt;
 &lt;br /&gt;
 Definicja:&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt; &lt;br /&gt;
  # reguła walidacji&lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'O_katcol0_rule1','O_',0,2,'Wartosc pierwszej kategorii kolumnowej musi byc okreslona! '),&lt;br /&gt;
&lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'O_katcol0_rule1_1','O_katcol0_rule1','katcol0',0,0,'NOT_EMPTY',&amp;quot;&amp;quot;,'grupa=0',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: Administracja]]&lt;br /&gt;
[[Kategoria: MySQL]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:_Definicja_regul_pol_obowiazkowych</id>
		<title>Code: Definicja regul pol obowiazkowych</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:_Definicja_regul_pol_obowiazkowych"/>
				<updated>2009-03-25T12:20:43Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Algorytm walidacji pól'''&lt;br /&gt;
&lt;br /&gt;
Mechanizm definiowanej walidacji pól aktywowany jest kluczem w [[Edytor_kluczy_rejestru|Rejestrze systemowym]] o nazwie '''walidacja_pol_aktywna'''.&lt;br /&gt;
&lt;br /&gt;
Procedura walidacji pobiera definicje z tabel '''sys_fld_validator_ng''' i '''sys_fld_validator_po''' dla danego coreid i przetwarza wszystkie reguły.&lt;br /&gt;
&lt;br /&gt;
Struktury tabel odpowiadających za definicje walidacji pól:&lt;br /&gt;
&lt;br /&gt;
''Tabela sys_fld_validator_ng''&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; cellspacing=1 cellpadding=3 style=&amp;quot;border: 1px solid #888888; border-collapse: collapse; padding: 5px;&amp;quot;  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Field&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Null&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Key&lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; | Default&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| [[idn]]&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| int(11)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| PRI&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NULL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| [[GUID]]&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| varchar(38)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| UNI&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| [[coreid]]&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| varchar(38)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| MUL&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| rule_operator&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| int(11)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| rule_mode&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| int(11)&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| NO&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888; &amp;quot;| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  message_if_not_valid  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  text  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  comment  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(250)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Tabela sys_fld_validator_po''&lt;br /&gt;
{| class=&amp;quot;prettytable&amp;quot; cellspacing=1 cellpadding=3  style=&amp;quot;border: 1px solid #888888; border-collapse: collapse; padding: 5px;&amp;quot;  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Field  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Type  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Null  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Key  &lt;br /&gt;
! style=&amp;quot;text-align:left; border: 1px solid #888888; background: #eeeeee;&amp;quot; |  Default  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  [[idn]]  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  int(11)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  PRI  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  [[GUID]]  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  UNI  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  GUID_NG  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  MUL  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  fieldname  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  rule_order  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  int(11)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  0  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  admin  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  int(11)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  0  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  validation_rule_type  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(20)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  validation_rule  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(200)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  condition_expr  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(250)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |    &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  condition_ruleset_guid  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  varchar(38)  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NO  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  MUL  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  message_if_not_valid  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  text  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  YES  &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |   &lt;br /&gt;
| style=&amp;quot;text-align:left; border: 1px solid #888888;&amp;quot; |  NULL  &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Reguła może mieć wiele pozycji - np kontrolować wiele pól lub zakładać różne warunki na jedno pole.&lt;br /&gt;
Poszczególne reguły w danym zestawie mogą być łączone operatorem AND (rule_operator=0) - czyli wymagają spełnienia wszystkich warunków, lub operatorem OR (rule_operator=1) - czyli wystarczy spełnienie jednego z warunków.&lt;br /&gt;
&lt;br /&gt;
Rule_mode określa metodę walidacji:&lt;br /&gt;
 0 - na poziomie cds (czyli wykonywana w czasie edycji pola)&lt;br /&gt;
 1 - Before Post&lt;br /&gt;
 2 - Before Apply&lt;br /&gt;
&lt;br /&gt;
Reguła definiowana jest przez typ reguły i wartość kontrolowaną:&lt;br /&gt;
&lt;br /&gt;
Pole validation_rule_type przyjmuje wartości:&lt;br /&gt;
 NOT_NULL, - dla wszystkich typów&lt;br /&gt;
 NOT_EMPTY, - dla stringów: &amp;lt;&amp;gt;&amp;quot;&amp;quot;, dla liczb &amp;lt;&amp;gt;0, dla dat &amp;lt;&amp;gt;'0000-00-00'&lt;br /&gt;
 LENGTH_EQ, LENGTH_MAX, LENGTH_MIN - dotyczy pól stringowych - w validation_rule określona jest długość&lt;br /&gt;
 EQ, NOT_EQ, LESS, LESS_EQ, GREATER, GREATER_EQ, - porównanie z polem validation_rule&lt;br /&gt;
 DEFAULT - wartość domyślna pola określona w validation_rule&lt;br /&gt;
&lt;br /&gt;
 Przykłady:&lt;br /&gt;
  fieldname='datawystaw'&lt;br /&gt;
  validation_rule_type='GREATER_EQ'&lt;br /&gt;
  validation_rule='2009-01-01'&lt;br /&gt;
 &lt;br /&gt;
  fieldname='opis'&lt;br /&gt;
  validation_rule_type='LENGTH_MIN'&lt;br /&gt;
  validation_rule='10'&lt;br /&gt;
&lt;br /&gt;
Reguły mogą być warunkowe - patrz ''Przykład 2''.&lt;br /&gt;
W przypadku nie spełnienia warunków zawartych w regule powinien zostać wyświetlony komunikat złożony z zawartości pól &lt;br /&gt;
message_if_not_valid dla nagłówka i tych pozycji reguły, które nie zostały spełnione.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Przykładowe definicje walidacji:'''&lt;br /&gt;
&lt;br /&gt;
'''Przykład 1:'''&lt;br /&gt;
&lt;br /&gt;
 Karta kontrahenta (coreid='K_'), pole katcol0 ma być różne od 0, a długość pola NIP ma być równa 10 lub 12 lub 0 &lt;br /&gt;
 (rule_operator=1 (OR) oznacza, że  wystarczy, by jeden z warunków był spełniony).&lt;br /&gt;
 &lt;br /&gt;
 Definicja:&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt; &lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'K_rule1','K_',0,2,'Wartosc pierwszej kategorii kolumnowej musi byc okreslona! '),&lt;br /&gt;
  (0,'K_rule2','K_',1,2,'Pole NIP może mieć długość 10,12 znaków bądź być puste');&lt;br /&gt;
 &lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'K_katcol0_rule1_1','K_rule1','katcol0',0,0,'NOT_EMPTY',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
  (0,'K_nip_rule1_1','K_rule2','nip',0,0,'LENGTH_EQ','0',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
  (0,'K_nip_rule1_2','K_rule2','nip',0,0,'LENGTH_EQ','10',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
  (0,'K_nip_rule1_3','K_rule2','nip',0,0,'LENGTH_EQ','12',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Jeśli definiowane pole ma być sprawdzane tylko przy spełnieniu warunków dotyczących danego zapisu można takie warunki zdefiniować tworząc kolejny zestaw reguł i przypisując jego guid do pola condition_ruleset_guid.&lt;br /&gt;
&lt;br /&gt;
'''Przykład 2:'''&lt;br /&gt;
&lt;br /&gt;
 Edycja operacji (coreid='O_') sprzedaży (grupaoper=0), pole katcol0 ma być różne od 0.&lt;br /&gt;
 Definicja z wykorzystaniem dodatkowego warunku zdefiniowanego w regule 'O_katcol0_cond1'&lt;br /&gt;
 &lt;br /&gt;
 Definicja:&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt; &lt;br /&gt;
  # reguła walidacji&lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'O_katcol0_rule1','O_',0,2,'Wartosc pierwszej kategorii kolumnowej musi byc okreslona! '),&lt;br /&gt;
&lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'O_katcol0_rule1_1','O_katcol0_rule1','katcol0',0,0,'NOT_EMPTY',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,'O_katcol0_cond1',&amp;quot;&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
  # reguła warunku walidacji&lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'O_katcol0_cond1',&amp;quot;&amp;quot;,0,2,&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'O_katcol0_cond1_1','O_katcol0_cond1','grupaoper',0,0,'EQ','0',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Przykład 3:'''&lt;br /&gt;
&lt;br /&gt;
 Edycja operacji (coreid='O_') sprzedaży (grupaoper=0), pole katcol0 ma być różne od 0.&lt;br /&gt;
 Definicja z wykorzystaniem dodatkowego warunku zdefiniowanego w polu condition_expr&lt;br /&gt;
 &lt;br /&gt;
 Definicja:&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt; &lt;br /&gt;
  # reguła walidacji&lt;br /&gt;
  insert into sys_fld_validator_ng values &lt;br /&gt;
  (0,'O_katcol0_rule1','O_',0,2,'Wartosc pierwszej kategorii kolumnowej musi byc okreslona! '),&lt;br /&gt;
&lt;br /&gt;
  insert into sys_fld_validator_po values &lt;br /&gt;
  (0,'O_katcol0_rule1_1','O_katcol0_rule1','katcol0',0,0,'NOT_EMPTY',&amp;quot;&amp;quot;,'grupa=0',&amp;quot;&amp;quot;,&amp;quot;&amp;quot;),&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: Administracja]]&lt;br /&gt;
[[Kategoria: MySQL]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-23T14:30:58Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedury do [[HierCube]] i [[RadarCube]]&lt;br /&gt;
&lt;br /&gt;
== HierCube ==&lt;br /&gt;
Dla komponentu '''HierCube'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
1. Rozwiązanie statyczne.&lt;br /&gt;
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:&amp;lt;br&amp;gt;&lt;br /&gt;
* kliknąć w komponent '''Grid''' (THierCubeGrid);&lt;br /&gt;
* we własności '''FunctionDefs''' wybrać zakładkę '''Sub-function settings''';&lt;br /&gt;
* kliknąć w ikonkę '''Create custom sub-function''' i w pole '''Display name''' wpisać nazwę wyświetlaną, która pojawi się w menu;&lt;br /&gt;
* przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count''';&lt;br /&gt;
* wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości;&lt;br /&gt;
2. Rozwiązanie dynamiczne.&lt;br /&gt;
W głównej formatce dodajemy deklaracje, a w zdarzeniu '''OnCreate''' dodajemy własne funkcje jak poniżej:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
TMainFRM = class(TForm)&lt;br /&gt;
private&lt;br /&gt;
  {...}&lt;br /&gt;
  MySubFunc1, MySubFunc2: TSubFunction;&lt;br /&gt;
  function MyColPercentCalculator1(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean;&lt;br /&gt;
  function MyColPercentCalculator2(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean;&lt;br /&gt;
  function MyColTrendCalc(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendNo: Integer): Boolean;&lt;br /&gt;
public&lt;br /&gt;
  {...}&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{...}&lt;br /&gt;
&lt;br /&gt;
procedure TMainFRM.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  {...}&lt;br /&gt;
  { dodanie funkcji w menu i pobranie identyfikatora }&lt;br /&gt;
  MySubFunc1 := Grid.AddSubFunction('Przyrost w %').SubFunction;&lt;br /&gt;
  MySubFunc2 := Grid.AddSubFunction('Stosunek wartości %').SubFunction;&lt;br /&gt;
  { dodanie formatowania }&lt;br /&gt;
  Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc1)].FormatString := '0.00&amp;quot;%&amp;quot;';&lt;br /&gt;
  Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc2)].FormatString := '0.00&amp;quot;%&amp;quot;';&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W komponencie '''Grid''' (THierCubeGrid) zdarzenie '''OnGetSubFunctionCalculator''' należy uzupełnić w następujący sposób:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
procedure TMainFRM.GridGetSubFunctionCalculator(Sender: TObject; SubFun: TSubFunction; var Calculator: TSubFunctionCalculator);&lt;br /&gt;
begin&lt;br /&gt;
  if SubFun = sstCustom1 then Calculator := MyColPercentCalculator else&lt;br /&gt;
  if SubFun = MySubFunc1 then Calculator := MyColPercentCalculator1 else&lt;br /&gt;
  if SubFun = MySubFunc2 then Calculator := MyColPercentCalculator2;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dodajemy kod własnych funkcji:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function TMainFRM.MyColPercentCalculator1(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := MyColTrendCalc(Args, Res, 1);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMainFRM.MyColPercentCalculator2(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := MyColTrendCalc(Args, Res, 2);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMainFRM.MyColTrendCalc(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendNo: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex];&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendNo of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== RadarCube ==&lt;br /&gt;
Dla komponentu '''RadarCube'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Deklaracja własnej procedury:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
TfmMain = class(TForm)&lt;br /&gt;
private&lt;br /&gt;
  {...}&lt;br /&gt;
  procedure MyColTrendCalc(EventArgs: TShowMeasureArgs; TrendNo: Integer);&lt;br /&gt;
public&lt;br /&gt;
  {...}&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W implementacji dodajemy:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
implementation&lt;br /&gt;
&lt;br /&gt;
{...}&lt;br /&gt;
&lt;br /&gt;
const&lt;br /&gt;
  _ColTrend = 'Przyrost w %';&lt;br /&gt;
  _ColRate = 'Stosunek wartości %';&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Modyfikujemy zdarzenia '''OnInitMeasures''' i '''OnShowMeasure''':&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
procedure TfmMain.OnInitMeasuresHandler(Sender: TObject);&lt;br /&gt;
var&lt;br /&gt;
  M: TMeasure;&lt;br /&gt;
begin&lt;br /&gt;
  //+ Add a new show mode named &amp;quot;Rank by Row&amp;quot; in the &amp;quot;Sales&amp;quot; measure&lt;br /&gt;
  M := (Sender as TCustomOLAPGrid).Measures.FindByDisplayName('Sales');&lt;br /&gt;
  if M &amp;lt;&amp;gt; nil then&lt;br /&gt;
  begin&lt;br /&gt;
    M.ShowModes.Add('Rank by Row');&lt;br /&gt;
    M.ShowModes.Add(_ColTrend);&lt;br /&gt;
    M.ShowModes.Add(_ColRate);&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TfmMain.OnShowMeasure(Sender: TObject; EventArgs: TShowMeasureArgs);&lt;br /&gt;
begin&lt;br /&gt;
  {...}&lt;br /&gt;
  if EventArgs.ShowMode.Caption = _ColTrend then&lt;br /&gt;
    MyColTrendCalc(EventArgs, 1);&lt;br /&gt;
  if EventArgs.ShowMode.Caption = _ColRate then&lt;br /&gt;
    MyColTrendCalc(EventArgs, 2);&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dodajemy własną procedurę:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
procedure TfmMain.MyColTrendCalc(EventArgs: TShowMeasureArgs; TrendNo: Integer);&lt;br /&gt;
var&lt;br /&gt;
  i, j: integer;&lt;br /&gt;
  MC: IMemberCell;&lt;br /&gt;
  V: Variant;&lt;br /&gt;
  x0, x1, y: Double;&lt;br /&gt;
  S: string;&lt;br /&gt;
begin&lt;br /&gt;
  EventArgs.ReturnValue := '';&lt;br /&gt;
  if VarIsNull(EventArgs.OriginalData) then Exit;&lt;br /&gt;
  x1 := EventArgs.OriginalData;&lt;br /&gt;
  if x1 = 0.0 then Exit;&lt;br /&gt;
  S := '*';&lt;br /&gt;
  Grid.GetCellByAddress(EventArgs.CurrentAddress, i, j);&lt;br /&gt;
  MC := IMemberCell(Grid.CellSet.Cells[j, i]);&lt;br /&gt;
  if MC &amp;lt;&amp;gt; nil then&lt;br /&gt;
  begin&lt;br /&gt;
    MC := MC.PrevMember;&lt;br /&gt;
    if MC &amp;lt;&amp;gt; nil then&lt;br /&gt;
    begin&lt;br /&gt;
      V := EventArgs.Evaluator.SiblingValue(MC.Member);&lt;br /&gt;
      if not VarIsNull(V) then&lt;br /&gt;
      begin&lt;br /&gt;
        x0 := V;&lt;br /&gt;
        y := 0;&lt;br /&gt;
        case TrendNo of&lt;br /&gt;
          1: y := (1 - x0/x1) * 100;&lt;br /&gt;
          2: y := x0/x1 * 100;&lt;br /&gt;
        end;&lt;br /&gt;
        S := FormatFloat('#0.00&amp;quot;%&amp;quot;', y);&lt;br /&gt;
      end;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      S := 'N/A';&lt;br /&gt;
  end;&lt;br /&gt;
  EventArgs.ReturnValue := S;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-23T11:10:19Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedury do [[HierCube]] i [[RadarCube]]&lt;br /&gt;
&lt;br /&gt;
== HierCube ==&lt;br /&gt;
Dla komponentu '''HierCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
1. Rozwiązanie statyczne.&lt;br /&gt;
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:&amp;lt;br&amp;gt;&lt;br /&gt;
* kliknąć w komponent '''Grid''' (THierCubeGrid);&lt;br /&gt;
* we własności '''FunctionDefs''' wybrać zakładkę '''Sub-function settings''';&lt;br /&gt;
* kliknąć w ikonkę '''Create custom sub-function''' i w pole '''Display name''' wpisać nazwę wyświetlaną, która pojawi się w menu;&lt;br /&gt;
* przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count''';&lt;br /&gt;
* wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości;&lt;br /&gt;
2. Rozwiązanie dynamiczne.&lt;br /&gt;
W głównej formatce dodajemy deklaracje, a w zdarzeniu '''OnCreate''' dodajemy własne funkcje jak poniżej:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
TMainFRM = class(TForm)&lt;br /&gt;
private&lt;br /&gt;
  {...}&lt;br /&gt;
  MySubFunc1, MySubFunc2: TSubFunction;&lt;br /&gt;
public&lt;br /&gt;
  {...}&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TMainFRM.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  ...&lt;br /&gt;
  { dodanie funkcji w menu i pobranie identyfikatora }&lt;br /&gt;
  MySubFunc1 := Grid.AddSubFunction('Przyrost w %').SubFunction;&lt;br /&gt;
  MySubFunc2 := Grid.AddSubFunction('Stosunek wartości %').SubFunction;&lt;br /&gt;
  { dodanie formatowania }&lt;br /&gt;
  Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc1)].FormatString := '0.00&amp;quot;%&amp;quot;';&lt;br /&gt;
  Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc2)].FormatString := '0.00&amp;quot;%&amp;quot;';&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W komponencie '''Grid''' (THierCubeGrid) zdarzenie '''OnGetSubFunctionCalculator''' należy uzupełnić w następujący sposób:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
procedure TMainFRM.GridGetSubFunctionCalculator(Sender: TObject; SubFun: TSubFunction; var Calculator: TSubFunctionCalculator);&lt;br /&gt;
begin&lt;br /&gt;
  if SubFun = sstCustom1 then Calculator := MyColPercentCalculator else&lt;br /&gt;
  if SubFun = MySubFunc1 then Calculator := MyColPercentCalculator1 else&lt;br /&gt;
  if SubFun = MySubFunc2 then Calculator := MyColPercentCalculator2;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dodajemy kod własnych funkcji:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function TMainFRM.MyColPercentCalculator1(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := MyColTrendCalc(Args, Res, 1);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMainFRM.MyColPercentCalculator2(Args: TSubFunctionCalculatorArgs; out Res: Double): boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := MyColTrendCalc(Args, Res, 2);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMainFRM.MyColTrendCalc(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendNo: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex];&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendNo of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RadarCube ==&lt;br /&gt;
Dla komponentu '''RadarCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-23T11:08:40Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedury do [[HierCube]] i [[RadarCube]]&lt;br /&gt;
&lt;br /&gt;
== HierCube ==&lt;br /&gt;
Dla komponentu '''HierCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
1. Rozwiązanie statyczne.&lt;br /&gt;
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:&amp;lt;br&amp;gt;&lt;br /&gt;
* kliknąć w komponent '''Grid''' (THierCubeGrid);&lt;br /&gt;
* we własności '''FunctionDefs''' wybrać zakładkę '''Sub-function settings''';&lt;br /&gt;
* kliknąć w ikonkę '''Create custom sub-function''' i w pole '''Display name''' wpisać nazwę wyświetlaną, która pojawi się w menu;&lt;br /&gt;
* przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count''';&lt;br /&gt;
* wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości;&lt;br /&gt;
2. Rozwiązanie dynamiczne.&lt;br /&gt;
W głównej formatce dodajemy deklaracje, a w zdarzeniu '''OnCreate''' dodajemy własne funkcje jak poniżej:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
TMainFRM = class(TForm)&lt;br /&gt;
private&lt;br /&gt;
  ...&lt;br /&gt;
  MySubFunc1, MySubFunc2: TSubFunction;&lt;br /&gt;
public&lt;br /&gt;
  ...&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
procedure TMainFRM.FormCreate(Sender: TObject);&lt;br /&gt;
begin&lt;br /&gt;
  . . .&lt;br /&gt;
  {dodanie funkcji w menu i pobranie identyfikatora}&lt;br /&gt;
  MySubFunc1 := Grid.AddSubFunction('Przyrost w %').SubFunction;&lt;br /&gt;
  MySubFunc2 := Grid.AddSubFunction('Stosunek wartości %').SubFunction;&lt;br /&gt;
  {dodanie formatowania}&lt;br /&gt;
  Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc1)].FormatString := '0.00&amp;quot;%&amp;quot;';&lt;br /&gt;
  Grid.SummarySettings.FindFieldName('Quantity').FunctionCustom1.SubFunctions[Ord(MySubFunc2)].FormatString := '0.00&amp;quot;%&amp;quot;';&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
W komponencie '''Grid''' (THierCubeGrid) zdarzenie '''OnGetSubFunctionCalculator''' należy uzupełnić w następujący sposób:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
procedure TMainFRM.GridGetSubFunctionCalculator(Sender: TObject; SubFun: TSubFunction; var Calculator: TSubFunctionCalculator);&lt;br /&gt;
begin&lt;br /&gt;
  if SubFun = sstCustom1 then Calculator := MyColPercentCalculator else&lt;br /&gt;
  if SubFun = MySubFunc1 then Calculator := MyColPercentCalculator1 else&lt;br /&gt;
  if SubFun = MySubFunc2 then Calculator := MyColPercentCalculator2;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dodajemy kod własnych funkcji:&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function TMainFRM.MyColPercentCalculator1(Args: TSubFunctionCalculatorArgs; out Res: Double): Boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := MyColTrendCalc(Args, Res, 1);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMainFRM.MyColPercentCalculator2(Args: TSubFunctionCalculatorArgs; out Res: Double): boolean;&lt;br /&gt;
begin&lt;br /&gt;
  Result := MyColTrendCalc(Args, Res, 2);&lt;br /&gt;
end;&lt;br /&gt;
&lt;br /&gt;
function TMainFRM.MyColTrendCalc(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendNo: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex];&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendNo of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RadarCube ==&lt;br /&gt;
Dla komponentu '''RadarCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T15:08:00Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedury do [[HierCube]] i [[RadarCube]]&lt;br /&gt;
&lt;br /&gt;
== HierCube ==&lt;br /&gt;
Dla komponentu '''HierCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:&amp;lt;br&amp;gt;&lt;br /&gt;
* kliknąć w komponent '''Grid''' (THierCubeGrid);&lt;br /&gt;
* we własności '''FunctionDefs''' wybrać zakładkę '''Sub-function settings''';&lt;br /&gt;
* kliknąć w ikonkę '''Create custom sub-function''' i w pole '''Display name''' wpisać nazwę wyświetlaną, która pojawi się w menu;&lt;br /&gt;
* przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count''';&lt;br /&gt;
* wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendVer of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RadarCube ==&lt;br /&gt;
Dla komponentu '''RadarCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T15:07:00Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedury do [[HierCube]] i [[RadarCube]] =&lt;br /&gt;
== HierCube ==&lt;br /&gt;
Dla komponentu '''HierCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:&amp;lt;br&amp;gt;&lt;br /&gt;
* kliknąć w komponent '''Grid''' (THierCubeGrid);&lt;br /&gt;
* we własności '''FunctionDefs''' wybrać zakładkę '''Sub-function settings''';&lt;br /&gt;
* kliknąć w ikonkę '''Create custom sub-function''' i w pole '''Display name''' wpisać nazwę wyświetlaną, która pojawi się w menu;&lt;br /&gt;
* przechodzimy do zakładki '''Summary settings''', w drzewie wybieramy '''Distinct Count''';&lt;br /&gt;
* wybieramy nowo założoną procedurę i w polu '''Format mask''' wybieramy właściwą maskę dla wyświetlanych wartości;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendVer of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RadarCube ==&lt;br /&gt;
Dla komponentu '''RadarCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T15:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedury do [[HierCube]] i [[RadarCube]] =&lt;br /&gt;
== HierCube ==&lt;br /&gt;
Dla komponentu '''HierCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
W celu dodania własnej procedury wyliczeniowej należy wykonać następujące czynności:&amp;lt;br&amp;gt;&lt;br /&gt;
* kliknąć w komponent Grid (THierCubeGrid);&lt;br /&gt;
* we własności &amp;quot;FunctionDefs&amp;quot; wybrać zakładkę &amp;quot;Sub-function settings&amp;quot;;&lt;br /&gt;
* kliknąć w ikonkę &amp;quot;Create custom sub-function&amp;quot; i w pole &amp;quot;Display name&amp;quot; wpisać nazwę wyswietlaną która pojawi się w menu;&lt;br /&gt;
* przechodzimy do zakładki &amp;quot;Summary settings&amp;quot;, w drzewie wybieramy &amp;quot;Distinct Count&amp;quot;;&lt;br /&gt;
* wybieramy nowo założoną procedurę i w polu &amp;quot;Format mask&amp;quot; wybieramy właściwą maskę dla wyświetlanych wartości;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendVer of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RadarCube ==&lt;br /&gt;
Dla komponentu '''RadarCube'''.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T14:41:39Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Procedura do [[HierCube]] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    //if not FunctionData[ColTreeIndex, RowTreeIndex].NotEmpty then Exit;&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendVer of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T14:23:15Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Procedura do [[HierCube]] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    //if not FunctionData[ColTreeIndex, RowTreeIndex].NotEmpty then Exit;&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendVer of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T14:20:39Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: /* Procedura do HierCube */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Procedura do [[HierCube]] ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=pascal&amp;gt;&lt;br /&gt;
function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
var&lt;br /&gt;
  Node: TLabelNode;&lt;br /&gt;
  Nodes: TLabelNodes;&lt;br /&gt;
  i: Integer;&lt;br /&gt;
  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
  x0, x1: Double;&lt;br /&gt;
begin&lt;br /&gt;
  { by default return empty cell }&lt;br /&gt;
  Result := False;&lt;br /&gt;
  with Args do&lt;br /&gt;
  begin&lt;br /&gt;
    //if not FunctionData[ColTreeIndex, RowTreeIndex].NotEmpty then Exit;&lt;br /&gt;
    CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
    if CurrCell.NotEmpty then&lt;br /&gt;
    begin&lt;br /&gt;
      x1 := CurrCell.Data;&lt;br /&gt;
      if x1 = 0.0 then Exit;&lt;br /&gt;
    end&lt;br /&gt;
    else&lt;br /&gt;
      Exit;&lt;br /&gt;
    if RowLabelNode = nil then Exit;&lt;br /&gt;
    { find the parent node of RowLabelNode }&lt;br /&gt;
    Node := RowLabelNode;&lt;br /&gt;
    { for the most total node return empty value }&lt;br /&gt;
    if Node = nil then Exit;&lt;br /&gt;
    { the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
    if Node.IsSubTotal then Exit;&lt;br /&gt;
    if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
    Nodes := Node.LabelNodes;&lt;br /&gt;
    { find previous cells from the area of adequate comparisons }&lt;br /&gt;
    i := Node.Index - 1;&lt;br /&gt;
    if i &amp;gt;= 0 then&lt;br /&gt;
    begin&lt;br /&gt;
      Node := Nodes[i];&lt;br /&gt;
      if not Node.IsSubTotal then&lt;br /&gt;
      begin&lt;br /&gt;
        PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
        if PrevCell.NotEmpty then&lt;br /&gt;
        begin&lt;br /&gt;
          Result := True;&lt;br /&gt;
          x0 := PrevCell.Data;&lt;br /&gt;
          case TrendVer of&lt;br /&gt;
            1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
            2: Res := x0/x1 * 100;&lt;br /&gt;
          end;&lt;br /&gt;
        end;&lt;br /&gt;
      end;&lt;br /&gt;
    end;&lt;br /&gt;
  end;&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	<entry>
		<id>https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar</id>
		<title>Code:OLAP Radar</title>
		<link rel="alternate" type="text/html" href="https://wikii.int.com.pl/index.php?title=Code:OLAP_Radar"/>
				<updated>2009-03-20T14:18:49Z</updated>
		
		<summary type="html">&lt;p&gt;Awo: Nowa strona: == Procedura do HierCube ==  	function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean; 	var 	  Node: TLabelNode; 	  Nodes: TLabelNodes...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Procedura do [[HierCube]] ==&lt;br /&gt;
&lt;br /&gt;
	function CalcTrendByCol(Args: TSubFunctionCalculatorArgs; out Res: Double; TrendVer: Integer): Boolean;&lt;br /&gt;
	var&lt;br /&gt;
	  Node: TLabelNode;&lt;br /&gt;
	  Nodes: TLabelNodes;&lt;br /&gt;
	  i: Integer;&lt;br /&gt;
	  CurrCell, PrevCell: PDataCell;&lt;br /&gt;
	  x0, x1: Double;&lt;br /&gt;
	begin&lt;br /&gt;
	  { by default return empty cell }&lt;br /&gt;
	  Result := False;&lt;br /&gt;
	  with Args do&lt;br /&gt;
	  begin&lt;br /&gt;
		//if not FunctionData[ColTreeIndex, RowTreeIndex].NotEmpty then Exit;&lt;br /&gt;
		CurrCell := FunctionData[ColTreeIndex, RowTreeIndex];&lt;br /&gt;
		if CurrCell.NotEmpty then&lt;br /&gt;
		begin&lt;br /&gt;
		  x1 := CurrCell.Data;&lt;br /&gt;
		  if x1 = 0.0 then Exit;&lt;br /&gt;
		end&lt;br /&gt;
		else&lt;br /&gt;
		  Exit;&lt;br /&gt;
		if RowLabelNode = nil then Exit;&lt;br /&gt;
		{ find the parent node of RowLabelNode }&lt;br /&gt;
		Node := RowLabelNode;&lt;br /&gt;
		{ for the most total node return empty value }&lt;br /&gt;
		if Node = nil then Exit;&lt;br /&gt;
		{ the list of all nodes from the area of adequate comparisons including the given one }&lt;br /&gt;
		if Node.IsSubTotal then Exit;&lt;br /&gt;
		if (Node.Parent &amp;lt;&amp;gt; nil) and Node.Parent.IsSubTotal then Exit;&lt;br /&gt;
		Nodes := Node.LabelNodes;&lt;br /&gt;
		{ find previous cells from the area of adequate comparisons }&lt;br /&gt;
		i := Node.Index - 1;&lt;br /&gt;
		if i &amp;gt;= 0 then&lt;br /&gt;
		begin&lt;br /&gt;
		  Node := Nodes[i];&lt;br /&gt;
		  if not Node.IsSubTotal then&lt;br /&gt;
		  begin&lt;br /&gt;
			PrevCell := FunctionData[ColTreeIndex, Node.TreeIndex]; // RowTreeIndex&lt;br /&gt;
			if PrevCell.NotEmpty then&lt;br /&gt;
			begin&lt;br /&gt;
			  Result := True;&lt;br /&gt;
			  x0 := PrevCell.Data;&lt;br /&gt;
			  case TrendVer of&lt;br /&gt;
				1: Res := (1 - x0/x1) * 100;&lt;br /&gt;
				2: Res := x0/x1 * 100;&lt;br /&gt;
			  end;&lt;br /&gt;
			end;&lt;br /&gt;
		  end;&lt;br /&gt;
		end;&lt;br /&gt;
	  end;&lt;br /&gt;
	end;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategoria: System]]&lt;br /&gt;
[[Kategoria: Programowanie]]&lt;/div&gt;</summary>
		<author><name>Awo</name></author>	</entry>

	</feed>