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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2012, 20:44   #1  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
table.validateField(), table.modifiedField(), table.validateWrite(), table.insert() и пр.

Если программист сделал все грамотно и не забыл написать нужный код куда следует и наверняка только в той части, в которой применима к NAV (то есть, думать все равно надо)... Принципиально от NAV отличаться не должно. Есть еще AX* классы, но я сомнвеваюсь, что в кастомизируемом (да и в стандартном) коде эта концепция везде поддерживается и на нее можно полагаться. Не поддерживается. Нельзя.

Только надо не забывать, что методы перекрыты бывают не только на уровне таблиц, но и на уровне источников данных форм. А иногда и на конкретных контролах.

Так что концепция применима, но так вот просто "Все что нужно было сделать для программного импорта данных это заполнять одно за одним поля и вызывать нужные тригерры в соответствующих местах" сказать нельзя.

Не поверю, что в NAV чтобы создать запись в "Item Journal Line" (и других таблицах) всегда достаточно написать так (псевдокод).

'Item Journal Line'.field1 := 1
'Item Journal Line'.onValidateField1()
'Item Journal Line'.field2 := 2
'Item Journal Line'.onValidateField2()
'Item Journal Line'.field3 := 3
'Item Journal Line'.onValidateField3()
...
'Item Journal Line'.OnInsert()
'Item Journal Line'.insert()
За это сообщение автора поблагодарили: yuh (1).
Старый 06.06.2012, 13:24   #2  
yuh is offline
yuh
Участник
 
14 / 10 (1) +
Регистрация: 30.08.2011
Цитата:
Сообщение от oip Посмотреть сообщение
Не поверю, что в NAV чтобы создать запись в "Item Journal Line" (и других таблицах) всегда достаточно написать так (псевдокод).

'Item Journal Line'.field1 := 1
...
Олег, спасибо за ответ! Я когда это прочитал, чуть было сам не засомневался. А потом еще раз подумал и утвердился: да, именно так и происходит в NAV! Мало того, именно этот код используется самой системой при создании складских проводок из других модулей. Например, когда пользователь проводит продажу товара, программа создает специальный "временный" товарный журнал и заполняет его с помощью тех самых "OnValidate", а потом автоматически его разносит.
Отсюда - другой вопрос: а как это происходит в AX? Нечто подобное? И если да, то какие именно классы используются для создания журналов?
Старый 06.06.2012, 13:39   #3  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от yuh Посмотреть сообщение
Отсюда - другой вопрос: а как это происходит в AX? Нечто подобное? И если да, то какие именно классы используются для создания журналов?
Например, вот набросок кода создания журнала платежей для какой-то старой версии Аксапты:

