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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.02.2011, 07:47   #1  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
:( Query датасорса на форме
Добрый день, вот такая проблема: есть форма с датасорсом, при открытии формы в гриде отображаются все записи, так же на форме есть чекбокс, при установки галки, в гриде должны отображаться только те данные которые не входят (NoExistsJoin) в другие 4 таблицы.

Перекрываю метод modified на чекбоксе, там вызываю executeQuery датасорса. Соответственно executeQuery перекрыт, так:

X++:
QueryBuildDatasource    ds;
    QueryBuildDatasource    ds2;
    QueryBuildDatasource    ds3,ds4,ds5;
    Query                   q       = new Query();
    ;
    if (Open.checked())
    {
        ds = q.addDataSource(tableNum(PurchTable_request));

        ds3 = ds.addDataSource(tableNum(RcontractTable));
        ds3.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(RcontractTable, RequestId));
        ds3.joinMode(JoinMode::NoExistsJoin);

        ds2 = ds.addDataSource(tableNum(PurchTable));
        ds2.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(PurchTable, RequestId));
        ds2.joinMode(JoinMode::NoExistsJoin);

        ds4 = ds.addDataSource(tableNum(PurchLine));
        ds4.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(PurchLine, RequestId));
        ds4.joinMode(JoinMode::NoExistsJoin);


        ds5 = ds.addDataSource(tableNum(AdvanceHolderTable));
        ds5.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(AdvanceHolderTable, RequestId));
        ds5.joinMode(JoinMode::NoExistsJoin);
        ds5.fetchMode(QueryFetchMode::One2One);

        PurchTable_request_DS.queryRun().query(q);
    }
    else
    {
        super();
    }
не работает
подскажите плиз где что не так написал?
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 07.02.2011, 08:24   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
  1. fetchMode(QueryFetchMode::One2One) надо добавить к каждому вложенному датасорсу
  2. super() должен вызываться в любом случае - иначе у вас запрос на сервер не будет уходить.
  3. Если вы для обновления фильтра вызываете ExecuteQuery(), то запрос должен находиться в PurchTable_request_DS.Query()
  4. Надо обрабатывать обе ветки if (Open.checked()) - иначе без переоткрытия формы не получится снять фильтр
  5. Слишком много датасорсов на одном уровне вложенности - Аксапта может такое и не проглотить. Можно попробовать сформулировать запрос так, что бы вложенные датасорсы "цеплялись" друг за друга
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 07.02.2011 в 08:27.
Старый 07.02.2011, 08:33   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
не работает - выдаёт ошибку? или
не работает - скрывает не те записи/не скрывает не те записи?

почему fetchMode One2One устанавливается только пятому источнику?
Старый 07.02.2011, 08:49   #4  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от AndyD Посмотреть сообщение
  1. fetchMode(QueryFetchMode::One2One) надо добавить к каждому вложенному датасорсу
  2. super() должен вызываться в любом случае - иначе у вас запрос на сервер не будет уходить.
  3. Если вы для обновления фильтра вызываете ExecuteQuery(), то запрос должен находиться в PurchTable_request_DS.Query()
  4. Надо обрабатывать обе ветки if (Open.checked()) - иначе без переоткрытия формы не получится снять фильтр
  5. Слишком много датасорсов на одном уровне вложенности - Аксапта может такое и не проглотить. Можно попробовать сформулировать запрос так, что бы вложенные датасорсы "цеплялись" друг за друга
