|
![]() |
#1 |
Ищущий знания...
|
хм, очень интересно...
ради интереса протестировал такой же джоб у себя... и действительно ничего не меняется, хотя все отрабатывает и не ругается. вообще, если уж надо просто изменить у записей в таблице компанию, то лучше это сделать напрямую через SQL\ORACLE (может это и некрасиво, но работает 100% ![]() P.S. Замечания к джобу остаются в силе.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#2 |
Administrator
|
Такая бурная дискуссия
![]() Такая задача (по перебивке dataareaid) имеет смысл - если нужно включить (выключить) какую-то компанию в виртуальную. В этом случае в ряде таблиц нужно (и можно) заменить поле dataareaid. Этот случай решается (достаточно несложно) через SQL-оператор.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
![]() |
#3 |
Administrator
|
Нашел в своих загашниках "джобик" Class_ReplaceDataAreaId.xpo (оформленный как класс-наследник RunBase) по перебивке dataAreaId. Запрашиваются следующие параметры:
Компания с данными - невиртуальная компания с данными. Это компания ИЗ Виртуальная компания - виртуальная компания с данными. Это компания В Имя таблицы - имя таблицы в АОТ, в которой перебиваются данные. Точное соответствие - Да, если указывается точное имя таблицы. Нет, если в поле Имя таблицы будет указано к примеру Invent* - т.е. обработать все таблицы, начинающиеся на Invent Джобик грамотно перебивает поле dataareaid и также перебивает поле RecID (поэтому обработка построчная). Для изменения записей используются команды вне AX. Есть отдельная врезка кода для Oracle и для SQL Server, т.е. джобик, несмотря на то, что обращения идут к БД - поддерживает обе платформы. Джобик не умеет перебивать связанные RecId. Т.е. если перебивается табличка, на RecId которой ссылаются какие-то записи, то эта связь будет потеряна после применения джобика. Джобик писался изначально для 3.0 и был успешно оттестирован на: 3.0 SP3 CU1 + SQL Server 2000 3.0 SP3 CU1 + Oracle 10i 4.0 SP2 + Oracle 10i Предполагаю, что на SQL Server 2005 он также будет работать Обновлено: В файл добавлена корректная обработка разрешений
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 16.10.2009 в 16:58. Причина: Замена XPO |
|
![]() |
#4 |
MCITP
|
![]()
офтоп...
да уж... а если напрямую в БД, это был бы небольшой скриптик на несколько строчек... ![]()
__________________
Zhirenkov Vitaly |
|
![]() |
#5 |
Administrator
|
Цитата:
Оформлено это просто в класс - чтобы можно было этот код убрать из ветки Jobs, как код, полезный при постепенном внедрении. Ну и конечно - добавлен интерфейс указания компаний для возможности использования консультантами этого джобика. Пункт меню сделан (в xpo я его не стал вкладывать)
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 14.10.2009 в 23:36. |
|
![]() |
#6 |
Administrator
|
Ну я ж сказал
Цитата:
(C)\Classes\ReplaceDataAreaId\updateTableRows - line 31 вставить new SqlStatementExecutePermission('sql-запрос').assert(); а после строчки - CodeAccessPermission::revertAssert(); Либо отключить параметр caslevel (установить его в значение disable) в конфигурации АОСа (это в реестре) и перезапустить АОС. Лучше первый вариант - он правильнее. Опять-таки - джоб предлагался на условии идеи - т.е. на первых порах мы пермишны отключили, а потом джоб забыли поднять ![]() Проверю -отпишусь
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Poleax (3). |
![]() |
#7 |
Участник
|
Еще нужно учесть, что SqlStatementExecutePermission разрешен только на стороне сервера, поэтому нужно в классе изменить свойство RunOn = Server, либо добавить статический серверный конструктор...
|
|
![]() |
#8 |
Участник
|
Цитата:
Судя по строке "(C)\Classes\ReplaceDataAreaId\updateTableRows ", ваш класс работает на клиенте. Дело в том, что statement - это серверный класс, и выполняется он всегда на сервере, а permission вы даете на стороне клиента... Последний раз редактировалось Bishop; 16.10.2009 в 19:16. |
|
![]() |
#9 |
Administrator
|
Цитата:
![]()
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
![]() |
#10 |
Боец
|
А целостность данных?
Почему бы просто не сохранить данные в буфер, переключить компанию и вставить данные. Примерно так: X++: static void copy2company(Args _args) { InventTable tmpInventTable, fromInventTable, toInventTable; ; tmpInventTable.setTmp(); fromInventTable.skipDataMethods(true); while select fromInventTable { tmpInventTable.clear(); buf2buf(fromInventTable, tmpInventTable); tmpInventTable.insert(); } ttsbegin; changecompany ("DMO") { while select tmpInventTable { toInventTable.clear(); buf2buf(tmpInventTable, toInventTable); if (toInventTable.validateWrite()) toInventTable.insert(); } } ttscommit; } Последний раз редактировалось DSPIC; 15.10.2009 в 00:12. |
|
![]() |
#11 |
Administrator
|
Цитата:
Переход в другую компанию, которая уже входит в виртуальную - это конечно вариант - но... ее может и не быть, например, мы решили объединить ряд компаний и создать новую виртуальную компанию. Кстати, обращаю внимание, что нельзя перейти в саму виртуальную компанию. Можно только перейти в компанию, входящую в состав виртуальной. На самом деле - мы отвлеклись от темы. Я привел пример - не для того, чтобы показать как это работает с виртуальными компаниями, а для того, чтобы показать, что прямое обращение к БД при замене dataAreaId если все делать по-честному - выливается не в одну строчку кода. И даже наоборот - мой вариант по сути применим только тогда, когда штатно (по аналогии как Вы показали) невозможно этого добиться. Хотя с т.з. функциональности оба примера работают одинаково - никакой целостности данных нигде не нарушается если нет связок по RecID (а если есть, то нарушается и там и там) Кстати, Ваш код работать не будет. После changecompany временная таблица тоже ведь сменит компанию. Или я не понял хитрого хода конем?
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 15.10.2009 в 00:35. |
|
![]() |
#12 |
Сам.AX
|
Цитата:
Джоб действительно работать не захотел. Сделали напрямую через SQL. Задача решена. Спасибо. |
|
![]() |
#13 |
Administrator
|
Цитата:
Так что если в будущем будет потребность повторить "на бис" процедуру - можно им будет воспользоваться
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#14 |
Сам.AX
|
Цитата:
![]() Через SQL, говорят, могут возникнуть трудности в дальнейшем. Последний раз редактировалось Alexx7; 15.10.2009 в 10:21. Причина: Про SQL |
|
![]() |
#15 |
Сам.AX
|
Цитата:
Сообщение (14:06:50) Сбой запроса на разрешение типа "SqlStatementExecutePermission". (S)\Classes\SqlStatementExecutePermission\demand (S)\Classes\Statement\executeQuery (C)\Classes\ReplaceDataAreaId\updateTableRows - line 31 (C)\Classes\ReplaceDataAreaId\updateTables - line 28 (C)\Classes\ReplaceDataAreaId\run - line 19 (C)\Classes\ReplaceDataAreaId\main - line 7 Чего то скорее всего не хватает. |
|
![]() |
#16 |
Боец
|
Цитата:
Кстати, Ваш код работать не будет. После changecompany временная таблица тоже ведь сменит компанию. Или я не понял хитрого хода конем?
Цитата:
Джоб действительно работать не захотел.
|
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
![]() |
#17 |
Administrator
|
Цитата:
![]() Поэкспериментирую.
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#18 |
Administrator
|
Обновил XPO. Теперь он с разрешениями. Да, и необходимо учесть замечание выше по поводу RunOn=Server и сделать соответствующий пункт меню с RunOn=Server
__________________
Возможно сделать все. Вопрос времени |
|
![]() |
#19 |
Сам.AX
|
sukhanchik,
Колупаю Ваш обновленный джоб. Уходит в ошибку в строрчке: X++: rst = stmt.executeQuery(sSQL); [s]\Classes\Statement\executeQuery (0) [c]\Classes\ReplaceDataAreaId\updateTableRows (39) [c]\Classes\ReplaceDataAreaId\updateTables (28) [c]\Classes\ReplaceDataAreaId\run (19) [c]\Classes\ReplaceDataAreaId\main (7) Что ещё можно посмотреть, чтобы он отработал. Спасибо. |
|
![]() |
#20 |
Administrator
|
Цитата:
Сообщение от Alexx7
![]() sukhanchik,
Колупаю Ваш обновленный джоб. Уходит в ошибку в строрчке: X++: rst = stmt.executeQuery(sSQL); [s]\Classes\Statement\executeQuery (0) [c]\Classes\ReplaceDataAreaId\updateTableRows (39) [c]\Classes\ReplaceDataAreaId\updateTables (28) [c]\Classes\ReplaceDataAreaId\run (19) [c]\Classes\ReplaceDataAreaId\main (7) Что ещё можно посмотреть, чтобы он отработал. Спасибо. ![]()
__________________
Возможно сделать все. Вопрос времени |
|
Теги |
update_recordset, законченный пример, как правильно, полезное, системые поля |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|