06.05.2008, 07:53 | #1 |
Участник
|
Здравствуйте.
Имею ошибку при добавлении записи "Запись уже существует... бла-бла-бла") Первичный ключ - поле 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 |
Участник
|
Не надо валидейтить поле ID. И присваивать его не нужно. Оставьте пустым.
__________________
Want to believe... |
|
06.05.2008, 09:06 | #3 |
Участник
|
Так тоже делал(
|
|
06.05.2008, 09:16 | #4 |
Участник
|
Напишите так:
Код: 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;
__________________
MBS Certified Master in Navision Developer |
|
06.05.2008, 10:06 | #5 |
Участник
|
Только что я еще раз попробовал оба варианта. Безрезультатно.
|
|
06.05.2008, 10:19 | #6 |
Участник
|
Есть ряд ограничений, накладываемых по использованию свойства поля AutoIncrement. Смысла описывать их здесь нет - лучше посмотреть справку по данному свойству. И понять выполнены ли все условия.
Возможно, что проблема в обработке триггера Insert.
__________________
MBS Certified Master in Navision Developer |
|
06.05.2008, 10:33 | #7 |
MCTS
|
Табличка случайно не временная?
|
|
06.05.2008, 12:42 | #8 |
Участник
|
Цитата:
Сообщение от 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; |
|
06.05.2008, 13:48 | #9 |
Участник
|
|
|
06.05.2008, 14:41 | #10 |
Участник
|
Посмотрите в тексте сообщения об ошибке какая именно запись уже существует (с каким значением id)? Откройте таблицу и проверьте, что этот id является очередным (тем что должен быть на 1 больше максимального). Проверьте, что поле id действительно автоинкремент. Остановите дебагер на строке INSERT и посмотрите, с какими значениями первичного ключа вы пытаетесь вставить запись. Это даст ответ на вопрос почему она не вставляется.
|
|
06.05.2008, 17:05 | #11 |
Участник
|
Цитата:
Но здась оказывается другая еунда - при созданном объекте можно вставить только 1 строку. Если нужно ставить другую, то нужно создавать либо копию этого же объекта, либо его закрывать и запускать заново. Наверное это баг, так как есть - не очень удобно манипулировать данными таким образом. |
|
06.05.2008, 17:50 | #12 |
Участник
|
Точно... вспомнил ... это поле нормально работает при пользовательском вводе, при вставке из кода проблемы .
__________________
Want to believe... |
|
06.05.2008, 17:53 | #13 |
Участник
|
|
|
06.05.2008, 18:06 | #14 |
Участник
|
Цитата:
Сообщение от RedFox
Вот именно!
Но здась оказывается другая еунда - при созданном объекте можно вставить только 1 строку. Если нужно ставить другую, то нужно создавать либо копию этого же объекта, либо его закрывать и запускать заново. Наверное это баг, так как есть - не очень удобно манипулировать данными таким образом. Про баг, в общем-то, согласен |
|
06.05.2008, 18:21 | #15 |
Участник
|
только что
создал таблицу с одним полем AutoKey типа integer, инкремент = true написал в кодеюните FOR i := 1 TO 10 DO BEGIN Table.AutoKey := 0; Table.INSERT; END; все прекрасно работает. автору надо посмотреть что у него в триггере insert написано |
|
07.05.2008, 05:48 | #16 |
Участник
|
Пробовал с 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 |
Участник
|
На мой взгляд не очень хорошее решение принял, Smoyk. Если принять за правило писать логику в скуле, когда не понимаешь, что написано в навиженовском триггере ... Кончится все это плохо. Вас не интересует количество кода в триггере в данном случае. Вас интересует то, с каким значением в этом триггере присутствует одно поле таблицы.
Автоинкремент с момента создания или недавно переделали? Обнулите айди перед вставкой как советовали и посмотрите как будет вставляться с нулем .. Хотя вы говорите, что так уже пробовали. |
|
07.05.2008, 11:35 | #18 |
Участник
|
Цитата:
Сообщение от 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 все возможно))) Скорее всего произошел баг и для AutoIncrement поля из НАВ, и на сиквеле для поля Identity = 0? Так? |
|
07.05.2008, 11:42 | #19 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Автоинкремент стоит с самого начала, хотя ключи пару раз перестраивались в поисках оптимального решения. Но не думаю, что в этом дело т.к. сервер обрабатывает эту ситуацию нормально. На сервере свойства поля Код: Identity=Yes; Identity Seed=1; Identity Increment=1; Может это быть из-за того, что первичный ключ составной? Сейчас попробуем в этом направлении покопать. |
|