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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:
 
Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:
  
Создаем таблицу [GD_MULTINAME], которая будет хранить название объекта с идентификатором refid в таблице relname на языке langid в падеже caseid.
+
Создаем таблицу [[GD_MULTINAME]], которая будет хранить название объекта с идентификатором refid в таблице relname на языке langid в падеже caseid.
  
 
=== Идентификаторы падежей для русского языка ===
 
=== Идентификаторы падежей для русского языка ===

Версия 09:38, 31 июля 2008

Предлагается решить проблемы склонения имен по падежам и хранения имен на разных языках следующим образом:

Создаем таблицу GD_MULTINAME, которая будет хранить название объекта с идентификатором refid в таблице relname на языке langid в падеже caseid.

Содержание

Идентификаторы падежей для русского языка

Название Идентификатор
Именительный N
Родительный G
Дательный D
Винительный A
Творительный B
Предложный L

Пример использования

Пусть в таблице 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 не является внешним ключем, то применить автоматическое каскадное удаление невозможно. Для очистки таблицы от ненужных записей придется написать хранимую процедуру, которая найдет и удалит все записи, которые не ссылаются ни на одну из таблиц в БД.

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

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

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

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

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

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