Две таблицы в одном Browse

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Две таблицы в одном Browse

Сообщение falcon »

Помогите пожалуйста решить задачу....
Необходимо в одном Browse одновременно отобразить записи из двух несвязанных различных таблиц
для примера таблицы KATMC и KATUSL.
В Browse отобразить поля KATMC.NAME и KATUSL.NAME. Получается вывести только одну из таблиц или декартово произведение таблиц (заменить Table KATMC на ViewTable).
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Таким образом есть две независимые таблицы и они не связаны никак. И необходимо, что бы записи отображались одновременно в одном Browse сразу из обеих таблиц... Это как иметь два Browse с каждой из таблиц и слепить их вместе.
Последний раз редактировалось falcon Ср, 24/11/2010 21:12, всего редактировалось 3 раза.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Я для наглядности и упрощения задачи привел таблицы KATMC и KATUSL. Если удастся отобразить их, то более сложная и осмысленная задача тоже будет решена.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Представляется, что код интерфейса должен выглядеть примерно так (см. ниже).
Но ни как не могу правильно запрограммировать события. Может быть, кто-то сталкивался с данными событиями и быстрее найдет решение...

Код: Выделить всё

Interface Test2Table 'Test2Table' EscClose, Cyan;
Show At(,,90,20);

Var
ind : integer;

Create View
As Select
*
From
KATMC
,KATUSL
;

Panel pList;
Browse brTbl;
Fields
ind 'Ind': [10], Protect;

If(TreeGetNodeTable(brTbl)=tnKATMC, KATMC.NAME, If(TreeGetNodeTable(brTbl)=tnKATUSL, KATUSL.NAME, ''))
'NAME': [20], Protect;

If(TreeGetNodeTable(brTbl)=tnKATMC, 'МЦ', If(TreeGetNodeTable(brTbl)=tnKATUSL, 'Услуга', ''))
'Услуга/МЦ': [10], Protect;
End;
End;

TableEvent Table KATMC, EventNavigation
cmDoGetFirst:
{
ind :=0;
TreeSetNodeTable(brTbl, tnKATUSL);
RescanPanel(tnKATMC);
RescanPanel(tnKATUSL);
}
cmDoGetLast:
{
ind :=0;
}
cmDoGetPrev:
{
ind:=ind-10;
}
cmDoGetNext:
{
ind :=ind+10;
}
End;

TableEvent Table KATUSL, EventNavigation
cmDoGetFirst:
{
ind := 1000;
}
cmDoGetLast:
{
ind := 1000;
TreeSetNodeTable(brTbl, tnKATMC);
RescanPanel(tnKATMC);
RescanPanel(tnKATUSL);
}
cmDoGetPrev:
{
ind :=ind-5;
}
cmDoGetNext:
{
ind :=ind+5;
}
End;

HandleEvent
cmInit:
{
ind:=500;
}
End;
End.
kroxa
топ-софт
Сообщения: 65
Зарегистрирован: Пт, 07/09/2007 11:57
Имя Фамилия: Александр Крахотко
Откуда: ТопСофт
Контактная информация:

Re: Две таблицы в одном Browse

Сообщение kroxa »

а таблица в памяти Вас не устроит?
слили обе таблицы, построили нужный индекс - все работает.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Временная таблица связи/объединения имеет один минус.
Если добавит/удалит запись в т. KATMC или KATUSL другой пользователь на другом ПК, то в таблице связи не будет видна эта запись (или надо постоянно сканировать таблицы КАТМC и KATUSL на предмет добавления/ удаления).
Задача и состоит, как обойтись без временной таблицы связи/объединения встроенными средствами или умными запросами.
kroxa
топ-софт
Сообщения: 65
Зарегистрирован: Пт, 07/09/2007 11:57
Имя Фамилия: Александр Крахотко
Откуда: ТопСофт
Контактная информация:

Re: Две таблицы в одном Browse

Сообщение kroxa »

falcon писал(а):Если добавит/удалит запись в т. KATMC или KATUSL другой пользователь на другом ПК, то в таблице связи не будет видна эта запись
если другой добавит/удалит и у вас Oracle или MS-SQL, то эта запись видна не будет:) только переоткрытие интерфейса (GetFirst не поможет).
кроме этого есть-же LastDate LastTime - можно по эти полям что-то добавлять в память- а нужно ли?
у Вас действительно настолько большая динамика изменения каталогов МЦ и Услуг?

у таблицы в памяти главное преимущество - навигация и быстрый поиск работать будут быстро.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Многое в вышесказанном достаточно спорно (не будут видны записи, ускорится работа на больших объемах), но не это главное.
Таблица связи/объединения представляется достаточно грубым, "топорным" решением.
Должно быть более изящное решение, я верю в это… :-)
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: Две таблицы в одном Browse

Сообщение cruger »

Браузер по БД строится на какой-то выборке. Либо на узле, либо на всей ЛТ.
Выборка описывается на Атлантис-SQL.
В Атлантис-SQL нет union. Значит нужную выборку описать невозможно.

Стало быть браузер надо строить не по БД.

см. в доке eventnavigation

Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.

Ещё на SQL платформах можно докомпилировать словарь, добавить табличку с нужной структурой. А потом внешними средствами табличку заменить на вьюху по запросу с объединением.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

cruger писал(а):Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.
Это интересное решение и в принципе полностью удовлетворяет требованиям. Я пробовал его - но не могу на одном уровне(TreeLevel одинаковый) отобразить записи из двух различных таблиц.. . На разных (подчиненных, отличных) получается.
Уверенность в том, что решение существует как раз и питает возможность строить смешанное дерево.
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: Две таблицы в одном Browse

Сообщение cruger »

Код: Выделить всё

interface aaa;
table struct tl
( i: integer,
  s: string
)
with index
( iii = i(unique)
);

create view as select * from x$users t1, groups t2,tl;

function fldval: string; forward;

tree tr;
table tl;
fields
fldval: [20],protect;
end;

function fldval: string;
{
 result := case(treegetnodetable(tr); tntl: tl.s, tnt1: xu$loginname, tnt2: name);
}

handleevent
cminit:
{
insert tl set i=1,s='users';
insert tl set i=2,s='groups';
}
cmtreetop: treesetnodetable(tr,tntl);
cmtreeup: treesetnodetable(tr,tntl);
cmtreedown:
 if treegetnodetable(tr)=tntl {
  if tl.i=1 treesetnodetable(tr,tnt1)
  else treesetnodetable(tr,tnt2);
 }
 else abort;
cmtreenodetype: treesetnodetype(tr,if(treegetnodetable(tr)=tntl,if(treenodeisopen(tr),ntfOpen,ntfClose),ntfText));
end;
end.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Да, это прекрасный пример смешанного дерева, но к сожалению мне не помогает (видимо я не точно выразил свою мысль с TreeLevel).
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: Две таблицы в одном Browse

Сообщение cruger »

Это как раз пример реализации
Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Две таблицы в одном Browse

Сообщение falcon »

Да еще бы корневых узлов не было видно - тогда да.

Можно программно расскрыть все узлы и указать
tree -1 tr;
и получим список (рис. 2) из дерева (рис. 1), но корневые узлы остаются.

Рис.1
Изображение

Рис.2
Изображение
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Re: Две таблицы в одном Browse

Сообщение cruger »

хм, мне показалось, я в первом ответе пояснил, почему такой браузер по бд сделать не получится

только с навигацией по событиям можно попробовать
Ответить