Страница 1 из 1
Обработка пакетом файлов - update
Добавлено: 13 Январь 2026, 16:23
gopstop2007
С праздниками всех. Делал пакетную обработку -
viewtopic.php?p=41889#p41889
Пробую сделать код более универсальным, если запись уже есть при добавлении, то нужно записать в нее измениния.
Например:
Код: Выделить всё
SET(pFM.File)
Loop while pFM.Next() = Level:Benign
CLEAR(pFM2.File) ! CLEAR(my:RECORD)
pFm2.File{PROP:Record} = pFm.File{PROP:Record} ! pFM:RECORD = pFM:RECORD
pFM2.Insert()
IF ERRORCODE()
! ============ нужно получить, стать на запись для записи в нее изменений =====
! аналог кода, примерно так
! =========================================================================
FirstFild_Target = FirstFild_Source ! ????
GET(FileTarget, FileTargetKey) ! ????
IF ~ERRORCODE()
PUT(FileTarget)
END
! =========================================================================
END
END
Вопрос, кто знает как получить GET, Key при пакетной обработке?
Спасибо за внимание.
Обработка пакетом файлов - update
Добавлено: 13 Январь 2026, 20:22
kreator
А у Вас не SQL разве?
Обработка пакетом файлов - update
Добавлено: 14 Январь 2026, 0:17
gopstop2007
kreator писал(а): 13 Январь 2026, 20:22
А у Вас не SQL разве?
И не только ) Временные файлы храню в TPS и IMDD
Обработка пакетом файлов - update
Добавлено: 14 Январь 2026, 2:20
Admin
gopstop2007 писал(а): 13 Январь 2026, 16:23
Вопрос, кто знает как получить GET, Key при пакетной обработке?
Если в пакетной обработке (по ссылке) ты добавляешь записи в FileTarget с помощью APPEND (что такое pFM2.Insert() я х.з.) то как ты их собрался искать по GET(File, Key)? Ключ то не валидный до BUILD
Мне кажется тут тема про "крестик и трусы"

