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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.03.2007, 10:50   #1  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
Post Как получить значения полей (modifiedDate, modifiedTime, modifiedBy и др.) при работе с объектами AOT типа Map?
Как получить значения полей (modifiedDate, modifiedTime, modifiedBy и др.) при работе с объектами AOT типа Map?
Есть map, пусть это будет CustVendTable. У него есть метод MyMethod1, который может быть только в данном map, но не может быть в CustTable и VendTable.
В CustVendTable, CustTable, VendTable свойства modifiedDate, modifiedTime, modifiedBy, createdDate, createdTime, createdBy установлены в ”Yes”.
Если я инициализирую CustVendTable таким кодом:

CustVendTable сustVendTable;
CustTable custTable;
;
select firstonly custTable;
сustVendTable = custTable;
...
то сustVendTable по существу является экземпляром таблицы custTable. При этом метод MyMethod1, определенный в CustVendTable, ДОСТУПЕН НЕ БУДЕТ.
Если же инициализируем CustVendTable таким кодом:
CustVendTable сustVendTable;
CustTable custTable;
;
select firstonly custTable;
сustVendTable.data(custTable);
сustVendTable.RecId = custTable.RecId;
...
то метод MyMethod1 будет доступен, но при этом нельзя получить значения системных полей modifiedDate, modifiedTime, modifiedBy и др. В сustVendTable все значения этих полей будут нулевыми.
Вопросы:
1. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), определить чьим мэпом он является (CustTable или VendTable).
2. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), красиво определить значения полей modifiedDate, modifiedTime, modifiedBy.
Пока остановились на варианте искать соответствующий RecID, сначала в CustTable, потом в VendTable, но думается, что должен быть более универсальный способ.
PS: Axapta 3.0 SP3. MS SQL
Старый 28.03.2007, 10:56   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
>>1. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), определить чьим мэпом он является (CustTable или VendTable).

поле tableID

>>>2. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), красиво определить значения полей modifiedDate, modifiedTime, modifiedBy.

может можно добавить изх в меппинг?
Старый 28.03.2007, 11:29   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А если для первого случая сделать так?
X++:
ustVendTable.ustVendTable::Method1();
__________________
Axapta v.3.0 sp5 kr2
Старый 28.03.2007, 11:44   #4  
Russland is offline
Russland
MCTS
Аватар для Russland
MCBMSS
 
267 / 116 (4) +++++
Регистрация: 17.10.2005
Адрес: Донеччина, Україна
Может это вам поможет

X++:
    UtilElements    utilElements;
;
    select utilElements
    where utilElements.name == 'BudgetModelMap' &&
          utilElements.recordType == UtilElementType::Table;

    if(utilElements)
    {
        info(strFmt('createdBy: %1', utilElements.createdBy));
        info(strFmt('createdDate: %1', utilElements.createdDate));
        info('createdTime: '+time2str(utilElements.createdTime,1,1));

        info(strFmt('modifiedBy: %1', utilElements.modifiedBy));
        info(strFmt('modifiedDate: %1', utilElements.modifiedDate));
        info('modifiedTime: '+time2str(utilElements.modifiedTime,1,1));
    }
    else
    {
        info("Nothing");
    }
__________________

В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню
Старый 28.03.2007, 11:49   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
2 Russland
То, что вы указали - это дата/время создания/модификации таблицы, а не сторок в ней
__________________
Axapta v.3.0 sp5 kr2
Старый 29.03.2007, 16:31   #6  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
Ув. belugin
TableID у CustVendTable инициализированного через сustVendTable.data(custTable), будет содержать код map CustVendTable, отличный от замэпенных таблиц CustTable и VendTable.
Добавить в мэпинг поля modifiedDate, modifiedTime, modifiedBy и иже с ними у меня не получилось.
Ув. AndyD.
Не совсем понял “сustVendTable.сustVendTable::Method1();” У меня этот код не отработал. Что должен содержать метод .сustVendTable:: ?
Старый 29.03.2007, 16:53   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Если вы скопировали приведенный мной код, то он не будет работать
Там, оказывается, вместо английской "с" (cи) стоит русская "c" (эс). Но вините в этом себя - я скопировал из вашего сообщения
X++:
CustVendTable ( )ustVendTable;
CustTable custTable;
;
select firstonly custTable;
( )ustVendTable = custTable;
( )ustVendTable.C( )ustVendTable::Method1();
А если серьзно, то это стандартная конструкция обращения к методам Map'а из табличной переменной

