Склонение ФИО (постановка)
SYSDBA (обсуждение | вклад) (→Идентификаторы падежей для русского языка) |
SYSDBA (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | + | При оформлении различных документов на основании информации из базы данных часто возникает необходимость в склонении имен существительных по падежам. Например, справка выдана ''Петрову'', принять на работу ''Сидорова'' и т.п. Кроме этого, есть необходимость в хранении переводов наименований объектов на различные языки. Предлагается решить две указанные проблемы следующим образом. Создаем таблицу [[GD_MULTINAME]], каждая запись которой хранит наименование для объекта заданного идентификатором '''refid''' из таблицы '''relationkey'''. Поля '''langid''' и '''caseid''' содержат языковой тэг и падеж соответственно. Поле '''caseid''' заполняется только в тех случаях, когда это имеет смысл. Для одного объекта таблица [[GD_MULTINAME]] может содержать несколько наименований на разных языках и/или в разных падежах. В запросы, извлекающие наименование объекта мы будем добавлять '''LEFT JOIN''' на таблицу [[GD_MULTINAME]] для извлечения имени в нужном падеже и/или на нужном языке. | |
| − | + | ||
| − | Создаем таблицу [[GD_MULTINAME]], | + | |
| − | + | ||
| − | + | ||
=== Пример использования === | === Пример использования === | ||
| Строка 23: | Строка 19: | ||
REFID LANGID CASEID NAME | REFID LANGID CASEID NAME | ||
============================================================= | ============================================================= | ||
| − | 20000001 | + | 20000001 ru D Иванову Ивану Ивановичу |
| − | 20000001 | + | 20000001 ru G Иванова Ивана Ивановича |
| − | 20000001 | + | 20000001 be N Іваноў Іван Іванавіч |
| − | 20000002 | + | 20000002 en NULL Soap |
Запрос, который извлечет ФИО человека в родительном падеже, будет выглядеть следующим образом: | Запрос, который извлечет ФИО человека в родительном падеже, будет выглядеть следующим образом: | ||
| Строка 37: | Строка 33: | ||
... | ... | ||
gd_contact c LEFT JOIN gd_multiname m | gd_contact c LEFT JOIN gd_multiname m | ||
| − | ON c.id = m.refid AND m.langid = ' | + | ON c.id = m.refid AND m.langid = 'ru' AND m.caseid = 'G' |
... | ... | ||
| Строка 51: | Строка 47: | ||
... | ... | ||
gd_good g LEFT JOIN gd_multiname m | gd_good g LEFT JOIN gd_multiname m | ||
| − | ON g.id = m.refid AND m.langid = ' | + | ON g.id = m.refid AND m.langid = 'en' |
... | ... | ||
| + | |||
| + | |||
| + | === Бизнес-класс TgdcMultiName === | ||
| + | |||
| + | Таблица gd_multiname является главной таблицей для бизнес-класса [[TgdcMultiName]]. | ||
=== Удаление записей из таблицы gd_multiname === | === Удаление записей из таблицы gd_multiname === | ||
| − | Поскольку refid не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая | + | Поскольку refid не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая для каждой записи в gd_multiname будет проверять ее существование в таблице relationkey и удалять в случае отсутствия. |
=== Организация пользовательского интерфейса === | === Организация пользовательского интерфейса === | ||
Версия 10:30, 31 июля 2008
При оформлении различных документов на основании информации из базы данных часто возникает необходимость в склонении имен существительных по падежам. Например, справка выдана Петрову, принять на работу Сидорова и т.п. Кроме этого, есть необходимость в хранении переводов наименований объектов на различные языки. Предлагается решить две указанные проблемы следующим образом. Создаем таблицу GD_MULTINAME, каждая запись которой хранит наименование для объекта заданного идентификатором refid из таблицы relationkey. Поля langid и caseid содержат языковой тэг и падеж соответственно. Поле caseid заполняется только в тех случаях, когда это имеет смысл. Для одного объекта таблица GD_MULTINAME может содержать несколько наименований на разных языках и/или в разных падежах. В запросы, извлекающие наименование объекта мы будем добавлять LEFT JOIN на таблицу GD_MULTINAME для извлечения имени в нужном падеже и/или на нужном языке.
Содержание |
Пример использования
Пусть в таблице 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'
...
Бизнес-класс TgdcMultiName
Таблица gd_multiname является главной таблицей для бизнес-класса TgdcMultiName.
Удаление записей из таблицы gd_multiname
Поскольку refid не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая для каждой записи в gd_multiname будет проверять ее существование в таблице relationkey и удалять в случае отсутствия.
Организация пользовательского интерфейса
Можно предложить три варианта организации пользовательского интерфейса:
- В диалоговых окнах тех объектов, которые подразумевают наличие наименований на разных языках (в разных падежах), мы добавляем закладку со списком дополнительных наименований. На этой вкладке озможно редактирование непосредственно в таблице.
- Справа от поля ввода наименования добавить кнопку "..." по которой на экране открывать окно со списком наименований.
- На той же вкладке, где находится поле для ввода наименования, добавить TLabel (или TEdit в режиме только для чтения), где отображать дополнительные наименования. Рядом разместить кнопку "..." по которой на экране открывать окно со списком наименований для редактирования.