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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.05.2004, 11:03   #1  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Странное поведение Join
Привет.

Натолкнулся на совершенно непонятную проблему, связанную с использованием простейшей конструкцией:
PHP код:
while select table1
  order field1
  join table2
     order field1
     where table1
.field1 table2.field1
           
&& table2.field2 table3.field2
{
...

где table3 внешняя по отношению к join таблица

в table1 - 1 запись,
в table2 - 2 записи, соответствующие условию запроса

Как должно работать: все знают - выбор поочередно обеих записей из table2, соответствующий условию.
Как работает: выбор поочередно одной и тойже записи из table2 при неизменном курсоре в table1, ну и table3, разумеется .

В чем может быть проблема?
Запускал индексацию, проверку \ синхронизацию, игрался с индексами - не помогает.
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 26.05.2004, 11:32   #2  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
А что будет если поменять порядок следования таблиц в запросе?
PHP код:
while select table2 order by field1
where table2
.field2 == table3.field2
join table1 order by field1
where table1
.field1 == table2.field1 
Старый 26.05.2004, 11:52   #3  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано dn
А что будет если поменять порядок следования таблиц в запросе?
Ничего не будет, если forceselectorder не использовать. Если оптимизатор сам не справляется, значит, с индексами не все в порядке
Старый 26.05.2004, 11:56   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
И еще не пойму - зачем при
PHP код:
select table1 order field1
join table2 order field1 where 
    table1
.field1 table2.field1 && 
    
table2.field2 table3.field2 
дополнительная сортировка table2 по field1

С чего бы это форум && стал херить? Раньше такого не было
Старый 26.05.2004, 12:15   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
С чего бы это форум && стал херить? Раньше такого не было
как интересно!
будем разбираться. Спасибо
Старый 26.05.2004, 12:19   #6  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Цитата:
Изначально опубликовано Vadic
Ничего не будет, если forceselectorder не использовать. Если оптимизатор сам не справляется, значит, с индексами не все в порядке
Ничего и не случилось.
По поводу order by - взял реализацию одного из классов по российской локализации, dis слой.
Попробовал также перестроить индексы приложения - результат тот же.
ничего не меняется.

маленькое дополнение:
внутри цикла происходит присваивание курсоора:
sourceTable = table2;
и далее обработка уже sourceTable ( тип Common.)

Я к тому ,что написав подобным образом job, но без переприсваиваний через common, результат выборки становился верным.

Какие мысли по этому поводу?
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 26.05.2004, 12:28   #7  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Возникло ощущение, что я спросонья не на то отвечаю

А в чем собственно проблема?

Если брать пример (table1 - одна запись, table2 - две записи), результат у Вашего запроса будет такой:

Table1.RecId Table2.RecId Table1.Field1 Table2.Field1 Table2.Field2
1 100 Вася Вася Петя
1 101 Вася Вася Петя

Собственно, это Вы и наблюдаете.

What's Up, Doc? (c) Bugs Bunny
Старый 26.05.2004, 12:28   #8  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
sourceTable = table2;
Этим вы просто делаете ссылку на курсор и вся дальнейшая работа касается и table2
Если вам нужна копия записи делайте sourceTable = table2.data().
__________________
С уважением, Игорь Ласийчук.
Старый 26.05.2004, 12:33   #9  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Изначально опубликовано Ser

Я к тому ,что написав подобным образом job, но без переприсваиваний через common, результат выборки становился верным.
Объясните, пожалуйста, в чем разница между правильными и неправильными результатами выборки. Если можно, на примере
Старый 26.05.2004, 14:07   #10  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Цитата:
Изначально опубликовано Vadik
Объясните, пожалуйста, в чем разница между правильными и неправильными результатами выборки. Если можно, на примере
Пример:
Table1:
RecId field1
1 Вася

Table2:
RecId field1 field2 fieldn
100 Вася Петя value1
101 Вася Петя value2

Правильно (с моей точки зрения, похоже и с Вашей) :
Table1.RecId Table2.RecId Table1.Field1 Table2.Field1 Table2.Field2 Table2.Fieldn
1 100 Вася Вася Петя value1
1 101 Вася Вася Петя value2

Имеем на данный момент:
Table1.RecId Table2.RecId Table1.Field1 Table2.Field1 Table2.Field2 Table2.Fieldn
1 100 Вася Вася Петя value1
1 100 Вася Вася Петя value1

Вот собсттвенно, думаю наглядный пример. Извиняюсь, что возможно первоначально не полностью описал ситуацию.
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 26.05.2004, 14:14   #11  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
to Garic:
Да, в этом случае используется указатель на запись а не ее копия, но не думаю что это может действительно быть причиной ошибочной ситуации, поскольку указатель каждый раз внутри цикла переназначается на новую запись из table2.

Или я ошибаюсь в чем-то?
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 27.05.2004, 12:31   #12  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Беда, товарищи. Уже с ума схожу - ничего не выходит.
Каким-то образом указатель не слезает с первой записи в table2:
- сколько бы ни вводил строк - все равно выбирается только первая, зато столько раз, сколько и было бы положено;
- меняю, удаляю, добавляю - одно и тоже.

подсказка:
RPayCalculate_StandardDeduction -метод calcCommon

please, help me!
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 27.05.2004, 12:50   #13  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Перед тем, как искать ошибки в коде, стоит еще раз внимательно посмотреть на свои данные. Напишите запрос вручную, посмотрите на его результаты. Сильно удивлюсь, если они будут отличаться от тех, что видны при отладке, по крайней мере, на первом операторе внутри while select
Старый 27.05.2004, 14:41   #14  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
По-моему я уже указывал, что писал job и что там все в порядке (это первое, что было сделано), с того момента и начал сильно удивлятся. И даже переписывал его с участием common - все замечательно.
__________________
Чудес не бывает (c), истина где-то рядом (c)...
Старый 27.05.2004, 17:32   #15  
Ser is offline
Ser
NavAx
 
99 / 14 (1) ++
Регистрация: 04.03.2002
Адрес: Москва
Кому интересно: проблема локализована.
Если образно, то проблема заключается в одной строке (преобразование через common и обратно, но суть не меняется):
PHP код:
while select table1
  order field1
  join table2
     order field1
     where table1
.field1 table2.field1
           
&& table2.field2 table3.field2
{
...
    
table2 table2.data();   // грабли!!!

Опробуйте, я был сильно удивлен, хотя, понятно, ситуация не из рядовых.

Всем спасибо за участие (сочувствие )
__________________
Чудес не бывает (c), истина где-то рядом (c)...
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Странное поведение сессий sergeypp DAX: Администрирование 11 27.04.2006 11:09
Странное поведение формы Создание строк vc DAX: Функционал 10 22.03.2006 10:32
Странное поведение при использовании карантина VIS DAX: Функционал 22 15.09.2005 18:40
Странное поведение Аксапты. Kosoi DAX: Прочие вопросы 21 18.08.2005 06:51
Странное поведение резервирования после создания спланированной закупки. NEO DAX: Функционал 7 01.07.2004 14:03

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

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

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