28.03.2007, 10:50 | #1 |
Участник
|
Как получить значения полей (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 |
Участник
|
>>1. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), определить чьим мэпом он является (CustTable или VendTable).
поле tableID >>>2. Как из сustVendTable, инициализированного через сustVendTable.data(custTable), красиво определить значения полей modifiedDate, modifiedTime, modifiedBy. может можно добавить изх в меппинг? |
|
28.03.2007, 11:29 | #3 |
Участник
|
А если для первого случая сделать так?
X++: ustVendTable.ustVendTable::Method1();
__________________
Axapta v.3.0 sp5 kr2 |
|
28.03.2007, 11:44 | #4 |
MCTS
|
Может это вам поможет
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 |
Участник
|
2 Russland
То, что вы указали - это дата/время создания/модификации таблицы, а не сторок в ней
__________________
Axapta v.3.0 sp5 kr2 |
|
29.03.2007, 16:31 | #6 |
Участник
|
Ув. belugin
TableID у CustVendTable инициализированного через сustVendTable.data(custTable), будет содержать код map CustVendTable, отличный от замэпенных таблиц CustTable и VendTable. Добавить в мэпинг поля modifiedDate, modifiedTime, modifiedBy и иже с ними у меня не получилось. Ув. AndyD. Не совсем понял “сustVendTable.сustVendTable::Method1();” У меня этот код не отработал. Что должен содержать метод .сustVendTable:: ? |
|
29.03.2007, 16:53 | #7 |
Участник
|
Если вы скопировали приведенный мной код, то он не будет работать
Там, оказывается, вместо английской "с" (cи) стоит русская "c" (эс). Но вините в этом себя - я скопировал из вашего сообщения X++: CustVendTable ( )ustVendTable; CustTable custTable; ; select firstonly custTable; ( )ustVendTable = custTable; ( )ustVendTable.C( )ustVendTable::Method1(); PS. Кстати, путаница с буковами эс и си есть и в коде. Например, в классе RCustVendTurnoverHolder есть объявление X++: CustVendTable ustVendTable;
__________________
Axapta v.3.0 sp5 kr2 |
|
29.03.2007, 16:57 | #8 |
Участник
|
Что у вас выдает следующий код
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 |
Участник
|
Ув. 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 |
Участник
|
Цитата:
Цитата:
Инициализация идет через метод Data(); и присвоение RecID
custVendTable.data(custTable); custVendTable.RecId = custTable.RecId; |
|
30.03.2007, 11:02 | #11 |
NavAx
|
Цитата:
А после этого долго думать, прежде чем писать:
__________________
Isn't it nice when things just work? |
|
02.04.2007, 10:45 | #12 |
Участник
|
Ув. 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 |
Участник
|
я бы попробовал инициализировать мэп как обычно, но при этом fieldID преобразовывать к fieldID таблиц.
см. например, (там несколько не то, но общую идею уловить можно) Palle Agermark's WebLog : One piece of code to update a field in multiple tables |
|
02.04.2007, 11:16 | #14 |
Участник
|
Честно сказать, совершенно не понимаю зачем для простых действий надо изобретать велосипед
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 |
Administrator
|
Цитата:
fieldNum(map) <-> fieldNum(table) ? Правда там обсуждалось - как найти fieldId в исходной таблице - зная fieldId в Map Но, возможно, это может помочь
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: belugin (5). |
02.04.2007, 13:37 | #16 |
Участник
|
Ув. 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)); } Последний раз редактировалось LRA; 02.04.2007 в 13:46. |
|
Теги |
aot, map, modifieddate, modifiedtime |
|
|