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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.01.2014, 16:51   #1  
zuzka is offline
zuzka
Участник
Аватар для zuzka
 
131 / 10 (1) +
Регистрация: 29.07.2013
Коллеги, пол дня промучался не понимая причины неполадки. Потребовалось в одной из таблиц изменять поле существующей записи - из интерфейса (ролевой, классик) все меняется легко, все валидейты отрабатывают чудесно. Но! при попытке забить данные при помощи кода - т.е. автоматизировать процесс - никаких ошибок не выдавая поле не изменяется, конкретно как была пустота в нем, так и остается(причем после попытки изменения, до перехода на другую запись тест поля выдает что в нем есть то значение что я пишу!!! т.е. как я понял не отрабатывает модификация...). Обратил внимание что поле входит в состав первичного ключа, если создавая запись ввести значение поля - делал на временной таблице - все записывается, при попытке изменить с теми же данными - изменения не вносятся... Как решить проблему не изменяя структуры таблицы? удалять записи и создавать их заново?
__________________
Как только вы проиграете, все ваши прошлые победы забудут.
Старый 13.01.2014, 16:57   #2  
Eugeny_F is offline
Eugeny_F
Участник
 
371 / 30 (2) +++
Регистрация: 18.11.2003
Адрес: Москва
Вообще для изменения значения поля, входящего в первичный ключ, используется оператор RENAME. Второй возможный вариант это копирование записи с помощью TRANSFERFILDS, изменение значения ключевого поля в создаваемой записи, удаление старой записи и вставка новой. Второй вариант отрабатывает быстрее.
Старый 13.01.2014, 18:27   #3  
zuzka is offline
zuzka
Участник
Аватар для zuzka
 
131 / 10 (1) +
Регистрация: 29.07.2013
сделал немного элегантнее:

Код:
...
_SalesPriseWorksheetTmp.TRANSFERFIELDS(SalesPriseWorksheet);
_SalesPriseWorksheetTmp."Ending Date" := CALCDATE('<-1D>', _SalesPriseWorksheet."Starting Date");
IF _SalesPriseWorksheetTmp.INSERT(TRUE) THEN;
...
после TRANSFERFIELDS подсунул нужное мне значение и только после провел INSERT - все отлично отработало) а вот RENAME наоборот не дался - постоянно ругался на разные типы данных... И все равно благодарность - вспомнил про TRANSFERFIELDS)))
__________________
Как только вы проиграете, все ваши прошлые победы забудут.
Старый 13.01.2014, 21:21   #4  
Eugeny_F is offline
Eugeny_F
Участник
 
371 / 30 (2) +++
Регистрация: 18.11.2003
Адрес: Москва
А старую запись удалить? При использовании TRANSFERFIELDS еще нужно помнить про неглобальные измерения и про возможные связанные таблицы. Правда, судя по названию переменных типа Record, измерений в Вашем примере быть не должно.
RENAME должен отрабатывать корректно. Там есть тонкость, которая впрочем описана в хелпе, что после RENAME в скобках должны быть указаны через запятую, значения всех полей из первичного ключа, даже если они не изменяются. Т.е для таблицы SalesPriseWorksheet это должно выглядеть примерно так

_SalesPriseWorksheet.RENAME("Starting Date",CALCDATE('<-1D>', _SalesPriseWorksheet."Starting Date"),"Sales Type","Sales Code","Currency Code","Item No.","Variant Code","Unit of Measure Code","Minimum Quantity")
Старый 29.01.2014, 20:09   #5  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Я всегда использую ренэйм, проблем нет с изменением ключевых полей нет.
Просто нужно отгетить таблицу по этому ключу, а сам ренэйм проводить на таблице через другую переменную.
например:
IF NOT Tab1.GET(Type,"No.") THEN ...
RENAME(Type,"No.");
MODIFY;
Старый 30.01.2014, 11:30   #6  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Sova Посмотреть сообщение
Я всегда использую ренэйм, проблем нет с изменением ключевых полей нет.
Просто нужно отгетить таблицу по этому ключу, а сам ренэйм проводить на таблице через другую переменную.
например:
IF NOT Tab1.GET(Type,"No.") THEN ...
RENAME(Type,"No.");
MODIFY;
Мелькающее при этом окошко "Идет подсчет записей в таблицах ...." не смущает?)
Старый 05.02.2014, 19:08   #7  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Цитата:
Сообщение от romeo Посмотреть сообщение
Мелькающее при этом окошко "Идет подсчет записей в таблицах ...." не смущает?)
Не помню.. окошка... может, оно и есть ))
Дело в том, что обычно это применяется в служебных функциях, одноразовых - что-то поправить в базе. Мелькает, не мелькает - нет никакой разницы для разработчика, запустил и отошел. А пользователю, естественно, такие механизмы не даются в принципе. Что бы они еще и ключи меняли - как-то в голову не приходило.
Старый 06.02.2014, 11:00   #8  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от Sova Посмотреть сообщение
Цитата:
Сообщение от romeo Посмотреть сообщение
Мелькающее при этом окошко "Идет подсчет записей в таблицах ...." не смущает?)
Не помню.. окошка... может, оно и есть ))
Дело в том, что обычно это применяется в служебных функциях, одноразовых - что-то поправить в базе. Мелькает, не мелькает - нет никакой разницы для разработчика, запустил и отошел. А пользователю, естественно, такие механизмы не даются в принципе. Что бы они еще и ключи меняли - как-то в голову не приходило.
нормальное отношение у вас - "мелькает, не мелькает". Может там deleteall(true)...
Старый 10.02.2014, 16:09   #9  
Sova_imported is offline
Sova_imported
Участник
 
46 / 10 (1) +
Регистрация: 15.11.2007
Цитата:
Сообщение от InTacto Посмотреть сообщение
/> нормальное отношение у вас - "мелькает, не мелькает". Может там deleteall(true)...
Там только то, что сам напишешь в коде
Если написал делит - значит, судьба такая....
Старый 10.07.2015, 18:07   #10  
Васыо is offline
Васыо
Участник
 
316 / 12 (1) ++
Регистрация: 15.11.2006
Хочу перекодировать всех клиентов. Сделал репорт, в OnAfterGetRecord() пишу как-то так:

Код:
RENAME(NoSeriesMgt.GetNextNo(SalesSetup."Customer2 Nos.",0D,TRUE)) ;
На ReqFilterFields ставлю фильтр диапазоном по "No.". Запускаю. Обрабатывает одну запись (корректно) и всё. Как его заставить пройтись по всему списку?
Старый 10.07.2015, 18:31   #11  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
Попробуй использовать две переменные

Т.е., к примеру, одна переменная типа record Customer - это датаайтем
Заведи переменную Customer1 такого же типа
на onaftergetrecord напиши
Customer1.GET(Customer."No.");
Customer1.RENAME...
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
Старый 11.07.2015, 09:21   #12  
Васыо is offline
Васыо
Участник
 
316 / 12 (1) ++
Регистрация: 15.11.2006
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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