Научите делать JOIN таблиц в MAVBrowse

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
samo_let
Посетитель
Сообщения: 42
Зарегистрирован: 26 Январь 2009, 16:24

Научите делать JOIN таблиц в MAVBrowse

Сообщение samo_let »

Люди! Подскажите как нужно делать соединение таблиц?
У меня в словаре есть 2 таблицы Factory и Area, никакие связи между таблицами в словаре не указаны.
Нужно в Browse показать Area.Name из Area по Factory.KodArea
Необходимо ли в таком случае в словаре прописывать связи и создавать соответствующие индексы?
В File Shematic я просто добавил к Factory таблицу Area и в настройке JOIN написал: Fac:Kodarea = Are:Kod
Однако при загрузке Browse получаю сообщение об ошибке и в трассе не вижу своего JOIN вообще:

9772064 Open cursor
9772064 Read all rows for cursor
Binding field 1 A."flag" = 1
9772064 Parsing Cursor : SELECT A."prizn",A."kod",A."name",A."okved",A."adres",A."kodarea",A."phone",A."phone2",A."kodgor",B."name" FROM FACTORY A,AREA B WHERE A."flag"=? Return Code : SQL_ERROR
Time Taken: 17.42 sec.
Error : Out of memory while reading tuples.;
Error while executing the query [HY000]
9772064 Close cursor
Time Taken: 2.27 sec.
9772064 Free cursor
Disconnect [Connection 'PostgreSQL UNICODE'] Return Code : 0


Возможно ли что-то сделать подобное такому:
SELECT A."prizn",A."kod",A."name",A."okved",A."adres",A."kodarea",A."phone",A."phone2",A."kodgor",B."name"
FROM FACTORY A LEFT OUTER JOIN AREA B ON A."kodarea" = B."kod" WHERE A."flag"=?
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение StillZero »

связи в словаре я не делаю
в индексах особой необходимости нет, кроме primary
последний параметр TRUE/FALSE - как соединять по JOIN или по LEFT JOIN
Вложения
1.jpg
2.jpg
Все сайты закрыты...
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение Andrew™ »

samo_let писал(а): Возможно ли что-то сделать подобное такому:
SELECT A."prizn",A."kod",A."name",A."okved",A."adres",A."kodarea",A."phone",A."phone2",A."kodgor",B."name"
FROM FACTORY A LEFT OUTER JOIN AREA B ON A."kodarea" = B."kod" WHERE A."flag"=?
для такой связи ключи в DCT не требуются, да если бы и потребовался, всё равно в проге они не генерятся и дополнительной нагрузки на код нет, так что два варианта:

1. с использованием связей из DCT, всё генерится штатно
2. ручками, сконструируй Browse по эти двум файлам, второй прицепить можно без связи, в BRWX:Browse.Where методе сам пропиши требуемую связь:

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

 SELF.Select.Relation(FACTORY:kodarea,AREA:kod,0) ! третий параметр либо TRUE либо FALSE, в зависимоси какая связь нужна LEFT или нет
если связки более хитрые, типа A.Field = B.Field AND B.Field2=10, то возможность такой JOIN тоже имеется прописать:

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

SELF.Select.BindParameter(File2:Field2,10)
SELF.Select.Relation(File2,SELF.Select.Field(File2:Field) & '=' & SELF.Select.Field(File1.Field) & ' and ' & SELF.Select.Field(File2:Field2) & '=?',0) ! третий параметр аналогично.
Аватара пользователя
samo_let
Посетитель
Сообщения: 42
Зарегистрирован: 26 Январь 2009, 16:24

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение samo_let »

Спасибо большое!
Понял.
Аватара пользователя
samo_let
Посетитель
Сообщения: 42
Зарегистрирован: 26 Январь 2009, 16:24

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение samo_let »

Еще вопрос:
Возможно ли делать соединение с "временными" таблицами?
Например, мне бы хотелось отметить в браузе предприятия, с которыми заключены договора иконкой или цветом.
Что-то вроде такого:
SELECT A."kod",A."name",A."adres",B."fcount"
FROM FACTORY A
left outer join (Select kodfac as kodfac, count(*) as fcount from Contract group by kodfac) as B
on A."kod" = B."kodfac"

Как что-то подобное реализовать в MAV Browse?
Аватара пользователя
StillZero
Ветеран
Сообщения: 454
Зарегистрирован: 06 Июль 2005, 2:17
Откуда: Хабаровск
Контактная информация:

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение StillZero »

вот эту часть

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

Select kodfac as kodfac, count(*) as fcount from Contract group by kodfac
выноси в вьюху, вьюху в словарь как обычную таблицу и далее join по накатанной

если кста не нужно считать количество, а просто знать наличие, то лучше юзать exist
Все сайты закрыты...
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение Andrew™ »

samo_let писал(а):Еще вопрос:
Возможно ли делать соединение с "временными" таблицами?
Например, мне бы хотелось отметить в браузе предприятия, с которыми заключены договора иконкой или цветом.
Что-то вроде такого:
SELECT A."kod",A."name",A."adres",B."fcount"
FROM FACTORY A
left outer join (Select kodfac as kodfac, count(*) as fcount from Contract group by kodfac) as B
on A."kod" = B."kodfac"

Как что-то подобное реализовать в MAV Browse?
да так же как и с обычными, в качестве имени таблицы закрепляй !глобальную переменную и перед использованием такой табилицы инициализируй правильно эту переменную, если её значение всегда неизменно, то можно и без неё, этот волшебный SELECT прописать в DCT в Full path name, но надо не забывать про префиксы, такая таблица в File Schematic должна быть второй
Аватара пользователя
samo_let
Посетитель
Сообщения: 42
Зарегистрирован: 26 Январь 2009, 16:24

Re: Научите делать JOIN таблиц в MAVBrowse

Сообщение samo_let »

Спасибо.
Про вьюху - это я догадывался, только не хотелось бы на каждый "чих" заводить в словаре таблицы. Решение с записью селекта в имени таблицы мне кажется более привлекательным, т.к. такую таблицу можно потом еще как-нибудь использовать "в мирных целях".
Только в инициализации окна-брауза пришлось написать селект с алиасом
GLO:SQL_Table = '(SELECT KODFAC AS FKOD, COUNT(*) AS FVALUE FROM CONTRACT GROUP BY KODFAC) AS T '
А уже позже - перед соединеним таблиц - без алиаса, т.к. там свой алиас назначается
GLO:SQL_Table = '(SELECT KODFAC AS FKOD, COUNT(*) AS FVALUE FROM CONTRACT GROUP BY KODFAC) '
SELF.Select.Relation(FACTORY:KOD, T_DUMMY:FKOD, 0)
Но это уже детали
Ответить