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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.02.2012, 11:38   #1  
stgor is offline
stgor
Участник
 
3 / 10 (1) +
Регистрация: 27.06.2011
Изменить modifiedDate
Доброго дня!
Подскажите, как можно изменить modifiedDate?

X++:
priceDiscTable.overwriteSystemfields(true);

        modifiedDate = str2date('05.10.2011',123);
        priceDiscTable.(fieldnum(PriceDiscTable, modifiedDate)) = modifiedDate; 

          priceDiscTable.doUpdate();
Позволяет редактировать запись, не изменяя modifiedDate на текущую дату, но и не ставит ту, что мне нужна...
Старый 21.02.2012, 11:55   #2  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,510 / 435 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
А зачем вам нужно менять modifiedDate?
__________________
С уважением,
Вячеслав
Старый 21.02.2012, 12:03   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от stgor Посмотреть сообщение
Доброго дня!
Подскажите, как можно изменить modifiedDate?

X++:
priceDiscTable.overwriteSystemfields(true);

        modifiedDate = str2date('05.10.2011',123);
        priceDiscTable.(fieldnum(PriceDiscTable, modifiedDate)) = modifiedDate; 

          priceDiscTable.doUpdate();
Позволяет редактировать запись, не изменяя modifiedDate на текущую дату, но и не ставит ту, что мне нужна...
нужно "ещё получить разрешение" т.е. OverwriteSystemfieldsPermission.
X++:
new OverwriteSystemfieldsPermission().assert();

         priceDiscTable.overwriteSystemfields(true);

        modifiedDate = str2date('05.10.2011',123);
        priceDiscTable.(fieldnum(PriceDiscTable, modifiedDate)) = modifiedDate; 

        priceDiscTable.doUpdate();

CodeAccessPermission::revertAssert();
А вообще читайте ВОТ ЭТУ тему.

З.Ы. поиск рулит
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: alex55 (1).
Старый 21.02.2012, 23:25   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 lev
Меняют ModifiedDate - наврядли это 2009-я.

2 stgor
Надо поменять значение какого-либо несистемного поля, иначе Аксапта считает, что ничего не изменилось и не обновляет запись
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: lev (3).
Старый 22.02.2012, 09:38   #5  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
2 lev
Меняют ModifiedDate - наврядли это 2009-я.
точно, в 2009 уже ModifiedDateTime...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 22.02.2012, 11:31   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Проблема в том, что Axapta выполняет обновление данных только в том случае, если было изменено хотя бы одно из НЕ системных полей. В противном случае команда UPDATE на сервер просто не уходит, поскольку Axapta считает, что ничего не было изменено. Незачем лишний раз посылать на сервер "пустую" команду.

Другими словами, Вам надо добавить изменение какого-либо еще НЕ системного поля. Любого.

X++:
// Чтобы подействовало изменение системных полей необходимо изменить НЕ системное поле
priceDiscTable.Amount += 0.01;
priceDiscTable.doUpdate();

priceDiscTable.overwriteSystemfields(true);

modifiedDate = str2date('05.10.2011',123);
priceDiscTable.(fieldnum(PriceDiscTable, modifiedDate)) = modifiedDate; 

// Возвращаем значение НЕ системного поля в исходное значение
priceDiscTable.Amount -= 0.01;

priceDiscTable.doUpdate();
Пожалуй, наиболее корректным решением было бы добавить в таблицу поле-примечание и делать запись в нем, указывая причину изменения системных полей.

PS: Не заметил ответ AndyD. Он это уже написал
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 22.02.2012, 13:00   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Не знаю, как в 3.0 (лень проверять ), а в 2009-й ядро никакими штатными средствами не позволяет менять createdDateTime/modifiedDateTime на обновлении записи - только на создании. Иначе, к примеру, такая фишка как аудиторский след (ГК/Запросы/Аудиторский след) потеряет смысл.
Старый 22.02.2012, 13:29   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Это не панацея, кому нужно - тот и прямым SQL запросом данные подкорректировать сможет.
Старый 25.05.2012, 13:22   #9  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Не знаю, как в 3.0 (лень проверять ), а в 2009-й ядро никакими штатными средствами не позволяет менять createdDateTime/modifiedDateTime на обновлении записи - только на создании. Иначе, к примеру, такая фишка как аудиторский след (ГК/Запросы/Аудиторский след) потеряет смысл.
createdDateTime, как и другие поля created* - да, причем это работает не только в 2009-й, но и 4.0, да и в трешке я думаю тоже, поле modifiedDateTime, как и другие modified* можно менять, при соблюдении условий, которые обозначены выше.

Логика думаю понятна - поля created* могут формироваться только при вставке, modified* - вставке\обновлении.
__________________
Sergey Nefedov
Старый 25.05.2012, 13:40   #10  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от SRF Посмотреть сообщение
поле modifiedDateTime, как и другие modified* можно менять, при соблюдении условий, которые обозначены выше.
Это - ваша теория или выводы на основе реальных экспериментов по изменению того же modifiedDateTime? Из моего скромного опыта, при отправке запроса на обновление записи ядро вообще "не смотрит", что там прописано в поле modifiedDateTime табличного буфера, и запрос, в случае с Ораклом, получается вида
PHP код:
update SomeTable set fld1=@in1fld2=@inmodifiedDateTime=SYSUTCDATETIME()
output inserted.modifiedDateTime 
Т.е. поле в базе заполняется не значением из табличного буфера, а значением, возвращаемым системной функцией СУБД. Насколько я понимаю, в случае с SQL Server происходит то же самое, см. также Create RecID index on tables with Created/Modified DateTime fields
Старый 25.05.2012, 13:58   #11  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Это - ваша теория или выводы на основе реальных экспериментов по изменению того же modifiedDateTime?
И теория и практика - поля дат проверил джобом, остальное не стал, думаю работать будет по тому же принципу.

