Страница 1 из 1
Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:03
gloomy
Помогите пожалуйста решить задачу....
Необходимо в одном Browse одновременно отобразить записи из двух несвязанных различных таблиц
для примера таблицы KATMC и KATUSL.
В Browse отобразить поля KATMC.NAME и KATUSL.NAME. Получается вывести только одну из таблиц или декартово произведение таблиц (заменить Table KATMC на ViewTable).
Interface Test2Table 'Test2Table' EscClose, Cyan;
Show At(,,90,20);
Create View
As Select
*
From
KATMC
,KATUSL
;
Panel pList;
Table KATMC;
Browse brTbl;
Fields
KATMC.NAME 'NAME' : [90], Protect;
End;
End;
End.
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:09
edward_K
есть 2 пути
1. в select объявить поле
.... ,if(spsopr.prmc=1,katm.name,katusl.name) (fieldname=namespec)
допустимо использование функций, их надо перед select объявить с ключем forward
2. выражение выше использовать прямо в броусе или скрине. Минус в том что неизвестно, что возратит curfield.
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:13
gloomy
У меня нет SPSOPR, и он мне не нужен...
Есть две независимые таблицы и они не связаны никак. И необходимо, что бы записи отображались одновременно в одном Browse сразу из обеих таблиц... Это как иметь два Browse с каждой из таблиц и слепить их вместе
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:31
Алексей
а какой смысл?
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:34
gloomy
Я для наглядности и упрощения задачи привел таблицы KATMC и KATUSL. Если удастся отобразить их, то более сложная и осмысленная задача тоже будет решена.
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:41
edward_K
ну тогда вариант один - временная таблица, а поля из дочек вывести как я написал.
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 13:49
gloomy
Временная таблица связи/объединения имеет один минус.
Если добавит/удалит запись в т. KATMC или KATUSL другой пользователь на другом ПК, то в таблице связи не будет видна эта запись (или надо постоянно сканировать таблицы КАТМC и KATUSL на предмет добавления/ удаления).
Задача и состоит, как обойтись без временной таблицы связи/объединения встроенными средствами или умными запросами.
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 20:02
LaaLaa
Ищите в документации по Атлантису ключевое слово EventNavigation и описание событий cmDoGetPrev, cmDoGetNext, cmDoGetFirst, cmDoGetLast. Можно попробовать сделать программный обход по записям. Сначала по одной таблице. Когда она кончится перейти на другую.
Re: Две таблицы в одном Browse
Добавлено: 22 ноя 2010, 23:22
gloomy
Действительно, представляется, что код интерфейса должен выглядеть примерно так (см. ниже).
Но ни как не могу правильно запрограммировать события. Может быть, кто-то сталкивался с данными событиями и быстрее найдет решение...
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.
Re: Две таблицы в одном Browse
Добавлено: 25 ноя 2010, 21:52
gloomy
Застопорился значительный (для меня) проект из-за невозможности решить данную задачу.
Готов заплатить вознаграждение (из личных сбережений) от 300-500 WMR, первому программисту, представившему изящное решение (без таблицы связи/объединения) задачи.
Re: Две таблицы в одном Browse
Добавлено: 25 ноя 2010, 22:04
m0p3e
Без временной все равно не получится, IMHO.
Другое дело, что строить ее и обновлять можно по разному.
Если СУБД Сиквел или Оракл, то прямо просится заполнение через прямой SQL + UNION
Ну и обновление через тот же DSQL по cmIdle.
Re: Две таблицы в одном Browse
Добавлено: 26 ноя 2010, 16:39
LaaLaa
Набросал пример EventNavigation для вашего случая. Правда не совсем неправильно работают клавиши PageUp PageDown. Где то есть ошибка - не додумал.
Код: Выделить всё
Interface Test2Table blue;
Var
WhatTable : integer; // 0 - KatMc, 1 - KatUsl
IsStart : boolean;
Create View As Select * From KATMC, KATUSL;
Browse brTwoTables NotableNavigation;
Fields
if(WhatTable = 0, 'МЦ', 'Услуга') 'Table': [10], Protect;
if(WhatTable = 0, KatMC.NRec, KatUsl.Nrec) 'Nrec': [10], Protect;
if(WhatTable = 0, KatMC.Name, KatUsl.Name) 'Name': [60], Protect;
End;
function GoNext : boolean;
{
result := false;
if( IsStart )
{
IsStart := false;
if( WhatTable = 1 )
exit;
if( getfirst katmc = tsok )
{
result := true;
exit;
}
else
{
WhatTable := 1;
if( getfirst katusl = tsok )
{
result := true;
exit;
}
}
}
else
{
if(WhatTable = 0)
{
if( getnext katmc = tsok )
{
result := true;
exit;
}
else
{
WhatTable := 1;
if( getfirst katusl = tsok )
{
result := true;
exit;
}
}
}
if(WhatTable = 1)
{
if( getnext katusl = tsok )
{
result := true;
exit;
}
}
}
}
function GoPrev : boolean;
{
result := false;
if( IsStart )
{
IsStart := false;
if( WhatTable = 0 )
exit;
if( getlast katusl = tsok )
{
result := true;
exit;
}
else
{
WhatTable := 0;
if( getlast katmc = tsok )
{
result := true;
exit;
}
}
}
else
{
if(WhatTable = 1)
{
if( getprev katusl = tsok )
{
result := true;
exit;
}
else
{
WhatTable := 0;
if( getlast katmc = tsok )
{
result := true;
exit;
}
}
}
if(WhatTable = 0)
{
if( getprev katmc = tsok )
{
result := true;
exit;
}
}
}
}
handleevent
cmInit:
{
WhatTable := 0;
IsStart := true;
}
cmDoGetFirst:
{
WhatTable := 0;
IsStart := true;
//if( not GoNext )
// abort;
}
cmDoGetLast:
{
WhatTable := 1;
IsStart := true;
//if( not GoPrev )
// abort;
}
cmDoGetNext:
{
if( not GoNext )
abort;
}
cmDoGetPrev:
{
if( not GoPrev )
abort;
}
End;
End.
Re: Две таблицы в одном Browse
Добавлено: 26 ноя 2010, 16:56
gloomy
Да, значительный прогресс!
Уверен, истина где-то рядом!