PS. Кстати, путаница с буковами эс и си есть и в коде.
Например, в классе RCustVendTurnoverHolder есть объявление
X++:
CustVendTable       ustVendTable;
В сustVendTable - тоже русская эс
__________________
Axapta v.3.0 sp5 kr2
Старый 29.03.2007, 16:57   #8  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Что у вас выдает следующий код
X++:
static void Job28(Args _args)
{
    CustTable custTable;
    CustVendTable custVendTable;
;
    custVendTable = custTable;
    info(tableId2Name(custVendTable.TableId));
    info((custVendTable.TableId == tableNum(custTable))?"t":"f");
}
см. также примеры
AxPath://AOT/Classes/EP/modifySmmBusRelTable?line=41&pos=11

Последний раз редактировалось belugin; 29.03.2007 в 17:00.
Старый 30.03.2007, 10:35   #9  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
Ув. AndyD.
Мой метод, определенный в CustVendTable не является статическим, поэтому конструкция
custVendTable.CustVendTable::MyMethod();
не подходит, а
custVendTable.CustVendTable.MyMethod();
выдаст ошибку.

Ув. belugin.
Джоб, который Вы написали выдаст в результате TableID, как у CustTable. Но Вы инициализируете мэп кодом:
custVendTable = custTable;

При этом у Вас custVendTable будет не custVendTable, а CustTable и следовательно методы определенные только на СustVendTable доступны не будут. В коде Вы их (методы) поставить сможете, и даже нормально прокомпилится, но при выполнении кода возникнет ошибка времени выполнения. Прочитайте первое сообщение, там это как раз и написано.

Видимо, я не совсем явно обрисовал задачу.
Если
CustVendTable = CustTable; или CustVendTable = VendTable; то проблем нет. Все достаточно просто. Но у меня в модуле есть метод, который работает с FieldID полей из CustVendTable, а FieldID полей в CustVendTable отличаются от FieldID соответствующих полей в CustTable и VendTable. Поэтому инициализировать CustVendTable прямым присвоением типа CustVendTable = CustTable; нельзя. Инициализация идет через метод Data(); и присвоение RecID

custVendTable.data(custTable);
custVendTable.RecId = custTable.RecId;

При такой инициализации поля custVendTable сохраняют мэпные FieldID, при этом доступны методы, определенные только на CustVendTable, но при этом я теряю возможность определить из кого (из CustTable или из VendTable) был получен данный экземпляр custVendTable. Так же теряется возможность получить значения полей modifiedTime, modifiedBy, createdDate и т.д.
Посему вопросы:
1. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), определить чьим мэпом он является (CustTable или VendTable).
2. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), определить значения полей modifiedDate, modifiedTime, modifiedBy

Последний раз редактировалось LRA; 30.03.2007 в 10:39.
Старый 30.03.2007, 10:51   #10  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от LRA Посмотреть сообщение
Ув. AndyD.
Мой метод, определенный в CustVendTable не является статическим, поэтому конструкция
custVendTable.CustVendTable::MyMethod();
не подходит, а
Вы проверяли? :: тут значит не статичность, а принадлежность к мапу

Цитата:
Инициализация идет через метод Data(); и присвоение RecID
custVendTable.data(custTable);
custVendTable.RecId = custTable.RecId;
дааа...
Старый 30.03.2007, 11:02   #11  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,263 / 982 (37) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от LRA Посмотреть сообщение
Ув. AndyD.
Мой метод, определенный в CustVendTable не является статическим, поэтому конструкция
custVendTable.CustVendTable::MyMethod();
не подходит
Срочно учить матчасть: \Data Dictionary\Tables\SalesLine\Methods\amountCur

А после этого долго думать, прежде чем писать:

Цитата:
Сообщение от LRA Посмотреть сообщение
метод, который работает с FieldID полей из CustVendTable,
__________________
Isn't it nice when things just work?
Старый 02.04.2007, 10:45   #12  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
Ув. belugin, приношу свои извинения, код, предложенный Вами, работает. Спасибо, буду знать, как вызывать методы мэпа из таблицы.

Но в данной задаче такое решение не имеет смысла.
Дело в том, что настройки, с которыми я сейчас борюсь, завязаны на map CustVendTable, точнее на FieldIDs мэпа. Поэтому на входе я имею именно экземпляр мэпа, от которого и хочу определить от кого он породился, от CustTable или VendTable. Я так же хочу получить реальные значения полей modifiedDate и modifiedTime.

