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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.05.2008, 07:53   #1  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Здравствуйте.
Имею ошибку при добавлении записи "Запись уже существует... бла-бла-бла")
Первичный ключ - поле id, автоинкрементное, я так понимаю должно увеличиваться, но почемуто этого не происходит и на него ругань идет.
Код:
  WITH ILRec DO BEGIN
	  INIT;
	  VALIDATE(id);
	  idIH := Rec.id;
	  ItemCode := adoRec1.Fields.Item(0).Value;
	  UnitPrise:= adoRec1.Fields.Item(1).Value;
	  CountDoc := adoRec1.Fields.Item(2).Value;
	  SumDoc   := adoRec1.Fields.Item(3).Value;
	  INSERT(TRUE);
  END;
Подскажите, в чем причина может быть?
Старый 06.05.2008, 09:00   #2  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Не надо валидейтить поле ID. И присваивать его не нужно. Оставьте пустым.
__________________
Want to believe...
Старый 06.05.2008, 09:06   #3  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Так тоже делал(
Старый 06.05.2008, 09:16   #4  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Напишите так:

Код:
  WITH ILRec DO BEGIN
	  INIT;
	  id := 0;
	  idIH := Rec.id;
	  ItemCode := adoRec1.Fields.Item(0).Value;
	  UnitPrise:= adoRec1.Fields.Item(1).Value;
	  CountDoc := adoRec1.Fields.Item(2).Value;
	  SumDoc   := adoRec1.Fields.Item(3).Value;
	  INSERT(TRUE);
  END;
То есть, полю id присвойте 0 перед вставкой.
__________________
MBS Certified Master in Navision Developer
Старый 06.05.2008, 10:06   #5  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Только что я еще раз попробовал оба варианта. Безрезультатно.
Старый 06.05.2008, 10:19   #6  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Цитата:
Сообщение от smoyk Посмотреть сообщение
Только что я еще раз попробовал оба варианта. Безрезультатно.
Есть ряд ограничений, накладываемых по использованию свойства поля AutoIncrement. Смысла описывать их здесь нет - лучше посмотреть справку по данному свойству. И понять выполнены ли все условия.
Возможно, что проблема в обработке триггера Insert.
__________________
MBS Certified Master in Navision Developer
Старый 06.05.2008, 10:33   #7  
apanko is offline
apanko
MCTS
MCBMSS
Лучший по профессии 2009
 
1,164 / 139 (7) +++++
Регистрация: 24.02.2005
Табличка случайно не временная?
Старый 06.05.2008, 12:42   #8  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от smoyk Посмотреть сообщение
Здравствуйте.
Имею ошибку при добавлении записи "Запись уже существует... бла-бла-бла")
Первичный ключ - поле id, автоинкрементное, я так понимаю должно увеличиваться, но почемуто этого не происходит и на него ругань идет.
Код:
  WITH ILRec DO BEGIN
	  INIT;
	  VALIDATE(id);
	  idIH := Rec.id;
	  ItemCode := adoRec1.Fields.Item(0).Value;
	  UnitPrise:= adoRec1.Fields.Item(1).Value;
	  CountDoc := adoRec1.Fields.Item(2).Value;
	  SumDoc   := adoRec1.Fields.Item(3).Value;
	  INSERT(TRUE);
  END;
