Обсуждение:Класс TBtrFile (потомок TbFile) с поддержкой журнализации и фильтром записей
0 (0)
Обсуждение:Класс TBtrFile (потомок TbFile) с поддержкой журнализации и фильтром записей ( Обсуждение примера 09.04.2015 20:21 )
0(0)Класс, являющийся наследником от TbFile, c расширенными возможностями. Возможность фильтрации записей, как просто путем задания условий на поля, так и возможность отобрать определенный диапазон записей, путем задания границ диапазона, то есть первой и последней записи при данном ключе. Возможна и комбинация этих двух способов фильтрации, то есть сначала задаем диапазон, а затем дополнительные условия фильтрования.
Класс поддерживает журнализацию всех изменений в БД с записью в operlog.dbt (для RS-Bank), при написании этого функционала был частично использован класс xOperLog из данной библиотеки (Хондожко И.В., ИС-Банк). Как и у первоисточника, контрольная сумма не заполняется (однако никаких проблем за время эксплуатации с 2009-го года это не вызвало).
В прилагаемом архиве находятся следующие файлы:
_tbtrfile.mac - класс TBtrFile
_common_const.mac, _kbdcodes.mac - всякие константы
_func_lib.mac - используемые функции и процедуры
_common_classes.mac - библиотека вспомогательных классов
_tfields.mac - классы для стандартных типов данных
_toperlog - класс, используемый для журнализации
Во вспомогательных файлах осталось много не относящегося к данному примеру, но вычищать все основательно просто нет времени. Впрочем, там много всякой нужной всячины, может кому что и пригодится.
В файле _tfiles.mac содержится ряд примеров использования класса, например, arhdoc за заданный диапазон дат, кассовые символы для документа, счета по маске и по балансовому счету, и.т.д.
Ниже подробно разбирается один из этих примеров - архивные документы.
Класс этот активно мной используется где-то с 2009-го или 2010-го года, если нужно открывать постоянную таблицу БД на запись - только его и использую, не приходится озабачиваться журнализацией. Но operlog приходится архивировать регулярно, растет в разы быстрее, чем на дистрибутиве. Из серьезных недостатков класса - сильно тормозит метод NRecords при большом числе записей, так как работает тупым перебором. В ряде случаев советую переопределить этот метод с использованием SQL, это гораздо быстрее, но, к сожалению, не универсально и требует писать запрос руками для каждого конкретного случая. Сгенерить запрос на автомате базируясь только на том, как задается фильтрация, у меня не получилось. Еще один тонкий момент - если задали границы диапазона по какому-то ключу, менять его уже нельзя, получится полная ерунда. Надеюсь, эта разработка кому-нибудь да пригодится.
Посмотреть пример
>> ОтветитьЧтото както сложно в использовании ( LeonL 14.04.2015 11:37 )
0(0)У нас это реализовано вот так, при этом еще позволяет объединить несколько баз в одну запись по аналогии с JOIN SQL
+полная журнализация изменений в своих базах
+возможность отката изменений объединенных в транзакцию (с документами и т.д)
+возможность повтора откаченных изменений и так до бесконечности.
Програмировать очень удобно, не боишься свалить базу безвозвратно.
Выкладывать лень, тянет очень много макросов.
macro DBContractClassSync (src) src.join_dbfiles[1].rec.ID = src.join_dbfiles[0].rec.ObjectID; src.join_dbfiles[1].GetEq(); END; class DBContractClass var GroupID; var ObjectID; var ID; var Type; var OpenDate; var Number; var Client; var Product; var EndDate; var CloseDate; var Sum; var Type0; var FakeNumber; var Depart; var MB_RBS; var UfoAppID; END; dbfile= JTBFile( "DBContractClass", @DBContractClassSync); dbfile.LeftJoin ( TBFileLock( "cont_grp.dbt" , "R" , 1 , RIK+"cont_grp.dbt" , RIK+ "rik.def") ); dbfile.join_dbfiles[0].KeyNum = 1; dbfile.join_dbfiles[0].SetReverse ( false ); dbfile.join_dbfiles[0].SetKeyLo ( 1 , "GroupID" , group , "ObjectID", 0 ); dbfile.join_dbfiles[0].SetKeyHi ( 1 , "GroupID" , group , "ObjectID", CONSTANT.MAX.MAX_INT ); dbfile.LinkField ( "GroupID" , "GroupID" ); dbfile.LinkField ( "ObjectID" , "ObjectID" ); dbfile.LeftJoin ( TBFileLock( "contract.dbt" , "R" , 0 , RIK+"contract.dbt" , RIK+ "rik.def") ); dbfile.LinkField ( "ID" , "ID" ); dbfile.LinkField ( "Type" , "Type" ); dbfile.LinkField ( "OpenDate" , "OpenDate" ); dbfile.LinkField ( "Number" , "Number" ); dbfile.LinkField ( "Client" , "Client" ); ..
>> Ответитьможет и сложно (+) ( krupennikov 15.04.2015 10:48 )
5(1)Но можно скопировать файлы и использовать, работать будет. А по Вашему примеру я могу лишь за Вас порадоваться, что есть интересные наработки. Но ни понять как это реализовано, не говоря уже об использовании, не получится. Поэтому лучше все же выкладывать интересные наработки, а не просто упоминать о их наличии. Так-то у меня вообще весь опердень 5.5.2 переписанный на RSL и с кучей собственных доработок имеется, но его выложить уже действительно проблематично. А вот отдельные кирпичики оттуда - в самый раз.
>> Ответить