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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.08.2007, 09:41   #1  
VasVovec is offline
VasVovec
Участник
Аватар для VasVovec
 
145 / 10 (1) +
Регистрация: 13.04.2007
Что то я из справки не очень понял про эту функцию.
Цитата:
[Ok]:= Record.RENAME(Value1, [Value2],...)
Value1, Value2, ...

Data type: text

The new values for the primary key.
Если у меня в первичном ключе к примеру 5 полей и мне надо у записи изменить значение одного из них,
то мне в этой функции надо всеравно перечислить все 5 значений которые примут поля ключа?

Тобишь примерно так должно выглядеть изменение значения 3 поля ключа?

Код:
фильтрация
IF SomeRecord.FIND('-') THEN
  WITH SomeRecord DO
	REPEAT
	  RENAME("Key1","Key2",NewValue,"Key4","Key5");
	  UNTIL SomeRecord.NEXT = 0;
Старый 15.08.2007, 10:28   #2  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от VasVovec Посмотреть сообщение
Что то я из справки не очень понял про эту функцию.
Если у меня в первичном ключе к примеру 5 полей и мне надо у записи изменить значение одного из них,
то мне в этой функции надо всеравно перечислить все 5 значений которые примут поля ключа?

Тобишь примерно так должно выглядеть изменение значения 3 поля ключа?

Код:
фильтрация
IF SomeRecord.FIND('-') THEN
  WITH SomeRecord DO
	REPEAT
	  RENAME("Key1","Key2",NewValue,"Key4","Key5");
	  UNTIL SomeRecord.NEXT = 0;
Именно так. При этом поменяется первичный ключ у текущей записи. При этом следующая запись после переименовки будет равна следующей записи до переименовки.
SomeRecord. RENAME("Key1","Key2",NewValue,"Key4","Key5");

Если ты хочешь поменять только одно поле (и при этом новое значение выходит за диапазон фильта), то можно использовать копирование ссылки в новую записть и потом изменять что нужно только у этой записи.
Пример "GenJnlLine.COPY(Rec);" в 13 кодеюните.

P.S. Хотите увеличить производительность - не используйте RENAME, потому что при вызове данной команды производится проверка связей всех полей по все таблице (проверено).
Старый 16.08.2007, 09:39   #3  
VasVovec is offline
VasVovec
Участник
Аватар для VasVovec
 
145 / 10 (1) +
Регистрация: 13.04.2007
Как это понять?
Цитата:
При этом поменяется первичный ключ у текущей записи. При этом следующая запись после переименовки будет равна следующей записи до переименовки.
Имеется ввиду следующая запись после текущей?

Цитата:
P.S. Хотите увеличить производительность - не используйте RENAME, потому что при вызове данной команды производится проверка связей всех полей по все таблице (проверено).
Этот объект я для одноразового использования делал, но как медленно работает успел заметить.
А если не делать переименования, а удалять старую запись и вставлять новую? Так быстрее будет? И не поубивает ли Навижен при удалении записи в одной таблицы связанные с ней записи в других таблицах?
Или есть какая то другая альтернатива RENAME?
Старый 16.08.2007, 10:38   #4  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от VasVovec Посмотреть сообщение
Как это понять?
Имеется ввиду следующая запись после текущей?
Да, если измененная запись выходит за диапазон фильтров, то обычно сразу происходит выход за пределы цикла (если Вы его используете). Мне кажется, что именно так и происходит ("локальная" вставка нового значения и удаление другого).

Цитата:
Этот объект я для одноразового использования делал, но как медленно работает успел заметить.
А если не делать переименования, а удалять старую запись и вставлять новую? Так быстрее будет? И не поубивает ли Навижен при удалении записи в одной таблицы связанные с ней записи в других таблицах?
Или есть какая то другая альтернатива RENAME?
Удаление и вставка будет быстрее, но связи могут теряться (не могу 100% утверждать).
Альтернатива есть (как я уже писал) - копировать (при копировании в новую переменную туда передается только указатель) в другую переменную, модифицировать нужное поле и сохранять значение (.MODIFY).
Старый 20.08.2007, 09:21   #5  
VasVovec is offline
VasVovec
Участник
Аватар для VasVovec
 