Подскажите, в чем причина может быть?
Вы уверены, что id не часть первичного ключа? Какой ключик первичный?
Старый 06.05.2008, 13:48   #9  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от RedFox Посмотреть сообщение
Вы уверены, что id не часть первичного ключа? Какой ключик первичный?
Что значит не часть? Должно быть частью! Более того, последним полем в первичном ключе...
Старый 06.05.2008, 14:41   #10  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Посмотрите в тексте сообщения об ошибке какая именно запись уже существует (с каким значением id)? Откройте таблицу и проверьте, что этот id является очередным (тем что должен быть на 1 больше максимального). Проверьте, что поле id действительно автоинкремент. Остановите дебагер на строке INSERT и посмотрите, с какими значениями первичного ключа вы пытаетесь вставить запись. Это даст ответ на вопрос почему она не вставляется.
Старый 06.05.2008, 17:05   #11  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от Fordewind Посмотреть сообщение
Что значит не часть? Должно быть частью! Более того, последним полем в первичном ключе...
Вот именно!
Но здась оказывается другая еунда - при созданном объекте можно вставить только 1 строку. Если нужно ставить другую, то нужно создавать либо копию этого же объекта, либо его закрывать и запускать заново.
Наверное это баг, так как есть - не очень удобно манипулировать данными таким образом.
Старый 06.05.2008, 17:50   #12  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
Точно... вспомнил ... это поле нормально работает при пользовательском вводе, при вставке из кода проблемы .
__________________
Want to believe...
Старый 06.05.2008, 17:53   #13  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от DA_NEAL Посмотреть сообщение
Точно... вспомнил ... это поле нормально работает при пользовательском вводе, при вставке из кода проблемы .
Хм. Не замечал такого.
Старый 06.05.2008, 18:06   #14  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от RedFox Посмотреть сообщение
Вот именно!
Но здась оказывается другая еунда - при созданном объекте можно вставить только 1 строку. Если нужно ставить другую, то нужно создавать либо копию этого же объекта, либо его закрывать и запускать заново.
Наверное это баг, так как есть - не очень удобно манипулировать данными таким образом.
CLEAR в руки и вперед .
Про баг, в общем-то, согласен
Старый 06.05.2008, 18:21   #15  
SVG is offline
SVG
Участник
 
201 / 10 (1) +
Регистрация: 15.11.2004
только что
создал таблицу с одним полем AutoKey типа integer, инкремент = true
написал в кодеюните
FOR i := 1 TO 10 DO BEGIN
Table.AutoKey := 0;
Table.INSERT;
END;