Обработка пакетом файлов - update
Добавлено: 14 Январь 2026, 12:41
gopstop2007
Admin писал(а): 14 Январь 2026, 2:20
gopstop2007 писал(а): 13 Январь 2026, 16:23
Вопрос, кто знает как получить GET, Key при пакетной обработке?
Если в пакетной обработке (по ссылке) ты добавляешь записи в FileTarget с помощью APPEND (что такое pFM2.Insert() я х.з.) то как ты их собрался искать по GET(File, Key)? Ключ то не валидный до BUILD
Мне кажется тут тема про "крестик и трусы"
pFM2.Insert() это - Access:MyFile.Insert() , неважно может быть и Add(pFM2) - Add(MyFile), Append не использую. Нужно добавить запись, если она есть стать на нее и изменить ее.
Обработка пакетом файлов - update
Добавлено: 14 Январь 2026, 20:51
kreator
Ладно, пусть не SQL (там всё просто, есть оператор "insert or update"). Надо сначала сделать get. Если нет ошибки, то изменить запись. Eсли ошибка, то добавить. В чём проблема? Уникального ключа нет?
Обработка пакетом файлов - update
Добавлено: 14 Январь 2026, 22:54
gopstop2007
Результат, того , что получилось на данном этапе, где то ошибка в коде при получении ключа (KeyRef) GET , прошу помощи
Код: Выделить всё
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)
Обработка пакетом файлов - update
Добавлено: 15 Январь 2026, 0:08
finsoftrz
Я думаю, что самый безопасный способ это разделить задачу на 2 этапа. На первом проходим по исходному файлу, проверяем наличие записи в целевом. Если находим, то делаем put. Если не находим, то сохраняем идентификатор в кьюшке. На втором этапе проходим по всем строкам кьюшки и добавляем записи в целевой файл. Если драйвер tps, то надо использовать logout, если inmemory, то logout не нужен. STREAM это вроде атавизм давно, использовался для dat файлов.
Обработка пакетом файлов - update
Добавлено: 15 Январь 2026, 0:46
kreator
Не буду категоричен, но думается проблема в prop:Key. Судя по справке, это некая ссылка на индекс. А оператору get определённо нужно наименование ключа. Т.е. неплохо бы применить к этой ссылке оператор who. Но это скорее всего тоже не прокатит.
А нельзя впрямую указать поля, ключи и т.д.? Всё равно структуру файлов/таблиц подбираете специально, а не всё подряд пытаетесь автоматизировать.
Я видел такую реализацию. В словаре описан один файл. А при пакетной обработке присваивается каждый раз новое имя, открывается, обрабатывается, закрывается, всё.
Обработка пакетом файлов - update
Добавлено: 15 Январь 2026, 23:14
gopstop2007
Благодаря помощи Андрею К., который подсказал решение, которое в моем случае, работает.
Код: Выделить всё
targetRec = sourceRec ! заменил targetField = sourceField
GET(pFMt_.File, KeyRef)
Обработка пакетом файлов - update
Добавлено: 16 Январь 2026, 0:28
Oleg Fomin
Привет Александр,
В исходном коде необходимо исправить
1. targetField ANY
2. targetField &= WHAT(targetRec,1)
И будет тебе щастье.
Обработка пакетом файлов - update
Добавлено: 18 Январь 2026, 18:30
Oleg Fomin
Судя по комментам Александра в
ClaList, требуется дополнтельная (убедительная) помощь.
Вложен модифицированный
IMDDExample.app для Clarion 11.1 - cохранить в
Clarion11.1\Examples\IMDD.
В комплекте оригинальный и модифицированный TXA - для удобства сравнения и/или импорта в пустой APP иной версии Clarion.
Приведенный выше код процедуры
Load_MemToTpsFile вставлен один к одному в Program Procedures с двумя предложенными выше правками:
Код: Выделить всё
!targetField STRING(30) ! Alex GopStop ! name of the TPS key field
targetField ANY ! Oleg fomin ! reference to TPS key field
Код: Выделить всё
!targetField = WHO(targetRec,1) ! Alex GopStop !Returns a string containing the name of a specified field from a group structure.
targetField &= WHAT(targetRec,1) ! Oleg Fomin !Returns a specified field from a group structure
В качестве теста собрать и запустить приложение, в меню
Generated Tables - Customer Information добавить новую и отредактировать хотя бы одну существующую запись. При выходе из программы изменения из MEMORY таблицы запишутся в
Customers.tps.
Следует отметить следующее
- Приведенный Александром упрощенный код процедуры Load_MemToTpsFile не отрабатывает удаленные записи.
- Для оптимизации хорошо бы PUT выполнять только при условии IF NOT targetRec = sourceRec
- STREAM/FLUSH здесь лишние, т.к. процедура вызывается в рамках транзакции, а LOGOUT/COMMIT - лучший ускоритель для TPS.
Обработка пакетом файлов - update
Добавлено: 18 Январь 2026, 20:55
gopstop2007
Oleg Fomin писал(а): 18 Январь 2026, 18:30
Судя по комментам Александра в
ClaList, требуется дополнтельная (убедительная) помощь.
Вложен модифицированный
IMDDExample.app для Clarion 11.1 - cохранить в
Clarion11.1\Examples\IMDD.
В комплекте оригинальный и модифицированный TXA - для удобства сравнения и/или импорта в пустой APP иной версии Clarion.
Приведенный выше код процедуры
Load_MemToTpsFile вставлен один к одному в Program Procedures с двумя предложенными выше правками:
Код: Выделить всё
!targetField STRING(30) ! Alex GopStop ! name of the TPS key field
targetField ANY ! Oleg fomin ! reference to TPS key field
Код: Выделить всё
!targetField = WHO(targetRec,1) ! Alex GopStop !Returns a string containing the name of a specified field from a group structure.
targetField &= WHAT(targetRec,1) ! Oleg Fomin !Returns a specified field from a group structure
В качестве теста собрать и запустить приложение, в меню
Generated Tables - Customer Information добавить новую и отредактировать хотя бы одну существующую запись. При выходе из программы изменения из MEMORY таблицы запишутся в
Customers.tps.
Следует отметить следующее
- Приведенный Александром упрощенный код процедуры Load_MemToTpsFile не отрабатывает удаленные записи.
- Для оптимизации хорошо бы PUT выполнять только при условии IF NOT targetRec = sourceRec
- STREAM/FLUSH здесь лишние, т.к. процедура вызывается в рамках транзакции, а LOGOUT/COMMIT - лучший ускоритель для TPS.
Спасибо большое, что потратил время на хороший пример и подробное разъяснение, это то что нужно! Еще раз спасибо.