Страница 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
Да, значительный прогресс!
Уверен, истина где-то рядом!