Склонение ФИО (постановка)

Материал из GedeminWiki
Перейти к: навигация, поиск

При оформлении различных документов на основании информации из базы данных часто возникает необходимость в склонении имен существительных по падежам. Например, справка выдана Петрову, принять на работу Сидорова и т.п. Кроме этого, есть необходимость в хранении переводов наименований объектов на различные языки. Предлагается решить две указанные проблемы следующим образом. Создаем таблицу 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 и удалять в случае отсутствия.

Организация пользовательского интерфейса

Можно предложить три варианта организации пользовательского интерфейса в диалоговых окнах тех объектов, которые подразумевают наличие наименований в разных падежах и/или на разных языках:

  1. Добавить вкладку со списком дополнительных наименований, на которой возможно редактирование непосредственно в таблице.
  2. Справа от поля ввода наименования добавить кнопку "..." по которой на экране открывать окно со списком наименований (форма просмотра TgdcMultiName с настроенными ExraConditions?).
  3. На той же вкладке, где находится поле для ввода наименования, добавить TLabel (TEdit или TMemo, в режиме только для чтения), где отображать дополнительные наименования. Рядом разместить кнопку "..." по которой на экране открывать окно со списком наименований для редактирования.

Ссылки по теме

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты