16 апреля, пятница 21:16
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

BS-Client. Доступ к данным БЛОБ-таблиц

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • BS-Client. Доступ к данным БЛОБ-таблиц

    Господа профессионалы, ответетьте, пожалуйста, чайнику.

    Каким образом можно получить доступ к информации лежщей в БЛОБ-ТАБЛИЦАХ стороннним приложением? Есть ли какой либо стандартный интрефейс к этой функциональности, например DLL, COM, .NET?? Есть задача чтения запии данных напрямую в БД BS-Client-a, конкретно, выписок и платежек. Все прекрасно получилось, но возникла загвоздка с БЛОБ-таблицами. Посоветуйте: куда копать?

    Заранее прошу прошения, если вопрос не в эту рубрику.

  • #2
    Сообщение от Ro25 Посмотреть сообщение
    Господа профессионалы, ответетьте, пожалуйста, чайнику.

    Каким образом можно получить доступ к информации лежщей в БЛОБ-ТАБЛИЦАХ стороннним приложением? Есть ли какой либо стандартный интрефейс к этой функциональности, например DLL, COM, .NET?? Есть задача чтения запии данных напрямую в БД BS-Client-a, конкретно, выписок и платежек. Все прекрасно получилось, но возникла загвоздка с БЛОБ-таблицами. Посоветуйте: куда копать?

    Заранее прошу прошения, если вопрос не в эту рубрику.
    Вам скорее к профессионалам-программистам.
    Могу предложить ответ от "чайника": копать нужно в сторону разработчиков, а именно, необходимо знать структуру того потока данных, который записан в БЛОБ. Т.е. Вам всего-то нужно иметь описание структуры данных, ну или класса, или объекта, если хотите.
    Вряд ли БСС поделится с Вами этой информацией. Почерпнуть ее Вы можете в метаданных BSClient.

    Комментарий


    • #3
      2BAV большое спасибо за совет, но...
      Со структурой потока данных все понятно - она изветна, дело не в ней, а в том что при записи БЛОБ-таблиц, система каким-то образом кодирует данные, (как я понял, просто архивирует их, пытаясь сжать). Естественно формат архиватора мне не ясен, попытки расшифровать его ничего не дали. Уверен что есть интрефейс с который бы позволил читать писать в эти ячейки. Но вот какой он?

      Комментарий


      • #4
        СУБД какая?
        Семь раз отпей - один отъешь.

        Комментарий


        • #5
          Pychick, MS-SQL

          Комментарий


          • #6
            Интерфейс исключительно внутренний - из BS-Script'а. Внешнего интерфейса нет.
            Дмитрий Мирошников
            www.iSimpleLab.com

            Комментарий


            • #7
              MDS, понятно.
              Тогда встречный вопрос. А есть ли интрефейс к вызову BSS-библиотек, например через COM? или же каких либо функций через DLL? Или может быть возможно вызывать классы из BLL файлов напрямую? Вроде BLL-файл это како-то стандарт Borland библиотек..

              Комментарий


              • #8
                Из BLL можно почти что угодно вызывать, и можно опять же из BLL сделать нужный интерфейс - если есть к компилятору BS-Script'а доступ. То есть изнутри все просто, а вот снаружи почти никак.

                К Borland'у BLL никакого отношения не имеет, это BSS'ный формат - результат работы компилятора языка.
                Дмитрий Мирошников
                www.iSimpleLab.com

                Комментарий


                • #9
                  Механизм работы BSS-софта следующий: BLL-код обращается к вспомогательным DLL-модулям, предоставляющим доступ к БД, сами DLL оперируют с БД посредством ODBC. Эти DLL имеют специальный интерфейс таблицы экспорта, вызвать их не из BLL кода практически невозможно. Требуемый функционал недоступен через функции таблицы экспорта, в таблице экспорта есть лишь функции, которые создают и заполняют таблицы методов для специальных объектов (наследники TObject?).

                  К примеру, в интересующем случае используется следующая функция:
                  GetBlobTableFromRecord(aRecord: TableRecord; aFieldName: string):Table;
                  эта функция находится в модуле LLTable.dll, но напрямую ее вызвать не удастся, к тому же, нужно предварительно создать объект TTable (TableRecord - это метод TTable.RecordInterface), который, в свою очередь, создается неявно в BLL-коде посредством вызова целой иерархии конструкторов объектов для доступа к БД. Эти конструкторы тоже так просто не вызовешь, поскольку неизвестна структура таблиц методов объектов, плюс неясно, как эти конструкторы вызывать из DLL, потому что адреса этих функций - это в свою очередь методы объектов с непонятной структурой, создаваемых при вызове функций GetCallsLibrary и FillCallsList.

                  Реальным представляется другой вариант - пишется BLL, в которй реализуется механизм работы одновременно с 2 (или более) БД. Цикл разбирает записи, в т.ч. и со структурой BLOB-полей (доступ через один объект TDatabase) в "родной" БД BSS, а потом скидывает в заботливо подготовленную таблицу в другой БД (это может быть и MSSQL или даже Оракл, что угодно, лишь бы был интерфейс ODBC к этой БД - тогда можно получить к ней доступ в BLL-коде без малейших проблем) эти данные в таком формате, который можно было бы уже по-человечески разобрать без функций BSS.

                  Если же желание копаться в BLOB-полях еще не отпало, то могу предположить, что в них тупо сидят записи в dictman-овском формате, пожатые каким-то архиватором, может быть, zlib. BLL-код, например - это сжатый LZH-поток.

                  Да, и обратите внимание, что для каждого BLOB-поля, имеющего структуру таблицы, в БД хранится описание структуры этого BLOB-поля, например, наряду со структурой StatementRu, описывающей данные одноименной таблицы, есть структуры StatementRu.CreditDocuments и StatementRu.DebetDocuments, и этим структурам не соответствуют физические таблицы в БД, они выступают только как описание соответствующих BLOB-полей (имена, кстати, тоже должны совпадать - это BLOB-поля CreditDocument и DebetDocuments).

                  Комментарий


                  • #10
                    Посторонним В, Огромное спасибо за развернутй ответ!!!
                    Сам разбирал DLL у увидел все что вы описали...
                    Варинат написания кода адаптера базы BSS-Client в промежуточную базу импорта, у нас уже реализован, он работает, но проблема в том что активация такого импорта возможна только из BSS-Client. Вот сценарий работы: пользователи работают в бухгалитерской системе, импортируют выписки и экспортируют платежи в промежуточную БД, потом выходят из этой системы, заходят в BSS-Client и выполняют операции импорта-экспорта из промежуточной БД в БД BSS. Таких пользователей много и путнаница получается еще та - они могут править данные в BSS (соответсвенно концов в головной системе потом не найти). Хотелось бы избавить пользователей от этого промежуточного шага а программистов от промежуточной БД. То есть мы не против написать код адаптера в BSS (загрузки данных в БД BSS самим клиентом), - но проблема как его потом вызвать из другой системы? Чтобы пользователюб не нужно было бы заходить в BSS и выбирать выполнять импорт данных.

                    Комментарий


                    • #11
                      Ro25, поставьте вызов адаптера на автопроцедуру с запуском по флагу (самый примитивный вариант - по файловому), и поднимайте его когда нужно из внешней системы. Другой вариант - периодический запуск автопроцедуры (раз в 1-15 минут), которая смотрит на наличие флага в БД, и если поднят, то выполняет импорт.
                      Дмитрий Мирошников
                      www.iSimpleLab.com

                      Комментарий


                      • #12
                        Добрый день.
                        Подскажите может быть кто-то решил задачу с расшифровкой blob-полей ?

                        Комментарий


                        • #13
                          Сообщение от Maximich Посмотреть сообщение
                          Добрый день.
                          Подскажите может быть кто-то решил задачу с расшифровкой blob-полей ?
                          Один из вариантов, кроме собственной разработки bll модуля, нам предложили доработку уже имеющейся в БСС текстовой выгрузки с выгрузкой blob полей (сейчас текстовая выгрузка blob конструкции не разумеет). Естествено за деньги.

                          Комментарий


                          • #14
                            если БД на оракле, то читать можно с помощью ораклового пакета dbms_lob (писать не пробовал).
                            например так:

                            declare
                            sconn blob;
                            s1 varchar(500);
                            nCount number;
                            nOffset number;
                            begin

                            SELECT conndata
                            into sconn
                            FROM transtemplate
                            where clientid=1 and priority=20;

                            nCount := 50;
                            nOffset := 1;
                            dbms_lob.read(sconn, nCount, nOffset, s1 );
                            dbms_output.put_line( s1 );
                            end;

                            в s1 поместилось blob поле в шестнадцатеричном виде, т.е например ip адрес 192.123.1.1 в ней будет в виде
                            3139322Е3132332Е312Е31

                            дальше зная структуру blob поля можно из него выдергивать конкретные данные.

                            Комментарий


                            • #15
                              Для работы с blob полями исползуем perl и iconv. Все оформляем в пиде web страниц. Очень удобно. Стоит комп с linux, oracle client и apache.

                              По поводу iconv, то в каждом случае структура blob поля зависит от требуемого типа хранения данных. Как вариант - прикрепленный файл в произвольном документе. А вот текст сообщения в этом случае в кодировке 1251. Поэтому следует понимать, что NLS на blob не влияет. Несомненно, что обрабатывать blob через dll удоьнее, но тащить за всем этим остальные костыли - неудобно.

                              Комментарий


                              • #16
                                kgbprioda, В данный момент меня интересует именно чтение, в частности полей DEBETDOCUMENTS и CREDITDOCUMENTS таблицы STATEMENTRU.
                                Данные я вытащил, но не могу понять структуру.

                                Комментарий


                                • #17
                                  Добрый день.
                                  А можете работающий пример показать?
                                  Если решили с помощью dictman, пришлите пожалуйста на hooper@list.ru
                                  рабочий файл экспорта операции (eif). Если самописный рапознование содержимого blob - каким образом?

                                  Очень хочу упростить работу операционистам

                                  Комментарий


                                  • #18
                                    kgbprioda, kgbprioda,
                                    Подскажите как вы расшифровываете данные по суммам и датам
                                    ACCEPTDATE : ,„]@ЛB
                                    ACCEPTDOCDATE : ,„]@ЛB
                                    AMOUNT : 0q@
                                    AMOUNTNAT : 0q@

                                    из blob полей STATEMENTRU BSS????

                                    Комментарий


                                    • #19
                                      QWE,

                                      Комментарий


                                      • #20
                                        Добрый день!
                                        Тема стара, но все же, у кого нибудь получилось разобраться и извлечь прикрепленные файлы из FreeClientDoc поле DocAttachment (база oracle)?

                                        Комментарий


                                        • #21
                                          Всем привет!

                                          Самому пришлось разбираться со структурой BLOB поля (DOCATTACHMENT) БД BS-Client-a - результат положительный!

                                          Если кому нужна помощь - пишите в личку
                                          Последний раз редактировалось nns; 17.03.2015, 17:05.

                                          Комментарий


                                          • #22
                                            zvp
                                            что касаетсяприкрепленных файлов, то есть встроенные механизм автооткреплений/автоприкреплений. Если все файлы падают в папку, там уже как хотите так и используйте.
                                            Тут больше рассматривается вопрос получения данных вложенных BLOB-таблиц. Почему то БСС их считает большой тайной, не подлежащей разглашению. На самом же деле, причина - в нежелании терять хлеб на доработках того, с чем не может справиться клиент (банк).

                                            Комментарий


                                            • #23
                                              Добрый день Коллеги!
                                              Есть какая-то новая информация ? Кто - нибудь разобрался с вопросом доступа к данным из blob таблиц ?

                                              Комментарий


                                              • #24
                                                Возникла задача доступа к данным зарплатных ведомостей в ДБО, хранятся в таблице PAYROLLDOC, информация о начислениях хранится в виде BLOB-поля salaryblob, начал разбираться с форматом, наработки в виде Oracle-пакета во вложении
                                                -Данные запакованы zlib-сжатием, с добавлением 12-байтного заголовка. Распаковка RCB_BSS_HELPER.UnzipBssBlob(salaryblob).
                                                -Внутри распакованного блоба данные хранятся в бинарном формате заголовок со списком полей, затем последовательно дописаны записи. Насколько мне удалось понять (по крайней мере для salaryblob) длина поля (значение + доп. информация) фиксирована. Описание списка полей для текущей версии (при этом в базе могут быть записи с более старой версией BLOB с другим набором полей) можно посмотреть в построителе, в моем случае это структура PayRollDoc.SalaryBlob. Значения полей типа String ограничены нулевым байтом, типа Amount - с символом с кодом 01. Для salaryblob я использовал тот факт, что первое поле в записи всегда NoticeNumber, которое начинается с 1 и в каждой записи на 1 больше. Это позволяет находить его по сигнатуре 01NN и по смещению от него получать значения нужных полей. Для других BLOB скорее всего данный метод не подойдет и потребуется разбираться со структурой заголовка. Пример получения поля RCB_BSS_HELPER.GetSalaryField(RCB_BSS_HELPER.UnzipBssBlob(salaryblob) ,'EmployeeName',1).
                                                -Значения сумм (тип Amount) хранятся в закодированном виде 8-байтной строки, с ее форматом разобраться не удалось. Например, для 1 рубля - 000000000000F03F, 2 - 0000000000000040, 3 - 0000000000000840, 4 - 0000000000001040, 6 - 0000000000001840, 8 - 0000000000002040, 16 - 0000000000003040. 0.01 копейка - 7B14AE47E17A843F, 0.1 - 9A9999999999B93F, 0.02 - 7B14AE47E17A943F.
                                                Если кто-нибудь знает алгоритм записи полей типа Amount, напишите, пожалуйста.
                                                Вложения

                                                Комментарий

                                                Обработка...
                                                X