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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.04.2007, 13:08   #1  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Помогите разобраться с запросом по РБП
Задача: вывечти с форме списка РБП только те карточки, в которых есть открытые модели.

SELECT * FROM RDeferralsTable JOIN FIRSTONLY * FROM RDeferralsBook WHERE RDeferralsTable.DeferralsId = RDeferralsBook.DeferralsId AND ((Status = В работе))

По результатам данного запроса в списке РБП выводиться столько строк РБП, сколько открытых моделей.

Что неправильно в запросе?
Старый 18.04.2007, 13:20   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
esists join для этого есть
Старый 18.04.2007, 13:47   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
FetchMode - это совсем другое свойство

Вам нужно свойство JoinMode
Старый 18.04.2007, 13:48   #4  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
уже сообразила, не успела отменить )))
Старый 18.04.2007, 16:49   #5  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Цитата:
Сообщение от kashperuk Посмотреть сообщение
FetchMode - это совсем другое свойство

Вам нужно свойство JoinMode
Еще вопрос.
При первом входе он делает все верно. Свзявает источник ds формы и тот источник, который я указываю qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook));

Но стоит мне повторно обратиться к методу executeQuery на источнике формы из метода modifide на checkbox после метода super() и он видит только один источник данных в запросе в методе executeQuery. Т.е. он игнорирует qbdsStd и строчки дальше. Отладчиком он по ним идет, но query не меняет.

Вообще код простой.


X++:
public void executeQuery()
{
    QueryBuildDataSource qbds;
    QueryBuildRange      qbdsrange3;
    QueryBuildDataSource qbds1;
    str                  _rangeClose;

    QueryBuildDataSource qbdsStd;
    QueryBuildRange      qbrStatus;

    ;
    //запрос по таблице РБП

    qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));
    qbds1.clearRanges();
    qbds1.clearLinks();
    qbdsStd =  qbds1.addDataSource(tablenum(RDeferralsBook));
    qbdsStd.joinMode(JoinMode::ExistsJoin);
    qbdsStd.relations(true);
    qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status));

 /*   if (Cat_OpenDef.value() == NoYes::No)
    {     */
        qbrStatus.value(enum2str(RDeferralsStatus::Open));
  //  }
    super();

}
Старый 18.04.2007, 17:07   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Еще вопрос.
Вообще код простой.
Код:
public void executeQuery()
{
    QueryBuildDataSource qbds;
    QueryBuildRange      qbdsrange3;
    QueryBuildDataSource qbds1;
    str                  _rangeClose;

    QueryBuildDataSource qbdsStd;
    QueryBuildRange      qbrStatus;

    ;
    //запрос по таблице РБП

    qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));
    qbds1.clearRanges();
    qbds1.clearLinks();
    if (!query.dataSourceTable(tableNum(RDeferralsBook)))
        qbdsStd =  qbds1.addDataSource(tablenum(RDeferralsBook));    qbdsStd.joinMode(JoinMode::ExistsJoin);
    qbdsStd.relations(true);
    qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status));

 /*   if (Cat_OpenDef.value() == NoYes::No)
    {     */
        qbrStatus.value(enum2str(RDeferralsStatus::Open));
  //  }
    super();

}
Пытаетесь добавить еще один источник каждый раз.

Последний раз редактировалось kashperuk; 18.04.2007 в 17:15.
Старый 18.04.2007, 17:19   #7  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
все как всегда, если вы меняете запрос, а он не меняется, значит... вы меняете не тот запрос
if(this.queryRun()) qbds1 = this.queryRun().query().dataSourceTable(tableNum(RDeferralsTable));
else qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));
Старый 18.04.2007, 17:32   #8  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
X++:
public void executeQuery()
{
    QueryBuildDataSource qbds;
    QueryBuildRange      qbdsrange3;
    QueryBuildDataSource qbds1;
    str                  _rangeClose;

    QueryBuildDataSource qbdsStd;
    QueryBuildRange      qbrStatus;

    ;
    //запрос по таблице РБП

    qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));
    qbds1.clearRanges();
    qbds1.clearLinks();
    if (!this.query().dataSourceTable(tableNum(RDeferralsBook)))
    {
        if (Cat_OpenDef.value() == NoYes::No)
        {
            qbdsStd =  qbds1.addDataSource(tablenum(RDeferralsBook));
            qbdsStd.joinMode(JoinMode::ExistsJoin);
            qbdsStd.relations(true);
            qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status));
            qbrStatus.value(enum2str(RDeferralsStatus::Open));
        }
    }
    else
    {
        qbdsStd =  qbds1.addDataSource(tablenum(RDeferralsBook));
        qbdsStd.joinMode(JoinMode::ExistsJoin);
        qbdsStd.relations(true);
        qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status));
        qbrStatus.value('');

    }
    super();

}
Идет куда надо, но qbds1.addDataSource(tablenum(RDeferralsBook)); все равно игнорирует, он вообще
qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); расценивает как один запрос и не соединяет его с первичным запросом
qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));

