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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.10.2008, 08:56   #1  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Есть ли в Axapta ф-ия схожая с TRANSFERFIELDS из Nav?
Доброго времени суток, уважаемые знатоки Ax. Подскажите беженцу с MBS Navision.

Вопрос следущий: Есть ли в MorphX функция подобная C/All'овской TRANSFERFIELDS()? И если есть, используется ли она при разноске? Не могу найти ответ.

Для сведения, в Nav она делала перенос сразу нескольких значений полей из одной таблицы в другую. Для переноса важно было, что бы необходимые для переноса поля имели один ID и Name соответственно в обоих таблицах. Использовалась при учете.
Старый 15.10.2008, 09:16   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
buf2buf()

ЗЫ. Если надо инициализировать курсор из курсора того же типа (такая же таблица), то можно Table1.data(Table2).

Последний раз редактировалось raz; 15.10.2008 в 09:19.
Старый 15.10.2008, 09:48   #3  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Спасибо, но это немного не то.
Таблицы разные.
Например: LedgerJournalTrans и LedgerTrans.
Эти таблицы имеют схожие наборы полей, участвующие в процедуре разноски. Но в LJT и в LT было добавлено поле. После разноски значение из созданного поля в LJT должно попадать в LT. Отвечает за разноску класс LedgerJournalCheckPost. А вот в каком методе происходит перенос данных из LJT в JT я, к сожалению, не нашел. И поэтому вспомнил про указанную в вопросе функцию из Nav.
Старый 15.10.2008, 09:59   #4  
Red Stranger is offline
Red Stranger
Участник
 
102 / 19 (1) ++
Регистрация: 01.04.2005
Цитата:
Сообщение от raz Посмотреть сообщение
ЗЫ. Если надо инициализировать курсор из курсора того же типа (такая же таблица), то можно Table1.data(Table2).
Цитата:
Сообщение от bobski Посмотреть сообщение
Спасибо, но это немного не то.
Таблицы разные.
Не только. Можно сделать табличный map. "Запмапить" в нем нужные таблицы.
И уже у мапа вызывать функцию data().
Старый 15.10.2008, 10:18   #5  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от bobski Посмотреть сообщение
Спасибо, но это немного не то.
Таблицы разные.
Например: LedgerJournalTrans и LedgerTrans.
Эти таблицы имеют схожие наборы полей, участвующие в процедуре разноски. Но в LJT и в LT было добавлено поле. После разноски значение из созданного поля в LJT должно попадать в LT. Отвечает за разноску класс LedgerJournalCheckPost. А вот в каком методе происходит перенос данных из LJT в JT я, к сожалению, не нашел. И поэтому вспомнил про указанную в вопросе функцию из Nav.
В данном случае лучше сделать доплнительный parm метод на классе LedgerVoucherTransObject и через него передавать в разноску что нужно, и уже внутри разноски все делать.

Но если вернуться к вопросу переноса полей, то в аксапте обычно создают метод типа initFromTable1 на таблице Table2, и вызывают его Table2.initFromTable1(Table1).

Или можно сделать свой buf2buf типа:
X++:
static void myBuf2Buf(
    Common  _from,
    Common  _to
    )
{
    DictTable   dictTable = new DictTable(_from.tableId);
    fieldId     fieldId   = dictTable.fieldNext(0);
    fieldId     fieldIdto;
    fieldName   fieldName;

    while (fieldId && ! isSysId(fieldId))
    {
        fieldName = fieldId2name(_from.TableId, fieldId);
        fieldIdto = fieldname2Id(_to.TableId, fieldName);

        if (fieldIdto && typeof(_to.(fieldIdto)) == typeof(_from.(fieldId))) 
            _to.(fieldIdto)  = _from.(fieldId);

        fieldId         = dictTable.fieldNext(fieldId);
    }
}
За это сообщение автора поблагодарили: kashperuk (3).
Старый 15.10.2008, 10:41   #6  
bobski is offline
bobski
Участник
 
38 / 11 (1) +
Регистрация: 01.10.2008
Идею понял, спасибо за скорые ответы.
Старый 04.05.2010, 14:05   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Не пользуйтесь этой идеей - это то, что mazzy называет "программистским подходом". Из моего скромного опыта, в долгосрочной перспективе эта идея несет куда больше проблем, чем удобств. Дело в том, что:
  • в приведенном коде как минимум нужно еще проверять длину строковых полей и ArraySize;
  • совпадение названия и базового типа полей в двух произвольных таблицах не означает автоматом, что эти поля содержат одну и ту же информацию;
  • вы не получите перекрестных ссылок, которые помогут выявить, откуда в поля результирующей таблицы попадают значения; при использовании Map'а по крайней мере будут перекрестные ссылки на поля Map'а;
  • вы будете ограничены в именовании полей, могут возникнуть сложности, если в одной таблице поле с каким-то префиксом/суффиксом (кастомизация), а в другой - нет (таблица создана вами, и там достаточно префикса в названии таблицы);
  • копирование не будет сопровождаться вызовом каких-либо обработчиков изменения полей, которые в той или иной таблице могут подтянуть значения связанных полей;
  • самое главное: вы не сможете контролировать, какие именно поля надо копировать, а какие нет.
Зачастую нужно копировать "все поля, кроме таких-то", из-за чего к одной строке вызова buf2buf() или подобного метода добавляется фигова туча строк кода, вычищающего значения полей, которые копировать не надо было, либо которые надо брать из других источников. При этом из-за отсутствия перекрестных ссылок (см. выше) нужно либо самому помнить, что при добавлении нового поля в обе таблицы надо подумать о том, копировать ли его и если копировать, то при каких условиях, либо надо будет решать такие вопросы по факту, исправляя некорректные данные ("ой, а вот тот флажок не должен был копироваться в новые записи"). В общем, я лично для себя решил, что наиболее оптимальный вариант - это использование методов типа initFromXXTable(): такой код и в перекрестные ссылки попадает, и поля явно заданы - не возникнет неожиданных эффектов при создании новых полей, и код можно разбить на несколько методов, скажем, вместо копирования кода клиента или договора сделать отдельные initFromCustTable(), initFromRContractTable() и вызывать их в initFromXXTable(). Первоначальные затраты на написание такого кода выше, но он намного более предсказуем, его куда легче сопровождать и развивать.
За это сообщение автора поблагодарили: Zabr (1).
Теги
законченный пример, как правильно, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axaptabuilder: How to setup Axapta batch server running as user defined windows service Blog bot DAX Blogs 0 12.04.2007 16:10
axaptabuilder: How to build Axapta application from XPO files stored in Visual Source Safe. Blog bot DAX Blogs 0 12.04.2007 16:10
ALEG: Доступны записи тренингов по Microsoft Dynamics NAV Blog bot DAX Blogs 0 21.03.2007 15:00
Есть стандартный метод который возвращал бы пустую складскую аналитику т.е. "Axapta"? Hidden DAX: Функционал 8 30.05.2006 14:44
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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