15 августа, суббота 05:18
Bankir.Ru

Объявление

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

Универсальные транзакции

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

  • #91
    Чернушка Честно говоря, мне бы пригодилось на первое время даже не "разбирать", а "забирать". А разберу я его уже в самой НТ.
    Можно попробовать следующий механизм:
    1. Создать подкласс класса Exchange, переопределить метод импорта и задать реквизиты, которые необходимо передавать дальше.
    2. Создать транзакцию со следующими шаблонами:
    2.1 На классе Seance -роль - Результат, действие - Импорт
    2.2 На новом класе - роль - Выборка, действие - Быстрый импорт
    3. Создать правило обмена с ранее созданной транзакцией импорта и указать каталоги обмена.

    Комментарий


    • #92
      Честно говоря, проблема была решена уже тогда - редактированием pp-ptmp.p
      Требует эстетической доработки, но работает и так.

      {pfuncdef
      &NAME = "getTextFile"
      &DESCRIPTION = "Считывает текстовую строку из файла"
      &PARAMETERS = "Имя файла с полным путем"
      &RESULT = "Текстовая строка, с которой можно делать что угодно"
      &SAMPLE = "getTextFile('/home/klv/ok/dima2/файл')"
      }
      DEFINE INPUT PARAMETER File-Name AS CHARACTER NO-UNDO.
      DEFINE OUTPUT PARAMETER out_Result AS CHARACTER NO-UNDO.
      DEFINE OUTPUT PARAMETER is-ok AS INTEGER NO-UNDO.
      def var choice as log init no no-undo. /* yes - выбор */
      choice = YES.
      out_result = "".
      if search(File-Name) ne ? then
      MESSAGE COLOR NORMAL SKIP "Загрузить файл " File-Name " ?"
      VIEW-AS ALERT-BOX QUESTION BUTTONS YES-NO UPDATE choice.
      else do:
      MESSAGE COLOR NORMAL SKIP "Данные не найдены."
      VIEW-AS ALERT-BOX BUTTONS ok.
      next.
      end.
      if choice = NO then next.
      input stream imp-str from value(file-name) convert target "ibm866" source "1251".
      import stream imp-str UNFORMATTED out_Result.
      input close.
      end procedure.
      Чем больше связей, тем меньше степеней свободы.

      Комментарий


      • #93
        Чернушка
        Да нет, читать текст - читали давно.
        Хотелось организовать чтение с поддержкой новых транзакций. Была задача взять текстовый файл - список, и для каждой строки запустить некую вспомогательную транзакцию, которая на основе полученных из файла данных генерила несколько документов.

        Комментарий


        • #94
          2 beloll & Чернушка

          Забегая вперед паровоза такая возможность будет в D08

          Комментарий


          • #95
            bulklodd
            Это не паровоз, .
            Сейчас занимаемся выгрузкой всей этой беды обратно в текстовый файл.
            Кстати вопрос, если я нахожу поиском экземпляр класса и в подшаблонах укажу связанные классы, то в следующих шаблонах я могу спокойно обращаться к реквизитам связанных классов, это так?

            Комментарий


            • #96
              beloll

              Кстати вопрос, если я нахожу поиском экземпляр класса и в подшаблонах укажу связанные классы, то в следующих шаблонах я могу спокойно обращаться к реквизитам связанных классов, это так?
              Да это так.
              И еще, к реквизитам шаблона и подшаблонов одной транзакции можно обращаться из любой ею вызванной транзакции, используя функцию GETVAR.

              Комментарий


              • #97
                bulklodd
                И еще, к реквизитам шаблона и подшаблонов одной транзакции можно обращаться из любой ею вызванной транзакции, используя функцию GETVAR.

                Да, до этого я дошел после суток раздумий, как передать данные из вызывающей транзакции в вызываемую. Потом впомнил правило - когда не занаешь что делать - прочитай, наконец инструкцию.
                Кстати, список договоров кредитов или депозитов я таки получить не смог. Можно бросьть какой-нибудь примерчик транзакции.

                Комментарий


                • #98
                  beloll

                  Кстати, список договоров кредитов или депозитов я таки получить не смог. Можно бросьть какой-нибудь примерчик транзакции.
                  Конечно, вот пример (транзакция может быть запущена только из модуля КиД):


                  // ***************************************************************************
                  // ТРАНЗАКЦИЯ: BROWSE ( Введите наименование операции ) ИСПОЛНЯЕМАЯ


                  // ТРАНЗАКЦИЯ BROWSE: ВЫРАЖЕНИЕ ВЫПОЛНИТЬ ДО
                  // Запрашиваем тип отображаемого браузера (кредиты или депозиты)
                  @answer = prompt(character,"Тип браузера (К/Д)","x");

                  // Если ответ был К или Д, то показываем браузер, иначе нет
                  if(can-do("К,Д",@answer)) then

                  // Вычисляем параметры функции ОБЪЕКТ
                  @class = _if(@answer == "К","loan_allocat","loan_attract");
                  @contract = _if(@answer == "К","Кредит","Депоз");

                  // Выводим браузер
                  ОБЪЕКТ(ДА,"contract",@contract,"",",ESC_NO_ERROR," + @class);

                  else
                  0
                  endif

                  // ТРАНЗАКЦИЯ BROWSE - КОНЕЦ
                  // ***************************************************************************
                  Последний раз редактировалось bulklodd; 15.05.2005, 18:37.

                  Комментарий


                  • #99
                    bulklodd
                    Спасибо, все срослось.
                    А теперь, в этой связи вопрос - какие функции работы с кредитными договорами работают и возможна ли привязка к параметрам договоров из транзакции?

                    Комментарий


                    • beloll

                      А теперь, в этой связи вопрос - какие функции работы с кредитными договорами работают и возможна ли привязка к параметрам договоров из транзакции?
                      Функции есть, рекомендую посмотреть функции из библиотеки pp-ploan. Функция привязки описана там же.

                      Комментарий


                      • bulklodd
                        Да, когда не знаешь что делать - почитай, наконец-то инструкцию.
                        Кстати, это у меня глюк или так задумано - в модуле администрирование, в стандартных транзакцияэ пытаюсь отфильтровать новые транзакции по классу op-common-kind, но созданные нами да и поднятые в последних патчах (06 - 07) не отбираются.

                        Комментарий


                        • beloll
                          Кстати, это у меня глюк или так задумано - в модуле администрирование, в стандартных транзакцияэ пытаюсь отфильтровать новые транзакции по классу op-common-kind, но созданные нами да и поднятые в последних патчах (06 - 07) не отбираются.
                          Может все-таки по классу COMMON-OP-KIND?!
                          Да, в фильтре надо в поле "Директория" поставить "*".
                          Тогда все должно работать...

                          Комментарий


                          • При помощи универсальной транзакции можно вызвать любой динамический браузер с любой хитрой выборкой, недоступной обычному фильтру. Пример:
                            Код:
                            // ТРАНЗАКЦИЯ: ccrep1 ( Работающие юрики с ОГРН, ОценкаРиска ) ИСПОЛНЯЕМАЯ
                               // ШАБЛОН:   10 (5334)
                               // КЛАСС:    filter
                               // ДЕЙСТВИЕ: Создание
                               // РОЛЬ:     Ввод данных
                                  // РЕКВИЗИТ: buffers (константа)
                                  @buffers = 'cust-corp,acct,oecr,oedb,s-ogrn,s-risk,b';
                                  // РЕКВИЗИТ: tables (константа)
                                  @tables = 'cust-corp,acct,op-entry,op-entry,signs,signs,branch';
                                  // РЕКВИЗИТ: where (формула)
                                  @where = "for each cust-corp no-lock,
                                  first acct of cust-corp where
                                   acct.acct-cat = `b` and
                                   acct.close-date = ? and
                                   acct.bal-acct >= 40700 and 
                                   acct.bal-acct = 40900 no-lock ,
                                  last oecr outer-join where oecr.acct-cr = acct.acct
                                              and oecr.op-date > ?
                                              and oecr.op-status > 'А' no-lock,
                            last oedb outer-join where oedb.acct-db = acct.acct                         
                                              and oedb.op-date > ?
                                              and oedb.op-status > 'А' no-lock,
                                  first s-ogrn outer-join
                                      where s-ogrn.file-name = 'cust-corp'
                                        and s-ogrn.surrogate =string(cust-corp.cust-id)
                                        and s-ogrn.code = 'ОГРН' no-lock,
                                  first s-risk outer-join
                                  where s-risk.file-name = 'cust-corp'
                                    and s-risk.surrogate = string(cust-corp.cust-id)
                                    and s-risk.code = 'ОценкаРиска' no-lock ,
                                  first b where (avail oecr )
                                             or (avail oedb ) no-lock
                                   ";
                                  // РЕКВИЗИТ: persist (константа)
                                  @persist = 'Нет';
                               // ШАБЛОН 10: ВЫРАЖЕНИЕ ВЫПОЛНИТЬ ПОСЛЕ
                               ОБЪЕКТ(нет,'filtertable' + chr(1) +
                                          'date-out1' ,
                                          @filtertable(10) + chr(1) +
                                          ''  ,
                                          "",",ESC_NO_ERROR,cust-corp")
                            // ТРАНЗАКЦИЯ ccrep1 - КОНЕЦ
                            // ***********************************************

                            Комментарий


                            • А... Э... А можно ли с помощью НТ открывать кредитные договора?
                              Чем больше связей, тем меньше степеней свободы.

                              Комментарий


                              • Я думаю, теоретически, можно - создать договор и условие, открыть счета, заложив алгоритмы выбора счета 2 порядка от срока кредита, привязать счета к договору (создать записи в loan-acct), в term-obl создать все графики, задать процентные ставки - и все.

                                Комментарий


                                • Ага, и спи-отдыхай
                                  Чем больше связей, тем меньше степеней свободы.

                                  Комментарий


                                  • Кстати, не подскажите - как в назначении платежа в новой транзакции обеспечить перевод строки?

                                    Комментарий


                                    • 2Andry :
                                      большой thnx - сильно загнул - будем использовать )
                                      2Чернушка :
                                      beloll прав - мы так и делаем
                                      2beloll :
                                      ... + chr(10) + ...

                                      Комментарий


                                      • Сообщение от laviator
                                        2Чернушка :
                                        beloll прав - мы так и делаем
                                        Я и не спорю. Просто процесс мне показался очень трудоемким, что руки на время опустились.
                                        Чем больше связей, тем меньше степеней свободы.

                                        Комментарий


                                        • laviator
                                          Спасибо, попробую.
                                          Чернушка
                                          Да, механизм мощнейший - но пока не наполненный процедурами - нужно переписать все парсерные функции, что были раньше, иначе надоедает писать вспомогательные транзакции.
                                          И еще, гложет сомнение - насколько это серьезно - не закроют ли этот механизм в ближайшем будущем. Накатишь очередной патч - и все твои наработки стоят намертво. Прецедент уже был - сделал на основе новых транзакций импорт из текстового файла, после установки очередного патча - не работает, ну переписали они процедуру поиска файлов в каталоге импорта и тербуют, чтобы у класса из которого она вызывается был определенный допрек- бывает.

                                          Комментарий


                                          • beloll
                                            Кстати, не подскажите - как в назначении платежа в новой транзакции обеспечить перевод строки?
                                            Константа __NL, например,

                                            MESSAGE("Fisrt String" + @__NL + "Second String");

                                            выдаст двустрочное сообщение.

                                            Комментарий


                                            • Предчувствуя вопрос о других константах, публикую полный их список:

                                              __ERROR - ошибка, возращается рядом функций и методов обработки шаблонов.
                                              __OPKIND - код текущей транзакции
                                              __OPDATE - дата опердня
                                              __USERID - идентификатор текущего пользователя
                                              __1 - CHR(1), разделитель списков, например, в параметрах функции ОБЪЕКТ и в реквизитов ATTRLIST, VALLIST в шаблонах фильтра
                                              __NL - новая строка
                                              __PG - новая страница
                                              __V - CHR(251), он же "крыж"

                                              Комментарий


                                              • bulklodd
                                                Спасибо.
                                                А как при недостатке средств на счете заставить транзакцию создать документ с кодом В (или как-то обработать ошибку не вываливаясь из основной транзакции)?

                                                Комментарий


                                                • beloll Возможно так: первый шаблон вызывает метод "создание с ош" (если нет - скопируй в справочнике "Действие" с метода "Создание", поставив '!' перед validate.

                                                  В поле "выполнить после" первого шаблона проверяешь наличие ошибки от validate (навскидку не помню переменную, в которой ошибка сохраняется).
                                                  Если есть - тогда во втором шаблоне создаешь такой-же документ со статусом "В", использовав "копирование" для скорости.

                                                  Комментарий


                                                  • beloll

                                                    А как при недостатке средств на счете заставить транзакцию создать документ с кодом В (или как-то обработать ошибку не вываливаясь из основной транзакции)?
                                                    Andry описал правильную последовательность действий, добавлю только, что в выражении выполнить после, надо написать следующее сравнение:

                                                    IF @__return == @__error THEN
                                                    // Здесь обрабатываем ошибку
                                                    ELSE
                                                    // Сюда попадаем, если ошибки не было
                                                    ENDIF

                                                    Комментарий


                                                    • А если возможность при обработке выборки групповой транзакцией определить является ли запись последней в выборке?
                                                      Поясню задачу. Фильтром отбираю проводки по счетам, групповой транзакцией определяю кол-во документов по каждому из счетов дебета и формирую проводку. Проблема - последняя запись не обрабатывается как нужно. Или есть более простой алгоритм?
                                                      Чем больше связей, тем меньше степеней свободы.

                                                      Комментарий


                                                      • Чернушка к сожалению в выборках filter* невозможно задать group-by , поэтому приходится реализовывать группировку самостоятельно.

                                                        Нужна самая последняя запись ? Она проверяется по условию
                                                        (@__counter == @num-results)
                                                        Могу прислать транзакцию, где такая группировка реализована.

                                                        Комментарий


                                                        • присылай
                                                          Чем больше связей, тем меньше степеней свободы.

                                                          Комментарий


                                                          • Andry
                                                            Если можно, выложи в студию.

                                                            Комментарий


                                                            • Можно и в студию, правда, мой вариант слегка отличается от Andry. В прикрепленном файле. Вроде там нет ничего личного, кроме коррсчета
                                                              Последний раз редактировалось Людмила Кулагина; 18.08.2005, 10:10. Причина: Подвешу транзакцию
                                                              Чем больше связей, тем меньше степеней свободы.

                                                              Комментарий

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