X++:
static void checkSystemFieldOverWrite(Args _args)
{
    CustTable   custTable;
    ;

    ttsbegin;
    
    custTable = CustTable::find('4000', true);

    new OverwriteSystemfieldsPermission().assert();
    custTable.overwriteSystemfields(true);
    custTable.(fieldNum(CustTable, modifiedDateTime))   = DateTimeUtil::newDateTime(20\05\2012, 0);
    custTable.(fieldNum(CustTable, createdDateTime))    = DateTimeUtil::newDateTime(20\05\2012, 0);
    custTable.City = 'check';
    custTable.update();

    CodeAccessPermission::revertAssert();

    ttscommit;

    info("done");
}
SQL 2008 R2 DAX2009 RU8
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: gl00mie (2).
Старый 25.05.2012, 15:08   #12  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от SRF Посмотреть сообщение
поля дат проверил джобом, остальное не стал, думаю работать будет по тому же принципу.
Да, и правда дает на обновлении прописать другое зачение modifiedDateTime, а вот другие modifiedBy/modifiedTransactionId/createdXX - не дает, точнее, игнорирует такие попытки.
За это сообщение автора поблагодарили: SRF (1).
Старый 28.05.2012, 07:17   #13  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Насчет полей modifiedBy\modifiedTransactionId - у меня система ведет себя так :

Если обновлять поля из джоба\класса и перед обновлением запускать поиск, обновляемого курсора, как в примере ниже, то значения указанных полей просто затираются
X++:
static void checkSystemFieldOverWrite(Args _args)
{
    CustTable   custTable;
    ;

    ttsbegin;

    custTable = CustTable::find('4000', true); 

    new OverwriteSystemfieldsPermission().assert();
    custTable.overwriteSystemfields(true);
    //custTable.(fieldNum(CustTable, modifiedDateTime))   = DateTimeUtil::newDateTime(19\05\2012, 0);
    //custTable.(fieldNum(CustTable, createdDateTime))    = DateTimeUtil::newDateTime(19\05\2012, 0);
    custTable.(fieldNum(CustTable, modifiedBy))             = 'test';
    custTable.(fieldNum(CustTable, ModifiedTransactionId))  = 444444;
    custTable.City = 'check';
    custTable.update();

    CodeAccessPermission::revertAssert();

    ttscommit;

    info("done");
}
Если обновить запись, которая находится непоcредственно на форме(при этом не разрывать связь с ДС), то значения полей меняются :

X++:
static void main(Args  _args)
{
    CustTable   custTable;
    ;

    custTable = _args.record();
    new OverwriteSystemfieldsPermission().assert();
    custTable.overwriteSystemfields(true);
    //custTable.(fieldNum(CustTable, modifiedDateTime))   = DateTimeUtil::newDateTime(19\05\2012, 0);
    //custTable.(fieldNum(CustTable, createdDateTime))    = DateTimeUtil::newDateTime(19\05\2012, 0);
    custTable.(fieldNum(CustTable, modifiedBy))             = 'test';
    custTable.(fieldNum(CustTable, ModifiedTransactionId))  = 444444;
    custTable.City = 'check';
    custTable.update();

    CodeAccessPermission::revertAssert();
}
__________________
Sergey Nefedov
Старый 28.05.2012, 14:24   #14  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Да, и правда дает на обновлении прописать другое зачение modifiedDateTime, а вот другие modifiedBy/modifiedTransactionId/createdXX - не дает, точнее, игнорирует такие попытки.
Цитата:
Сообщение от SRF Посмотреть сообщение
Насчет полей modifiedBy\modifiedTransactionId - у меня система ведет себя так :

Если обновлять поля из джоба\класса и перед обновлением запускать поиск, обновляемого курсора, как в примере ниже, то значения указанных полей просто затираются.

Если обновить запись, которая находится непоcредственно на форме(при этом не разрывать связь с ДС), то значения полей меняются.
У меня из джоба меняются значения всех modified* полей. Схема в точности такая же.

Не работало, когда менял значение в поле Name на то же самое, но чтобы значения полей затирались...

Последний раз редактировалось Dark Light; 28.05.2012 в 14:28.
Старый 29.05.2012, 09:17   #15  
Hammer is offline
Hammer
Участник
Аватар для Hammer
 
43 / 12 (1) ++
Регистрация: 24.06.2009
Адрес: Подольск
А можно нужную дату и время поставить на сервере и сделать update записи.
Старый 29.05.2012, 09:30   #16  
Dark Light is offline
Dark Light
Участник
 
64 / 49 (0) +++
Регистрация: 17.02.2009
Адрес: Омск
Цитата:
Сообщение от Hammer Посмотреть сообщение
А можно нужную дату и время поставить на сервере и сделать update записи.
Вот остальные пользователи в это время обрадуются
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Изменить текст меток по всей базе с заданными условиями Cardagant DAX: Программирование 3 23.12.2011 21:06
Достаточно ли изменить дату в таблицах inventTrans, inventTransPosting, VendPackingSlipJour? DmitryS DAX: Программирование 3 18.09.2008 14:37
Как изменить фамилию гл.буха в счет-фактуре? AX 3.0. Подскажите... Бриллиантик DAX: Функционал 5 07.05.2008 11:50
Обработка накладной – функция изменить дату Sanya DAX: Функционал 2 05.08.2005 12:50
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02

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

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

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