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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.11.2008, 13:40   #1  
pyramid is offline
pyramid
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2008
Как получить периодические значения
Друзья!
Подскажите, как можно выполнить вложенный запрос в X++ для получения периодических значений?
Таблица периодических значений MyTable следующей структуры:
Key - ключ,
Value - значение,
TransDate - дата начала действия значения

на T-SQL набор можно получить так:
Код:
select t1.TransDate, t1.Key, t1.Value 
from MyTable t1
join (
	select max(TransDate) TransDate, Key
	from MyTable
	where TransDate <= getdate()
	group by Key
) t2 on t2.TransDate = t1.TransDate and t2.Key = t1.Key
А как записать то же, но для X++ ?
Старый 20.11.2008, 14:02   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от pyramid Посмотреть сообщение
...
на T-SQL набор можно получить так:
Код:
select t1.TransDate, t1.Key, t1.Value 
from MyTable t1
join (
	select max(TransDate) TransDate, Key
	from MyTable
	where TransDate <= getdate()
	group by Key
) t2 on t2.TransDate = t1.TransDate and t2.Key = t1.Key
А как записать то же, но для X++ ?
Из какой таблицы нужны значения? Из первой или второй?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 20.11.2008, 14:05   #3  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от pyramid Посмотреть сообщение
...
А как записать то же, но для X++ ?
Боюсь, высокотехнологичный X++SQL не способен написать именно так.
Вложенный цикл Вам поможет.
__________________
Zhirenkov Vitaly
Старый 20.11.2008, 14:12   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если заменить вложенный запрос на проверку факта существования записей с бОльшим значением даты из заданного диапазона, то все решается достаточно просто

X++:
MyTable myTable, myTable2;
;

select myTable.TransDate, myTable.Key, myTable.Value 
from myTable
where myTable.TransDate <= getdate()

notexists join myTable2
where 
	myTable2.RecId != myTable.RecId
	&& myTable2.key == myTable.key
	&& myTable2.TransDate > myTable.TransDate
	&& myTable2.TransDate <= getdate()
Только здесь нужен дополнительный идетнификатор, позволяющий однозначно определить запись. В данном случае, это RecId.
За это сообщение автора поблагодарили: pyramid (1).
Старый 20.11.2008, 14:13   #5  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Такой запрос, насколько я понимаю, даёт аналогичный результат?

X++:
Select T1.Transdate, T1.Key, T1.Value
  From Mytable T1
 Where T1.Transdate <= Getdate ( )
   And Not Exists ( Select Null
                     From Mytable T2
                    Where T2.Transdate > T1.Transdate
                      And T2.Key = T1.Key )
Он нормально в X++ переносится.

UPD забыл условие во вложенном цикле
Where T2.Transdate <= Getdate ( )
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 20.11.2008 в 14:18.
За это сообщение автора поблагодарили: pyramid (1).
Старый 20.11.2008, 14:20   #6  
pyramid is offline
pyramid
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2008
Цитата:
Сообщение от ZVV Посмотреть сообщение
Боюсь, высокотехнологичный X++SQL не способен написать именно так.
Вложенный цикл Вам поможет.
А если мне нужно показать это в гриде, то тащить данные во временную таблицу, и напрягать сервер запросами типа
X++:
select Key, Value, maxof(TransDate)
from MyTable
where MyTable.Key == _key
  && MyTable.TransDate <= systemdateget();
, а затем подложить эту временную таблицу гриду?
Старый 20.11.2008, 14:21   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
2 Владимир Максимов
Помойму в данном случае вы перемудрили с recid.
Ваш взапрос не вернёт нужные данные, если за нужную дату окажется несколько строк..
Если б было условие только на одну строчку, тогда да, и то нужно было бы использовать не "!=", а ">" или "<"

Distinct в QueryBuildDataSource
__________________
Zhirenkov Vitaly
Старый 20.11.2008, 14:23   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от pyramid Посмотреть сообщение
А если мне нужно показать это в гриде, то тащить данные во временную таблицу, и напрягать сервер запросами типа
X++:
select Key, Value, maxof(TransDate)
from MyTable
where MyTable.Key == _key
  && MyTable.TransDate <= systemdateget();
