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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.05.2007, 16:02   #1  
Rect is offline
Rect
Участник
 
43 / 11 (1) +
Регистрация: 29.05.2006
Update создаваемой записи
Доброе время суток.

Подскажите, пожалуйста, насколько корректно делать так.
В таблице Table создаем метод
createRec()
{
Table hlpTbl;
;
this.field1 = "ABC";
this.insert();

ttbegin;
select forupdate hlpTbl where hlpTbl.RecId == this.RecId;
hlpTbl.field1 = "CBA";
hlpTbl.update();
ttscommit;
}

и дальше используем этот метод в каком-нибудь классе.
Старый 15.05.2007, 16:33   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Может я конечно не вижу общей картины , но почему сразу не установить field1 в нужное значение?
Старый 15.05.2007, 16:36   #3  
Rect is offline
Rect
Участник
 
43 / 11 (1) +
Регистрация: 29.05.2006
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Может я конечно не вижу общей картины , но почему сразу не установить field1 в нужное значение?
скорее всего именно так я и сделаю, но тогда придется больше кода править)
К тому же, интересно узнать, насколько корректен предложенный вариант и возможные последствия.
Старый 15.05.2007, 16:58   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Думаю, что больше кода править - не так уж и страшно
Предложенный вариант - рабочий. (причем стабильный)
Но плохо читаемый и трудно поддерживаемый, ИМХО.
Я бы от него ушел в сторону более логичного кода
Старый 16.05.2007, 13:31   #5  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Если вся проблема в том, что в методе insert() есть какой-то код, который вы не хотите выполнять, возможно, стоит задуматься об использовании doInsert().
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 16.05.2007, 13:34   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Насколько я понял, ему как раз надо выполнить код insert - только с другим значением поля. А потом значение поля поменять - в update() видимо бизнес-логики нет.
Старый 16.05.2007, 13:50   #7  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
В этом случае, конечно, правильнее будет вынести необходимый код в новый метод и вызывать его и из insert(), и из createRec().

Кстати, а что это за код такой, что выполняется при insert(), но не выполняется при update()???
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 17.05.2007, 12:08   #8  
Akinak is offline
Akinak
Участник
 
17 / 11 (1) +
Регистрация: 22.02.2007
Буквально вчера делал нечто подобное...
Предположим что необходимо создавать рекорд в таблице логов на каждый метод какого-либо класса... запускать метод, а потом апдейтить данную запись количеством успехов/ошибок и временем потраченным на работу вызывающих методов.

X++:
/*******************************************************************************
PARAMETERS: Name - descr of method, Upd - number of successes, Err - number of errors,
//---Insert - flag to create new record or update existing one.
RETURN VALUE: None
DESCRIPTION:
//---05/16/2007-10:52:18--- This method writes complete log of XXX class,
//---including all its methods. To create a record method should be called 2 times from any method within class:
//---at start->to create a record, at finish->to update record with number of errors/sucesses and time consumped.
*******************************************************************************/
void XXXClassLog(str         Name,
                int         Upd=0,
                int         Err=0,
                boolean     Insert=true
                )
{   XXX_Log       XXX_Log;
    if (Insert)
    {
        XXX_Log.Job            = Name;
        XXX_Log.Updated     = 0;
        XXX_Log.Errors        = 0;
        XXX_Log.Path          = strfmt("%3%1_error.%2","XXX_Log","csv",WinAPI::getTempPath());
        XXX_Log.insert();
        RecId                      = XXX_Log.RecId;
    }
    if (!Insert)
    {
        XXX_Log.selectForUpdate(true);
        ttsbegin;
        select firstonly XXX_Log
            where XXX_Log.RecId == RecId;
            {
                XXX_Log.Updated     = Upd;
                XXX_Log.Errors        = Err;
                XXX_Log.update();
            }
        ttscommit;
    }
}
З.Ы.
Да, RecID - это глобальная переменная для поиска по ней... можно конечно хранить и весь рекорд... но я решил сделать так).
З.Ы.Ы.
По самому вопросу - да, сделать так конечно можно, вот только логики в примере не видно... не совсем ясно ЗАЧЕМ так делать.
Приведено в качестве примера для Максима Горбунова.

пасибо, исправил))))

Последний раз редактировалось Akinak; 17.05.2007 в 13:46.
Старый 17.05.2007, 13:30   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Он Горбунов.
Старый 19.05.2007, 10:05   #10  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Спасибо за пример. Тем не менее, не убедили. Если уж вести лог, то, по-моему, гораздо практичнее делать новую запись и на insert(), и на update(), а также включить createdDate и createdTime у таблицы.

Rect, Вам я бы посоветовал все же задуматься над рефакторингом кода в insert(). Как минимум, пригодится в будущем.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 21.05.2007, 17:16   #11  
Akinak is offline
Akinak
Участник
 
17 / 11 (1) +
Регистрация: 22.02.2007
Хм..... CreatedDate/Time у таблицы включены. Одновременно с этим включены и ModifiedDate/Time.
И что мы имеем в итоге - создана запись (заполнены поля Created*)...
пошел обрабатываться другой метод, после его обработки мы дописываем в эту-же строку что-либо (в данном случае Updates и Errors) и Акса автоматом нам заполнит поля Modified* - итого мы еще имеем наглядность по времени (сколько времени занял вызывающий метод)...

Если у вас найдется более оптимальный и хороший код - выложите, я с огромным удовольствием его прочитаю... (это не сарказм, до уровня постоянных жителей данного форума мне далеко, и я это осознаю).

С уважением, Акинак.
Старый 21.05.2007, 17:51   #12  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
А если надо будет зарегистрировать несколько событий?
Я согласен с Максимом - лучше на каждое событие создавать свою строку в логе

Кроме того, в вашем коде не происходит одновременной вставки и обновления записи, в отличие от код Rect. Предполагаю, между вызовами происходит еще какое-то действие, которое вы регистрируете в одном методе
__________________
Axapta v.3.0 sp5 kr2
Старый 21.05.2007, 18:24   #13  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
На "более оптимальный и хороший код" не претендую, но посмотрите для примера, как организован Database Log. Я даже не про код говорю (его посмотреть и не удастся), а про структуру данных. Вклюите лог для какой-нибудь одной таблицы и посмотрите, как появляются записи в логе.

Добавлено: А вообще, update'ов в логе по определению быть не может. Ведь что такое лог? Это сохраненная трасса (возможно, не полная, но все же). А какие могут быть апдейты в трассе? Там ведь либо событие произошло (сделали insert в лог), либо нет (соответственно, insert не сделали). А такого, чтобы событие произошло, а потом мы подумали, и решили что оно произошло по-другому, не бывает. В таком случае это уже не лог получается.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me

Последний раз редактировалось Maxim Gorbunov; 21.05.2007 в 18:29.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dianne Siebold: Rec Fields Required in AIF Partial Update Blog bot DAX Blogs 0 20.01.2009 09:05
Потеря активного буфера записи при вызове super() в update() таблицы TasmanianDevil DAX: Администрирование 13 01.10.2008 11:36
Проблемы с обновлением записи, выбранной для обновления внутри транзакции Oz DAX: Программирование 13 02.07.2008 16:24
Dianne Siebold: Update on the Dynamics AX SDK Team kashperuk DAX Blogs 1 16.10.2007 08:23

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

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

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