Страница 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.
Спасибо большое, что потратил время на хороший пример и подробное разъяснение, это то что нужно! Еще раз спасибо.