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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.01.2018, 15:37   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,692 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
ValidTimeStateMode = NoGap. Можно ли создать запись в действующем диапазоне
Ax2012

Возникла необходимость создать запись "задним числом" в уже созданной истории. Если свойство ключа ValidTimeStateMode = Gap, то все просто:

1. Создаю "дырку" в диапазоне изменяя ValidFrom и ValidTo у существующих записей
2. Создаю новую запись с диапазоном действия в этой "дырке"

А вот если ValidTimeStateMode = NoGap, то при изменении ValidFrom или ValidTo у существующих записей автоматически корректируются диапазоны действий у соседних записей с тем, чтобы исключить появление "дырки". Соответственно, новую запись создать невозможно - будет пересечение диапазонов.

Можно ли это как-то обойти? Т.е. в итоге, по окончании модификации, "дыр" по прежнему не будет, но промежуточное состояние будет с "дыркой"
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 30.01.2018, 17:40   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,312 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Если смочь перевести часы на компьютере, где крутится АОС, то должно сработать. Правда у меня не получилось перевести часы )

Общий подход такой - есть 3 режима правки такого рода таблиц:Correction, CreateNewTimePeriod и EffectiveBased
Все режимы запрещают правку в прошлом периоде, однако в текущем и будущем периодах ведут себя по-разному:
Correction позволяет редактировать поля ValidFrom / ValidTo с последующей автоматической корректировкой дат у записей в прошлом / будущем периоде
CreateNewTimePeriod всегда дробит период
EffectiveBased - дробит только текущий период, а будущий правит в режиме Correction

Т.е. если мы убедим систему считать дату из прошлого датой из настоящего, то тогда текущий период можно разбить таким кодом:
X++:
    ttsBegin;
    dat = today() + 5; // Тут нужно поставить правильную дату
    select forUpdate validTimeState(dat) items;
    info(strFmt('Выбрана запись %1 со сроком с %2 по %3', items.name, items.ValidFrom, items.ValidTo));
    items.validTimeStateUpdateMode(ValidTimeStateUpdate::CreateNewTimePeriod);
    items.ValidFrom = dat;
    items.write();
    info(strFmt('Изменена запись %1 со сроком с %2 по %3', items.name, items.ValidFrom, items.ValidTo));
    ttsCommit;
где items - это таблица, которая имеет поле name и поля ValidFrom / ValidTo
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 30.01.2018 в 17:43.
За это сообщение автора поблагодарили: Logger (1).
Старый 30.01.2018, 21:19   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,692 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Как-то мне категорически не нравится менять глобальные настройки (системную дату) для решения локальных задач

Пока вышел из положения "хакерским" способом. Прямой модификацией диапазонов командой Update-SQL напрямую на сервере через connection, statement, executeUpdate().

Т.е. новая запись, как и положено, создается в конце всей истории, а потом прямой командой на SQL-сервере вносится изменение в диапазон дат у нужных записей (диапазоны до 3 записей может потребоваться изменить).

Нет, теоретически, можно было бы изменить только в одной, там где организовать "дырку". Но, похоже, контроль пересечения диапазонов при создании новой записи какой-то лентяй писал. Предположительно, этот контроль возможные "дыры" не ищет, а просто сравнивает со значениями в первой и последней записи Вот и приходится сначала в конец истории добавлять...
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Теги
ax2012

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно ли создать edit-метод в таблице кодом на X++? Vasiliusis DAX: Программирование 31 01.12.2016 09:30
невозможно создать запись в Rudman DAX: Программирование 3 24.08.2006 18:15
Программно создать запись в RLS. oip DAX: Программирование 9 22.12.2005 17:25
Можно ли создать нормельную отгрузку при возврате по строке Sirius DAX: Функционал 4 04.06.2004 08:25
Можно ли создать версии спецификации для номенклатуры с разными конфигурациями? Hard DAX: Функционал 4 08.12.2003 19:20

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

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

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