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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Организация пользовательского интерфейса)
Строка 98: Строка 98:
 
=== Организация пользовательского интерфейса ===
 
=== Организация пользовательского интерфейса ===
  
В диалоговых окнах тех объектов, которые подразумевают наличие наименований на разных языках (в разных падежах), мы добавляем закладку со списком дополнительных наименований.
+
Можно предложить три варианта организации пользовательского интерфейса:
 +
# В диалоговых окнах тех объектов, которые подразумевают наличие наименований на разных языках (в разных падежах), мы добавляем закладку со списком дополнительных наименований. На этой вкладке озможно редактирование непосредственно в таблице.
 +
# Справа от поля ввода наименования добавить кнопку "..." по которой на экране открывать окно со списком наименований.
 +
# На той же вкладке, где находится поле для ввода наименования, добавить TLabel (или TEdit в режиме только для чтения), где отображать дополнительные наименования. Рядом разместить кнопку "..." по которой на экране открывать окно со списком наименований для редактирования.
  
 
=== Ссылки по теме ===
 
=== Ссылки по теме ===

Версия 16:41, 30 июля 2008

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

Создаем таблицу:

 CREATE TABLE gd_multiname (
   id       dintkey,
   relname  drelationname,
   refid    dintkey,
   langid   CHAR(20) NOT NULL,
   caseid   CHAR(1),
   name     dname,

   PRIMARY KEY gp_pk_multiname (id),
   UNIQUE (refid, langid, caseid)
 )

Эта таблица будет хранить название объекта с идентификатором 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 в режиме только для чтения), где отображать дополнительные наименования. Рядом разместить кнопку "..." по которой на экране открывать окно со списком наименований для редактирования.

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

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

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