несколько таблиц в Browse
Модераторы: m0p3e, edward_K, Модераторы
несколько таблиц в Browse
Можно ли в интерфейсе поля из двух и более таблиц отобразить в одном browse не используя при этом временные таблицы?
Re: несколько таблиц в Browse
Атрибут cartesian может быть использован, если необходимо отобразить декартово произведение таблиц в одной области ввода. При наличии этого атрибута записи в области ввода будут видны как результат предложения select из корневой таблицы области ввода и всех к ней подцепленных. (По умолчанию видно все записи из корневой таблицы и для каждой такой записи по одной из всех подцепляемых).
Re: несколько таблиц в Browse
galover, только не совсем понятно где и к чему этот атрибут cartesian использовать? Если можно - примерчик.
Re: несколько таблиц в Browse
ну смотри, есть view
В таком случае у тебя для каждой записи из KatSopr-a будет одна запись из SpSopr-a (первая в подцепке). Всего записей в browse будет RecordsInTable(tnKatSopr)
А вот так
Для всех записей из SpSopr-a будет родительская из KatSopr-a. Всего записей в browse будет RecordsInTable(tnSpSopr). Vipprogr.chm скачал?
Код: Выделить всё
create view as select * from KatSopr, SpSopr where ((KatSopr.NRec == SpSopr.cSopr));
browse;
table KatSopr;
fields
KatSopr.NRec : protect;
SpSopr.NRec : protect;
end;
А вот так
Код: Выделить всё
browse;
table KatSopr, cartesian;
fields
KatSopr.NRec : protect;
SpSopr.NRec : protect;
end;
Re: несколько таблиц в Browse
Сформировал я два брауза.
В одном katsop.nrec соответствует свой spsopr.nrec.
Во втором есть несколькоы spsopr.nrec для повторяющихся строк katsopr.nrec .
Почему в первом случае столько записей RecordsInTable(tnKatSopr), а во втором именно столько записей RecordsInTable(tnSpSopr)?
В одном katsop.nrec соответствует свой spsopr.nrec.
Во втором есть несколькоы spsopr.nrec для повторяющихся строк katsopr.nrec .
Почему в первом случае столько записей RecordsInTable(tnKatSopr), а во втором именно столько записей RecordsInTable(tnSpSopr)?
Re: несколько таблиц в Browse
ну так во втором случае применен флаг cartesian - результат такой же как выполнение запроса в support. Или я вопрос не понял 

Re: несколько таблиц в Browse
galover, получается, что без cartesian берётся только одна первая строка удовлетворяющая подцепке (для каждого spsopr.nrec один katsopr.nrec), а если использовать cartesian, то все строки удовлетворяющие подцепке (все ссылки spopr на katsopr). В итоге, как я понимаю, cartesian этим напоминает ALL в select.
Re: несколько таблиц в Browse
Не совсем понял при чем тут 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
Теперь всё ясно
А как быть, если будет больше таблиц, как узнать, которая из списка таблиц будет корневой?

А как быть, если будет больше таблиц, как узнать, которая из списка таблиц будет корневой?
Re: несколько таблиц в Browse
все таблицы во view, которые не имеют ограничений, являются корневыми
-
- Абориген
- Сообщения: 943
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: External Developer
- Контактная информация:
Re: несколько таблиц в Browse
ммм... немножко не так Ж-)galover писал(а):все таблицы во view, которые не имеют ограничений, являются корневыми
думаю корректнее будет такое определение:
Корневой таблицей в выборке будет являться та таблица, которая а) либо не имеет ограничений б) либо ограничения на поля данной таблицы задаются константами.
Ведь по сути
Код: Выделить всё
Select * from table1, table2 Where (( a==table1.fileld and b==table2.field));
Re: несколько таблиц в Browse
тогда еще выражения, например
в обоих случаях таблицы будут корневые. Т.е. корневая - это любая таблица, не ограниченная другой таблицей
Код: Выделить всё
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)));
-
- Местный житель
- Сообщения: 1846
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: несколько таблиц в Browse
Ну а если так поставить вопрос - а может ли быть некорневой таблица при описании вью интрефейса в секции where которая ником образом не ссылается по внешнему ключу на другую (или оная вообще отсутствует во where а описана тока во from...) ?
Root, судя по доке, служит для задания фильтра на корневой узел, а не указывает на то, что таблица является корневой.
Не совсем ясно, что имел ввиду Screw, упомянув про жесткие подцепки в рамках этой темы. Жесткая подцепка, имхо, лишь сужает ввыборку "слева". А как вот каки образом она связана с корнем ?
И потом, если говорить о корневой таблице в контексте видимого элемента, то получается что любая таблица корневая м.б. в принципе.
Если же в рамках описанной вью, то тут наверное по другому уже )
Root, судя по доке, служит для задания фильтра на корневой узел, а не указывает на то, что таблица является корневой.
Не совсем ясно, что имел ввиду Screw, упомянув про жесткие подцепки в рамках этой темы. Жесткая подцепка, имхо, лишь сужает ввыборку "слева". А как вот каки образом она связана с корнем ?
И потом, если говорить о корневой таблице в контексте видимого элемента, то получается что любая таблица корневая м.б. в принципе.
Если же в рамках описанной вью, то тут наверное по другому уже )
-
- Слесарь-системщик
- Сообщения: 304
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
- Контактная информация:
Re: несколько таблиц в Browse
Это я к тому сделал замечание, что корневым для визуального элемента может быть абсолютно любой узел ЛТ. По всей видимости, случилось смешение понятий "корневистости", и хорошо бы для начала определиться с тем, какое из них мы обсуждаем.
Что же до темы ветки, то cartesian означает, что результирующее количество записей в браузе будет равно произведению количества записей во всех упомянутых в ЛТ несвязанных узлов. Для связанных узлов немного по-другому: записи из правой части подцепки суммируются. То есть, в примере
результирующее количество записей будет равно, в условной записи, RecordInTable(#KatSopr) + Sum(foreach KatSopr RecordsInTable(#SpSopr) - if(IsValid(#SpSopr), 1, 0)).
Что же до темы ветки, то 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;
Виталий