Я прогнал код через ИИ:
Ошибка 35 (Record not found) в вашем случае возникает не из-за KeyRef как ссылки, а из-за того, что буфер ключа не заполнен корректно перед GET().
В Clarion GET(File, Key) не ищет “что-то” сам — он ищет по значениям ключевых полей, которые УЖЕ должны быть записаны в RECORD-буфер файла.
Главная проблема в вашем коде
sourceField &= WHAT(sourceRec,1)
targetField = WHO(targetRec,1)
targetField = sourceField
GET(pFMt_.File, KeyRef)
❌ Что здесь не так
Как GET(file, key) работает на самом деле
TargetFile.KeyField1 = значение
TargetFile.KeyField2 = значение
GET(TargetFile, Key)
Если хотя бы одно поле ключа не заполнено → запись не найдётся.
Правильный подход (рабочий вариант)
✅ Вариант 1: заполняем ключевые поля явно
Допустим ключ состоит из одного поля ID.
LOOP WHILE pFMm_.Next() = Level:Benign
CLEAR(pFMt_.File)
pFMt_.ID = pFMm_.ID ! <-- ключевое поле
GET(pFMt_.File, KeyRef)
IF ERRORCODE() = 35
pFMt_.File{PROP:Record} = pFMm_.File{PROP:Record}
ADD(pFMt_.File)
ELSE
pFMt_.File{PROP:Record} = pFMm_.File{PROP:Record}
PUT(pFMt_.File)
END
END
✅ Вариант 2: универсально (копирование ключевых полей)
Если структура одинаковая и ключ одинаковый:
CLEAR(pFMt_.File)
pFMt_.File{PROP:Record} = pFMm_.File{PROP:Record}
GET(pFMt_.File, KeyRef)
⚠️ Работает только если ключевые поля совпадают по именам и типам
❌ Чего делать нельзя
sourceField &= WHAT(sourceRec,1) ! ❌
targetField = WHO(targetRec,1) ! ❌
WHAT / WHO — это рефлексия, а не доступ к данным.
Проверка, почему именно 35
Добавьте отладку:
MESSAGE(CLIP(pFMt_.ID))
GET(pFMt_.File, KeyRef)
MESSAGE(ERRORCODE() & ' ' & ERROR())
Если ключ пустой — сразу станет видно.
Итог
Причина ошибки
GET() вызывается без заполненного ключа
Решение
✔ Заполняйте ключевые поля target-файла
✔ Используйте значения, а не WHAT/WHO
✔ GET(file,key) ≠ поиск, это доступ по уже заполненному ключу
Если хотите — покажите:
--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/2e8ca5d9-acfe-429e-89a2-418077a59175n%40googlegroups.com.
The WHAT statement returns the number specified field from a group structure. Generally, this would be assigned to an ANY variable. If the number specified field is a dimensioned field, then WHAT returns a reference to the dimension element of the number field.
If the field with an ordinal position equal to the passed second parameter is defined as an ANY type or has the DIM attribute, the returned value can only be used in "reference equality" (&=) operations. Any attempt to access the field will cause a run-time error.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/002701dc863c%243f9918f0%24becb4ad0%24%40gmail.com.