Две таблицы в одном Browse
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Две таблицы в одном Browse
Помогите пожалуйста решить задачу....
Необходимо в одном Browse одновременно отобразить записи из двух несвязанных различных таблиц
для примера таблицы KATMC и KATUSL.
В Browse отобразить поля KATMC.NAME и KATUSL.NAME. Получается вывести только одну из таблиц или декартово произведение таблиц (заменить Table KATMC на ViewTable).
Необходимо в одном Browse одновременно отобразить записи из двух несвязанных различных таблиц
для примера таблицы KATMC и KATUSL.
В Browse отобразить поля KATMC.NAME и KATUSL.NAME. Получается вывести только одну из таблиц или декартово произведение таблиц (заменить Table KATMC на ViewTable).
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Таким образом есть две независимые таблицы и они не связаны никак. И необходимо, что бы записи отображались одновременно в одном Browse сразу из обеих таблиц... Это как иметь два Browse с каждой из таблиц и слепить их вместе.
Последний раз редактировалось falcon Ср, 24/11/2010 21:12, всего редактировалось 3 раза.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Я для наглядности и упрощения задачи привел таблицы KATMC и KATUSL. Если удастся отобразить их, то более сложная и осмысленная задача тоже будет решена.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Представляется, что код интерфейса должен выглядеть примерно так (см. ниже).
Но ни как не могу правильно запрограммировать события. Может быть, кто-то сталкивался с данными событиями и быстрее найдет решение...
Но ни как не могу правильно запрограммировать события. Может быть, кто-то сталкивался с данными событиями и быстрее найдет решение...
Код: Выделить всё
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.
-
- топ-софт
- Сообщения: 65
- Зарегистрирован: Пт, 07/09/2007 11:57
- Имя Фамилия: Александр Крахотко
- Откуда: ТопСофт
- Контактная информация:
Re: Две таблицы в одном Browse
а таблица в памяти Вас не устроит?
слили обе таблицы, построили нужный индекс - все работает.
слили обе таблицы, построили нужный индекс - все работает.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Временная таблица связи/объединения имеет один минус.
Если добавит/удалит запись в т. KATMC или KATUSL другой пользователь на другом ПК, то в таблице связи не будет видна эта запись (или надо постоянно сканировать таблицы КАТМC и KATUSL на предмет добавления/ удаления).
Задача и состоит, как обойтись без временной таблицы связи/объединения встроенными средствами или умными запросами.
Если добавит/удалит запись в т. KATMC или KATUSL другой пользователь на другом ПК, то в таблице связи не будет видна эта запись (или надо постоянно сканировать таблицы КАТМC и KATUSL на предмет добавления/ удаления).
Задача и состоит, как обойтись без временной таблицы связи/объединения встроенными средствами или умными запросами.
-
- топ-софт
- Сообщения: 65
- Зарегистрирован: Пт, 07/09/2007 11:57
- Имя Фамилия: Александр Крахотко
- Откуда: ТопСофт
- Контактная информация:
Re: Две таблицы в одном Browse
если другой добавит/удалит и у вас Oracle или MS-SQL, то эта запись видна не будет:) только переоткрытие интерфейса (GetFirst не поможет).falcon писал(а):Если добавит/удалит запись в т. KATMC или KATUSL другой пользователь на другом ПК, то в таблице связи не будет видна эта запись
кроме этого есть-же LastDate LastTime - можно по эти полям что-то добавлять в память- а нужно ли?
у Вас действительно настолько большая динамика изменения каталогов МЦ и Услуг?
у таблицы в памяти главное преимущество - навигация и быстрый поиск работать будут быстро.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Многое в вышесказанном достаточно спорно (не будут видны записи, ускорится работа на больших объемах), но не это главное.
Таблица связи/объединения представляется достаточно грубым, "топорным" решением.
Должно быть более изящное решение, я верю в это… :-)
Таблица связи/объединения представляется достаточно грубым, "топорным" решением.
Должно быть более изящное решение, я верю в это… :-)
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Re: Две таблицы в одном Browse
Браузер по БД строится на какой-то выборке. Либо на узле, либо на всей ЛТ.
Выборка описывается на Атлантис-SQL.
В Атлантис-SQL нет union. Значит нужную выборку описать невозможно.
Стало быть браузер надо строить не по БД.
см. в доке eventnavigation
Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.
Ещё на SQL платформах можно докомпилировать словарь, добавить табличку с нужной структурой. А потом внешними средствами табличку заменить на вьюху по запросу с объединением.
Выборка описывается на Атлантис-SQL.
В Атлантис-SQL нет union. Значит нужную выборку описать невозможно.
Стало быть браузер надо строить не по БД.
см. в доке eventnavigation
Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.
Ещё на SQL платформах можно докомпилировать словарь, добавить табличку с нужной структурой. А потом внешними средствами табличку заменить на вьюху по запросу с объединением.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Это интересное решение и в принципе полностью удовлетворяет требованиям. Я пробовал его - но не могу на одном уровне(TreeLevel одинаковый) отобразить записи из двух различных таблиц.. . На разных (подчиненных, отличных) получается.cruger писал(а):Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.
Уверенность в том, что решение существует как раз и питает возможность строить смешанное дерево.
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Re: Две таблицы в одном Browse
Код: Выделить всё
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.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Да, это прекрасный пример смешанного дерева, но к сожалению мне не помогает (видимо я не точно выразил свою мысль с TreeLevel).
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Re: Две таблицы в одном Browse
Это как раз пример реализации
Ещё можно сделать дерево с двумя корневыми узлами, в одном содержимое одной таблицы выводить, в другом - другой.
-
- партнер
- Сообщения: 45
- Зарегистрирован: Чт, 04/10/2007 09:27
- Имя Фамилия: Александр Волков
- Откуда: Фалькон плюс
Re: Две таблицы в одном Browse
Да еще бы корневых узлов не было видно - тогда да.
Можно программно расскрыть все узлы и указать
tree -1 tr;
и получим список (рис. 2) из дерева (рис. 1), но корневые узлы остаются.
Рис.1
Рис.2
Можно программно расскрыть все узлы и указать
tree -1 tr;
и получим список (рис. 2) из дерева (рис. 1), но корневые узлы остаются.
Рис.1
Рис.2
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
Re: Две таблицы в одном Browse
хм, мне показалось, я в первом ответе пояснил, почему такой браузер по бд сделать не получится
только с навигацией по событиям можно попробовать
только с навигацией по событиям можно попробовать