Вообще говоря, Вы делаете лишнее действие, вставляя пустую запись. Перенесите insert на то место, где у Вас стоит update, а update удалите:
X++:
. . . . . .
while select iTable
{
iLocation.ItemId = iTable.ItemId;
iLocation.insert();
}
. . . . . .
Переменная типа таблицы имеет смысл буфера. Вы заполняете ее поля, а методы insert и update переносят значение этого буфера в таблицу.
Ваша ошибка возникает в том случае, когда на таблице определен индекс, не позволяющий повторы (Allow Duplicates равно No). Вставляя пустую запись, Вы автоматически создаете такой повтор.
Однако, ошибка может быть вызвана и тем, что, как уже писал PlasticinE, заполнены не Все поля записи. Опять же, если одно из незаполненных полей входило в индекс, который не позволял повторов, Вы получите ту же самую ошибку. Чтобы сократить вероятность появления таких ситуаций, в некоторых таблицах переопределен метод initValue. Этот метод обычно заполняет некоторые поля таблицы (если быть точным, то буфера), среди которых и те, которые входят в индексы, причем они заполняются так, чтобы избежать повторов. initValue рекомендуется вставлять непосредственно перед тем, как Вы начинаете заполнять поля:
X++:
. . . . . .
while select iTable
{
iLocation.initValue();
iLocation.ItemId = iTable.ItemId;
iLocation.insert();
}
. . . . . .