145 / 10 (1) +
Регистрация: 13.04.2007
Что то я с копированием не совсем понимаю. Можно примерчик написать который будет выполнять действия с аналогичным результатом, как код в первом посте?
Старый 20.08.2007, 11:08   #6  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от VasVovec Посмотреть сообщение
Что то я с копированием не совсем понимаю. Можно примерчик написать который будет выполнять действия с аналогичным результатом, как код в первом посте?
Переменные в объявлении:
CopyRecord (rec) = "SomeRecord";
NextStep :boolean

КОД:
SomeRecord.фильтрация
IF SomeRecord.FIND('-') THEN REPEAT
NextStep := 0
// SomeRecord.RENAME("Key1","Key2",NewValue,"Key4","Key5");
CopyRecord.COPY(SomeRecord) //to copy a record from a C/SIDE table. All filters, marks, and keys are included in the copy.
NextStep := SomeRecord.NEXT;
CopyRecord.KeyField3 := NewValue;
CopyRecord. MODIFY;
UNTIL NextStep = 0;
Старый 23.08.2007, 17:21   #7  
VasVovec is offline
VasVovec
Участник
Аватар для VasVovec
 
145 / 10 (1) +
Регистрация: 13.04.2007
Попробовал таким способом прога вылетает на MODIFY с ошибкой "Запись не существует"
Старый 30.08.2007, 17:14   #8  
del_negrozzz is offline
del_negrozzz
Участник
 
35 / 10 (1) +
Регистрация: 11.07.2007
заводим темповую переменную такого же типа, что и переменная в которой хотим поменять ключевое поле например
Temp

Далее пишем примерно такой код

Temp.DELETEALL;

MyRec.FIND('-'); //реальная запись
Temp := MyRec;
Temp.PrimaryKeyField := 'NewValue';
Temp.INSERT;

MyRec.DELETE;
MyRec := Temp;
MyRec.INSERT;

этот пример можно модифицировать и для перебора значений по фильтру(с последующей сменой значения в ключ поле)

минус в том что в Temp мы можем вставить запись которая уже есть в MyRec
Старый 31.08.2007, 10:19   #9  
VasVovec is offline
VasVovec
Участник
Аватар для VasVovec
 
145 / 10 (1) +
Регистрация: 13.04.2007
Цитата:
MyRec.DELETE;
MyRec := Temp;
MyRec.INSERT;
а при DELETE не случится ли удаление подчиненных записей? К примеру, если удалить запись из таблицы Calendar, то не повлечет ли это удаление соответствующих записей из таблицы Calendar Line?

Цитата:
минус в том что в Temp мы можем вставить запись которая уже есть в MyRec
даа DELETE тогда случится а INSERT не сработает. Так если между этими вызовами COMMIT не вставлять то в принципе ж вся транзакция откатится и ничего страшного не случится
Старый 03.09.2007, 14:05   #10  
Голышев Михаил is offline
Голышев Михаил
Участник
 
106 / 10 (1) +
Регистрация: 03.07.2006
Цитата:
Сообщение от VasVovec Посмотреть сообщение
а при DELETE не случится ли удаление подчиненных записей? К примеру, если удалить запись из таблицы Calendar, то не повлечет ли это удаление соответствующих записей из таблицы Calendar Line?
DELETE без параметров вызывается со значением FALSE по умолчанию, т.е. никаких тригеров, которые могут удалить Lines не выполняется.
Цитата:
Сообщение от VasVovec Посмотреть сообщение
даа DELETE тогда случится а INSERT не сработает. Так если между этими вызовами COMMIT не вставлять то в принципе ж вся транзакция откатится и ничего страшного не случится
Оперирование с данными темповских таблиц не поддерживает транзакционность. (в 4.0 sp3 точно)
Операции с темповской таблицой не откатываются при откате транзакции
Старый 03.09.2007, 21:35   #11  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от golyshev Посмотреть сообщение
Оперирование с данными темповских таблиц не поддерживает транзакционность. (в 4.0 sp3 точно)
Операции с темповской таблицой не откатываются при откате транзакции
ну так MyRec не темповая.... по ней откат должен пройти.
А вобще, лучше проверку поставить перед удалением и все
Старый 04.09.2007, 10:18   #12  
VasVovec is offline
VasVovec
Участник
Аватар для VasVovec
 
145 / 10 (1) +
Регистрация: 13.04.2007
Согласен с Fordewind
 


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

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

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