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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.09.2003, 18:02   #1  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Помогите разобраться с QueryBuildDataSource
Создаю Lookup метод, для выбора из InventTrans токого TransRefId, который соответсвует таблицам: SalesTable или PurchTable. Т.е. необходимо показать записи, только по этим двум таблицам, остальные не нужны.

В форме один датасорс ссылающийся на таблицу InventTrans.

У него я перекрыл метод Init.
PHP код:
public void init()
{
    
Query                   query;
    
QueryBuildDataSource    qbds_InventTrans;
    
QueryBuildDataSource    qbds_SalesTable;
    
QueryBuildDataSource    qbds_PurchTable;
    
QueryBuildDataSource    qbds_InventJournalTable;
    ;

    
super();

    
Query = new Query();

    
qbds_InventTrans Query.addDataSource(tablenum(InventTrans));

    
qbds_SalesTable qbds_InventTrans.addDataSource(tablenum(SalesTable));
    
qbds_SalesTable.joinMode(JoinMode::ExistsJoin);
    
qbds_SalesTable.fetchMode(0);

    
qbds_PurchTable qbds_InventTrans.addDataSource(tablenum(PurchTable));
    
qbds_PurchTable.joinMode(JoinMode::ExistsJoin);
    
qbds_PurchTable.fetchMode(0);

    
qbds_PurchTable.addLink(FieldNum(InventTrans,TransRefId),fieldNum(PurchTable,PurchId));
    
qbds_SalesTable.addLink(FieldNum(InventTrans,TransRefId),fieldNum(SalesTable,SalesId));

    
this.query(Query);

В результате пустой грид, если оставить один присоединенный датасорс, то видно только относящиеся к нему записи.

Что я делаю не правильно?
Старый 03.09.2003, 06:38   #2  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
Привет!
Вот твой SQL - запрос:
PHP код:
SELECT FROM InventTrans 
           EXISTS JOIN 
FROM SalesTable WHERE InventTrans.TransRefId SalesTable.SalesId 
           EXISTS JOIN 
FROM PurchTable WHERE InventTrans.TransRefId PurchTable.PurchId 
Если его написать на Х++, то вернется пустое множество.

А правильный запрос будет такой (на Х++). На TransType внимание не обращай - это не суть:
PHP код:
while select InventTrans
    exists join salesTable
        exists join purchTable
                where 
(InventTrans.TransRefId == salesTable.SalesId && InventTrans.TransType == InventTransType::Sales)
                 ||   ( 
InventTrans.TransRefId  == purchTable.PurchId && InventTrans.TransType == InventTransType::Purch)
    print 
InventTrans.ItemId
...Но как "выразить" этот селект на языке QBDS - я затрудняюсь...
__________________
С уважением,
Андрей Беседин
Старый 03.09.2003, 09:12   #3  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Проще надо быть
для выбора из InventTrans токого TransRefId, который соответсвует таблицам хватит такого запроса
PHP код:
select InventTrans 
  where InventTrans
.TransType == InventTransType::Sales ||
              
InventTrans.TransType == InventTransType::Purch

// или 
qbds.addRange(fieldNum(InventTransTransType)).value(queryValue(InventTransType::Sales) + "," queryValue(InventTransType::Purch)); 
но тормоза обеспечены
Старый 03.09.2003, 10:00   #4  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
2 Wamr

Спасибо, но интересует именно мой вопрос.

Т.к. таблица InventTrans общая для нескольких компаний, и меня интересуют записи только текущей компании.
Старый 03.09.2003, 14:56   #5  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Вижу идей больше нет.

Тогда может кто нибудь подскажет, как у датасорса подменить курсор?
Старый 04.09.2003, 08:02   #6  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
Привет raz!

Вот работающий код:
PHP код:
public void init()
{
    
Query                   query;
    
QueryBuildDataSource    qbds_InventTrans;
    
QueryBuildDataSource    qbds_SalesTable;
    
QueryBuildDataSource    qbds_PurchTable;
    
QueryBuildDataSource    qbds_InventJournalTable;
    
SalesTable SalesTable;
    ;
    
super();
    
Query = new Query();
    
qbds_InventTrans Query.addDataSource(tablenum(InventTrans),"it");

    
qbds_PurchTable qbds_InventTrans.addDataSource(tablenum(PurchTable),"_pt");
    
qbds_PurchTable.joinMode(JoinMode::ExistsJoin);
    
qbds_PurchTable.fetchMode(0);
    
qbds_PurchTable.relations(false);

    
qbds_SalesTable qbds_InventTrans.addDataSource(tablenum(SalesTable),"st");
    
qbds_SalesTable.joinMode(JoinMode::ExistsJoin);
    
qbds_SalesTable.fetchMode(0);
    
qbds_InventTrans.relations(false);

    
qbds_SalesTable.addRange(fieldnum(SalesTable,salesID)).value("( (iT.transRefID == sT.salesID) || (iT.transRefID == _pT.purchID) )");

    
this.query(Query);
    
Info(this.query().dataSourceNo(1).tostring());

Идею подсказал Денис Федотенко, когда делился "стратегическим знанием"
вот ссылка на его постинг:http://www.axforum.info/forums/showt...=1634#post1634

Вопрос по ходу: что за волшебный идентификатор такой "pt" - из-за него не работало нифига...
__________________
С уважением,
Андрей Беседин
За это сообщение автора поблагодарили: raz (3).
Старый 04.09.2003, 09:02   #7  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
2 Andrew Besedin

Спасибо!!!
Все работает!!!

А я уже хотел делать с дополнительным контролом ComboBox, для предварительного выбора Заказ, Закупка, Журнал.
Старый 04.09.2003, 09:43   #8  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Странное дело, немного модифицировал метод inti, что бы добавить выбор складских журналов и ...

Именно журналы не показываются, а закупки и заказы видны.

Не пойму в чем дело.

PHP код:
public void init()
{
    
Query                   query;
    
QueryBuildDataSource    qbds_InventTrans;
    
QueryBuildDataSource    qbds_SalesTable;
    
QueryBuildDataSource    qbds_PurchTable;
    
QueryBuildDataSource    qbds_InventJournalTable;
    ;
    
super();
    
Query = new Query();
    
qbds_InventTrans Query.addDataSource(tablenum(InventTrans),"_InventTrans");

    
qbds_PurchTable qbds_InventTrans.addDataSource(tablenum(PurchTable),"_PurchTable");
    
qbds_PurchTable.joinMode(JoinMode::ExistsJoin);
    
qbds_PurchTable.fetchMode(0);
    
qbds_PurchTable.relations(false);

    
qbds_SalesTable qbds_InventTrans.addDataSource(tablenum(SalesTable),"_SalesTable");
    
qbds_SalesTable.joinMode(JoinMode::ExistsJoin);
    
qbds_SalesTable.fetchMode(0);
    
qbds_InventTrans.relations(false);

    
qbds_InventJournalTable qbds_InventTrans.addDataSource(tablenum(InventJournalTable),"_InventJournalTable");
    
qbds_InventJournalTable.joinMode(JoinMode::ExistsJoin);
    
qbds_InventJournalTable.fetchMode(0);
    
qbds_InventTrans.relations(false);

    
qbds_InventJournalTable.addRange(fieldnum(InventJournalTable,JournalId)).value("( (_InventTrans.TransRefId == _SalesTable.SalesId) ||" +
                                                                                   
" (_InventTrans.TransRefId == _PurchTable.PurchId) ||" +
                                                                                   
" (_InventTrans.TransRefId == _InventJournalTable.JournalId) )");


    
this.query(Query);

//    Info(this.query().dataSourceNo(1).tostring()); 
//   SELECT * FROM InventTrans EXISTS JOIN * FROM PurchTable EXISTS JOIN * FROM SalesTable EXISTS JOIN * FROM InventJournalTable WHERE ((( (_InventTrans.TransRefId == _SalesTable.SalesId) || (_InventTrans.TransRefId == _PurchTable.PurchId) || (_InventTrans.TransRefId == _InventJournalTable.JournalId) )))

Старый 04.09.2003, 11:26   #9  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
Привет Raz!

...Интере-е-есные вопросы задаешь, однако
Т.к. нормальные герои всегда идут в обход - предлагаю связать InventTrans с InventJournalTrans по полю InventTransID.
Работает гарантировано и решает твою задачу!
__________________
С уважением,
Андрей Беседин
Старый 04.09.2003, 11:33   #10  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Может быть поэтому:
InventTransRefId: string size 20, Adjustment Right
InventJournalId: string size 10, Adjustment Right
Старый 04.09.2003, 12:03   #11  
Andrew Besedin is offline
Andrew Besedin
Участник
 
121 / 15 (1) ++
Регистрация: 25.01.2002
Привет Эдуард!

PHP код:
public void init()
{
    
Query                   query;
    
QueryBuildDataSource    qbds_InventTrans;
    
QueryBuildDataSource    qbds_SalesTable;
    
QueryBuildDataSource    qbds_PurchTable;
    
QueryBuildDataSource    qbds_InventJournalTrans;
    ;
    
super();
    
Query = new Query();
    
qbds_InventTrans Query.addDataSource(tablenum(InventTrans),"it");
    
qbds_InventTrans.relations(false);


    
qbds_PurchTable qbds_InventTrans.addDataSource(tablenum(PurchTable),"_PT");
    
qbds_PurchTable.joinMode(JoinMode::ExistsJoin);
    
qbds_PurchTable.fetchMode(0);
    
qbds_PurchTable.relations(false);

    
qbds_SalesTable qbds_InventTrans.addDataSource(tablenum(SalesTable),"_ST");
    
qbds_SalesTable.joinMode(JoinMode::ExistsJoin);
    
qbds_SalesTable.fetchMode(0);
    
qbds_SalesTable.relations(false);

    
qbds_InventJournalTrans qbds_InventTrans.addDataSource(tablenum(InventJournalTrans),"ijt");
    
qbds_InventJournalTrans.joinMode(JoinMode::ExistsJoin);
    
qbds_InventJournalTrans.fetchMode(0);

    
qbds_InventJournalTrans.relations(false);

    
qbds_InventJournalTrans.addRange(fieldnum(InventJournalTrans,journalID)).value("( (iT.transRefID == _sT.salesID) || (iT.transRefID == _pT.purchID) || (it.InventTransID == ijt.InventTransID) )");
    
this.query(Query);

    
Info(this.query().dataSourceNo(1).tostring());

2 DN
Ты абсолютно прав насчет разных длин у EDT. Поэтому селект будет такой:
PHP код:
static void Job4(Args _args)
{

InventJournalTable InventJournalTable;
InventTrans InventTrans;

while 
select InventTrans
   join InventJournalTable
    where InventTrans
.TransRefId like /*!!! Равенство не работает!!!*/ InventJournalTable.JournalId
        
print InventTrans.TransRefId;
pause;

Но как этот LIKE затолкать в QBDS - хто бы знал
__________________
С уважением,
Андрей Беседин
Теги
query, программно

 

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

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

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

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