несколько таблиц в Browse

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

несколько таблиц в Browse

Сообщение BlazeBio »

Можно ли в интерфейсе поля из двух и более таблиц отобразить в одном browse не используя при этом временные таблицы?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: несколько таблиц в Browse

Сообщение galover »

Атрибут cartesian может быть использован, если необходимо отобразить декартово произведение таблиц в одной области ввода. При наличии этого атрибута записи в области ввода будут видны как результат предложения select из корневой таблицы области ввода и всех к ней подцепленных. (По умолчанию видно все записи из корневой таблицы и для каждой такой записи по одной из всех подцепляемых).
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Re: несколько таблиц в Browse

Сообщение BlazeBio »

galover, только не совсем понятно где и к чему этот атрибут cartesian использовать? Если можно - примерчик.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: несколько таблиц в Browse

Сообщение galover »

ну смотри, есть view

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

create view as select * from KatSopr, SpSopr where ((KatSopr.NRec == SpSopr.cSopr));

browse;
  table KatSopr;
  fields
      KatSopr.NRec : protect;
      SpSopr.NRec : protect;
end;
В таком случае у тебя для каждой записи из KatSopr-a будет одна запись из SpSopr-a (первая в подцепке). Всего записей в browse будет RecordsInTable(tnKatSopr)

А вот так

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

browse;
  table KatSopr, cartesian;
  fields
      KatSopr.NRec : protect;
      SpSopr.NRec : protect;
end;
Для всех записей из SpSopr-a будет родительская из KatSopr-a. Всего записей в browse будет RecordsInTable(tnSpSopr). Vipprogr.chm скачал?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Re: несколько таблиц в Browse

Сообщение BlazeBio »

Сформировал я два брауза.
В одном katsop.nrec соответствует свой spsopr.nrec.
Во втором есть несколькоы spsopr.nrec для повторяющихся строк katsopr.nrec .
Почему в первом случае столько записей RecordsInTable(tnKatSopr), а во втором именно столько записей RecordsInTable(tnSpSopr)?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: несколько таблиц в Browse

Сообщение galover »

ну так во втором случае применен флаг cartesian - результат такой же как выполнение запроса в support. Или я вопрос не понял :-?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Re: несколько таблиц в Browse

Сообщение BlazeBio »

galover, получается, что без cartesian берётся только одна первая строка удовлетворяющая подцепке (для каждого spsopr.nrec один katsopr.nrec), а если использовать cartesian, то все строки удовлетворяющие подцепке (все ссылки spopr на katsopr). В итоге, как я понимаю, cartesian этим напоминает ALL в select.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: несколько таблиц в Browse

Сообщение galover »

Не совсем понял при чем тут all в select. Без cartesian будут выведены все строки корневой таблицы (не имеющей ограничений во view, в примере KatSopr) + для каждой записи корневой будет выведена первая запись из подцепки дочерней таблицы (в примере это SpSopr). А с cartesion будет перемножение записей во всех дочерних.
KatSopr table
KatSopr1
KatSopr2

SpSopr table
SpSopr1 KatSopr1
SpSopr2 KatSopr1
SpSopr3 KatSopr2
SpSopr4 KatSopr2
SpSopr5 KatSopr2

Результат

Без cartesian:
KatSopr1 SpSopr1
KatSopr2 SpSopr3

C cartesian (так же и в support)
KatSopr1 SpSopr1
KatSopr1 SpSopr2
KatSopr2 SpSopr3
KatSopr2 SpSopr4
KatSopr2 SpSopr5
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Re: несколько таблиц в Browse

Сообщение BlazeBio »

Теперь всё ясно :)
А как быть, если будет больше таблиц, как узнать, которая из списка таблиц будет корневой?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: несколько таблиц в Browse

Сообщение galover »

все таблицы во view, которые не имеют ограничений, являются корневыми
Maverick
Абориген
Сообщения: 943
Зарегистрирован: 29 мар 2005, 17:49
Откуда: External Developer
Контактная информация:

Re: несколько таблиц в Browse

Сообщение Maverick »

galover писал(а):все таблицы во view, которые не имеют ограничений, являются корневыми
ммм... немножко не так Ж-)

думаю корректнее будет такое определение:
Корневой таблицей в выборке будет являться та таблица, которая а) либо не имеет ограничений б) либо ограничения на поля данной таблицы задаются константами.

Ведь по сути

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

Select * from table1, table2  Where (( a==table1.fileld and b==table2.field));
является вьюхой с 2 корневыми таблицами Ж-)
Изображение
Знающий людей разумен.
Знающий себя просветлён.
Побеждающий людей силен.
Побеждающий самого себя могущественнен
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: несколько таблиц в Browse

Сообщение Screw »

А в случае жесткой подцепки? 8-)
Виталий
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Re: несколько таблиц в Browse

Сообщение galover »

тогда еще выражения, например

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

private function SomeExpr : comp; forward;
select * from KatPodr where ((SomeExpr() == KatPodr.NRec));

//или даже так
select * from KatPodr, KatPodr KatPodrMain where ((root == KatPodr.NRec and SubStr(KatPodr.Code, 1, 3) == KatPodrMain.Code(noindex)));
в обоих случаях таблицы будут корневые. Т.е. корневая - это любая таблица, не ограниченная другой таблицей
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: несколько таблиц в Browse

Сообщение Den »

Ну а если так поставить вопрос - а может ли быть некорневой таблица при описании вью интрефейса в секции where которая ником образом не ссылается по внешнему ключу на другую (или оная вообще отсутствует во where а описана тока во from...) ?

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

Не совсем ясно, что имел ввиду Screw, упомянув про жесткие подцепки в рамках этой темы. Жесткая подцепка, имхо, лишь сужает ввыборку "слева". А как вот каки образом она связана с корнем ?

И потом, если говорить о корневой таблице в контексте видимого элемента, то получается что любая таблица корневая м.б. в принципе.
Если же в рамках описанной вью, то тут наверное по другому уже )
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Re: несколько таблиц в Browse

Сообщение Screw »

Это я к тому сделал замечание, что корневым для визуального элемента может быть абсолютно любой узел ЛТ. По всей видимости, случилось смешение понятий "корневистости", и хорошо бы для начала определиться с тем, какое из них мы обсуждаем.

Что же до темы ветки, то cartesian означает, что результирующее количество записей в браузе будет равно произведению количества записей во всех упомянутых в ЛТ несвязанных узлов. Для связанных узлов немного по-другому: записи из правой части подцепки суммируются. То есть, в примере

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

create view as select * from KatSopr, SpSopr where ((KatSopr.NRec == SpSopr.cSopr));
...
browse;
  table KatSopr, cartesian;
  fields
      KatSopr.NRec : protect;
      SpSopr.NRec : protect;
end;
результирующее количество записей будет равно, в условной записи, RecordInTable(#KatSopr) + Sum(foreach KatSopr RecordsInTable(#SpSopr) - if(IsValid(#SpSopr), 1, 0)).
Виталий
Ответить