Обработка пакетом файлов - update

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
gopstop2007
Полимат
Сообщения: 1864
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 33 раза
Поблагодарили: 11 раз

Обработка пакетом файлов - update

Сообщение 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 при пакетной обработке?
Спасибо за внимание.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5272
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 27 раз

Обработка пакетом файлов - update

Сообщение kreator »

А у Вас не SQL разве?
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1864
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 33 раза
Поблагодарили: 11 раз

Обработка пакетом файлов - update

Сообщение gopstop2007 »

kreator писал(а): 13 Январь 2026, 20:22 А у Вас не SQL разве?
И не только ) Временные файлы храню в TPS и IMDD
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Admin
Администратор
Сообщения: 4036
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 67 раз
Поблагодарили: 46 раз
Контактная информация:

Обработка пакетом файлов - update

Сообщение Admin »

gopstop2007 писал(а): 13 Январь 2026, 16:23 Вопрос, кто знает как получить GET, Key при пакетной обработке?
Если в пакетной обработке (по ссылке) ты добавляешь записи в FileTarget с помощью APPEND (что такое pFM2.Insert() я х.з.) то как ты их собрался искать по GET(File, Key)? Ключ то не валидный до BUILD
Мне кажется тут тема про "крестик и трусы" :)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
gopstop2007
Полимат
Сообщения: 1864
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 33 раза
Поблагодарили: 11 раз

Обработка пакетом файлов - update

Сообщение 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 не использую. Нужно добавить запись, если она есть стать на нее и изменить ее.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5272
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 27 раз

Обработка пакетом файлов - update

Сообщение kreator »

Ладно, пусть не SQL (там всё просто, есть оператор "insert or update"). Надо сначала сделать get. Если нет ошибки, то изменить запись. Eсли ошибка, то добавить. В чём проблема? Уникального ключа нет?
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1864
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 33 раза
Поблагодарили: 11 раз

Обработка пакетом файлов - update

Сообщение 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)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5710
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 21 раз
Поблагодарили: 82 раза

Обработка пакетом файлов - update

Сообщение finsoftrz »

Я думаю, что самый безопасный способ это разделить задачу на 2 этапа. На первом проходим по исходному файлу, проверяем наличие записи в целевом. Если находим, то делаем put. Если не находим, то сохраняем идентификатор в кьюшке. На втором этапе проходим по всем строкам кьюшки и добавляем записи в целевой файл. Если драйвер tps, то надо использовать logout, если inmemory, то logout не нужен. STREAM это вроде атавизм давно, использовался для dat файлов.
C6/C12, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 5272
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 27 раз

Обработка пакетом файлов - update

Сообщение kreator »

Не буду категоричен, но думается проблема в prop:Key. Судя по справке, это некая ссылка на индекс. А оператору get определённо нужно наименование ключа. Т.е. неплохо бы применить к этой ссылке оператор who. Но это скорее всего тоже не прокатит.
А нельзя впрямую указать поля, ключи и т.д.? Всё равно структуру файлов/таблиц подбираете специально, а не всё подряд пытаетесь автоматизировать.
Я видел такую реализацию. В словаре описан один файл. А при пакетной обработке присваивается каждый раз новое имя, открывается, обрабатывается, закрывается, всё.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1864
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 33 раза
Поблагодарили: 11 раз

Обработка пакетом файлов - update

Сообщение gopstop2007 »

Благодаря помощи Андрею К., который подсказал решение, которое в моем случае, работает.

Код: Выделить всё

            targetRec = sourceRec     ! заменил targetField = sourceField
            GET(pFMt_.File, KeyRef)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Oleg Fomin
Новичок
Сообщения: 23
Зарегистрирован: 12 Апрель 2006, 11:29
Поблагодарили: 3 раза

Обработка пакетом файлов - update

Сообщение Oleg Fomin »

Привет Александр,

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

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

И будет тебе щастье.
Oleg Fomin
Новичок
Сообщения: 23
Зарегистрирован: 12 Апрель 2006, 11:29
Поблагодарили: 3 раза

Обработка пакетом файлов - update

Сообщение 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.
Вложения
IMDDExample.zip
(417.33 КБ) 6 скачиваний
gopstop2007
Полимат
Сообщения: 1864
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 33 раза
Поблагодарили: 11 раз

Обработка пакетом файлов - update

Сообщение 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.
Спасибо большое, что потратил время на хороший пример и подробное разъяснение, это то что нужно! Еще раз спасибо.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить