Обновление 2-х файлов с одинаковой структурой

Clarion, Clarion 7

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

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

Обновление 2-х файлов с одинаковой структурой

Сообщение gopstop2007 »

При работе с Mysql загружаю данные из ODBC таблиц в MEMORY таблицы, потом из них делаю копии в локальные TPS таблицы,
Если в ODBC таблицах нет изменений, использую TPS таблицы, если есть то полностью обновляю локальные TPS таблицы
с помощью этого кода
Spoiler

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

	
!Код наполнения данными из файла (pFM_) в копию файла (pFM2_)
OneSaveToTwoFile PROCEDURE (RelationManager pRM_,FileSynchronizationClass pFS_,FileManager pFM_,RelationManager pRM2_,FileManager pFM2_)
 
        SET(pFM_.File)
        Loop while pFM_.Next() = Level:Benign     
            CLEAR(pFM2_.File)
            sourceRec &= pFM_.File{PROP:Record}
            targetRec &= pFM2_.File{PROP:Record}
            targetRec = sourceRec
            IF pFM2_.Insert() = Level:Benign
            ELSE
                 Message('Ошибка добавления записи: '& pFM2_.GetName() &'!<13,10>Ошибка: '& ERRORCODE() &' : '& ERRORFILE(),'Ошибка')
                 BREAK
            END
        END
При больших размерах данных появилась необходимость только дополнять, изменять, удалять в локальных TPS таблицах.
Нужно, что то аналогичное как при использовании GET для поиска записи
Spoiler

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

       SET(pFM_.File)
        Loop while pFM_.Next() = Level:Benign
        
            ! что то вроде этого ================================
            fileTPS.FieldPrimary = fileODBC.fieldPrimary
            GET(fileTPS, fileTPSPrimaryKey)
            IF ~ERRORCODE()
                ...
		Update OR Delete record
            ELSE
                Insert record
            END
 	END
Кто то может поделится кодом или указать пример использования, буду очень благодарен.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7387
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Обновление 2-х файлов с одинаковой структурой

Сообщение Игорь Столяров »

Вы имеете ввиду репликацию данных в двух списках ?
Т.е. данные во втором файле (TPS) должны быть приведены к состоянию первого (ODBC) ?

В этом случае идеально вести журнал изменений - т.е. список с номерами изменённых,
удалённых или добавленных записей в ODBC таблицу с момента крайней выгрузки в TPS.
Тогда просто идём по записям журнала и вносим изменения в TPS ... Быстро и удобно. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4631
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 7 раз
Поблагодарили: 37 раз

Обновление 2-х файлов с одинаковой структурой

Сообщение finsoftrz »

Я шаблон такой делал. Перечисляются таблицы и указывается строка индикатора, что синхронизируем. Для перечисленных таблиц создаются локальные той же структуры. Дальше перебором записей и сравнение с одинаковыми идентификаторами. Но шаблон для ШВС, не знаю, заработает ли для ABC. Код для каждой таблицы генерится такой (разумеется, все таблицы предварительно включены в logout).

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

   if lor:err=0
      change(?Loc:Info,'Sklad')
      set(Sklad)
      loop
         next(Sklad)
         if error()
            break
         end
         clear(Skl_in:record)
         Skl_in:ID=Skl:ID
         get(Sklad_in,Skl_in:keyID)
         if error()
            delete(Sklad)
            if error()
               lor:err=1
               break
            end 
         else
            if Skl:record<>Skl_in:record
               Skl:record=Skl_in:record
               put(Sklad)
               if error()
                  lor:err=1
                  break
               end 
            end
         end
      end 
   end   

   if lor:err=0
      set(Sklad_in)
      loop
         next(Sklad_in)
         if error()
            break
         end
         clear(Skl:record)
         Skl:ID=Skl_in:ID
         get(Sklad,Skl:keyID)
         if error()
            Skl:record=Skl_in:record
            add(Sklad)
            if error()
               lor:err=1
               break
            end
         end 
      end
   end 
C6/C11, ШВС, tps/btrieve.
gopstop2007
✯ Ветеран ✯
Сообщения: 1703
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Обновление 2-х файлов с одинаковой структурой

Сообщение gopstop2007 »

finsoftrz писал(а): 24 Июль 2023, 16:08 Я шаблон такой делал...

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

	...
         Skl_in:ID=Skl:ID
         get(Sklad_in,Skl_in:keyID)
         if error()
	...
Вы явно описываете имя таблицы (файла), я использую RelationManager (pRM_) и FileManager (pFM_) и без шаблонов

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

        SET(pFM_.File)
        Loop while pFM_.Next() = Level:Benign     
            CLEAR(pFM_.File)
           ... 
           Skl_in:ID=Skl:ID		! как получить(описать) первое поле таблиц
           get(Sklad_in,Skl_in:keyID)	! get(pFM_.File,Skl_in:keyID) - файл знаю, а как получить(описать) primary ключ файла
           if error()
           ...
Последний раз редактировалось gopstop2007 24 Июль 2023, 18:33, всего редактировалось 1 раз.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007
✯ Ветеран ✯
Сообщения: 1703
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

Обновление 2-х файлов с одинаковой структурой

Сообщение gopstop2007 »

Игорь Столяров писал(а): 24 Июль 2023, 16:07 Вы имеете ввиду репликацию данных в двух списках ?
Т.е. данные во втором файле (TPS) должны быть приведены к состоянию первого (ODBC) ?

В этом случае идеально вести журнал изменений - т.е. список с номерами изменённых,
удалённых или добавленных записей в ODBC таблицу с момента крайней выгрузки в TPS.
Тогда просто идём по записям журнала и вносим изменения в TPS ... Быстро и удобно. :)
Так и сделано через лог в ODBC и TPS, вопрос в другом.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7387
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Обновление 2-х файлов с одинаковой структурой

Сообщение Игорь Столяров »

gopstop2007 писал(а): 24 Июль 2023, 18:32 Так и сделано через лог в ODBC и TPS, вопрос в другом.
Отлично. Если у записей есть уникальный ID - Вы без проблем сможете вытащить её из любой таблицы.
Если уникального ID нет - добавьте в TPS 20 байтный SHA1 записи в ODBC и индекс по нему.

Тогда для записи ODBC Вы на лету расcчитаете SHA1 и получите по индексу запись в TPS таблице ...
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить