05.04.2002, 18:36 | #1 |
Участник
|
Связи между таблицами
Допустим у меня есть две таблицы:
Таблица А: id name Таблица Б: num id_a txt Причем значения столбца Б.id_a принимают значения из множества А.id. То есть связь между таблицами подразумевается, но не задана. Теперь мне необходимо создать форму с Grid в котором я хочу выводить таблицу вида: num id_a txt name Как мне этого достичь ? Как я понял необходимо использовать свойства JoinSource, LinkType у DataSource. Но вот достичь удачной их коомбинации мне так и не удалось. :-((. То появляется таблица Б с пристроенным сбоку столбцом name, повторяющимся циклически, то появляется только n записей, где n - количество записей в таблице А. 1. Как достичь желаемого мной эффекта ? 2. У какого из источников данных необходимо заполнить свойства JoinSource и LinkType ? У главной или подчиненной таблицы ? 3. У Design и у Grid есть свойство DataSource. Как она влияет на поведение этих объектов ? Вернее как оно влияет я вижу, а закономерность уловить не могу. :-)) 4. Не могли бы Вы пояснить(несмотря на Вашу загруженность работой, но встоенного Help'а мне не хватает для ясного понимания) значения свойства LinkType ? Спасибо за советы. |
|
05.04.2002, 19:13 | #2 |
Участник
|
посмотри на форму tutorial_join
|
|
05.04.2002, 20:23 | #3 |
Administrator
|
Re: Связи между таблицами
Цитата:
Изначально опубликовано Rem
1. Как достичь желаемого мной эффекта ? Цитата:
Изначально опубликовано Rem
У какого из источников данных необходимо заполнить свойства JoinSource и LinkType ? У главной или подчиненной таблицы ? Цитата:
Изначально опубликовано Rem
У Design и у Grid есть свойство DataSource. Как она влияет на поведение этих объектов ? Вернее как оно влияет я вижу, а закономерность уловить не могу. :-)) А у Grid... Ну тоже могу предположить, хотя доподлинно не знаю. По крайней мере это должно влиять в том случае, когда вы добавляете строку в Grid (Ctrl + N). Это свойство указывает, в какой именно dataSource добавлять строку в первую очередь (если в Grid выводится несколько). Кроме того, замечено, что если вообще никакого ds не указать, то Grid работать не будет Будем надеятся, что кто-нибудь сможет ответить подробнее. Цитата:
Изначально опубликовано Rem
4. Не могли бы Вы пояснить(несмотря на Вашу загруженность работой, но встоенного Help'а мне не хватает для ясного понимания) значения свойства LinkType ? LinkType Passive, Delayed и Active используются, когда вы выводите данные из нескольких dataSource в разных Grid (в том числе, когда с этим ds вызывается из другой, и Axapta автоматически связывает два ds). Они влияют лишь на скорость отклика. LinkType InnerJoin, OuterJoin используются для вывода данных в одном Grid. Подробнее, чем в Help я их вам не опишу. Посмотрите также tutorial, который Вам mazzy посоветовал. LinkType ExistJoin и NotExistJoin используются для фильтрации одного dataSource по другому. В том же месте в Help, где Вы найдете помощь про Inner и Outer, будут примеры и на Exist / NotExist. Удачи.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
08.04.2002, 08:52 | #4 |
Участник
|
Цитата:
mazzy
посмотри на форму tutorial_join Цитата:
Причем значения столбца Б.id_a принимают значения из множества А.id. То есть связь между таблицами подразумевается, но не задана.
Хорошо, объясню зачем мне это надо. На форме Заказы в Grid отображается код клиента, а нужно, чтобы там было и название клиента. Причем Relation между таблицами CustTable и SalesTable не задана, хотя она "подразумевается" через Extended Data Types. Создавать этот Relation для своих целей мне кажется как минимум не красивым, а как максимум неправильным и чреватым ошибками (Или я здесь не прав ???). Отсюда и мой вопрос, как правильно добавить в Grid на котором отображаются записи одного DataSource данные из другого DataSource, причем Relation между этими двумя DataSource не установлена (но она "подразумевается"). P.S Была идея создать display метод и его результат выводить в Grid. Но когда я обращался в этом методе к полям таблицы мне возвоащались значения той записи на которой установлен курсор, а результат этого метода отображался на все записи в Grid'е. Может здесь можно что нибудь поправить ? |
|
08.04.2002, 09:31 | #5 |
сибиряк
|
display method должен непосредственно быть в списке методов dataSource, а не в методах формы. причем в свойствах контрола (свойство dataSource ) должен быть указан dataSource, которому принадлежит метод.
только не пойму одного. зачем необходимо вытаскивать название клиента из таблицы клиентов? В таблице SalesTable есть поле SalesName (название клиента на момент выписки расходного документа). Очень правильно с точки зрения логики программы. Вы выписываете документ на одного клиента, меняете его наименование. а как узнать кто потом должен платить по счету? Поэтому правильнее всего, как мне кажется, вывести на грид поле SalesName.
__________________
С уважением, Вячеслав. |
|
08.04.2002, 09:57 | #6 |
Участник
|
Цитата:
slava
display method должен непосредственно быть в списке методов dataSource, а не в методах формы. причем в свойствах контрола (свойство dataSource ) должен быть указан dataSource, которому принадлежит метод. Цитата:
только не пойму одного. зачем необходимо вытаскивать название клиента из таблицы клиентов? В таблице SalesTable есть поле SalesName (название клиента на момент выписки расходного документа). Очень правильно с точки зрения логики программы. Вы выписываете документ на одного клиента, меняете его наименование. а как узнать кто потом должен платить по счету? Поэтому правильнее всего, как мне кажется, вывести на грид поле SalesName.
|
|
09.04.2002, 18:59 | #7 |
Участник
|
Во-первых. Если возникает необходимость в программировании, то стоит посмотреть на существующую функциональность. Скорее всего задача решена.
Во-вторых. Цитата:
Изначально опубликовано Rem
объясню зачем мне это надо. На форме Заказы в Grid отображается код клиента, а нужно, чтобы там было и название клиента. Причем Relation между таблицами CustTable и SalesTable не задана, хотя она "подразумевается" через Extended Data Types. Создавать этот Relation для своих целей мне кажется как минимум не красивым, а как максимум неправильным и чреватым ошибками (Или я здесь не прав ???). Отсюда и мой вопрос, как правильно добавить в Grid на котором отображаются записи одного DataSource данные из другого DataSource, причем Relation между этими двумя DataSource не установлена (но она "подразумевается"). Это как раз связь через тип. Если посмотреть через MorphXplorer, то CustTable и SalesTable - связаны. Создавать явный Relation некрасиво. Ничего страшного в этом не вижу. Разве что будущие изменения будет вносить тяжелее. Как отобразить таблицы связанные неявно? Так же как и таблицы, связанные явно. 1. Создаем два датасорса 2. Один из них подчиняем другому с помощью LinkType (здесь важно, чтобы связь была не Delayed) 3. Создаем грид 4. Привязываем грид к главному датасорсу 5. добавляем поля из подчиненного датасорса Все как в примере. |
|
19.04.2002, 19:36 | #8 |
Участник
|
Цитата:
slava
display method должен непосредственно быть в списке методов dataSource, а не в методах формы. причем в свойствах контрола (свойство dataSource ) должен быть указан dataSource, которому принадлежит метод. tb1 id name tb2 id type txt tb1 связана с tb2 по полю id отношением "один-ко-многим". Необходимо на форме в Gride выводить следующую информацию: tb1.id tb1.name и tb2.txt (причем тот txt из нескольких, который имеет type=1). Ранее пробовал так: display str vs_txt() { ; return (select * from tb2 where tb2.id==(select * from tb1).id && tb2.type==1).txt; } Этот метод принадлежал методам формы. При открытии формы метод возвращал txt первой записи для всех строк. Пробовал устанавливать/менять/снимать свойство LinkType у tb2 - не помогло. Просто создать связь посредством LinkType=InnerJoint тоже не подходит, так как надо отображать только tb2.type==1. Slava советовал разместить display метод Цитата:
в списке методов dataSource, а не в методах формы. причем в свойствах контрола (свойство dataSource ) должен быть указан dataSource, которому принадлежит метод.
Запускаю форму и столбец остается пустым. Более того я обнаружил, что этот метод так не разу и не вызывается. Что я делал не так и что мне необходимо исправить, чтобы мой пример заработал ? Всем спасибо. |
|
19.04.2002, 20:03 | #9 |
Участник
|
Цитата:
Изначально опубликовано Rem
Просто создать связь посредством LinkType=InnerJoint тоже не подходит, так как надо отображать только tb2.type==1. В init'е у tbl2_ds надо добавить код, который к текущему query добавляет еще один Range this.query().datasource(tablenum(tbl2)).addrange(fieldnum(tbl2,type)).value('1'); Цитата:
Изначально опубликовано Rem
return (select * from tb2 where tb2.id==(select * from tb1).id && tb2.type==1).txt; return ( select txt from from tb2 where tb2.type==1 join tbl1 where tbl2.id==tb1.id ).txt; Цитата:
Изначально опубликовано Rem
То есть я разместил этот метод в ветке myfrm\DataSources\tb1\methods. Свойство DataSource Grid'а установил в tb1. Datasource ты установил. Может DataMethod забыл? |
|
25.04.2002, 14:06 | #10 |
Участник
|
Цитата:
Можно дурацкий вопрос?
Datasource ты установил. Может DataMethod забыл? У меня таблица А. В ней поля Id, Name. Создаю форму, помещаю А в DataSource. Создаю Grid(DataSource=A), помещаю на него поля из А. В DataSource A создаю дисплей метод: display str nb() { ; print a.Id; return "__"; } Создаю в Grid поле (DataSource=A) и заполняю свойство DataMethod. Открываю форму - выводятся только Id текущей записи - той на которой стоит курсор. |
|
25.11.2002, 19:08 | #11 |
Модератор
|
Всем привет, принимайте еще одного чайника
Задача для знакономого с TSQL вроде как тривиальная, а вот как это в интерфейсе дизайнера нащелкать? Таблицы: Persons(PersodID, Name) Projects(ProjectID, PojectTitle) Persons2Projects(PersonId, ProjectID) хочу: стоя на определенном Person в первом Grid, получать список его Projects.* во втором Grid-е. вот как это выглядит на TSQL select P.* from A_Project P, A_Person2Project PP where P.ProjectId = PP.ProjectId and PP.PersonId = %PersonId куда тыкать? что делать? кто виноват? почему нет родного элемента Query c произвольным рукописным запросом? я конечно понимаю, что никто не застрахован от перехода с MSSQL на Oracle или от сервиспаков, но .. объясните, уважаемые, в чем я неправ.. |
|
25.11.2002, 19:16 | #12 |
Модератор
|
в прошлом письме опечатки
вместо A_Project -> Projects вместо A_Person2Project -> Persons2Projects кстати, править собственные сообщения нельзя всем или только новичкам на форуме? Или надо администраторам проставляться? |
|
26.11.2002, 09:20 | #13 |
----------------
|
2Rem
Если создаешь display-метод на DS, то в него необходимо передаватькурсор на твою таблу как параметр PHP код:
DS1 -> Persons DS2 -> Persons2Projects (Delayed Join с Persons) DS3 -> Projects (InnerJoin с Persons2Projects ) Grid1 -> DS1 Grid2 -> DS3 Кажется так должно работать |
|
26.11.2002, 12:49 | #14 |
Модератор
|
DS1 -> Persons
DS2 -> Persons2Projects (Delayed Join с Persons) DS3 -> Projects (InnerJoin с Persons2Projects ) Grid1 -> DS1 Grid2 -> DS3 Кажется так должно работать Работает, но есть нюансы. DS3(Projects) открывается правильно, и сам текст генерящегося запроса меня устраивает. НО. Двигаться в интерфейсе по Grid-у этого DS3 нормально не получается. Пока стою на первой в нем записи, все нормально. Как только пытаюсь перейти на следующую, начинает "брыкаться" - упорно показывает значения из первой, самовольно "перебегает" на первую. Вот такие пироги. Эксперимент продолжается. |
|
26.04.2012, 09:42 | #15 |
Участник
|
спасяитее!!
тут вот какое дело.
Если 2 таблицы связь один -ко-многим Необходимо в гриде отобразить все строки и столбцы из 1табл и 1столбез из первой подходящей по связи из 2й: Пробовала свойства датасорса JoinSource, ставила разные Link Type- ниче не получается красивогоо подскажите чего мне можно наколдовать?!
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает.... |
|
26.04.2012, 10:09 | #16 |
Участник
|
Цитата:
Что значит из первой подходящей? Там во всех подходящих строках в этом столбце одинаковое значение, и можно брать из любой? Или значения разные, но для этой странной задачи не важно какое именно будет выводиться? display-метод не подойдёт? Нужна возможность фильтрации и сортироваки по этому полю? |
|
26.04.2012, 10:49 | #17 |
Участник
|
короче вот как T1.id = T2.id2
T1 выглядит так id name 1 lolo 2 xx T2 выглядит так id2 chislo 1 90 1 40 1 50 2 45 2 10 2 10 2 25 надо в grid id name chislo 1 lolo 90 2 xx 45 условие либо первая по-я строка, либо мах(chislo)
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает.... Последний раз редактировалось Лиса-а-а; 26.04.2012 в 10:53. |
|
26.04.2012, 11:09 | #18 |
Участник
|
Вы не ответили на вопрос о необходимости фильтрации и сортировки по полю "chislo".
Если такая возможность необходима, то тогда прийдётся реализовывать запрос такого вида: X++: T1 T1; T2 T2, T2_; ; select T1 join T2 where T1.id == T2.id notexists join T2_ where T2_.id == T2.id && T2_.RecId < T2.RecId |
|
26.04.2012, 11:16 | #19 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Вы не ответили на вопрос о необходимости фильтрации и сортировки по полю "chislo".
Если такая возможность необходима, то тогда прийдётся реализовывать запрос такого вида: X++: T1 T1; T2 T2, T2_; ; select T1 join T2 where T1.id == T2.id notexists join T2_ where T2_.id == T2.id && T2_.RecId < T2.RecId
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает.... |
|
26.04.2012, 12:00 | #20 |
Участник
|
В виде текста его никуда не воткнёшь Я привёл текст запроса для иллюстрации самой идеи.
Запрос нужно конструировать из датасурсов формы. Как видно из текста запроса нужны три датасурса (один по таблице T1 и два по T2). Самым сложным здесь является установка связи "T2_.RecId < T2.RecId" её стандартными линками не сделаешь. Нужно будет использовать http://www.axaptapedia.com/Expressions_in_query_ranges. P.S.: Так вам точно нужна возможность фильтрации и сортировки по полю из T2? Иначе все гораздо проще реализуется через механизм display-методов. |
|
|
За это сообщение автора поблагодарили: Лиса-а-а (1). |
|
Похожие темы | ||||
Тема | Ответов | |||
Связи между таблицами 1:N и N:1 | 10 | |||
Связи между таблицами. | 7 | |||
связи между таблицами при установлении прав доступа | 9 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|