Видимо, после всего обсуждения тему форума можно еще сформулировать так.

Каким образом надо инициализировать CustVendTable, чтобы FieldIDвсех полей в CustVendTable оставался таким же, как и у CustVendTable, но при этом значения полей modifiedDate и modifiedTime стали такими же, как и у породивших их записей из CustTableи VendTable? И как у такого CustVendTable определить, от кого он произошел, от CustTableили от VendTable?

Ув. macklakov, я внимательно посмотрел указанный Вами пример, запомнил и внял. Теперь буду знать, как запускать методы мэпа из экземпляра таблицы.

Последний раз редактировалось LRA; 02.04.2007 в 10:48.
Старый 02.04.2007, 10:52   #13  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
я бы попробовал инициализировать мэп как обычно, но при этом fieldID преобразовывать к fieldID таблиц.

см. например, (там несколько не то, но общую идею уловить можно)
Palle Agermark's WebLog : One piece of code to update a field in multiple tables
Старый 02.04.2007, 11:16   #14  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Честно сказать, совершенно не понимаю зачем для простых действий надо изобретать велосипед
X++:
    CustVendTable custVendTable;
    custTable   custTable;
    ;
    select firstonly custTable;

    custTable.overwriteSystemfields(true);
    custTable.(fieldnum(custTable, createdDate)) = systemdateget();

    custVendTable = custTable;
    info("Поле в таблице :" + custTable.CustGroup);
    info("По номеру поля в Map'е :" + custVendTable.(fieldNum(CustVendTable,groupId)));
    info("По имени поля в Map'е :" + custVendTable.groupId);
    info(date2str(custVendTable.createdDate, 123, 2, 2, 2, 2, 4));

    switch (custVendTable.TableId)
    {
        case tableNum(CustTable):
            info(tableStr(CustTable));
            break;
        case tableNum(VendTable):
            info(tableStr(VendTable));
            break;
    }
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: belugin (5), LRA (1).
Старый 02.04.2007, 12:21   #15  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от LRA Посмотреть сообщение
Вопросы:
2. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), красиво определить значения полей modifiedDate, modifiedTime, modifiedBy.
PS: Axapta 3.0 SP3. MS SQL
Тут было небольшое обсуждение на похожую тему
fieldNum(map) <-> fieldNum(table) ?
Правда там обсуждалось - как найти fieldId в исходной таблице - зная fieldId в Map
Но, возможно, это может помочь
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: belugin (5).
Старый 02.04.2007, 13:37   #16  
LRA is offline
LRA
Участник
 
41 / 39 (2) +++
Регистрация: 19.12.2005
Адрес: Москва
Ув. AndyD. Спасибо Вам огромное. Из Вашего примера становится понятен ответ на второй вопрос. Применительно к моему случаю выглядеть это будет так:

X++:
static void LRA_setSystemFields()
{
  CustVendTable     custVendTable;
  CustTable         custTable;
;
  select firstonly custTable;
 
  custVendTable.data(custTable);
  custVendTable.RecId = custTable.RecId;
 
  custVendTable.overwriteSystemfields(true);
  custVendTable.(fieldNum(custVendTable, modifiedDate)) = custTable.modifiedDate;
  custVendTable.(fieldNum(custVendTable, modifiedTime)) = custTable.modifiedTime;
  custVendTable.(fieldNum(custVendTable, modifiedBy))   = custTable.modifiedBy;
 
  Info(StrFmt("%1  %2  %3", custVendTable.modifiedDate, 
  custVendTable.modifiedTime, custVendTable.modifiedBy));
}
Теперь о вопросе, как определить от кого произошел данный CustVendTable, от CustTable или от VendTable, для случая, когда инициализация мэпа типа CustVendTable = CustTable; ИСКЛЮЧЕНА. Ответ пока еще не ясен.

Последний раз редактировалось LRA; 02.04.2007 в 13:46.
Теги
aot, map, modifieddate, modifiedtime

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить из элемента enum-а код типа (enum-а)? Romb DAX: База знаний и проекты 12 27.06.2013 16:17
где хранятся значения полей удаленных строк? chanchala DAX: Программирование 16 04.09.2008 10:45
непонятности с полями modifiedTime, modifiedDate др. PavelSR DAX: Программирование 4 17.03.2007 10:28
Как получить имя типа расширенного типа velk DAX: Программирование 9 03.08.2006 14:17
Изменение полей ModifiedTime etc. lexa DAX: Программирование 2 01.02.2004 22:56

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

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

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