15.05.2007, 16:02 | #1 |
Участник
|
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 |
Участник
|
Может я конечно не вижу общей картины , но почему сразу не установить field1 в нужное значение?
|
|
15.05.2007, 16:36 | #3 |
Участник
|
|
|
15.05.2007, 16:58 | #4 |
Участник
|
Думаю, что больше кода править - не так уж и страшно
Предложенный вариант - рабочий. (причем стабильный) Но плохо читаемый и трудно поддерживаемый, ИМХО. Я бы от него ушел в сторону более логичного кода |
|
16.05.2007, 13:31 | #5 |
Administrator
|
Если вся проблема в том, что в методе 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 |
Участник
|
Насколько я понял, ему как раз надо выполнить код insert - только с другим значением поля. А потом значение поля поменять - в update() видимо бизнес-логики нет.
|
|
16.05.2007, 13:50 | #7 |
Administrator
|
В этом случае, конечно, правильнее будет вынести необходимый код в новый метод и вызывать его и из 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 |
Участник
|
Буквально вчера делал нечто подобное...
Предположим что необходимо создавать рекорд в таблице логов на каждый метод какого-либо класса... запускать метод, а потом апдейтить данную запись количеством успехов/ошибок и временем потраченным на работу вызывающих методов. 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 |
Участник
|
Он Горбунов.
|
|
19.05.2007, 10:05 | #10 |
Administrator
|
Спасибо за пример. Тем не менее, не убедили. Если уж вести лог, то, по-моему, гораздо практичнее делать новую запись и на 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 |
Участник
|
Хм..... CreatedDate/Time у таблицы включены. Одновременно с этим включены и ModifiedDate/Time.
И что мы имеем в итоге - создана запись (заполнены поля Created*)... пошел обрабатываться другой метод, после его обработки мы дописываем в эту-же строку что-либо (в данном случае Updates и Errors) и Акса автоматом нам заполнит поля Modified* - итого мы еще имеем наглядность по времени (сколько времени занял вызывающий метод)... Если у вас найдется более оптимальный и хороший код - выложите, я с огромным удовольствием его прочитаю... (это не сарказм, до уровня постоянных жителей данного форума мне далеко, и я это осознаю). С уважением, Акинак. |
|
21.05.2007, 17:51 | #12 |
Участник
|
А если надо будет зарегистрировать несколько событий?
Я согласен с Максимом - лучше на каждое событие создавать свою строку в логе Кроме того, в вашем коде не происходит одновременной вставки и обновления записи, в отличие от код Rect. Предполагаю, между вызовами происходит еще какое-то действие, которое вы регистрируете в одном методе
__________________
Axapta v.3.0 sp5 kr2 |
|
21.05.2007, 18:24 | #13 |
Administrator
|
На "более оптимальный и хороший код" не претендую, но посмотрите для примера, как организован 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. |
|