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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.10.2013, 13:03   #1  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
:( Display поле по двум датасорсам в одном гриде - возможно ли?
В одном гриде связаны два датасорса по OuterJoin
таблица "Действие" и
таблица "Детализация действия".

В обеих таблицах есть поле Комментарий.

Задача в гриде сделать поле в котором будет показан Комментарий из таблицы "Детализация действия", а в случае если "Детализация действия" - не существует показать Комментарий из таблицы "Действие"

Как такое реализовать? И реализуемо ли это вообще? Мозг сломал
Старый 10.10.2013, 13:18   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
У табличного буфера есть методы joinChild()/joinParent(), по ним можно получить связанный черезе запрос буфер другой таблицы.
За это сообщение автора поблагодарили: Logger (3).
Старый 10.10.2013, 13:55   #3  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
А не лучше ли создать новый display метод на таблице с детализацией?


X++:
display Comment comment()
{
    ActionTable actionTable;
    Comment comment;
 
    if (this.Comment != '')
    {
        comment = this.Comment;
    }
    else
    {
        select firstonly Comment from actionTable
            where this.ActionId == actionTable.ActionId;
 
        comment = actiontable.Comment;
    }
 
    return comment;
}

Последний раз редактировалось Stitch_MS; 10.10.2013 в 14:04. Причина: протупил
Старый 10.10.2013, 14:52   #4  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Цитата:
Сообщение от Stitch_MS Посмотреть сообщение
А не лучше ли создать новый display метод на таблице с детализацией?


X++:
display Comment comment()
{
    ActionTable actionTable;
    Comment comment;
 
    if (this.Comment != '')
    {
        comment = this.Comment;
    }
    else
    {
        select firstonly Comment from actionTable
            where this.ActionId == actionTable.ActionId;
 
        comment = actiontable.Comment;
    }
 
    return comment;
}
у меня OuterJoin
условие вывода скорее такое

X++:
if (this.RecId)
{
        comment = this.Comment;
}
else
 {
        select firstonly Comment from actionTable
            where this.ActionId == actionTable.ActionId;
 
        comment = actiontable.Comment;
        //но в том-то и беда что записи this в этом случае нет - this.ActionId всегда будет ""

  }
Старый 10.10.2013, 14:57   #5  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
joinChild()/joinParent(), не нашел как достучаться из дисплейметода на датасорсе

пытался
X++:
display Comment(ActionDetailTable _actionDetailTable)
{
    ActionTable actionTable;
    ;
    
actionTable = _actionDetailTable.dataSource().cursor().joinParent();
}
не получается достучаться до парента
Старый 10.10.2013, 15:10   #6  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
В SQL это было бы так:

X++:
select 
  isNull(detailTable.Comment, actionTable.Comment) as comment
from actionTable
left outer join detailTable
  on actionTable.ActionId = detailTable.ActionId
Старый 10.10.2013, 15:11   #7  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Цитата:
Сообщение от ex3em Посмотреть сообщение
...но в том-то и беда что записи this в этом случае нет - this.ActionId всегда будет "...
Точно, это я как-то упустил из виду.

А в обратном направлении идти пробовали?

display Comment(ActionTable _actionTable)
{
ActionDetailTable actionDetailTable;
;

actionDetailTable= _actionTable.dataSource().cursor().joinChild();

if (actionDetailTable.Comment ........
}

Последний раз редактировалось Stitch_MS; 10.10.2013 в 15:11. Причина: опечатка
Старый 10.10.2013, 15:24   #8  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Для понимания работы joinChild()/joinParent()
X++:
static void Job51(Args _args)
{
    InventTable     InventTable, InventTableParent;
    InventSum       InventSum;
    int             i;
    ;
    
    while select InventTable
    join InventSum
        where InventSum.ItemId == InventTable.ItemId
    {
        i++;
        
        InventTableParent = InventSum.joinParent();
        
        print(InventTable.RecId == InventTableParent.RecId);
        
        if (i >= 10)
        {
            break;
        }
    }
}
Соответственно
X++:
display Comment(ActionDetailTable _actionDetailTable)
{
    ActionTable actionTableLocal;
    ;
    
    actionTableLocal = _actionDetailTable.joinParent();
    ....
}
Старый 10.10.2013, 15:28   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от ex3em Посмотреть сообщение
joinChild()/joinParent(), не нашел как достучаться из дисплейметода на датасорсе. пытался
X++:
display Comment(ActionDetailTable _actionDetailTable)
{
    ActionTable actionTable = _actionDetailTable.dataSource().cursor().joinParent();
}
не получается достучаться до парента
А не надо мудрить Курсор datasource'а - это текущая выбранная на гриде запись, к которой кнопки привязаны и проч., а display-методы отображают данные для кучи записей на гриде, именно поэтому display-методу на datasource передается буфер, для которого он должен что-то отобразить, и который может не быть текущей выбранной записью. Поэтому надо, во-первых, дергать метод joinChild на действии, а не joinParent на детализации, а во-вторых, дергать на переданном буфере, а не на курсоре formDS. Я вот щас на коленке сделал форму CustTable outer join CustTrans, где display-методом вывожу либо CustTrans.RecId, если он есть, либо CustTable.RecId. Вот код метода:
X++:
display Description test(CustTable _custTable)
{
    CustTrans   ct = _custTable.joinChild();
    RecId       id = ct.RecId ? ct.RecId : _custTable.RecId;
    Description ret = strfmt('%1 %2', id, ct.RecId ? 'trans' : 'table');
    return ret;
}
А вот что показывается на форме:
За это сообщение автора поблагодарили: ex3em (1).
Старый 10.10.2013, 15:56   #10  
ex3em is offline
ex3em
Участник
 
38 / 19 (1) ++
Регистрация: 22.07.2008
Thumbs up
Ура!! Заработало, Спасибо что указали где искать. не заметил что у входного параметра сразу есть joinChild()/joinParent(). Вот и начал извращенно лезть правой рукой к левому уху

на OuterJoin если из чилд датасорса лезть по
_actionDetailTable.joinParent(); не получается,
похоже из-за отсутствия в чилде записи.

а вот наоборот получилось. В паренте метод и из него лезть к чилду
и проверять есть у него RecId - если есть то коммент чилда.
Иначе комент парента.

Огромное человеческое спасибо всем
Старый 10.10.2013, 16:38   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Два датасоурса и грид
За это сообщение автора поблагодарили: gl00mie (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отображение аналитик в гриде складских журналов. Баг? _scorp_ DAX: Программирование 2 25.10.2012 11:48
Не обновляется display метод на форме kit22 DAX: Программирование 7 15.08.2012 11:04
Недоступность источника данных формы в display/edit-методах таблицы - баг или фича с глубоким смыслом? TasmanianDevil DAX: Программирование 10 03.08.2012 15:00
Две таблицы в одном гриде Oloops DAX: Программирование 3 11.08.2006 14:25
edit и display методы Maxim Gorbunov DAX: База знаний и проекты 4 15.01.2002 12:58

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

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

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