16 октября, вторник 11:09
Bankir.Ru

Объявление

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

Юзерский код отбора счетов для проводки

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

  • Юзерский код отбора счетов для проводки

    Нет ли какого-нибудь хакерского способа прописать свой способ отбора счетов для проводки? Нужно добавить один дополнительный критерий в отбор. Кода всего строчек на 10 от силы - а приходится как милостыню у разработчика вымаливать несколько месяцев.

  • #2
    Пользовательский диспатч, который складывает ИД найденного счета в pDSysParams в параметр с определенным именем. На шаблоне диспатча, который делает проводки, установить тип поиска "Параметр" и выбрать то имя, с которым счет там лежит.

    Комментарий


    • #3
      Сообщение от Level Посмотреть сообщение
      Пользовательский диспатч, который складывает ИД найденного счета в pDSysParams в параметр с определенным именем. На шаблоне диспатча, который делает проводки, установить тип поиска "Параметр" и выбрать то имя, с которым счет там лежит.
      отличная идея, но в каких то моментах не срабатывала, по настройкам из Диаса 302-П
      подробности не помню, но параметризацию счетов из диспатчей убирал и подставлял поиск через алгоритм. Оговорюсь, было давно и может сейчас уже всё ок.
      А в СУОФИ с пользовательским типом счета привязать, и искать по тому же алгоритму, не судьба? Или критерии отбора вычурные очень?

      Комментарий


      • #4
        ...

        Комментарий


        • #5
          Сообщение от CostYa Посмотреть сообщение
          А в СУОФИ с пользовательским типом счета привязать, и искать по тому же алгоритму, не судьба? Или критерии отбора вычурные очень?
          Критерий элементарный: счета открыты в разрезе форм собственности контрагента по сделке + ГФИ (групп фининструментов). Алгоритм DocSecur умеет искать по группам, но не умеет по формам собственности, DocSecurOT - умеет по формам собственности, но не умеет по группам. И еще такой момент - та же байда должна работать в начислениях, где эти же счета фигурируют. Там какие-то свои способы отбора...
          Тема пользовательских диспатчей меня давно интересует. Слышал, что можно такие делать, но неясно как.(По крайней мере справка по системе по запросу "пользовательский диспатч" ничего не выдает) Есть какая-либо документация по этому вопросу?
          Последний раз редактировалось zbc; 01.08.2008, 11:36.

          Комментарий


          • #6
            Насчет документации по пользовательским диспатчам на форуме дельфинов от сопровожденца (далеко не самого плохого) базового модуля получен следующий ответ:
            в документации не нашел, в базе знаний посмотрел тоже нет
            сейчас спрошу у аналитиков есть ли нечто вроде инструкции
            Любопытно. По моей информации функционал пользовательских диспатчей активно используется как минимум с января. Возникает вопрос: откуда у людей инфа?

            Комментарий


            • #7
              По моей информации функционал пользовательских диспатчей активно используется как минимум с января. Возникает вопрос: откуда у людей инфа?
              Вах! Юзерские диспатчи существовали с самомго появления этого уродливого названия году так в 2000-м. И все это время активно использовались. А какая на них нужна документация? Пишешь процедуру, прописываешь ее в DispatchUser_Proc и все.

              Комментарий


              • #8
                Сообщение от Level Посмотреть сообщение
                Пользовательский диспатч, который складывает ИД найденного счета в pDSysParams в параметр с определенным именем. На шаблоне диспатча, который делает проводки, установить тип поиска "Параметр" и выбрать то имя, с которым счет там лежит.
                И всё ж таки мне не совсем понятно, как всё должно работать, поскольку мне не известно, как у них работает движок.
                "Место", где должен работать мой алгоритм отбора счетов показан на рисунке. Правильно ли я понял, что "между" 5-м и 6-м диспатчем я должен воткнуть свой диспатч, который кинет нужный мне счет в pDSysParams, который я потом отберу потом в указанном шабоне, поменяв в описании отбора счета по кредиту "алгоритм" на параметр и указав нужный мне тип?
                Заранее благодарен за помощь.

                Комментарий


                • #9
                  Сообщение от zbc Посмотреть сообщение
                  И всё ж таки мне не совсем понятно, как всё должно работать, поскольку мне не известно, как у них работает движок.
                  "Место", где должен работать мой алгоритм отбора счетов показан на рисунке. Правильно ли я понял, что "между" 5-м и 6-м диспатчем я должен воткнуть свой диспатч, который кинет нужный мне счет в pDSysParams, который я потом отберу потом в указанном шабоне, поменяв в описании отбора счета по кредиту "алгоритм" на параметр и указав нужный мне тип?
                  Заранее благодарен за помощь.
                  Лучше даже между 4-м и 5-м, после всех начиток. А что значит "как работает движок"? В универсальном диспатче есть механизм, который работает следующим образом. DSPSecFinRes, DSPDocSecurity и DSPAccSecurity все счета, которые они находят, складывают в pDSysParams в параметры с названиями, равными системному наименованию шаблона + Deb или Cre. Чтобы в этом убедиться, можно сделать запрос на эту таблицу после того, как отработала, например, генерация проводок под сделкой (при условии, что на шаблонах диспатчей указаны системные наименования). Сделано это для ускорения процесса - если следующему шаблону нужен тот же счет, который уже нашел следовавший ранее шаблон, счет можно не искать заново (долго), а просто взять из pDSysParams (быстрее). Для этого нужно указать тип поиска "Параметр" и имя параметра, с которым счет лежит в pDSysParams.

                  Комментарий


                  • #10
                    Сообщение от Level Посмотреть сообщение
                    Лучше даже между 4-м и 5-м, после всех начиток. А что значит "как работает движок"? В универсальном диспатче есть механизм, который работает следующим образом. DSPSecFinRes, DSPDocSecurity и DSPAccSecurity все счета, которые они находят, складывают в pDSysParams в параметры с названиями, равными системному наименованию шаблона + Deb или Cre. Чтобы в этом убедиться, можно сделать запрос на эту таблицу после того, как отработала, например, генерация проводок под сделкой (при условии, что на шаблонах диспатчей указаны системные наименования). Сделано это для ускорения процесса - если следующему шаблону нужен тот же счет, который уже нашел следовавший ранее шаблон, счет можно не искать заново (долго), а просто взять из pDSysParams (быстрее). Для этого нужно указать тип поиска "Параметр" и имя параметра, с которым счет лежит в pDSysParams.
                    Написать код, который по сделке отобрал бы счет и и положил бы его в pDSysParams, проблем нет.
                    Проблема в том, как это встроить в систему.
                    В связи с тем, что времени на "творчество" довольно ограничено, боюсь, сделать диспатч мне не удастся. Надо знать требования к нему, чтобы отработало протоколирование и пр. На форуме диаса привели пример, как он должен быть построен - мне там не все ясно:
                    if object_id( 'Dispatch_Proc' ) is not null
                    drop procedure Dispatch_Proc
                    go
                    create proc Dispatch_Proc
                    @ObjectID DSIDENTIFIER, -- ID объекта
                    @Brief varchar(25), --
                    @DealProtocolID DSIDENTIFIER, -- ID протокола
                    @ForUpdate int = NULL, -- 1 если вызван во время Update
                    @DispatchParam int = NULL, -- Внешний параметр
                    @OperSetID DSIDENTIFIER = NULL -- Действие типа ПРОЦЕДУРА
                    as
                    declare @RetVal int,
                    @ID DSIDENTIFIER,
                    @SwiftID DSIDENTIFIER,
                    @Confirmed tinyint,
                    @OwnerID DSIDENTIFIER,
                    @OperDate DSDATETIME,
                    @ValueDate DSDATETIME,
                    @OperationID DSIDENTIFIER

                    select @RetVal = 0,
                    @ForUpdate = isnull(@ForUpdate,0)

                    select @OperDate = Date
                    from tProtocol M_NOLOCK_INDEX(XPKtProtocol)
                    where ProtocolID = @DealProtocolID
                    M_ISOLAT

                    дальше идет инклуд - в нем диспатч перевода по состояниям DSP_NODE
                    -----------------------------------------------------------------------
                    if @Brief = 'DSP_NODE' and
                    exists (select 1
                    from tProtocol p M_NOLOCK_INDEX(XPKtProtocol),
                    tObject o M_NOLOCK_INDEX(XPKtObject)
                    where p.ProtocolID = @DealProtocolID
                    and o.ObjectID = p.ObjectID
                    and o.ObjectTypeID = PROTOCOL_FIXPAY
                    )
                    begin
                    exec @RetVal = Dispatch_DealTranNode @ObjectID, @DealProtocolID, @ForUpdate, @OperSetID
                    end
                    -----------------------------------------------------------------------

                    if @RetVal = 0
                    exec @RetVal = DispatchUser_Proc
                    @ObjectID, -- ID объекта
                    @Brief, --
                    @DealProtocolID, -- ID протокола
                    @ForUpdate, -- 1 если вызван во время Update
                    @DispatchParam, -- Внешний параметр
                    @OperSetID -- Действие типа ПРОЦЕДУРА

                    return @RetVal
                    go
                    X_ANYMODE( Dispatch_Proc )
                    grant execute on Dispatch_Proc to public
                    go
                    Думаю, может быть проще взять какой-нибудь диспатч поиска/создания счетов, и попытаться прикрутить к нему вызов своей процедуры? Тот же DSPAccSecurity. Он же работает по параметрам, взятым из настроенных шаблонов. Написать свою процедуру по аналогии с каким-нибудь шаблоном, и вызвать аналогично?

                    Комментарий


                    • #11
                      zbc
                      Гм. Про открытие счетов речи не было. Вы ж не собирались ничего генерить - только положить ID счетов в псевдо-времеменную таблицу. Ничего особо плохого Вы таким образом не сделаете. По шагам. Пишете sp, у которой входной параметр - DealID и которая кладет счета в таблицу. Прописываете вызов этой процедуры в DispatchUser_Proc по аналогии с обработкой какого-нибудь DSPFillQtyStack в Dispatch_Proc. Делаете, чтобы этот Dispatch вызывался раньше генерации документов и всего делов.
                      В двух словах как это работает. По вставке сделки или другой какой транзакции в последних строках процедры вставки система вызовет Dispatch_Proc и передаст ему метку, которую Вы настроили в GUI на действе типа процедура. Не найдя обработки этой метки Dispatch_Proc на всякий случай вызовет DispatchUser_Proc (в вашем посте просто кусок кода, который это делает), куда вы и вписываете вызов своей процедуры:
                      if @Brief = 'XYZ'
                      exec @RetVal=XYZ @DealID = @ObjectID
                      Больше ничего умного здесь нет. Никакого протоколирования. И не надо ничего прикручивать к стандартным процедурам - все погибнет при следующем апгрейде. Если есть сомнения в собственных силах - возьмите за образец какую-нибудь стандартную диспатч процедуру попроще и пропишите вызов как описано выше.
                      Последний раз редактировалось loo; 07.08.2008, 23:49.

                      Комментарий


                      • #12
                        loo, огромное спасибо за коммент, теперь всё понятно, у меня только пока проблемы с отобором по параметру :-(
                        Сообщение от Level Посмотреть сообщение
                        В универсальном диспатче есть механизм, который работает следующим образом. DSPSecFinRes, DSPDocSecurity и DSPAccSecurity все счета, которые они находят, складывают в pDSysParams в параметры с названиями, равными системному наименованию шаблона + Deb или Cre. Чтобы в этом убедиться, можно сделать запрос на эту таблицу после того, как отработала, например, генерация проводок под сделкой (при условии, что на шаблонах диспатчей указаны системные наименования). Сделано это для ускорения процесса - если следующему шаблону нужен тот же счет, который уже нашел следовавший ранее шаблон, счет можно не искать заново (долго), а просто взять из pDSysParams (быстрее). Для этого нужно указать тип поиска "Параметр" и имя параметра, с которым счет лежит в pDSysParams.
                        Появилось немного времени, решил проверить отбор. Не отбирает, хоть убейся ап стену. Не совсем ясно, что есть ObjectID в pDSysParams: Сделка? Объект сделки? Обязательство? Объект обязательства? Перепробовал все 4 способа, отбор не работает, хоть тресни :-(
                        Результаты в скриншоте.(кладу данные в таблицу и одновременно проверяю этим кодом), потом через интерфейс исполняю обязательство)
                        ...
                        Оказалось, что ObjectID счетов, которые падают в pDSysParams - это dealTransactID перерегистрации(фактичское исполнение обязательств по поставке). Этот самый DealTransactID генерится в момент исполнения обязательтва. Отберу его кодом select DealTransactID from tDealTransact where DealID=@DealID and TransactType=4 и делов...
                        Дело сдвинулось :-)
                        Последний раз редактировалось zbc; 08.08.2008, 12:15.

                        Комментарий


                        • #13
                          Хе-хе, всё оказалось не так сложно :-)
                          Спасибо всем за ценные советы

                          В процедуру в качестве @ObjectID уже попадает нужный "объект" - DealTransactID исполнения по сделке.
                          Тестовый вызов "алгоритма" начитки счетов:
                          Код:
                          CREATE proc DispatchUser_Proc
                          as
                            declare @RetVal      int
                          
                            if @Brief = 'TestProc'     
                             exec @RetVal =  TestProc     @ObjectID                
                          
                            return 0
                          Сама тестовая процедура:
                          Код:
                          CREATE PROCEDURE dbo.TestProc
                                             @ObjectID DSIDENTIFIER                                                                              
                            AS
                          
                            delete pDSysParams where SPID=@@SPID
                          
                          -- testing
                            declare @retval         DSIDENTIFIER,
                                    @ResourceID     DSIDENTIFIER  
                          
                            select @ResourceID = 10000075330 -- test
                          
                            insert pDSysParams (SPID,ObjectID,SysName,ValID) 
                            values (@@SPID, @ObjectID,'RepoDoh',@ResourceID)
                          Вешаем диспатч с сокращением TestProc после начитки параметров по сделке, в шаблоне проводки в критериях отбора ставим в типе поиска "параметр", параметр: RepoDoh - и шаблон нарезает проводочку с нужным нам счетом. Красота!
                          Последний раз редактировалось zbc; 08.08.2008, 16:25.

                          Комментарий


                          • #14
                            Поясните пожалуйста какие входные параметры у DispatchUser_Proc

                            у Dispatch_Proc вот так:
                            create proc Dispatch_Proc
                            @ObjectID DSIDENTIFIER, -- ID объекта
                            @Brief varchar(25), --
                            @DealProtocolID DSIDENTIFIER, -- ID протокола
                            @ForUpdate int = NULL, -- 1 если вызван во время Update
                            @DispatchParam int = NULL, -- Внешний параметр
                            @OperSetID DSIDENTIFIER = NULL -- Действие типа ПРОЦЕДУРА

                            Комментарий


                            • #15
                              вопрос снимается просто сначала не нашел DispatchUser_Proc.
                              Думал его надо создать

                              Комментарий


                              • #16
                                Сообщение от zbc Посмотреть сообщение
                                Насчет документации по пользовательским диспатчам на форуме дельфинов от сопровожденца (далеко не самого плохого) базового модуля получен следующий ответ:

                                Любопытно. По моей информации функционал пользовательских диспатчей активно используется как минимум с января. Возникает вопрос: откуда у людей инфа?
                                Функционал этот существует действительно давно года с 2001 го на равне с пользовательским алгоритмом генерации номера счета, но стал активно использоваться продвинутыми внедренцами РКО году так в 2003 по причине все возрастающих требований у банков и ужасной волокиты при продавливании этих требований в родной конторе. Со временем многие вещи реализованные в пользовательских процедурах, после их "валидации" аналитиками и программистами в родной конторе перешли в дистрибутив 5NT. Даже вроде одно время шли дополнительным скриптом (проверка всяких ВО, КБК, наличия всяких прочю аттр.). Конечно это в основном контролирующие процедуры, которые не модифицируют данные, их и "валидировали", т.к. не так страшно если "юнит" "корявыми ручками" что-то проверяет, ну будет блокировка, а если он что-то "заапдейтит" и особенно напрямую, то это страшно. Правда теперь мало осталось наверное таких "умельцев" в хорошем смысле и от того клиенты и не узнают о такой возможности при внедрении.

                                Вот так

                                Комментарий


                                • #17
                                  Сообщение от Level Посмотреть сообщение
                                  Пользовательский диспатч, который складывает ИД найденного счета в pDSysParams в параметр с определенным именем. На шаблоне диспатча, который делает проводки, установить тип поиска "Параметр" и выбрать то имя, с которым счет там лежит.
                                  Еще один вопрос по этой же теме.
                                  Для того, чтобы начитать в pDispatchQtyStack дополнительный параметр для использовании его значения в шаблонах проводки, надо использовать этот же механизм, либо лучше что-то другое юзать? Нужен след. параметр (из сделки): TradingSysID

                                  Комментарий


                                  • #18
                                    Сообщение от zbc Посмотреть сообщение
                                    Еще один вопрос по этой же теме.
                                    Для того, чтобы начитать в pDispatchQtyStack дополнительный параметр для использовании его значения в шаблонах проводки, надо использовать этот же механизм, либо лучше что-то другое юзать? Нужен след. параметр (из сделки): TradingSysID
                                    А как использовать в шаблоне проводки TradingSysID? Только если в комментарии, это сюда http://www.dom.bankir.ru/showthread.php?t=89835.

                                    Комментарий


                                    • #19
                                      Сообщение от Level Посмотреть сообщение
                                      А как использовать в шаблоне проводки TradingSysID? Только если в комментарии, это сюда http://www.dom.bankir.ru/showthread.php?t=89835.
                                      Ну-у, если будет параметр TradingSysID, можно проводки "включать" и выключать в зависимости от этого.
                                      По одним площадкам нужна одна логика отбора счетов, по другим - другая.
                                      Кстати, на суппорте подсказали, что для этой задачи можно заюзать DSP_ClassFillStack, который умеет проверять классификацию. Для этого площадки надо будет проклассифицировать.
                                      Сообщение от 5.23.14. Диспатч "DSP_ClassFillStack"
                                      По каждому шаблону можно проверить только одну рубрику на одном объекте. Результат проверки будет сохранен в pDispatchQtyStack с именем из поля "Системное наименование" шаблона. Если будет обнаружено, что объект классифицирован на дату протокола выбранной рубрикой (если классификатор без зависимости от даты, то просто проверяется классификация рубрикой), то в таблицу в этом случае проставляется 1 (true), иначе — 0 (false).

                                      Комментарий


                                      • #20
                                        zbc
                                        Ну-у, если будет параметр TradingSysID, можно проводки "включать" и выключать в зависимости от этого.
                                        Лучше делать параметр типа IsMICEX или IsRTS, возвращающий сответственно 1 если да и 0 если нет. Тогда его будет удобно использовать в условиях в шаблоне. И не париться с классификаторами. Вот ради интереса, как эта вещь будет понимать какую рубрику для какого объекта я хочу проверить?

                                        Комментарий


                                        • #21
                                          Сообщение от loo Посмотреть сообщение
                                          zbc

                                          Лучше делать параметр типа IsMICEX или IsRTS, возвращающий сответственно 1 если да и 0 если нет. Тогда его будет удобно использовать в условиях в шаблоне. И не париться с классификаторами. Вот ради интереса, как эта вещь будет понимать какую рубрику для какого объекта я хочу проверить?
                                          Настройка на шаблоне.

                                          Комментарий

                                          Пользователи, просматривающие эту тему

                                          Свернуть

                                          Присутствует 1. Участников: 0, гостей: 1.

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