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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.01.2019, 12:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,448 / 846 (79) +++++++
Регистрация: 28.10.2006
ievgensaxblog: MSDyn365FO. AX 2012 data upgrade with virtual companies.
Источник: https://ievgensaxblog.wordpress.com/...ual-companies/
==============

In Dynamics 365 for Finance and Operations virtual companies are deprecated and could not be upgraded according to the documentation that just state this fact without proposing a solution.

If we cannot upgrade, then we need to get rid of them. Here are the high level steps how you can de-virtualize a table. Let’s say that we have virtual company V with two companies: A and B. V has only one table collection with one table for simplicity, let’s call it Table1.

<ol>Delete a data from Table1 that belongs to the companies A and B. When you create a virtual company, you may already have some data in the tables you want to share. That data may be orphaned, so we want to delete it to avoid duplicates. Can be done via simple T-SQL script:DELETE FROM Table1WHERE DATAAREAID = 'A' or DATAAREAID = ‘B’
Go to System administration > Setup > Virtual company accounts and delete the virtual company.
Restart AX client.
Insert data from the virtual company to de-virtualized companies via X++ job:static void deVirtualizeTables(Args _args){ DataAreaId virtualDataAreaId = 'V'; container oldCompaniesCon = ['A', 'B']; VirtualDataAreaList virtualDataAreaList; void deVirtualizeTable(TableId _tableId) { int i; DataAreaId dataAreaId; SysDictTable dictTable = new SysDictTable(_tableId); Common buffer = dictTable.makeRecord(); Common newBuffer; while select crossCompany buffer where buffer.dataAreaId == virtualDataAreaId { for (i = 1; i
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Старый 16.01.2019, 06:23   #2  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Круто, чо уж там ...
А если дело касается завиртуаленной таблицы, являющейся источником для определенного сегмента DefaultDimension или LedgerDimension ?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: trud (5).
Старый 16.01.2019, 09:12   #3  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Это не подходит для таблиц со связью по recId. Там придётся после вставки записей назад в старые компании пройтись и перебить все ссылки на новые recId. Для аналитик должно тоже сработать, но я не пробовал.
Старый 16.01.2019, 10:46   #4  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Кстати хорошее замечание от TasmanianDevil - т.е. лучше использовать немного другой алгоритм - перебить значение виртуальной компании на реальную в SQL, и дальше это уже размножить. В этом случае корректная ссылка по RecId останется хотя бы в одной компании
Старый 16.01.2019, 11:30   #5  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от trud Посмотреть сообщение
корректная ссылка по RecId останется хотя бы в одной компании
В остальных компаниях - будут интеллектуальные трэш, угар и содомия в одном флаконе по части копирования туда таблицы-источника, генерации новых комбинаций аналитики по новым значениям таблицы-источника и обновления имеющихся ссылок на новые ссылки по новым комбинациям. При наличии более одной такой таблицы - степень "радости" возрастает в геометрической прогрессии.

Кому они, виртуальные компании, <censored>, мешали?
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 16.01.2019, 12:21   #6  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
А зачем новые комбинации генерить? Аналитики и так были не company specific.
Цитата:
The primary table that is to be used as a source of financial dimension data MUST have a unique natural key value of 30 characters or less, and that value MUST resolve to a single RECID within that table.
Виртуальные компании заменились Cross-company data sharing, т.е. тут типичный Not Invented Here синдром
За это сообщение автора поблагодарили: EVGL (3).
Старый 16.01.2019, 13:13   #7  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
А зачем новые комбинации генерить? Аналитики и так были не company specific.

Виртуальные компании заменились Cross-company data sharing, т.е. тут типичный Not Invented Here синдром
Не все так однозначно, есть еще такое https://docs.microsoft.com/en-us/dyn.../copy-customer
Старый 17.01.2019, 05:47   #8  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
885 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от trud Посмотреть сообщение
А зачем новые комбинации генерить?
Согласен, про комбинации погорячился (больше года не работал уже с этой "прелестной" поганью, подзабыл ужо чутка структуру) - только записи в DimensionAttributeValue , ссылающиеся на записи в виртуализированном справочнике, покорежить придется в остальных компаниях, что в принципе снижает степень проблемы.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 19.01.2019, 07:30   #9  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Прежде чем присоединись к критике, хочу сказать что автор сделал больше чем МС в этом направлении.

Можно (Insert + Delete) свести к одному Update.
Я бы весь скрипт написал в T-SQL - проще, быстрее, можно повторить во всех средах (dev/qa/prod).

У нас теже проблемы с использование Partition. У нас их 6 и апгрейд не подерживается МС.
Проблему решил SQL скриптами - копируем все данные в новую базу и менять копируемый partition на initial (плюс 200 табличек у которых нет partition).
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 20.01.2019, 03:40   #10  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Я бы весь скрипт написал в T-SQL - проще, быстрее, можно повторить во всех средах (dev/qa/prod).
А как такой скрипт написать в SQL?
"newBuffer.doInsert();" требует же выделения нового RecId, т.е. как-то в SQL его надо будет выделять
Старый 20.01.2019, 04:01   #11  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
А как такой скрипт написать в SQL?
"newBuffer.doInsert();" требует же выделения нового RecId, т.е. как-то в SQL его надо будет выделять
Играясь с SYSTEMSEQUENCES таблицой, первый попавшийся блог с примером
https://sumitsaxfactor.wordpress.com...in-sql-server/
Не то что это сильно проще
Старый 20.01.2019, 04:05   #12  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Можно (Insert + Delete) свести к одному Update.
Я бы весь скрипт написал в T-SQL - проще, быстрее, можно повторить во всех средах (dev/qa/prod).
.
Чисто из вредности спрошу, чем 2 SQL скрипта и 1 x++ джоб проигрывают в повторяемости во всех средах ? Да. там больше ручных действий, но если идти по списку то какая принципиальная разница?
Старый 20.01.2019, 14:18   #13  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Кстати вот эта конструкция перезапишет значения в полях CreatedDateTime, а оно иногда нужно. Т.е. нужно усложнять
X++:
buf2buf(buffer, newBuffer);
newBuffer.doInsert();
Старый 20.01.2019, 21:14   #14  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от trud Посмотреть сообщение
Кстати вот эта конструкция перезапишет значения в полях CreatedDateTime, а оно иногда нужно. Т.е. нужно усложнять
X++:
buf2buf(buffer, newBuffer);
newBuffer.doInsert();
А можно сценарий, когда оно нужно? Для расширения кругозора.
Старый 21.01.2019, 06:11   #15  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Ну довольно часто нужно, эту информацию часто показывают пользователям - дата и время создания, кто создал. Встречал также что кто-то даже отчеты строит по этим полям
Старый 21.01.2019, 10:05   #16  
AlexeyS is offline
AlexeyS
Участник
 
404 / 339 (12) ++++++
Регистрация: 15.06.2004
Адрес: москва
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Я бы весь скрипт написал в T-SQL - проще, быстрее, можно повторить во всех средах (dev/qa/prod).
Скрипт на T-SQL иногда быстрее и проще в разы, но в D365 MS не дает доступа на ПРОД базу SQL.
Старый 22.01.2019, 03:08   #17  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Цитата:
Сообщение от trud Посмотреть сообщение
А как такой скрипт написать в SQL?
"newBuffer.doInsert();" требует же выделения нового RecId, т.е. как-то в SQL его надо будет выделять
Код типа такого должен работать -

Код:
declare @newDataAreaId as nvarchar(4) = 'BBBB' 
declare @virtualDataAreaId as nvarchar(4) = 'V' 

insert into [Table1]
(
  [RECID]
, [DATAAREAID]
...list of fields...
)
 SELECT 
  [RECID] = row_number() over (order by (select NULL)) + (select isnull(max(RECID), 0) from [Table1] )
, [DATAAREAID] = @newDataAreaId
, ...list of fields...
  FROM [Table1] as [sourceTable]
 WHERE [sourceTable].DATAAREAID = @virtualDataAreaId
Почему не SYSTEMSEQUENCES? Потому что D365 использует SQL sequence для выделения RecId и про SYSTEMSEQUENCES можно забыть как пережиток прошлого.
Data upgrade создаст все SQL sequence для RecId автоматически (см. DataUpgradePackage\AOSService\Scripts\AutoMajorDataUpgradePreReqs.ps и AdjustSQLSequences.sql).
Скрипт делает select max(RecId) по всем таблицам, так что опять, что там в SYSTEMSEQUENCES неважно.

Цитата:
Скрипт на T-SQL иногда быстрее и проще в разы, но в D365 MS не дает доступа на ПРОД базу SQL.
Скрипты для AX2012.

Цитата:
Сообщение от skuull Посмотреть сообщение
Чисто из вредности спрошу, чем 2 SQL скрипта и 1 x++ джоб проигрывают в повторяемости во всех средах ? Да. там больше ручных действий, но если идти по списку то какая принципиальная разница?
Вас while select + doInsert не смущает? Изменение-копирование данных - это для SQL, если надо бизнес логику - тогда X++ job.
Плюс, а сколько там других шагов будет которые тоже вручную делать?
По мне так на go-live день чем меньше шагов, тем лучше -
Потушил AOSы (вручную),
Запустил скрипт -
DB back up, подготовка дынных (например virtual companies), скрипты от МС для подготовки bacpac, сам bacpac, залив bacpac в блоб, restore в sandpit, создание сервисных аккаунтов.
Как скрипт отработал - запуск D365 upgrade.
А сколько раз вы эти шаги будете делать перед реальным go-live?

Тоже чисто из вредности спрошу, а вы код релизите через xpo вручную?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
За это сообщение автора поблагодарили: trud (3).
Старый 22.01.2019, 06:35   #18  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Вас while select + doInsert не смущает?
Неа, что должно смущать?
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Изменение-копирование данных - это для SQL, если надо бизнес логику - тогда X++ job.
Это экспертное мнение или есть какие-то обоснования?
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Плюс, а сколько там других шагов будет которые тоже вручную делать?
По мне так на go-live день чем меньше шагов, тем лучше -
Потушил AOSы (вручную),
Запустил скрипт -
DB back up, подготовка дынных (например virtual companies), скрипты от МС для подготовки bacpac, сам bacpac, залив bacpac в блоб, restore в sandpit, создание сервисных аккаунтов.
Как скрипт отработал - запуск D365 upgrade.
А сколько раз вы эти шаги будете делать перед реальным go-live?
Простой же был вопрос, почему 3 скрипта не повторяемые, а 1 повторяемый? Там и там есть ручные шаги, какой у вас критерий "повторяемости"?
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
Тоже чисто из вредности спрошу, а вы код релизите через xpo вручную?
Хорошо когда можно через model store, но не всегда это возможно. Какое это отношение вообще имеет к теме дискусии?
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axsa: Extensibility in Dynamics AX 2012 R3 CU8 (CRT, RetailServer, MPOS) Part 2 – New data entity Blog bot DAX Blogs 0 21.05.2015 01:19
axsa: Microsoft Dynamics AX 2012 Data Import/Export Framework standalone version for AX 2012 R2 without installing full CU7 Blog bot DAX Blogs 0 04.12.2013 04:13
emeadaxsupport: SEPA affected objects Blog bot DAX Blogs 0 29.11.2013 13:11
emeadaxsupport: Writing Data Upgrade Scripts Part 1: Understanding the components of the process Blog bot DAX Blogs 0 10.02.2012 05:16
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:12.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.