все прекрасно работает.
автору надо посмотреть что у него в триггере insert написано
Старый 07.05.2008, 05:48   #16  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Пробовал с CLEAR (такой баг мне известен), не помогало.
Таблица не временная.
id действительно инкремент.
Значения смотрел: id был равен значению id первой записи в НД (на таблице стоят фильтры, впрочем пробовал и без них). Значение просто не увеличивалось.
Все надоело, сделал через запрос на сервер
Код:
	cuSQL.Execute('INSERT INTO InventoryLine (idIH, ItemCode, UnitPrise, CountDoc, SumDoc) '+
				  'VALUES ('+
				  FORMAT(Rec.id)+','''+
				  DELCHR(FORMAT(adoRec1.Fields.Item(0).Value),'=',' ')+''','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(1).Value),'=',' ')+','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(2).Value),'=',' ')+','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(3).Value),'=',' ')+')');
Работает. Всем спасибо за советы и помощ.

p.s. В тригере insert много чего написано, куда смотреть не знаю. Не могу понять, как то, что там написано могло бы помешать увеличению значения автоинкрементного поля. Впрочем, в navision все возможно)))
Старый 07.05.2008, 11:30   #17  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
На мой взгляд не очень хорошее решение принял, Smoyk. Если принять за правило писать логику в скуле, когда не понимаешь, что написано в навиженовском триггере ... Кончится все это плохо. Вас не интересует количество кода в триггере в данном случае. Вас интересует то, с каким значением в этом триггере присутствует одно поле таблицы.
Автоинкремент с момента создания или недавно переделали?
Обнулите айди перед вставкой как советовали и посмотрите как будет вставляться с нулем .. Хотя вы говорите, что так уже пробовали.
Старый 07.05.2008, 11:35   #18  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
Цитата:
Сообщение от smoyk Посмотреть сообщение
Пробовал с CLEAR (такой баг мне известен), не помогало.
Таблица не временная.
id действительно инкремент.
Значения смотрел: id был равен значению id первой записи в НД (на таблице стоят фильтры, впрочем пробовал и без них). Значение просто не увеличивалось.
Все надоело, сделал через запрос на сервер
Код:
	cuSQL.Execute('INSERT INTO InventoryLine (idIH, ItemCode, UnitPrise, CountDoc, SumDoc) '+
				  'VALUES ('+
				  FORMAT(Rec.id)+','''+
				  DELCHR(FORMAT(adoRec1.Fields.Item(0).Value),'=',' ')+''','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(1).Value),'=',' ')+','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(2).Value),'=',' ')+','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(3).Value),'=',' ')+')');
Работает. Всем спасибо за советы и помощ.

p.s. В тригере insert много чего написано, куда смотреть не знаю. Не могу понять, как то, что там написано могло бы помешать увеличению значения автоинкрементного поля. Впрочем, в navision все возможно)))
Хм.. а вот это странно. Если у вас SQL версия, то для полей AutoIncrement на сиквеле ставится свойство Identity 1, а это значит, что данное поле нельзя "править" ручками.
Скорее всего произошел баг и для AutoIncrement поля из НАВ, и на сиквеле для поля Identity = 0? Так?
Старый 07.05.2008, 11:42   #19  
RedFox is offline
RedFox
Участник
 
1,441 / 10 (0) +
Регистрация: 28.12.2004
Адрес: Киев
Цитата:
Сообщение от smoyk Посмотреть сообщение
Пробовал с CLEAR (такой баг мне известен), не помогало.
Таблица не временная.
id действительно инкремент.
Значения смотрел: id был равен значению id первой записи в НД (на таблице стоят фильтры, впрочем пробовал и без них). Значение просто не увеличивалось.
Все надоело, сделал через запрос на сервер
Код:
	cuSQL.Execute('INSERT INTO InventoryLine (idIH, ItemCode, UnitPrise, CountDoc, SumDoc) '+
				  'VALUES ('+
				  FORMAT(Rec.id)+','''+
				  DELCHR(FORMAT(adoRec1.Fields.Item(0).Value),'=',' ')+''','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(1).Value),'=',' ')+','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(2).Value),'=',' ')+','+
				  DELCHR(FORMAT(adoRec1.Fields.Item(3).Value),'=',' ')+')');
Работает. Всем спасибо за советы и помощ.

p.s. В тригере insert много чего написано, куда смотреть не знаю. Не могу понять, как то, что там написано могло бы помешать увеличению значения автоинкрементного поля. Впрочем, в navision все возможно)))
Если честно, то я немного не понимаю зачем так сложно делать, чтобы увеличить значение? Неужели нельзя вручную найти последнюю запись и увеличить значение?
Поссмотрите столько времени занимает образотка этого запроса и обычного, как с FINDLAST (хотя наверное я не понял всей идеи применения)
Старый 07.05.2008, 12:47   #20  
smoyk is offline
smoyk
Участник
 
188 / 13 (1) ++
Регистрация: 20.04.2007
Цитата:
Сообщение от romeo Посмотреть сообщение
На мой взгляд не очень хорошее решение принял, Smoyk. Если принять за правило писать логику в скуле, когда не понимаешь, что написано в навиженовском триггере ... Кончится все это плохо.
Признаю, что Вы правы) Надо копать.
Автоинкремент стоит с самого начала, хотя ключи пару раз перестраивались в поисках оптимального решения. Но не думаю, что в этом дело т.к. сервер обрабатывает эту ситуацию нормально.
На сервере свойства поля
Код:
Identity=Yes;
Identity Seed=1;
Identity Increment=1;
Можно конечно и ручками увеличивать, но изначально идея в том, чтобы этого то как раз и не делать))
Может это быть из-за того, что первичный ключ составной? Сейчас попробуем в этом направлении покопать.
 


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

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

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