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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.12.2003, 14:39   #1  
VadimVN is offline
VadimVN
Участник
 
71 / 12 (1) ++
Регистрация: 21.11.2003
? Виртуальные компании. Проблема.
Ситуация банальна - есть две компании в Аксапте, необходимо использовать общий справочник номенклатуры, при этом данные на закладках "Цена/Скидка" и "Количество" карточки номенклатуры в каждой компании должы быть свои.
Делаю табличную коллекцию, пихаю туда InventTable, делаю виртуальную компанию, и, как вы уже догадались, при создании номенклатуры в одной компании в другой её не вижу. Как вы уже догадались, происходит это от того, что к InventTable привязвна InventTableModule, которая не является общей для компаний, и при добавлении записи в InventTable, в InventTableModule добавляются связанные записи только с кодом текущей компании, в результате в другой компании для добавленной в общий справочник номенклатуры отсутствуют связанные записи в InventTableModule, из-з чего, в свою очередь, выходит полная фигня (я не очень путано выражаюсь?).
Вопрос: Господа, сталкивался ли кто-нить с подобной проблемой и как она решалась? Мне не трудно переписать Insert и Delete на InventTableModule чтобы пихать записи ещё и в соседнюю компанию, но можт существует более изящный способ?

Заранее благодарен.
VVN.
Старый 08.12.2003, 14:47   #2  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Сталкивался с этой проблемой. Решал её именно таким образом.
__________________
С уважением, Игорь Ласийчук.
Старый 08.12.2003, 16:14   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Кстати на technet было обсуждение этой проблемы - "Share data between companies. " Пришли примерно к такому же результату.
Старый 29.03.2006, 15:09   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
?
Цитата:
Сообщение от Garic
Сталкивался с этой проблемой. Решал её именно таким образом.
У меня сейчас возникла та же самая задача - требуется, чтобы InventTable была общей (через виртуальную компанию), а InventTableModule - своя в каждой компании. В этой теме нашел такой вот рецепт получения списка других компаний в виртуальной:
Код:
select id from VirtualDataAreaList
  where VirtualDataAreaList.virtualDataArea == <код_виртуальной_компании>
Представляется обновление InventTableModule сделать примерно так:
  • определить, через какую виртуальную компанию в данной компании доступна таблица InventTable
  • пройтись по списку других компаний в этой виртуальной компании
  • в каждой из них создать/удалить соотв.записи для InventTable.ItemId
НО! Сразу возникает вопрос: как определить, через какую виртуальную компанию в текущей "реальной" компании доступна та или иная таблица? Потому что забивать в код строковую константу - идентификатор компании - как-то, мне кажется, совсем некрасиво. Можно ли это определить программно? Или придется все же забивать идентификатор виртуальной компании?

