AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.04.2002, 18:36   #1  
Rem is offline
Rem
Участник
 
17 / 10 (1) +
Регистрация: 27.03.2002
Связи между таблицами
Допустим у меня есть две таблицы:

Таблица А:
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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
посмотри на форму tutorial_join
Старый 05.04.2002, 20:23   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Re: Связи между таблицами
Цитата:
Изначально опубликовано Rem
1. Как достичь желаемого мной эффекта ?
Придется добавить связь. Без этого никак. Хотя нет, можно, но достаточно сложно: сделать query у Таблицы А и в потомки по DataSource записать Таблицу Б. Поиграв с range, кажется, можно достичь нужный результат (сам не пробовал, так что гарантий не даю ).

Цитата:
Изначально опубликовано Rem
У какого из источников данных необходимо заполнить свойства JoinSource и LinkType ? У главной или подчиненной таблицы ?
Если вы все-таки добавите связь, то у подчиненной.

Цитата:
Изначально опубликовано Rem
У Design и у Grid есть свойство DataSource. Как она влияет на поведение этих объектов ? Вернее как оно влияет я вижу, а закономерность уловить не могу. :-))
А как влияет свойство dataSource на форме? По моему ничего там нет такого. Предполагаю, что навигатор в тулбаре будет двигать Вас именно по этому dataSource, если Вы не редактируете поле другого.

А у Grid... Ну тоже могу предположить, хотя доподлинно не знаю. По крайней мере это должно влиять в том случае, когда вы добавляете строку в Grid (Ctrl + N). Это свойство указывает, в какой именно dataSource добавлять строку в первую очередь (если в Grid выводится несколько). Кроме того, замечено, что если вообще никакого ds не указать, то Grid работать не будет Будем надеятся, что кто-нибудь сможет ответить подробнее.

