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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.09.2005, 11:07   #1  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Проблемы с OuterJoin
Модифицировал форму SalesTable, добавив в нее новый DataSource с самопальной таблицей RMEPrintHistory.
Новый DataSource (RMEPrintHistory) соединяется с DataSource (SalesTable) c типом связи OuterJoin.
В таблице RMEPrintHistory в узле Relations, указана таблица SalesTable, далее в условии соединения задано
SalesTable.salesid== RMEPrintHistory.salesid
and
RMEPrintHistory.documentstatus == 28 (Facture_Ru)
Отношение между таблицами SalesTable и RMEPrintHistory один ко многим .
Все работает без проблем.
Но стоит применить фильтрацию к гриду , и условие RMEPrintHistory.documentstatus == 28 (Facture_Ru) словно слетает и вылезают все записи для которых верно SalesTable.salesid== RMEPrintHistory.salesid.
Голову сломал, в чем может быть дело ... не пойму. Если кто сталкивался с подобным, помогите!

Вложения
Тип файла: img78727-1 (28.3 Кб, 389 просмотров)
Тип файла: img78727-2 (73.8 Кб, 518 просмотров)
Старый 01.09.2005, 11:08   #2  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
...
Изображения
Тип файла: bmp relations.bmp (28.3 Кб, 270 просмотров)
Старый 01.09.2005, 11:09   #3  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
....
Изображения
Тип файла: bmp salestable.bmp (73.8 Кб, 186 просмотров)
Старый 01.09.2005, 11:24   #4  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
Можно посмотреть какая команда реально приходит на сервер SQL c помощью монитора SQL Аксапты или профайлера SQL Server
Старый 01.09.2005, 11:53   #5  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Посмотрел в профайлере .....
До фильтрации
PHP код:
SELECT FROM  
{oj SALESTABLE A LEFT OUTER JOIN RMEPRINTHISTORY B ON ((B.DATAAREAID=''rg+'') AND ((B.DOCUMENTSTATUS=28) AND (A.SALESID=B.SALESID)))} WHERE (A.DATAAREAID=''rg+''
ORDER BY A.DATAAREAID DESC,A.SALESID DESC OPTION(FAST 1
после фильтрации
PHP код:
SELECT FROM  {oj SALESTABLE A LEFT OUTER JOIN RMEPRINTHISTORY B ON ((B.DATAAREAID=''rg+'') AND (A.SALESID=B.SALESID))} WHERE ((A.DATAAREAID=''rg+'') AND (A.DELIVERYDATE={ts ''2005-09-01 00:00:00.000''})) ORDER BY A.DATAAREAID DESC,A.SALESID DESC OPTION(FAST 1
условия B.DOCUMENTSTATUS=28 как не бывало .....
Почему ?
Старый 01.09.2005, 11:57   #6  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
По-моему вы строите релейшен не на той таблице. Попробуйте на SalesTable построить рейлейшн на RMEPrintHistory
Старый 01.09.2005, 12:11   #7  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
А в форме запроса для фильтрации есть строка с DocumentStatus = 28 ?
Старый 01.09.2005, 12:15   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 Bega

DocumentStatus принадлежит подчиненной таблице. Чтобы отфильтровать по нему явно надо связать таблицы в фильтре и выбирать уже по RMEPrintHistory.DocumentStatus
Старый 01.09.2005, 12:18   #9  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
У меня есть похожий случай, в форме фильтра строка с полем по которому есть связь типа "поле ссылки фиксировано" отображается сразу, ее не надо добавлять пользователю
Старый 01.09.2005, 12:21   #10  
Bega is offline
Bega
Участник
Аватар для Bega
 
382 / 444 (15) +++++++
Регистрация: 18.08.2005
Адрес: Москва
может попробовать сбросить настройки пользователя ?
Старый 01.09.2005, 12:22   #11  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
По-моему я делал все правильно (все-таки основной таблицей является SalesTable).
Но все же попробовал перенести релэйшн в Salestable ...
Получил два запроса без условия B.DOCUMENTSTATUS=28

до фильтрации

PHP код:
SELECT 
 
FROM  {oj SALESTABLE A 
    LEFT OUTER JOIN 
  RMEPRINTHISTORY B ON 
((B.DATAAREAID=''rg+'')
  AND (
A.SALESID=B.SALESID))}
 
WHERE (A.DATAAREAID=''rg+''ORDER BY A.DATAAREAID 
DESC
,A.SALESID DESC OPTION(FAST 1

после фильтрации
PHP код:
SELECT 
FROM  {oj SALESTABLE A
 LEFT OUTER JOIN RMEPRINTHISTORY B
 ON 
((B.DATAAREAID=''rg+'') AND (A.SALESID=B.SALESID))}
 
WHERE ((A.DATAAREAID=''rg+'')
 AND (
A.DELIVERYDATE={ts ''2005-09-01 00:00:00.000''}))
 
ORDER BY A.DATAAREAID DESC,A.SALESID DESC 
OPTION
(FAST 1
Так что ближе к истине 1 вариант релэйшина.
Вопрос в том, почему при фильтрации условие B.DOCUMENTSTATUS=28 словно корова съедает ...
Цитата:
А в форме запроса для фильтрации есть строка с DocumentStatus = 28 ?
Нет там такого условия. Но там также нет и условия равенства salesid, однако оно попадает запрос ...
Старый 01.09.2005, 12:35   #12  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Цитата:
DocumentStatus принадлежит подчиненной таблице. Чтобы отфильтровать по нему явно надо связать таблицы в фильтре и выбирать уже по RMEPrintHistory.DocumentStatus
Опа! Вот это сюрприз! Т.е. фиксированные поля аксапта отбрасывает, а "нормальные" помнит? Так? В таком случае весьма и весьма странно получается ... Всегда надо помнить, что созданный релэйшн работает корректно только до той поры, пока кто-то не решит отфильтровать .... С трудом верю в эту багу. Может есть какая-то причина, может все-таки я чего-то не учел?
Старый 01.09.2005, 12:47   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Извиняюсь, что внес сумятицу в вопрос. Невнимательно прочитал вопрос и посчитал, что много записей в SalesTable
Старый 01.09.2005, 12:53   #14  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Я расчитывал, что выборка будет идти по следующему алгоритму
без фильтрации
PHP код:
select 
  
from SalesTable s
         left outer join
       RMEPrintHistory ph
         on s
.salesid ph.salesid
            
and ph.documentstatus 28 
после фильтрации
PHP код:
select 
  
from SalesTable s
         left outer join
       RMEPrintHistory ph
         on s
.salesid ph.salesid
            
and ph.documentstatus 28  
  where s
.deliverydate xxxxx
              
and и .д
Т.е джойн между таблицами должен быть неизменным, добавляются лишь условия в раздел where
Старый 01.09.2005, 13:01   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Сейчас проверил. Поле связи фиксировано действительно присутствует в фильтре и устанавливатеся явно. При этом связанная таблица также явно указывается. Т.е. возможно вы убираете этот критерий из запроса? Могли бы вы показать скриншот самого запроса?
Старый 01.09.2005, 13:19   #16  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Спасибо за помощь.
Да, фиксированное поле присутсвует в виде условия ( которое можно удалить).
Проблемы были из-за настроек пользователя. Подхватывался ранее настроенный запрос.
После сброса настроек и удаления ранее сохраненных запросов фиксированное поля появилось.
Вот бы его еще удалять нельзя было =)
Изображения
Тип файла: bmp query.bmp (69.2 Кб, 270 просмотров)
Старый 01.09.2005, 13:25   #17  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Изначально опубликовано ATimTim

Нет там такого условия. Но там также нет и условия равенства salesid, однако оно попадает запрос ...
Поле связи (SalesId) выбирается по релейшенам при построении отношения 1:n. В данном случае это присходит автоматом. Посмотрите в структуре - там указываются связываемые таблицы, вот там оно (поле) и находится, только явно не указывается. И здесь есть проблема - если в связываемой таблице есть два или больше поля, ссылающихся на одну таблицу, то связь будет построена только по первому.

Цитата:
Изначально опубликовано ATimTim

Вот бы его еще удалять нельзя было =)
Чтобы его нельзя было удалить необходимо ему установить статус Locked или Hidden
Старый 01.09.2005, 13:28   #18  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Посмотрите здесь http://www.axforum.info/forums/showt...8623#post78623 это обсуждалось только вчера для журналов
Старый 01.09.2005, 13:28   #19  
ATimTim is offline
ATimTim
Участник
 
395 / 13 (1) ++
Регистрация: 10.06.2004
Адрес: Питер
Цитата:
Чтобы его нельзя было удалить необходимо ему установить статус Locked или Hidden
Да, в курсе. Только хотелось бы автоматом, без программирования =)
Старый 01.09.2005, 15:51   #20  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
К сожалению без программирования я не знаю способа. Но могу предложить как это сделать для всей системы.

Класс SysQueryForm, метод buildRange

1. Необходимо добавить следующую вложенную функцию

PHP код:
boolean CheckFixedField(QueryBuildRange _range)
{
    
FieldId         fieldId;
    
DictRelation    dictRelation;
    
int             cnt;
    ;

    if (!
hasSecuritykeyAccess(securityKeyName2id(securitykeystr(AdminSetup)),AccessType::View) &&
        
_range && _range.dataSource() && _range.dataSource().joined())
    {
        
fieldId _range.field();

        
dictRelation = new DictRelation(_range.table());
        
dictRelation.loadTableRelation(_range.dataSource().parentDataSource().table());
        if (
dictRelation.validate())
        {
            for (
cnt 1cnt <= dictRelation.lines(); cnt++)
            {
                if ((
dictRelation.lineType(cnt) == TableRelation::ThisFixed) &&
                    (
dictRelation.lineTableValue(cnt) == fieldId))
                    return 
True;
            }
        }

    }
    return 
False;

2. Изменить следующий код

PHP код:
                    if (dynalinkFieldSet &&
                        
dynalinkFieldSet.in(queryBuildRange.field()))
                    {
                        
rangeStatus RangeStatus::Hidden;
                    }
                    else
                    {
                        
rangeStatus queryBuildRange.status();
                    } 
на

PHP код:
                    if (dynalinkFieldSet &&
                        
dynalinkFieldSet.in(queryBuildRange.field()))
                    {
                        
rangeStatus RangeStatus::Hidden;
                    }
                    else if (
CheckFixedField(queryBuildRange))
                    {
                        
rangeStatus RangeStatus::Locked;
                        
// или rangeStatus = RangeStatus::Hidden;
                    
}
                    else
                    {
                        
rangeStatus queryBuildRange.status();
                    } 
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблемы с Exists Join Logger DAX: Программирование 28 28.04.2010 02:54
Расширенный AddRange и OuterJoin Russland DAX: Программирование 0 04.07.2006 16:36
Опять про OuterJoin нескольких таблиц murad DAX: Программирование 1 15.05.2006 10:26
Проблемы работы ERP в многофилиальной и территориально разнесённой компании СНГ. SlavaK DAX: Прочие вопросы 18 02.03.2004 15:25

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

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

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