Последний раз редактировалось gl00mie; 29.03.2006 в 15:31.
Старый 29.03.2006, 16:18   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Lightbulb
Цитата:
Сообщение от gl00mie
Как определить, через какую виртуальную компанию в текущей "реальной" компании доступна та или иная таблица?
На буржуйском форуме нашел такой вот рецепт определения, доступна ли таблица церез виртуальную компанию или нет
PHP код:
static boolean checkTableVirtual(TableId _tableId)
{
  
TableCollectionList     tableCollectionList;
  
VirtualDataAreaList     virtualDataAreaList;
  
SysDictTableCollection  dictTblColl;
  
DictTable               dictTable;
  
TableName               tableName;
  ;

  while 
select virtualDataAreaList
    where virtualDataAreaList
.id == curExt()
      
join tableCollection from tableCollectionList
        where tableCollectionList
.virtualDataArea == 
              
virtualDataAreaList.virtualDataArea
  
{
    
dictTblColl = new SysDictTableCollection(tablecollectionlist.tableCollection);
    do
    {
      
tableName dictTblColl.nextTable();
      if (
tablename2id(tableName) == _tableId)
         return 
true;
    }
    while (
tableName);
  }
  return 
false;

Отсюда и буду копать...
Старый 29.03.2006, 16:57   #6  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от VadimVN
СМне не трудно переписать Insert и Delete на InventTableModule чтобы пихать записи ещё и в соседнюю компанию, но можт существует более изящный способ?
А почему бы не переписать insert и delete на InventTable и не заморачиваться с виртуальными компаниями? Или, еще лучше, написать периодическое задание, которое будет синхронизировать справочники номенклатуры в компаниях.

Цитата:
Сообщение от gl00mie
На буржуйском форуме нашел такой вот рецепт определения...
Вы их слушайте больше

X++:
boolean isVirtual;
;
isVirtual = (select firstonly DataArea
                    where DataArea.id == new DictTable(tableId).makeRecord().dataAreaId).isVirtual;
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
За это сообщение автора поблагодарили: gl00mie (1).
Старый 29.03.2006, 17:46   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Maxim Gorbunov
А почему бы не переписать insert и delete на InventTable и не заморачиваться с виртуальными компаниями?
В методе таблицы InventTable::insert() я не нашел никаких намеков на вставку чего-либо в InventTableModule. Судя по моим ковыряниям с отладчиком, эти вставки делаются из формы InventTable (в стеке вызова значится \Classes\FormDataSource\write)
Цитата:
Сообщение от Maxim Gorbunov
Или, еще лучше, написать периодическое задание, которое будет синхронизировать справочники номенклатуры в компаниях.
Ситуация такая: таблица InventTable - общая меж н-цати компаний, InventTableModule - везде своя. В одной компании создаем новую номенклатуру, все остальные ее не видят, потому что запись с новым InventTable.ItemId у них есть, а записей в InventTableModule с этим ItemId у них нет. При чем тут периодические задания?..
Цитата:
Сообщение от Maxim Gorbunov
X++:
select firstonly DataArea
   where DataArea.id == new DictTable(tableId).makeRecord().dataAreaId;
Спасибо, сейчас попробую
Старый 29.03.2006, 17:58   #8  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от gl00mie
Судя по моим ковыряниям с отладчиком, эти вставки делаются из формы InventTable (в стеке вызова значится \Classes\FormDataSource\write)
Вывод верный

Цитата:
Сообщение от gl00mie
Ситуация такая: таблица InventTable - общая меж н-цати компаний, InventTableModule - везде своя. В одной компании создаем новую номенклатуру, все остальные ее не видят, потому что запись с новым InventTable.ItemId у них есть, а записей в InventTableModule с этим ItemId у них нет. При чем тут периодические задания?..
При том, что если Вы все это затеваете только для того, чтобы иметь общий номенклатурный справочник, может проще этот справочник просто синхронизировать периодически.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.03.2006, 18:19   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Maxim Gorbunov
если Вы все это затеваете только для того, чтобы иметь общий номенклатурный справочник, может проще этот справочник просто синхронизировать периодически.
Перекрытие двух методов в InventTableModule, которые дергаются автоматом при создании/удалении номенклатуры, мне пока кажется более простым, нежели написание job'а по синхронизации справочников номенклатуры, который бы делал то же, но с какой-то периодичность - не имея при этом никаких данных о том, какие где номенклатуры добавились/удалились
Старый 29.03.2006, 18:33   #10  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Да я понимаю, что напрограммить-то несложно. Поддерживать БД с виртуальными компаниями просто сложнее, чем без них. Если все это затевается только ради общих кодов номенклатуры, подумайте, есть ли в этом смысл.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.03.2006, 18:35   #11  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Обратите внимание: если нужно только цены держать в отдельных компаниях, то можно "виртуализировать" как InventTable, так и InventTableModule. Только PriceDiscTable будет находиться в каждой отдельной компании. И никакого программирования.
Старый 29.03.2006, 18:42   #12  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от EVGL
Обратите внимание: если нужно только цены держать в отдельных компаниях, то можно "виртуализировать" как InventTable, так и InventTableModule.
Кроме цен необходимо держать в отдельных компаниях и такие вещи, например, как склады по умолчанию для закупки/заказа, количество по умолчанию, etc, а такие вещи вроде берутся через InventTableModule
Старый 29.03.2006, 18:54   #13  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Maxim Gorbunov
X++:
select firstonly DataArea
  where DataArea.id == new DictTable(tableId).makeRecord().dataAreaId;
А можно поподробней относительно смысловой нагрузки этого выражения с DictTable? А то я такой класс в AOT не нашел... Там делается какая-то запись в таблицу tableId? Я просто пока что написал вспомогательный класс для определения, через какую компанию таблица "виртуализируется", он выглядит, конечно, коряво в сравнении с этим select'ом, правда, по идее позволяет получать данные для любой компании, а не только текущей
X++:
static str getVirtualCompanyId(TableId _tableId, CompanyId _companyId = curExt())
{
    VirtualDataAreaList     virtDataAreaLst;
    TableCollectionList     tableColList;
    SysDictTableCollection  dictTableCol;
    ;

    while select virtDataAreaLst
        where virtDataAreaLst.id == _companyId
        join tableCollection from tableColList
        where tableColList.virtualDataArea == virtDataAreaLst.virtualDataArea
    {
        dictTableCol = new SysDictTableCollection(tableColList.tableCollection);
        do
        {
            if (tablename2id(dictTableCol.nextTable()) == _tableId)
                return virtDataAreaLst.virtualDataArea;
        }
        while (tableName);
    }
    return '';
}
Старый 29.03.2006, 18:59   #14  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Пусть я буду пессимистом, но все же...

Если вы включаете InventTable в табличную коллекцию, необходимо так же включить все таблицы, на которые есть ссылки из InventTable. Это, как минимум, InventItemGroup, InventDimGroup и InventModelGroup. К ним могут добавиться и такие таблицы, как BOMCostGroup, CommissionItemGroup, InventNumGroup и т.п. Разумеется, при этом придется включить и все таблицы, на которые ссылаются эти таблицы. Например, для InventNumGroup это NumberSequenceTable. Готовы вы к тому, что номерные серии будут общими между компаниями?
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.03.2006, 19:32   #15  
Atar is offline
Atar
Консультант
 
287 / 101 (4) +++++
Регистрация: 10.03.2006
Адрес: Москва
Номерная серия - это такая вещь, которую можно настроить "один раз и навсегда".
Необязательно делать таблицу виртуальной, можно лишь в это самый "один раз" синхронизировать (тем или иным способом) коды номерных серий в компаниях
Старый 29.03.2006, 19:42   #16  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Ага, сделать и убежать побыстрее, пока не накрылось. Номерные серии еще как меняются в процессе работы. Например, каждый год могут изменяться форматы номеров, чтобы было проще отличать документы разных лет.

В любом случае, номерные серии - это только пример. Можете найти другие примеры, если покопаетесь в остальных таблицах, на которые ссылается InventTable.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.03.2006, 20:00   #17  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от gl00mie
А можно поподробней относительно смысловой нагрузки этого выражения с DictTable? А то я такой класс в AOT не нашел...
Это системный класс. Найти в AOT его можно в System documentation.

new DictTable(tableId) - создает новый объект класса DictTable для таблицы tableId
makeRecord() - возвращает пустой буфер для таблицы (хоть буфер и пустой, dataAreaId в нем уже инициализирован).
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 30.03.2006, 10:53   #18  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Maxim Gorbunov
В любом случае, номерные серии - это только пример. Можете найти другие примеры, если покопаетесь в остальных таблицах, на которые ссылается InventTable.
Мда... Пожалуй, надо будет на самом деле покопать в сторону написания job'а для синхронизации справочников номенклатур
Старый 30.03.2006, 11:12   #19  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
И не забудьте при вводе новой номенклатуры делать проверку в соседних компаниях - вдруг она уже заведена?

С Уважением,
Георгий
Старый 30.03.2006, 12:08   #20  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
:( changeCompany() не работает?..
Цитата:
Сообщение от gl00mie
Представляется обновление InventTableModule сделать примерно так:
  • определить, через какую виртуальную компанию в данной компании доступна таблица InventTable
  • пройтись по списку других компаний в этой виртуальной компании
  • в каждой из них создать/удалить соотв.записи для InventTable.ItemId
Все же что-то у меня последний пункт не выходит Я наивно полагал, что сработает просто это
X++:
changeCompany(virtualDataAreaList.id) {
    super();
}
ан - фигу! Компания, конечно, сменяется (если в блоке распечатать curext(), то он показывает то, что нужно), только вот this.dataAreaId у InventTableModule как был в старой компании, так и остался, и вызываемый super() ессно ругается, что запись уже есть. xApplication.setDefaultCompany() дает тот же результат... Если в контексте другой компании (внутри блока changeCompany) сделать новый InventTableModule и скопировать в него this, то он тоже получает dataAreaId из исходонй компании, а не из той, куда делается changeCompany Что делать, как побороть? Неужто вместо простого вызова super() в InventTableModule в контексте другой компании придется "плясать с бубном", создавать новый экземпляр объекта и копировать в него нужные данные?..
Теги
виртуальные компании, как правильно, номенклатура, компания

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Виртуальные компании Freeangel DAX: Функционал 8 03.07.2007 18:49
виртуальные компании HelgaK DAX: Функционал 5 28.09.2006 13:47
Таблица DocuRef и виртуальные компании Vby DAX: Функционал 2 30.05.2006 10:06
Виртуальные компании или фин. отчеты Посторонний V DAX: Функционал 20 24.05.2006 16:58
Виртуальные компании Zodiak DAX: Функционал 7 06.04.2004 21:06

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

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

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