Цитата:
Изначально опубликовано Rem
4. Не могли бы Вы пояснить(несмотря на Вашу загруженность работой, но встоенного Help'а мне не хватает для ясного понимания) значения свойства LinkType ?
А что непонятно в Help? Там ведь все даже с примерами написано.

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  
Rem is offline
Rem
Участник
 
17 / 10 (1) +
Регистрация: 27.03.2002
Цитата:
mazzy
посмотри на форму tutorial_join
Посмотрел. Но там же между таблицами задана связь.А теперь процитирую сам себя:

Цитата:
Причем значения столбца Б.id_a принимают значения из множества А.id. То есть связь между таблицами подразумевается, но не задана.
А вот если в том примере связь убрать, то и пример тот работать перестанет. Впрочем об этом уже max сказал..

Хорошо, объясню зачем мне это надо. На форме Заказы в Grid отображается код клиента, а нужно, чтобы там было и название клиента. Причем Relation между таблицами CustTable и SalesTable не задана, хотя она "подразумевается" через Extended Data Types.

Создавать этот Relation для своих целей мне кажется как минимум не красивым, а как максимум неправильным и чреватым ошибками (Или я здесь не прав ???). Отсюда и мой вопрос, как правильно добавить в Grid на котором отображаются записи одного DataSource данные из другого DataSource, причем Relation между этими двумя DataSource не установлена (но она "подразумевается").

P.S

Была идея создать display метод и его результат выводить в Grid. Но когда я обращался в этом методе к полям таблицы мне возвоащались значения той записи на которой установлен курсор, а результат этого метода отображался на все записи в Grid'е. Может здесь можно что нибудь поправить ?
Старый 08.04.2002, 09:31   #5  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
display method должен непосредственно быть в списке методов dataSource, а не в методах формы. причем в свойствах контрола (свойство dataSource ) должен быть указан dataSource, которому принадлежит метод.
только не пойму одного. зачем необходимо вытаскивать название клиента из таблицы клиентов? В таблице SalesTable есть поле SalesName (название клиента на момент выписки расходного документа). Очень правильно с точки зрения логики программы. Вы выписываете документ на одного клиента, меняете его наименование. а как узнать кто потом должен платить по счету? Поэтому правильнее всего, как мне кажется, вывести на грид поле SalesName.
__________________
С уважением, Вячеслав.
Старый 08.04.2002, 09:57   #6  
Rem is offline
Rem
Участник
 
17 / 10 (1) +
Регистрация: 27.03.2002
Цитата:
slava
display method должен непосредственно быть в списке методов dataSource, а не в методах формы. причем в свойствах контрола (свойство dataSource ) должен быть указан dataSource, которому принадлежит метод.
Спасибо, обязательно попробую.

Цитата:
только не пойму одного. зачем необходимо вытаскивать название клиента из таблицы клиентов? В таблице SalesTable есть поле SalesName (название клиента на момент выписки расходного документа). Очень правильно с точки зрения логики программы. Вы выписываете документ на одного клиента, меняете его наименование. а как узнать кто потом должен платить по счету? Поэтому правильнее всего, как мне кажется, вывести на грид поле SalesName.
Да, пожалуй Вы правы. На это поле я не обратил внимание и пытался решить проблему сложным (и главное неправильным путем).
Старый 09.04.2002, 18:59   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Во-первых. Если возникает необходимость в программировании, то стоит посмотреть на существующую функциональность. Скорее всего задача решена.

Во-вторых.
Цитата:
Изначально опубликовано Rem
объясню зачем мне это надо. На форме Заказы в Grid отображается код клиента, а нужно, чтобы там было и название клиента. Причем Relation между таблицами CustTable и SalesTable не задана, хотя она "подразумевается" через Extended Data Types.

Создавать этот Relation для своих целей мне кажется как минимум не красивым, а как максимум неправильным и чреватым ошибками (Или я здесь не прав ???). Отсюда и мой вопрос, как правильно добавить в Grid на котором отображаются записи одного DataSource данные из другого DataSource, причем Relation между этими двумя DataSource не установлена (но она "подразумевается").
В Аксапте есть понятие "неявный relation"
Это как раз связь через тип. Если посмотреть через MorphXplorer, то CustTable и SalesTable - связаны.

Создавать явный Relation некрасиво. Ничего страшного в этом не вижу. Разве что будущие изменения будет вносить тяжелее.

Как отобразить таблицы связанные неявно?
Так же как и таблицы, связанные явно.

1. Создаем два датасорса
2. Один из них подчиняем другому с помощью LinkType (здесь важно, чтобы связь была не Delayed)
3. Создаем грид
4. Привязываем грид к главному датасорсу
5. добавляем поля из подчиненного датасорса

Все как в примере.
Старый 19.04.2002, 19:36   #8  
Rem is offline
Rem
Участник
 
17 / 10 (1) +
Регистрация: 27.03.2002
Цитата:
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, которому принадлежит метод.
То есть я разместил этот метод в ветке myfrm\DataSources\tb1\methods. Свойство DataSource Grid'а установил в tb1.

Запускаю форму и столбец остается пустым. Более того я обнаружил, что этот метод так не разу и не вызывается.

Что я делал не так и что мне необходимо исправить, чтобы мой пример заработал ?

Всем спасибо.
Старый 19.04.2002, 20:03   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано 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  
Rem is offline
Rem
Участник
 
17 / 10 (1) +
Регистрация: 27.03.2002
Цитата:
Можно дурацкий вопрос?
Datasource ты установил. Может DataMethod забыл?
Вы правы - у Grid поставил, а у поля забыл.
У меня таблица А. В ней поля 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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Всем привет, принимайте еще одного чайника

Задача для знакономого с 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  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
в прошлом письме опечатки
вместо A_Project -> Projects
вместо A_Person2Project -> Persons2Projects

кстати, править собственные сообщения нельзя всем или только новичкам на форуме? Или надо администраторам проставляться?
Старый 26.11.2002, 09:20   #13  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
2Rem
Если создаешь display-метод на DS, то в него необходимо передаватькурсор на твою таблу как параметр
PHP код:
display str nb(MyTable _a)
{
    print 
_a.id;

2Vadik
DS1 -> Persons
DS2 -> Persons2Projects (Delayed Join с Persons)
DS3 -> Projects (InnerJoin с Persons2Projects )
Grid1 -> DS1
Grid2 -> DS3
Кажется так должно работать
Старый 26.11.2002, 12:49   #14  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
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  
Лиса-а-а is offline
Лиса-а-а
Участник
1C
 
16 / 10 (1) +
Регистрация: 19.03.2012
Адрес: Самара
! спасяитее!!
тут вот какое дело.
Если 2 таблицы связь один -ко-многим

Необходимо в гриде отобразить все строки и столбцы из 1табл и 1столбез из первой подходящей по связи из 2й:
Пробовала свойства датасорса JoinSource, ставила разные Link Type- ниче не получается красивогоо
подскажите чего мне можно наколдовать?!
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает....
Старый 26.04.2012, 10:09   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Лиса-а-а Посмотреть сообщение
Необходимо в гриде отобразить все строки и столбцы из 1табл и 1столбез из первой подходящей по связи из 2й!
Какая-то не обычная задача. Тестовая?
Что значит из первой подходящей? Там во всех подходящих строках в этом столбце одинаковое значение, и можно брать из любой? Или значения разные, но для этой странной задачи не важно какое именно будет выводиться?

display-метод не подойдёт? Нужна возможность фильтрации и сортироваки по этому полю?
Старый 26.04.2012, 10:49   #17  
Лиса-а-а is offline
Лиса-а-а
Участник
1C
 
16 / 10 (1) +
Регистрация: 19.03.2012
Адрес: Самара
!
короче вот как 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вы не ответили на вопрос о необходимости фильтрации и сортировки по полю "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  
Лиса-а-а is offline
Лиса-а-а
Участник
1C
 
16 / 10 (1) +
Регистрация: 19.03.2012
Адрес: Самара
!
Цитата:
Сообщение от 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
а куда его втыкать то в create датасорса в T2 ?
__________________
Работа программиста и шамана имеют много общего!- Оба бормочут непонятные слова, совершают непонятные действия и не могут объяснить как оно работает....
Старый 26.04.2012, 12:00   #20  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Лиса-а-а Посмотреть сообщение
а куда его втыкать то в create датасорса в T2 ?
В виде текста его никуда не воткнёшь Я привёл текст запроса для иллюстрации самой идеи.
Запрос нужно конструировать из датасурсов формы. Как видно из текста запроса нужны три датасурса (один по таблице T1 и два по T2). Самым сложным здесь является установка связи "T2_.RecId < T2.RecId" её стандартными линками не сделаешь. Нужно будет использовать http://www.axaptapedia.com/Expressions_in_query_ranges.

P.S.: Так вам точно нужна возможность фильтрации и сортировки по полю из T2? Иначе все гораздо проще реализуется через механизм display-методов.
За это сообщение автора поблагодарили: Лиса-а-а (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Связи между таблицами 1:N и N:1 Jox DAX: Программирование 10 12.07.2006 10:17
Связи между таблицами. braathe DAX: Программирование 7 18.02.2005 18:40
связи между таблицами при установлении прав доступа Manner DAX: Администрирование 9 08.10.2004 22:31

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 18:29.