Склонение ФИО (постановка)
Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:
Создаем таблицу GD_MULTINAME, которая будет хранить название объекта с идентификатором refid в таблице relname на языке langid в падеже caseid.
Содержание |
Пример использования
Пусть в таблице GD_CONTACT мы имеем запись:
ID NAME ========================================== 20000001 Иванов Иван Иванович
а в таблице GD_GOOD:
ID NAME ========================================== 20000002 Мыло
Тогда, в таблице GD_MULTINAME могут быть следующие записи:
REFID LANGID CASEID NAME ============================================================= 20000001 RU D Иванову Ивану Ивановичу 20000001 RU G Иванова Ивана Ивановича 20000001 BE N Іваноў Іван Іванавіч 20000002 EN NULL Soap
Запрос, который извлечет ФИО человека в родительном падеже, будет выглядеть следующим образом:
SELECT
...
COALESCE(m.name, c.name),
...
FROM
...
gd_contact c LEFT JOIN gd_multiname m
ON c.id = m.refid AND m.langid = 'RU' AND m.caseid = 'G'
...
Обратите внимание, что если соответствующая запись в таблице gd_multiname будет отсутствовать, то запрос покажет наименование из таблицы gd_contact.
Аналогично, запрос, который пожет наименование товара на английском, если таковое присутствует в базе:
SELECT
...
COALESCE(m.name, g.name),
...
FROM
...
gd_good g LEFT JOIN gd_multiname m
ON g.id = m.refid AND m.langid = 'EN'
...
Удаление записей из таблицы gd_multiname
Поскольку refid не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая найдет и удалит все записи, которые не ссылаются ни на одну из таблиц в БД.
Организация пользовательского интерфейса
Можно предложить три варианта организации пользовательского интерфейса:
- В диалоговых окнах тех объектов, которые подразумевают наличие наименований на разных языках (в разных падежах), мы добавляем закладку со списком дополнительных наименований. На этой вкладке озможно редактирование непосредственно в таблице.
- Справа от поля ввода наименования добавить кнопку "..." по которой на экране открывать окно со списком наименований.
- На той же вкладке, где находится поле для ввода наименования, добавить TLabel (или TEdit в режиме только для чтения), где отображать дополнительные наименования. Рядом разместить кнопку "..." по которой на экране открывать окно со списком наименований для редактирования.