Правильная ссылка на эту страницу
http://az-design.ru/Support/DataBase/DBTree2/2500.shtml

Древовидные структуры без отображения

Архангельский Андрей

       Есть множество примеров древовидных структур, которые не требуют не только древовидного отображения, но и какого-либо другого отображения. При этом они значительно упрощают архитектуру и упрощают работу клиентской программы.

 

Локализация приложений

       Если приложение работает с базами данных, то для локализации приложения можно использовать эту же базу данных. Для этого необходимо разместить в БД следующие элементы:

Create table LczFormTexts -- таблица текстов на всех языках
      (PID         AZSID not null Primary Key,
       Prnt        AZSID0,
       Cnt         AZInt32D0,
       Lang        Char(2) character set WIN1251,
       Text        AZTitle,
       DtModify    AZTStamp,
Unique(Lang,Text));
Commit;
CREATE GENERATOR gLczFormTexts;
   SET GENERATOR gLczFormTexts to 0;
Commit;
SET TERM !! ;
CREATE TRIGGER LczFormTexts_INSGEN FOR LczFormTexts
ACTIVE BEFORE INSERT AS
BEGIN
   NEW.PID=GEN_ID(gLczFormTexts,1);
END!!
SET TERM ; !!
Commit;
Create table LczFormItems -- таблица объектов и их свойств и ссылка на текст
      (Form        AZNames not null, -- Имя Формы
       Object      AZNames not null, -- имя объекта
       Prop        AZNames not null, -- свойство объекта
       TextID      AZSID references LczFormTexts on update cascade,
       DtModify    AZTStamp,
Primary Key(Form,Object,Prop));
Commit;
-- заполнение теблицы текстов
Insert into LczFormTexts(Lang,Text) values('00','Поиск персоналий');
Commit;
Insert into LczFormTexts(Prnt,Lang,Text)
Select PID, 'ru','Поиск персоналий'
  from LczFormTexts
 where Lang='00' and Text='Поиск персоналий';
Commit;
Insert into LczFormTexts(Prnt,Lang,Text)
Select PID, 'en','Search persons'
  from LczFormTexts
 where Lang='00' and Text='Поиск персоналий';
Commit;

       Сначала заносится родительская запись на языке оригинала с кодом языка '00', затем заносятся дочерние записи на необходимых языках, указанием родительской записи.

Insert into LczFormItems(Form,Object,Prop,TextID)
Select 'fmPersonSearch','Self','Caption',PID
  from LczFormTexts
 where Lang='00' and Text='Поиск персоналий';
Commit;

       После этого текст можно присвоить свойству 'Caption' объекта fmPersonSearch.self в таблице LczFormItems. И, наконец, для получения реального текста для этого свойства можно использовать следующее представление:

Create view LocalizeForms
as Select f.Form,f.Object,f.Prop,t.Text,t.Lang
   from   LczFormItems f, 
   join LczFormTexts t on t.Prnt=f.TextID;
Commit;

       Простой запрос

Select Text from LocalizeForms
 where Form='fmPersonSearch'
   and Object='Self'
   and Prop='Caption'
   and Lang='en';

       выдаст наименование свойства на указанном языке. Так как локализация происходит обычно при создании формы, то достаточно указать только наименование формы и язык и в цикле присвоить новые значения свойств всем объектам на форме.

 

Сортировка текстовых значений

       В различных справочниках возможны случаи, когда некоторый экземпляр объекта имеет несколько правильных значение, но в итоге поиска должно быть выбрано одно. Например, в списке улиц есть "ул. Академика Волгина", различные пользователи (а часто и так указано и в справочниках) ищут ее как "Волгина академика ул." или "Академика Волгина ул.". В этих случаях простое использование древовидной структуры позволяет решить эту проблему. Для этого достаточно построить таблицу следующим образом:

Create Streets
    (ID       Integer not null primary key,
     Prnt     Integer default 0,
     Name     varchar(50),
Unique(Name));
Commit;
Insert into Streets(Name) value('ул. Академика Волгина');
Insert into Streets(Prnt,Name)
Select ID,'улица Академика Волгина'
  from Streets
  Where Name='ул. Академика Волгина';
Insert into Streets(Prnt,Name)
Select ID,'Академика Волгина ул.'
  from Streets
  Where Name='ул. Академика Волгина';
Insert into Streets(Prnt,Name)
Select ID,'Волгина Академика ул.'
  from Streets
  Where Name='ул. Академика Волгина';
Commit;

       Для построения списка выбора, например, ComboBox нужно выбрать значения для которых поле Prnt<>0. Общее правило для построения таких таблиц заключается в том, то значение, которое будет выбрано должно быть родительским по отношению к значениям в списке выбора.

© 01.08.2009, Архангельский А.Г.

<<Пред. Оглавление
Начало раздела
След.>>




Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:44 MSK


Постоянный адрес статьи:
http://az-design.ru/Support/DataBase/DBTree2/2500.shtml