Не работает, не фильтрует. ((
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 07.02.2011, 08:55   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Покажите код после исправления
__________________
Axapta v.3.0 sp5 kr2
Старый 07.02.2011, 09:02   #6  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
X++:
ds = q.addDataSource(tableNum(PurchTable_request));

        ds3 = ds.addDataSource(tableNum(RcontractTable));
        ds3.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(RcontractTable, RequestId));
        ds3.joinMode(JoinMode::NoExistsJoin);
        ds3.fetchMode(QueryFetchMode::One2One);

        ds2 = ds.addDataSource(tableNum(PurchTable));
        ds2.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(PurchTable, RequestId));
        ds2.joinMode(JoinMode::NoExistsJoin);
        ds2.fetchMode(QueryFetchMode::One2One);

        ds4 = ds.addDataSource(tableNum(PurchLine));
        ds4.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(PurchLine, RequestId));
        ds4.joinMode(JoinMode::NoExistsJoin);
        ds4.fetchMode(QueryFetchMode::One2One);

        ds5 = ds.addDataSource(tableNum(AdvanceHolderTable));
        ds5.addLink(fieldNum(PurchTable_request,  RequestId), fieldNum(AdvanceHolderTable, RequestId));
        ds5.joinMode(JoinMode::NoExistsJoin);
        ds5.fetchMode(QueryFetchMode::One2One);

        PurchTable_request_DS.query(q);
        super();
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 07.02.2011, 09:09   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AndyD Посмотреть сообщение
Слишком много датасорсов на одном уровне вложенности - Аксапта может такое и не проглотить.
Что бы проверить эту гипотезу, после применения фильтра посмотрите на результат следующей команды:
X++:
info(PurchTable_request_DS.query().DataSourceNo(1).ToString());
Старый 07.02.2011, 09:10   #8  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Информация:
SELECT * FROM PurchTable_request NOTEXISTS JOIN * FROM RContractTable WHERE PurchTable_request.RequestId = RContractTable.RequestId NOTEXISTS JOIN * FROM PurchTable WHERE PurchTable_request.RequestId = PurchTable.RequestId NOTEXISTS JOIN * FROM PurchLine WHERE PurchTable_request.RequestId = PurchLine.RequestId NOTEXISTS JOIN * FROM AdvanceHolderTable WHERE PurchTable_request.RequestId = AdvanceHolderTable.RequestId
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 07.02.2011, 09:13   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Что бы проверить эту гипотезу, после применения фильтра посмотрите на результат следующей команды:
X++:
info(PurchTable_request_DS.query().DataSourceNo(1).ToString());
Не факт. toString() может нарисовать правильно, а вот уходить на сервер будет совершенно другой запрос

Надо включать трассировку запросов и смотреть, что реально уходит

PS Угум. А вот и подтверждение.

2kalex_a - смотрите, какой запрос уходит на сервер
__________________
Axapta v.3.0 sp5 kr2
Старый 07.02.2011, 09:21   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AndyD Посмотреть сообщение
Не факт. toString() может нарисовать правильно, а вот уходить на сервер будет совершенно другой запрос
Честно говоря, на практике никогда не встречал такой ситуации. Всегда думал что проблема именно в парсере запросов, а не в их трансляции. В любом случае проверить никогда не повредит.

kalex_a, а если временно упростить запрос (оставить только один или два exists join), то он отработает?

Последний раз редактировалось S.Kuskov; 07.02.2011 в 09:24.
Старый 07.02.2011, 09:36   #11  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Честно говоря, на практике никогда не встречал такой ситуации. Всегда думал что проблема именно в парсере запросов, а не в их трансляции. В любом случае проверить никогда не повредит.

kalex_a, а если временно упростить запрос (оставить только один или два exists join), то он отработает?
с одним отрабатывает
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 16.02.2011, 09:46   #12  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Оставил два no exists join, на сервер уходит вот такой запрос:

