15.08.2007, 09:41 | #1 |
Участник
|
Что то я из справки не очень понял про эту функцию.
Цитата:
[Ok]:= Record.RENAME(Value1, [Value2],...)
Value1, Value2, ... Data type: text The new values for the primary key. то мне в этой функции надо всеравно перечислить все 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 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Как это понять?
Цитата:
При этом поменяется первичный ключ у текущей записи. При этом следующая запись после переименовки будет равна следующей записи до переименовки.
Цитата:
P.S. Хотите увеличить производительность - не используйте RENAME, потому что при вызове данной команды производится проверка связей всех полей по все таблице (проверено).
А если не делать переименования, а удалять старую запись и вставлять новую? Так быстрее будет? И не поубивает ли Навижен при удалении записи в одной таблицы связанные с ней записи в других таблицах? Или есть какая то другая альтернатива RENAME? |
|
16.08.2007, 10:38 | #4 |
Участник
|
Да, если измененная запись выходит за диапазон фильтров, то обычно сразу происходит выход за пределы цикла (если Вы его используете). Мне кажется, что именно так и происходит ("локальная" вставка нового значения и удаление другого).
Цитата:
Этот объект я для одноразового использования делал, но как медленно работает успел заметить.
А если не делать переименования, а удалять старую запись и вставлять новую? Так быстрее будет? И не поубивает ли Навижен при удалении записи в одной таблицы связанные с ней записи в других таблицах? Или есть какая то другая альтернатива RENAME? Альтернатива есть (как я уже писал) - копировать (при копировании в новую переменную туда передается только указатель) в другую переменную, модифицировать нужное поле и сохранять значение (.MODIFY). |
|
20.08.2007, 09:21 | #5 |
Участник
|
Что то я с копированием не совсем понимаю. Можно примерчик написать который будет выполнять действия с аналогичным результатом, как код в первом посте?
|
|
20.08.2007, 11:08 | #6 |
Участник
|
Цитата:
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 |
Участник
|
Попробовал таким способом прога вылетает на MODIFY с ошибкой "Запись не существует"
|
|
30.08.2007, 17:14 | #8 |
Участник
|
заводим темповую переменную такого же типа, что и переменная в которой хотим поменять ключевое поле например
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 |
Участник
|
Цитата:
MyRec.DELETE;
MyRec := Temp; MyRec.INSERT; Цитата:
минус в том что в Temp мы можем вставить запись которая уже есть в MyRec
|
|
03.09.2007, 14:05 | #10 |
Участник
|
Цитата:
Цитата:
Операции с темповской таблицой не откатываются при откате транзакции |
|
03.09.2007, 21:35 | #11 |
Участник
|
Цитата:
А вобще, лучше проверку поставить перед удалением и все |
|
04.09.2007, 10:18 | #12 |
Участник
|
Согласен с Fordewind
|
|