Особенность структуры таблиц HFM с версии 11.1.2.2

Чтобы разобраться с одним багом скрипта расчета HFM, мне понадобилось понять, как вставляются данные в DCE таблицы. В DCE таблицах обнаружились два атрибута lcustom1 и lcustom2. А кастомов в приложении – 4. В старых версиях в этих полях были просто IDшники из соответствующих таблиц справочников кастомов, и было их столько же, сколько кастомов. Начиная c 11.1.2.2, всё стало интереснее. Пришлось поломать голову, чтобы разобраться.

В таблице <APPNAME>_CUSTOM_MAP содержится описание кодирования кодов кастомов в полях lcustom1…lcustomN.

Здесь для кастомов(DIMID) описано, в каком номере lcustom оно закодировано (поле COLNUM), с какого байта начинается и сколько байт занимает (OFFSET, LENGTH).

Т.е. чтобы запросить таблицу типа DCE и приклеить элементы кастомов, надо написать запрос такого типа:

select c1.label as C1,
       c2.label as C2,
       c3.label as C3,
       c4.label as C4,
       d.*
from
  (
  select bitand(t.lcustom1, to_number('00000000ffffffff','XXXXXXXXXXXXXXXX')) as C1id,
	   /* C1 = lcustom1 & 0x00000000ffffffff*/
         bitand(t.lcustom1, to_number('ffffffff00000000','XXXXXXXXXXXXXXXX')) /  to_number('000000100000000','XXXXXXXXXXXXXXXX') as C2id,
            /* C2 = (lcustom1 & 0xffffffff00000000) / 0x000000100000000 */
         bitand(t.lcustom2, to_number('00000000ffffffff','XXXXXXXXXXXXXXXX')) as C3id,
            /* C3 = lcustom2 & 0x00000000ffffffff*/
         bitand(t.lcustom2, to_number('ffffffff00000000','XXXXXXXXXXXXXXXX')) /  to_number('000000100000000','XXXXXXXXXXXXXXXX') as C4id,
            /* C4 = (lcustom2 & 0xffffffff00000000) / 0x000000100000000 */
         t.*
  from FACT_DCE_8_2014 t
  ) d,
  (select ci.* from fact_custom_item ci, fact_custom_header ch
      where ci.ldimid = ch.ldimid and ch.treelabel = 'Custom1') c1,
  (select ci.* from fact_custom_item ci, fact_custom_header ch
      where ci.ldimid = ch.ldimid and ch.treelabel = 'Custom2') c2,
  (select ci.* from fact_custom_item ci, fact_custom_header ch
      where ci.ldimid = ch.ldimid and ch.treelabel = 'Custom3') c3,
  (select ci.* from fact_custom_item ci, fact_custom_header ch
      where ci.ldimid = ch.ldimid and ch.treelabel = 'Custom4') c4
where
  d.C1id = c1.itemid and
  d.C2id = c2.itemid and
  d.C3id = c3.itemid and
  d.C4id = c4.itemid