X++:
declare @p1 int
set @p1=1073742866
declare @p2 int
set @p2=180158983
declare @p5 int
set @p5=16
declare @p6 int
set @p6=1
declare @p7 int
set @p7=-1
exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 nvarchar(8),@P2 int,@P3 nvarchar(2002),@P4 nvarchar(8),@P5 nvarchar(8)',N'SELECT 
A.REQUESTID,A.CURRENCYCODE,A.DIMENSION,A.DIMENSION2_,A.DIMENSION3_,A.DIMENSION4_,A.DIMENSION5_,A.DIMENSION6_,A.DIMENSION7_,A.CONFIRM_LABEL1,A.CONFIRM_COSTCONTROL,A.CONFIRM_FINAL,A.DATECONFIRM_LABEL1,A.DATECONFIRM_COSTCONTROL,A.DATECONFIRM_FINAL,A.USERCONFIRMLABEL1,A.USERCONFIRM_COSTCONTROL,A.USERCONFIRM_FINAL,A.AMMOUNT,A.USER_REGISTR,A.DATE_REGISTR,A.FIELD1,A.ID_COMPETENCE,A.REQUESTID_REZERV,A.ATF_TYPEREQUEST,A.AMMOUNT_BALANS,A.VENDACCOUNT,A.VENDRNN,A.VENDNAME,A.CONTRACTDATE,A.CONTRACTNUMBER,A.DATECONFIRM_TOPAY,A.USERCONFIRM_TOPAY,A.AMMOUNT_PAYMENT,A.CONFIRM_TOPAY,A.REQUESTURL,A.MODIFIEDDATE,A.MODIFIEDTIME,A.MODIFIEDBY,A.CREATEDDATE,A.CREATEDTIME,A.CREATEDBY,A.RECVERSION,A.RECID,A.REQUEST_TEXT 
FROM PURCHTABLE_REQUEST A WHERE ((A.DATAAREAID=@P1) AND ((A.CONFIRM_FINAL=@P2) AND  NOT ((A.REQUESTURL=@P3)))) AND NOT EXISTS (SELECT ''x'' FROM PURCHTABLE B WHERE 
((B.DATAAREAID=@P4) AND (A.REQUESTID=B.REQUESTID)) AND NOT EXISTS (SELECT ''x'' FROM PURCHLINE C WHERE ((C.DATAAREAID=@P5) AND (A.REQUESTID=C.REQUESTID)))) ORDER BY A.DATAAREAID 
DESC,A.DATECONFIRM_FINAL DESC OPTION(FAST 1)',@p5 output,@p6 output,@p7 output,N'dat',1,N'',N'dat',N'dat'
select @p1, @p2, @p5, @p6, @p7
но фильтрует только по первому (PurchTable).