, а затем подложить эту временную таблицу гриду?
Лучше так не делайте, напишите запрос с NotExists Join.
__________________
Zhirenkov Vitaly
Старый 20.11.2008, 14:46   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от ZVV Посмотреть сообщение
2 Владимир Максимов
Помойму в данном случае вы перемудрили с recid.
Ваш взапрос не вернёт нужные данные, если за нужную дату окажется несколько строк..
В этом случае, во-первых, теряется физический смысл справочника значений. Какое из значений следует использовать, если на одну и ту же дату их несколько?

А, во-вторых, запрос pyramid также вернет несколько значений.

Цитата:
Сообщение от ZVV Посмотреть сообщение
Если б было условие только на одну строчку, тогда да, и то нужно было бы использовать не "!=", а ">" или "<"

Distinct в QueryBuildDataSource
Напомню вашу же цитату по приведенной ссылке

Цитата:
Сообщение от ZVV
В общем, нужно учитывать специфику запроса
Требуется именно "не равно" по той причине, что ищется не "дубли", а как раз-таки записи, отличные от данной. С другими значениями дат. И нет никакой гарантии, что возрастание / убывание RecId совпадает с возрастанием / убыванием дат. Ну, т.е. что для записи с бОльшим RecId дата всегда будет больше.

Поскольку "дубли" исключены по самой природе справочника, то проблем быть не должно.

Последний раз редактировалось Владимир Максимов; 20.11.2008 в 14:51.
Старый 20.11.2008, 14:54   #10  
pyramid is offline
pyramid
Участник
 
8 / 10 (1) +
Регистрация: 04.03.2008
Спасибо, друзья!
Оба способа хороши, остановился на следующем:
X++:
while select myTable
    where myTable.TransDate <= _getdate
notexists join myTable2
    where myTable2.TransDate <= _getdate
       && myTable2.Key == myTable.Key
       && myTable2.TransDate > myTable.TransDate
{
    info(strfmt("%1 : %2 : %3", myTable.Key, myTable.Value, myTable.TransDate));
}
Старый 20.11.2008, 15:15   #11  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Владимир, на самом деле ваш запрос и мой - это одно и тоже, только у вас было дополнительное условие на recId, которое по смыслу является лишним, т.к. оно никогда не будет равно из-за условия
X++:
&& myTable2.TransDate > myTable.TransDate
Именно это я имел ввиду, когда написал "Помойму в данном случае вы перемудрили с recid."
А вот "Ваш вапрос не вернёт нужные данные, если за нужную дату окажется несколько строк.." было лишним, это уже я ошибся, т.к. думал уже о том, что буду писать дальше.

А дальше следующее: насчёт "!=" и ">":

Исходный запрос возвращает именно все строки с максимальной датой, т.е. несколько, если бы их было несколько в таблице. (вопрос о том какие данные в таблице мы не рассматриваем)

А вот если бы нужно было только одно из них, то тогда и надо было бы использовать проверку рекID и именно с ">" или "<", т.к. иначе запрос не вернул бы данных.
т.е. если бы условие было
X++:
&& myTable2.TransDate >= myTable.TransDate
Вот это не вернёт ничего (тут надо < или >):

X++:
Select T1.Transdate, T1.Key, T1.Value
  From Mytable T1
 Where T1.Transdate <= getDate()
   And Not Exists (
          Select Null
            From Mytable T2
           Where T2.Recid != T1.Recid
             And T2.Key = T1.Key
             And T2.Transdate >= T1.Transdate
             And T2.Transdate <= getDate())
но к исходному вопросу эта вторая часть уже отношения не имеет. )
__________________
Zhirenkov Vitaly
Старый 20.11.2008, 16:19   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Да, действительно перемудрил . Если дата не равна, то и RecId никак не может оказаться равным.
Теги
периодические значения

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Получить значения контролов в ExecuteSection? CDan DAX: Программирование 6 19.08.2008 15:01
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Как получить значения полей (modifiedDate, modifiedTime, modifiedBy и др.) при работе с объектами AOT типа Map? LRA DAX: База знаний и проекты 15 02.04.2007 13:37
Как получить значения поля из lookup метода в WEB Dronas DAX: Программирование 5 13.01.2005 10:17
Значения параметров из SysQueryForm. har DAX: Программирование 19 29.10.2004 15:25

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

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

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