Т.е. на выходе у него появляется 2 отдельных запроса qbds1 и qbdsStd , а они должны были соединиться.

А может причина в том, что RDeferralsTable является DS формы, а RDeferralsBook - нет?

Последний раз редактировалось Arahnid; 18.04.2007 в 17:40.
Старый 18.04.2007, 17:51   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Долго смотрел этот запрос. Честно говоря, так и не понял, что должно получиться в результате.
Если можно, расскажите словами.

В любом случае, предлагаю альтернативный вариант запроса и пару вопросов:
X++:
public void executeQuery()
{
    QueryBuildDataSource qbds;
    QueryBuildRange      qbdsrange3;
    QueryBuildDataSource qbds1;
    str                  _rangeClose;

    QueryBuildDataSource qbdsStd;
    QueryBuildRange      qbrStatus;

    ;
    //запрос по таблице РБП

    qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));
    qbds1.clearRanges();
    qbds1.clearLinks();
    qbdsStd = this.query().dataSourceTable(tableNum(RDeferralsBook));
    if (!qbdsStd)
    {
        qbdsStd =  qbds1.addDataSource(tablenum(RDeferralsBook));
        qbdsStd.joinMode(JoinMode::ExistsJoin);
        qbdsStd.relations(true);
    }
    qbrStatus = SysQuery::findOrCreateRange(qbdsStd, fieldnum(RDeferralsBook,Status));
    if (Cat_OpenDef.value() == NoYes::No)
    {
        qbrStatus.value(enum2str(RDeferralsStatus::Open));
    }
    else
    {
        qbrStatus.value(SysQuery::valueUnlimited());
    }
    super();

}
Вопросы:
1. Зачем вы делаете присоединение источника из кода?
2. Почему бы не сделать это присоединение в методe init() источника?
Вложения
Тип файла: xpo tstDeferralsTableForm.xpo (17.8 Кб, 391 просмотров)
Старый 18.04.2007, 19:10   #10  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Все просто. Есть справочник. Он требует только одного источника - таблица РБП. Сейчас , если по РБП закрыты все модели в таблице моделей, то строка в форме списка РБП окрашивается в серый цвет (это прописано в методе на DS таблицы РБП), а нужно, чтоб ее не было видно.

Я предположила, что надо написать запрос в источнике формы на таблицу РБП. Чтобы определить закрыты все модели или нет, мне нужен еще один источник таблица моделей РБП. Но я не хочу корежить источник для формы, потому и не меняю его.

Значит я не логично делаю?


Ваш вариант, конечно, работает.
Только в нем есть оговорка. Модели если нет, то в список этот РБП ни туда, ни туда не попадает. Большое спасибо, буду играть дальше.

Последний раз редактировалось Arahnid; 18.04.2007 в 19:21.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
вопрос про дату в range. помогите разобраться. Hans DAX: Программирование 5 24.04.2007 17:52
Помогите разобраться с edit-методом mashaSi DAX: Программирование 4 08.06.2006 07:19
Помогите с запросом.. DarkBear DAX: Программирование 2 15.08.2005 13:38
Помогите разобраться с отчетностью Vansoft DAX: Функционал 2 12.04.2004 03:06
Журналы, пакеты... Помогите разобраться! dmit2604 DAX: Функционал 1 07.05.2002 21:53

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

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

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