Страница 1 из 1

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

Добавлено: 24 Июль 2023, 15:18
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-х файлов с одинаковой структурой

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

В этом случае идеально вести журнал изменений - т.е. список с номерами изменённых,
удалённых или добавленных записей в ODBC таблицу с момента крайней выгрузки в TPS.
Тогда просто идём по записям журнала и вносим изменения в TPS ... Быстро и удобно. :)

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

Добавлено: 24 Июль 2023, 16:08
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 

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

Добавлено: 24 Июль 2023, 18:31
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()
           ...

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

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

В этом случае идеально вести журнал изменений - т.е. список с номерами изменённых,
удалённых или добавленных записей в ODBC таблицу с момента крайней выгрузки в TPS.
Тогда просто идём по записям журнала и вносим изменения в TPS ... Быстро и удобно. :)
Так и сделано через лог в ODBC и TPS, вопрос в другом.

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

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

Тогда для записи ODBC Вы на лету расcчитаете SHA1 и получите по индексу запись в TPS таблице ...