Не пойму в чем проблема.
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 16.02.2011, 10:08   #13  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kalex_a Посмотреть сообщение
Оставил два no exists join ...
Вы уж определитесь какой конкретно запрос вам нужен.
Код:
SELECT ... FROM PURCHTABLE_REQUEST A 
WHERE ... AND 
NOT EXISTS 
(
	SELECT ... FROM PURCHTABLE B 
	WHERE ... AND 
	NOT EXISTS 
	(
		SELECT ... FROM PURCHLINE C 
		WHERE ...
	)
)
и
Код:
SELECT ... FROM PURCHTABLE_REQUEST A 
WHERE ... AND 
NOT EXISTS 
(
	SELECT ... FROM PURCHTABLE B 
	WHERE ...
)
AND NOT EXISTS 
(
	SELECT ... FROM PURCHLINE C 
	WHERE ...
)
совсем не одно и тоже
Старый 16.02.2011, 10:19   #14  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вы уж определитесь какой конкретно запрос вам нужен.
Код:
SELECT ... FROM PURCHTABLE_REQUEST A 
WHERE ... AND 
NOT EXISTS 
(
    SELECT ... FROM PURCHTABLE B 
    WHERE ... AND 
    NOT EXISTS 
    (
        SELECT ... FROM PURCHLINE C 
        WHERE ...
    )
)
и
Код:
SELECT ... FROM PURCHTABLE_REQUEST A 
WHERE ... AND 
NOT EXISTS 
(
    SELECT ... FROM PURCHTABLE B 
    WHERE ...
)
AND NOT EXISTS 
(
    SELECT ... FROM PURCHLINE C 
    WHERE ...
)
совсем не одно и тоже
А разве можно в Ax сделать второй вариант? По-моему, логика транслятора - "пихать все последовательно в WHERE" такого не позволяет...
Второй Not Exists всегда выношу в проверку внутри цикла, либо если на форме, то через временную таблицу...
Старый 16.02.2011, 10:20   #15  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Вы уж определитесь какой конкретно запрос вам нужен.
Код:
SELECT ... FROM PURCHTABLE_REQUEST A 
WHERE ... AND 
NOT EXISTS 
(
	SELECT ... FROM PURCHTABLE B 
	WHERE ... AND 
	NOT EXISTS 
	(
		SELECT ... FROM PURCHLINE C 
		WHERE ...
	)
)
и
Код:
SELECT ... FROM PURCHTABLE_REQUEST A 
WHERE ... AND 
NOT EXISTS 
(
	SELECT ... FROM PURCHTABLE B 
	WHERE ...
)
AND NOT EXISTS 
(
	SELECT ... FROM PURCHLINE C 
	WHERE ...
)
совсем не одно и тоже
Второй. Но никак не получается. ((
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 16.02.2011, 10:30   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от vanokh Посмотреть сообщение
А разве можно в Ax сделать второй вариант?
Нельзя.
Цитата:
Сообщение от kalex_a Посмотреть сообщение
Второй. Но никак не получается. ((
Я знаю. Поэтому и спрашивю, тот запрос который сформировала аксапта вас устраивает? Вы этого и хотели?
Старый 16.02.2011, 10:34   #17  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Да. Раз нельзя в Акс сделать второй вариант, то каким образом сделать выборку (((((
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Старый 16.02.2011, 10:46   #18  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от kalex_a Посмотреть сообщение
Да. Раз нельзя в Акс сделать второй вариант, то каким образом сделать выборку (((((
Да устраивает? И всё-таки вам нужен второй вариант? В AX2009 появилась возможность делать UNION. Можно попробовать через него
Старый 16.02.2011, 10:56   #19  
vanokh is offline
vanokh
Участник
 
108 / 63 (3) ++++
Регистрация: 23.10.2008
Цитата:
Сообщение от kalex_a Посмотреть сообщение
Да. Раз нельзя в Акс сделать второй вариант, то каким образом сделать выборку (((((
Либо через временную таблицу - собрать в нее RecId тех записей, которые не должны быть из таблиц RContractTable, PurchTable, PurchLine и т.д. И эту временную таблицу подцепить уже через один Not Exists.
Старый 16.02.2011, 12:44   #20  
kalex_a is offline
kalex_a
Участник
Аватар для kalex_a
Самостоятельные клиенты AX
MCBMSS
 
160 / 19 (1) ++
Регистрация: 26.11.2007
Адрес: Казахстан
Цитата:
Сообщение от vanokh Посмотреть сообщение
Либо через временную таблицу - собрать в нее RecId тех записей, которые не должны быть из таблиц RContractTable, PurchTable, PurchLine и т.д. И эту временную таблицу подцепить уже через один Not Exists.
Разве временную можно подцепить?
По моему нет, там ошибку какую то выдает
__________________
Лучше сделать и жалеть, чем жалеть что не сделал
Теги
exists, query

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Query на Datasource в LookUp-форме. dynamax DAX: Программирование 26 09.10.2009 15:58
Отображение AOT_Query на форме часть 2 radya DAX: Программирование 7 05.06.2008 17:33
отображение значений query на форме fialka DAX: Программирование 13 31.07.2007 14:31
Как в форме CustTrans через query отобрать записи у которых AmountCur != 0 ( когда в QueryBuildRange ставишь value(strFmt('!0')); - не работает!) rkorchagin DAX: Программирование 12 02.04.2007 17:58
Динамическое изменение Query() на форме makos DAX: Программирование 22 05.07.2006 16:28
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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