Синхронизация файлов с неизвестной структурой

4 views
Skip to first unread message

Alex GopStop

unread,
10:49 AM (8 hours ago) 10:49 AM
to ClaList
Приветствую всех.

Сокращенный код

Load_MemToTpsFile PROCEDURE (FileManager pFMm_,FileManager pFMt_) KeyRef &KEY sourceRec &GROUP targetRec &GROUP sourceField ANY targetField STRING(30) CODE sourceRec &= pFMm_.File{PROP:Record} targetRec &= pFMt_.File{PROP:Record} sourceField &= WHAT(sourceRec,1) targetField = WHO(targetRec,1) KeyRef &= pFMt_.File{PROP:Key,1} STREAM(pFMt_.File) SET(pFMm_.File) Loop while pFMm_.Next() = Level:Benign CLEAR(targetRec) ! ================== проблема - не видит GET , мне кажется проблема с KeyRef =================== targetField = sourceField GET(pFMt_.File, KeyRef) IF ERRORCODE() targetRec = sourceRec ADD(pFMt_.File) ELSE targetRec = sourceRec PUT(pFMt_.File) END END FLUSH(pFMt_.File)

Не могу получить запись по GET, выдает ошибку 35, запись не найдена, прошу помощи.
Спасибо за внимание, Александр.

Andrey Kuznetsov

unread,
11:30 AM (7 hours ago) 11:30 AM
to cla...@googlegroups.com

Я прогнал код через ИИ:

 

Ошибка 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)

Что здесь не так

  1. WHAT() и WHO() НЕ работают с данными,
    они работают с адресами/описаниями полей, а не со значениями.
  2. Вы НЕ заполняете ключевые поля pFMt_.File перед GET()
  3. В итоге GET() ищет по пустому или мусорному ключу → ошибка 35

Как 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) ≠ поиск, это доступ по уже заполненному ключу


Если хотите — покажите:

  • структуру KEY
  • структуру файлов
  • какие поля составляют ключ

--
Вы получили это сообщение, поскольку подписаны на группу "ClaList".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес clalist+u...@googlegroups.com.
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/2e8ca5d9-acfe-429e-89a2-418077a59175n%40googlegroups.com.

ShopPoint1 Point

unread,
12:45 PM (6 hours ago) 12:45 PM
to cla...@googlegroups.com
Спасибо большое за ответ.
Как ни странно, в моем варианте подошел второй вариант ответа ) И еще раз спасибо большое.

Насчет ИИ, он иногда подвирает, даже в данном случае с WHAT() из Help
WHAT (return field from group)

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.




чт, 15 янв. 2026 г. в 18:30, Andrey Kuznetsov <kuznet...@gmail.com>:
Чтобы посмотреть обсуждение, перейдите по ссылке https://groups.google.com/d/msgid/clalist/002701dc863c%243f9918f0%24becb4ad0%24%40gmail.com.

Oleg Fomin

unread,
4:10 PM (3 hours ago) 4:10 PM
to cla...@googlegroups.com
Привет Александр,

В коде необходимо исправить

  1. targetField ANY
  2. targetField &= WHAT(targetRec,1)

И будет тебе щастье.


Reply all
Reply to author
Forward
0 new messages