Добавить в корзинуПозвонить
Найти в Дзене
Oracle APEX

Oracle APEX - цвета сотрудников на графике по имени, отчеству и фамилии

Oracle APEX назначает цвета на графике по порядку - можно ли сопоставить имени, отчеству и фамилии отображаемых сотрудников фиксированный и автоматически назначаемый цвет?
Да, можно.

Oracle APEX назначает цвета на графике по порядку - можно ли сопоставить имени, отчеству и фамилии отображаемых сотрудников фиксированный и автоматически назначаемый цвет?

Да, можно.

Предположим, у нас есть таблица сотрудников, содержащая идентификатор, имя, отчество и фамилию. Выберу свою запись:

select id, f_name, m_name, l_name
from pers_arch_144_vi
where f_name = 'IT_Юрий' and l_name = 'Кирчин'
;
524 IT_Юрий Геннадьевич Кирчин

Мы бы хотели сопоставить каждому сотруднику в этой таблице уникальный цвет, используемый в дальнейшем для отображения их достижений на графиках. Уникальным является сочетание имени, отчества и фамилии - а цвет в Web'е состоит также из трех компонентов: Reg, Green, Blue, т.е. RGB в 16-ричной системе. Если мы сопоставим имя с R, отчество с G, а фамилию с B, - то мы получим уникальное соответствие цвета полному имени человека.

Рассмотрим сначала на одном из трех компонентов, пусть это будет имя - компонент цвета R. Возьмем от него хэш по норме 255 (максимальный диапазон цвета):

select f_name, ora_hash(f_name, 255)
from pers_arch_144_vi
where f_name = 'IT_Юрий' and l_name = 'Кирчин'
;
IT_Юрий 210

Теперь преобразуем полученное значение к 16-ричному формату:

select f_name, to_char(ora_hash(f_name, 255), 'XX')
from pers_arch_144_vi
where f_name = 'IT_Юрий' and l_name = 'Кирчин'
;
IT_Юрий D2

Учтем, что значение может быть однозначным, а нам нужно обязательное двузначное значение:

select f_name, lpad(trim(to_char(ora_hash(f_name, 255), 'XX')), 2, '0')
from pers_arch_144_vi
where f_name = 'IT_Юрий' and l_name = 'Кирчин'
;
IT_Юрий D2

Запишем по аналогии для имени, отчества и фамилии, учтя, что в некоторых случаях в данных могут быть пропуски (null):

select f_name, m_name, l_name
, nvl(lpad(trim(to_char(ora_hash(f_name, 255), 'XX')), 2, '0'), '00')
|| nvl(lpad(trim(to_char(ora_hash(m_name, 255), 'XX')), 2, '0'), '00')
|| nvl(lpad(trim(to_char(ora_hash(l_name, 255), 'XX')), 2, '0'), '00') as rgb
from pers_arch_144_vi
where f_name = 'IT_Юрий' and l_name = 'Кирчин'
;
IT_Юрий Геннадьевич Кирчин D2B2AC

Vu a la - каждому имени, отчеству и фамилии у нас сопоставлен однозначно соответствующий ему RGB цвет.

Для предотвращения проблемы полных тезок мы можем конкатенировать заведомо уникальный первичный ключ, например, к фамилии.