03.10.2022, 13:36 | #1 |
Участник
|
Невозможно создать запись в Проводки журнала спецификаций (ProdJournalBOM). Дата: 05.09.2022. Запись уже существует.
Добрый день. Подскажите в чем может быть проблема. В методе ProdJournalBOM.insertJournalCreate() на строке 58 есть давняя доработка. В ней для сброса статуса идет добавление/изменяешь таблицы ProdJournalBOM.
Ошибка возникает при операции "Начато" из-за того что идет добавление строки с Recid, который уже существует. Скрины внизу. Сама таблица: Код: Инфолог: В цикле по ProdJournalBOM.InventTransId == dax-10373942 есть две записи (Видно на скрине). Первую он изменяет, а вторую добавляет. Изменение и добавление происходит по логической переменной doSplit. Логика реализована так, что вторая и последующие строки будут изменятся. Последний раз редактировалось DaniilT; 03.10.2022 в 13:58. |
|
03.10.2022, 14:16 | #2 |
Участник
|
RecId у вас в сообщении выводится тот, который был в курсоре до вставки. Это не значит что система будет пытаться вставить его. Новый RecId не генерируется заранее он будет вычислен непосредственно в момент вставки.
Это я к тому что возможно у вас нарушается уникальность какого-то другого индекса. Если есть возможность, то попробуйте временно выключить уникальность на всех индексах в таблице ProdJournalBOM и проверить что будет. |
|
04.10.2022, 08:43 | #3 |
Участник
|
В стандартном приложении много уникальных индексов включают в себя LineNum.
Судя по коду, изменяется перед вставкой только именно LineNum. Так что (если, конечно в модификации приложения нет других уникальных индексов по сравнению со стандартом), то большая вероятность, что вот это LineNum = -LineNum как раз и приводит к нарушению уникальности. А тут уже варианты, которые нужно анализировать. Возможно, что по строке уже отрабатывал этот код и получился дубль номера строк. Возможно, что ошибочно где-то есть строка, в которую из-за каких-то ошибок записали ноль и -ноль по школьном математике дает тот же ноль. Тут уже нужен больше не анализ кода, а анализ данных. На мой взгляд, стоит отфильтровать данные именно по номеру журнала и посмотреть что там до выполнения с номерами строк. |
|
04.10.2022, 08:53 | #4 |
Участник
|
Хотя, опять же на мой взгляд, способ назначения номера строки несколько необычный.
|
|
06.10.2022, 11:58 | #5 |
Участник
|
Я бы обратил внимание на переменную doSplit. Мы здесь видим её изменение на true пока только в одном месте, однако, если бы она менялась только там, то уже на втором витке цикла было бы добавление. Я бы также изменил порядок if на противоположный для более естественной проверки, убрав отрицание.
И самое главное, найдите максимальное значение LineNum поиском по JournalId и прибавьте к нему 1. Ну и еще я бы выделил весь этот кастомный кусок в отдельный метод. Как минимум это облегчает понимание.
__________________
// no comments |
|
06.10.2022, 12:09 | #6 |
Участник
|
Можно даже просто обнулить LineNum, тогда при insert'е будет вызван lastLineNum(), который все сделает сам.
__________________
// no comments |
|