Страница 1 из 2

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

Добавлено: 16 июл 2010, 14:09
BlazeBio
Можно ли в интерфейсе поля из двух и более таблиц отобразить в одном browse не используя при этом временные таблицы?

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

Добавлено: 16 июл 2010, 14:30
galover
Атрибут cartesian может быть использован, если необходимо отобразить декартово произведение таблиц в одной области ввода. При наличии этого атрибута записи в области ввода будут видны как результат предложения select из корневой таблицы области ввода и всех к ней подцепленных. (По умолчанию видно все записи из корневой таблицы и для каждой такой записи по одной из всех подцепляемых).

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

Добавлено: 16 июл 2010, 14:40
BlazeBio
galover, только не совсем понятно где и к чему этот атрибут cartesian использовать? Если можно - примерчик.

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

Добавлено: 16 июл 2010, 15:07
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 скачал?

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

Добавлено: 16 июл 2010, 16:29
BlazeBio
Сформировал я два брауза.
В одном katsop.nrec соответствует свой spsopr.nrec.
Во втором есть несколькоы spsopr.nrec для повторяющихся строк katsopr.nrec .
Почему в первом случае столько записей RecordsInTable(tnKatSopr), а во втором именно столько записей RecordsInTable(tnSpSopr)?

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

Добавлено: 16 июл 2010, 16:32
galover
ну так во втором случае применен флаг cartesian - результат такой же как выполнение запроса в support. Или я вопрос не понял :-?

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

Добавлено: 16 июл 2010, 16:44
BlazeBio
galover, получается, что без cartesian берётся только одна первая строка удовлетворяющая подцепке (для каждого spsopr.nrec один katsopr.nrec), а если использовать cartesian, то все строки удовлетворяющие подцепке (все ссылки spopr на katsopr). В итоге, как я понимаю, cartesian этим напоминает ALL в select.

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

Добавлено: 16 июл 2010, 17:00
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

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

Добавлено: 16 июл 2010, 17:28
BlazeBio
Теперь всё ясно :)
А как быть, если будет больше таблиц, как узнать, которая из списка таблиц будет корневой?

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

Добавлено: 16 июл 2010, 17:31
galover
все таблицы во view, которые не имеют ограничений, являются корневыми

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

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

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

Ведь по сути

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

Select * from table1, table2  Where (( a==table1.fileld and b==table2.field));
является вьюхой с 2 корневыми таблицами Ж-)

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

Добавлено: 20 июл 2010, 20:14
Screw
А в случае жесткой подцепки? 8-)

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

Добавлено: 20 июл 2010, 20:57
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)));
в обоих случаях таблицы будут корневые. Т.е. корневая - это любая таблица, не ограниченная другой таблицей

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

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

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

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

И потом, если говорить о корневой таблице в контексте видимого элемента, то получается что любая таблица корневая м.б. в принципе.
Если же в рамках описанной вью, то тут наверное по другому уже )

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

Добавлено: 21 июл 2010, 14:07
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)).