Обсуждение:Класс 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 и с кучей собственных доработок имеется, но его выложить уже действительно проблематично. А вот отдельные кирпичики оттуда - в самый раз.
        >> Ответить