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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Идентификаторы падежей для русского языка)
Строка 1: Строка 1:
Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:
+
При оформлении различных документов на основании информации из базы данных часто возникает необходимость в склонении имен существительных по падежам. Например, справка выдана ''Петрову'', принять на работу ''Сидорова'' и т.п. Кроме этого, есть необходимость в хранении переводов наименований объектов на различные языки. Предлагается решить две указанные проблемы  следующим образом. Создаем таблицу [[GD_MULTINAME]], каждая запись которой хранит наименование для объекта заданного идентификатором '''refid''' из таблицы '''relationkey'''. Поля '''langid''' и '''caseid'''  содержат языковой тэг и падеж соответственно. Поле '''caseid''' заполняется только в тех случаях, когда это имеет смысл. Для одного объекта таблица [[GD_MULTINAME]] может содержать несколько наименований на разных языках и/или в разных падежах. В запросы, извлекающие наименование объекта мы будем добавлять '''LEFT JOIN''' на таблицу [[GD_MULTINAME]] для извлечения имени в нужном падеже и/или на нужном языке.
 
+
Создаем таблицу [[GD_MULTINAME]], которая будет хранить название объекта с идентификатором refid в таблице relname на языке langid в падеже caseid.
+
 
+
 
+
  
 
=== Пример использования ===
 
=== Пример использования ===
Строка 23: Строка 19:
 
  REFID        LANGID      CASEID      NAME
 
  REFID        LANGID      CASEID      NAME
 
  =============================================================
 
  =============================================================
  20000001    RU         D            Иванову Ивану Ивановичу
+
  20000001    ru         D            Иванову Ивану Ивановичу
  20000001    RU         G            Иванова Ивана Ивановича
+
  20000001    ru         G            Иванова Ивана Ивановича
  20000001    BE         N            Іваноў Іван Іванавіч
+
  20000001    be         N            Іваноў Іван Іванавіч
  20000002    EN         NULL        Soap
+
  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 = 'RU' AND m.caseid = 'G'
+
       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 = 'EN'  
+
       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 и удалять в случае отсутствия.

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

Можно предложить три варианта организации пользовательского интерфейса:

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

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

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

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