X++:
void createIncomingJournal()
{

LedgerJournalNameId incomingName;
LedgerJournalTable incomingJournal;

ledgerJournalTrans incomingTrans;
ledgerJournalTrans ledgerJournalTrans;

LedgerJournalEngine ljeIn;
LedgerJournalEngine ledgerJournalEngine;

NumberSeq numSeq;
ProjTable projTable;
RContractTable rct;
RContractPartnerType rctType;

;

ttsbegin;
select forupdate incomingJournal;
incomingJournal.clear();
incomingJournal.initValue();
incomingJournal.JournalName=incomingName;
incomingJournal.insert();

ljeIn = new BMLedgerJournalEngine(null);
ljeIn.newJournalActive(incomingJournal);

if(ljeIn)
{
while select lines
    {
        ledgerJournalTrans=incomingTrans;
        ledgerJournalEngine=ljeIn;
        select forupdate ledgerJournalTrans;
        ledgerJournalTrans.clear();

        ledgerJournalTrans.TransDate=lines.PaymDate;
        ledgerJournalTrans.currencyCode=lines.CurrencyID;
        ledgerJournalTrans.ExchRate=lines.ExchRate;

        ledgerJournalTrans.initValue();
        ledgerJournalTrans.JournalNum=incomingJournal.JournalNum;
        ledgerJournalEngine.numberSeqFormHandlerJournal().parmLedgerJournalTrans(ledgerJournalTrans);
        ledgerJournalEngine.formMethodDataSourceCreatePost();
        ledgerJournalEngine.initValue(ledgerJournalTrans);

        ledgerJournalTrans.TransDate=lines.PaymDate;
        ledgerJournalTrans.currencyCode=lines.CurrencyID;
        ledgerJournalTrans.ExchRate=lines.ExchRate;

        ledgerJournalTrans.accountType=lines.AccountType;
        ledgerJournalTrans.AccountNum=lines.Account;
        ledgerJournalTrans.offsetAccountType=lines.offsetAccountType;
        ledgerJournalTrans.OffsetAccount=lines.offsetAccount;

        if(AmountDebit)
            ledgerJournalTrans.AmountCurDebit=lines.AmountDebit;
        else if(AmountCredit)
            ledgerJournalTrans.AmountCurCredit=lines.AmountCredit;

        ledgerJournalTrans.Txt=lines.TransTxt;
        ledgerJournalTrans.DocumentNum=lines.DocumentNum;
        ledgerJournalTrans.DocumentDate=lines.PaymDate;

        ledgerJournalTrans.validateWrite();
        ledgerJournalEngine.preWrite(ledgerJournalTrans);
        ledgerJournalEngine.formMethodDataSourceWritePre();
        ledgerJournalTrans.write();
        ledgerJournalEngine.write(ledgerJournalTrans);
    }
}
ttscommit;
if(ljeIn)
    info(strfmt("Создан журнал входящих платежей %1", incomingJournal.JournalNum));
}
Но тут повезло, что был класс BMLedgerJournalEngine. В общем, еще раз повторю - бизнес логика может быть и на форме и в этом случае будут вызываться не только табличные триггеры. Ну вот разве в NAV не так? Обратите внимание на вызов различных "formMethod". Некоторые из подобных классов без открытия формы и не инициализируешь.

Цитата:
Сообщение от yuh Посмотреть сообщение
Олег, спасибо за ответ! Я когда это прочитал, чуть было сам не засомневался. А потом еще раз подумал и утвердился: да, именно так и происходит в NAV!
Поспрашивал коллег, занимающихся NAV. У них другое мнение. В сферическом идеальном случае да, вызывать табличные триггеры достаточно. Но так это и в AX так. А в реальности бывает и код на формах, который при вызове табличных триггеров, естественно, не сработает.
Старый 06.06.2012, 13:58   #4  
yuh is offline
yuh
Участник
 
14 / 10 (1) +
Регистрация: 30.08.2011
Цитата:
Сообщение от oip Посмотреть сообщение
Поспрашивал коллег, занимающихся NAV. У них другое мнение.
Ну вот, а я бросился было искать мануалы, научающие девелоперов всегда располагать код бизнес-логики в таблицах; при программном создании записей всегда вызывать OnValidate, OnInsert и OnModify;...
По крайней мере, так нас учили раньше и гордо называли это "Navision Way".
Может, с выходом более поздних версий что-то поменялось, и теперь этот путь уже не такой прямой
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: New Content for Microsoft Dynamics AX 2012 : October 2011 Blog bot DAX Blogs 0 27.10.2011 17:11
axinthefield: Dynamics AX Event IDs Blog bot DAX Blogs 0 01.03.2011 22:11
daxdilip: Whats New in Dynamics AX 2012 (A brief extract from the recently held Tech Conf.) Blog bot DAX Blogs 7 31.01.2011 12:35
axStart: Microsoft Dynamics AX 2009 Hot Topics Web Seminar Series Blog bot DAX Blogs 0 06.08.2008 12:05
Arijit Basu: AX 2009 - Quick Overview Blog bot DAX Blogs 4 19.05.2008 14:47

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

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

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