18.08.2011, 16:23 | #1 |
Axapta Retail User
|
Програмно изменить createdBy
Добрый день!
Можно ли записать автора создавшего строку через job X++: rhrmStaffListHistory.overwriteSystemfields(true); rhrmStaffListHistory.StartDate = startDate; rhrmStaffListHistory.StaffListRefRecId = rhrmStafflist.RecId; rhrmStaffListHistory.HistoryType = RHRMStaffListHistoryType::Disable; rhrmStaffListHistory.(fieldnum(rhrmStaffListHistory, createdBy)) = curuserid(); rhrmStaffListHistory.doInsert(); |
|
18.08.2011, 16:35 | #2 |
Участник
|
Только посредством прямого SQL
Если вам нужно не изменить уже вставленную запись, а подменить значение уже при вставке записи, то как вариант можно запустить выполнение кода делающего вставку записи под нужной учёткой при помощи функции runAs. Последний раз редактировалось S.Kuskov; 18.08.2011 в 16:42. |
|
18.08.2011, 17:02 | #3 |
Участник
|
Ваш код будет отлично работать если его выполнить на сервере. Джоб который запускается не через менюайтем всегда выполняется на клиенте. Соответственно задача сводится к тому как запустить код из джоба на сервере. Могу предложить два варианта:
1) вынести код из джоба в серверный метод. Вызвать этот серверный метод из джоба 2) создать меню айтем. Выставить ему свойство RunOn = Server. Открыть менюайтем, который в свою очередь запустит джобик на сервере |
|
|
За это сообщение автора поблагодарили: S.Kuskov (3). |
19.08.2011, 08:08 | #4 |
Axapta Retail User
|
Проделал предложенные варианты: - получаю ошибку -
"Сбой запроса на разрешение типа "OverwriteSystemfieldsPermission"." DAX2009 |
|
19.08.2011, 08:14 | #5 |
Участник
|
Цитата:
X++: if(isRunningOnServer() && CurUserId() == "Admin") { new OverwriteSystemfieldsPermission().assert(); salesLine.overwriteSystemfields(true); salesLine.(fieldnum(SalesTable,CreatedDateTime)) = str2datetime( "2010/04/03 11:00:00" ,321 ); salesLine.doInsert(); salesLine.overwriteSystemfields(false); CodeAccessPermission::revertAssert(); } |
|
19.08.2011, 08:31 | #6 |
Administrator
|
Цитата:
Нижеприведеннный пример замечательно работает с "клиентским" курсором (т.е. с курсором из формы) X++: static server void saveRecord(Common _record) { ; new OverwriteSystemfieldsPermission().assert(); _record.overwriteSystemfields(true); _record.update(); _record.overwriteSystemfields(false); CodeAccessPermission::revertAssert(); }
__________________
Возможно сделать все. Вопрос времени |
|
19.08.2011, 09:25 | #7 |
Сам.AX
|
Простите, я может чего-то не понял, или ваш пример сильно утрирован.
В чём проблема то, разве createdBy не будет всегда равен curserid()? Если же нет, зачем и по какому принципу вы собираетесь присваивать создателя записи, или же ваш следующий вопрос будет звучать - как после всех темных дел почистить SysDatabaseLog… Очень уж как то, вся эта затея подозрительно выглядит.
__________________
"Считать метафору доказательством, поток праздных слов источником истины, а себя оракулом - это заблуждение, свойственное всем нам." Поль Валери |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
19.08.2011, 09:56 | #8 |
Axapta Retail User
|
дело было в этом -
new OverwriteSystemfieldsPermission().assert(); Спасибо. все получилось. 2 driller: я хочу знать, кто запустил job создающий строку. job запускается по кнопке на форме. Последний раз редактировалось novic; 19.08.2011 в 10:08. |
|
19.08.2011, 10:04 | #9 |
Участник
|
|
|
19.08.2011, 10:28 | #10 |
Axapta Retail User
|
Эх, Семен Семеныч... Как же я не заметил то, что оно выключено )
|
|
19.08.2011, 10:55 | #11 |
Сам.AX
|
Цитата:
Просто вы своих в познаниях как то умудрились перепрыгнуть через одну ступеньку, упустив из виду это свойство таблицы, и сразу взялись за полухакерских методы overWriteSystemFields(). А в отношении возможности жонглирования с createdBy, считаю что это дыра в безопасности системы, как можно верить аудиторскому следу, если с этим полем можно играть, как вздумается даже на уровне приложения, и просто не могу представить (хотя возможно и плохо представляю) для каких благих целей это можно использовать, так что думаю рано или поздно майкрософт прикроет эту лазейки. Да оно вроде как даже не появляется в таблице без этого свойства.
__________________
"Считать метафору доказательством, поток праздных слов источником истины, а себя оракулом - это заблуждение, свойственное всем нам." Поль Валери |
|
19.08.2011, 13:18 | #12 |
Участник
|
Цитата:
Цитата:
В целом, насколько я могу судить, в той же 4.0/2009 изменения с т.з Trustworthy Computing были продиктованы примерно такими соображениями:
|
|
|
За это сообщение автора поблагодарили: Pustik (2), sukhanchik (2), driller (2). |
05.07.2012, 13:40 | #13 |
Участник
|
Вот сегодня тоже была необходимость в такой нужде.У руководства появилось желание видеть дату создания номенклатуры, скажем для своих каких-то внутренних целей. А в справочнике номенклатур это поле установлено не было. Естественно всем очень хотелось видеть и дату создания старых номенклатур. Выручило то, что за номеклатурным справочником велся лог на создание номенклатуры. Чтобы привести все к человеческому виду, решили включить поле createdDateTime в номенклатурный справочник,а для старых номенклатур пробежаться job-ом по справочнику, заглянуть в лог на создание и вручную проставить дату создания из лога.
И вот сегодня натолкнулись на особенность, что системные поля createdBy и createdDateTime упорно не хотят обновляться, в то время как ModifiedBy и ModifiedDateTime успешно изменяются. Используем конструкцию : X++: static server void saveRecord(Common _record) { ; new OverwriteSystemfieldsPermission().assert(); _record.overwriteSystemfields(true); _record.update(); CodeAccessPermission::revertAssert(); } AX2009 RU5
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 05.07.2012 в 13:59. |
|
05.07.2012, 14:35 | #14 |
Модератор
|
SQL.
С Уважением, Георгий |
|
05.07.2012, 15:01 | #15 |
Участник
|
Вы имеете в виду, что причина лежит в SQL?
После запуска Job-a X++: ttsbegin; select forupdate Table1; Table1.Field1 = 'ggg'; Table1.(fieldnum(Table1, modifiedBy)) = '11111'; Table1.(fieldnum(Table1, createdBy)) = '11111'; Utility_AN::OverwriteSystemfields(Table1); ttscommit; ..........UPDATE TABLE1 SET FIELD1=@P1,RECVERSION=@P2,MODIFIEDBY=@P3WHERE (((DATAAREAID=@P4) AND (RECID=@P5)) AND (RECVERSION=@P6)).............. а где CREATEDBY? Сама Аксапта не послала SQL-ю команду обновить CREATEDBY. PS (метод OverwriteSystemfields один в один как я указал выше)
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 05.07.2012 в 15:04. |
|
05.07.2012, 15:21 | #16 |
MCITP
|
Думаю они имели ввиду, что решать проблему следуют используя прямой сиквел...
__________________
Zhirenkov Vitaly |
|
05.07.2012, 15:41 | #17 |
Участник
|
Деваться то конечно не куда больше. Но после кареты в телегу пересаживаться не очень хочется
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
|
|