3 августа, понедельник 12:16
Bankir.Ru

Объявление

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

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

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

  • Сообщение от simsimd Посмотреть сообщение
    fetchxxx, Но, ОБЪЕКТ() возвращает идентификатор в каком-то странном виде, типа Паспорт,00 00 200000,1☺Ч☺1303
    а Entry использовать для разбора?
    Спасибо за совет. Просто было непонятно, какое из этих значений является идентификатором. Проблема решена следующим образом:

    // Вызываем браузер документов физика и получаем ID нужного документа
    @DocId = ENTRY(1,ОБЪЕКТ(НЕТ,'cust-id' + chr(1) + 'cust-cat',@PersonId + chr(1) + 'Ч','',',,p-cust-ident'),chr(01));
    // Получаем нужные нам реквизиты документа физика
    @DocDate = РЕКВИЗИТ('p-cust-ident',@DocId,'open-date');
    @DocIssue = РЕКВИЗИТ('p-cust-ident',@DocId,'issue');
    @DocNum = РЕКВИЗИТ('p-cust-ident',@DocId,'cust-code');
    @DocType = РЕКВИЗИТ('p-cust-ident',@DocId,'cust-doc-type');
    ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

    Комментарий


    • Сообщение от fetchxxx Посмотреть сообщение
      Проблема решена следующим образом:
      IMHO лучше всё-таки ENTRY, на четыре обращения к базе меньше.

      Комментарий


      • Подскажите пожалуйста, какие функции в УТ аналогичны функциям НСчДр и РольСчетВал в стандартных тр-ях? Если таковой нет, то как можно выбрать счета в зависимости от значения доп.река счета и определить валюту счета? Заранее спасибо
        P.S. В принципе думаю может получиться с ОБЪЕКТ, но может есть др.варианты?
        Последний раз редактировалось fotomix; 03.09.2009, 10:37.
        Большой Московский Форум

        Комментарий


        • Сообщение от fotomix Посмотреть сообщение
          Подскажите пожалуйста, какие функции в УТ аналогичны функциям НСчДр и РольСчетВал в стандартных тр-ях?
          РольСчетВал - очень похожа на СЧЕТ_ПО_РОЛИ .

          НСчДр - тут ОБЪЕКТ не совсем аналогичен, в ОБЪЕКТ действительно без проблем можно отфильтровать по доп.реквизиту, но ОБЪЕКТ в отличие от НСчДр выдаст браузер для выбора на экран.

          Комментарий


          • Сообщение от fotomix Посмотреть сообщение
            Подскажите пожалуйста, какие функции в УТ аналогичны функциям НСчДр и РольСчетВал в стандартных тр-ях? ...
            P.S. В принципе думаю может получиться с ОБЪЕКТ, но может есть др.варианты?
            НСчДр кстати можно реализовать с помощью класса filter или filternav, правда весьма громоздко, т.е. делаем допустим шаблон на классе filternav, в реквизитах шаблона указываем что нужно (например маску acct, sc-1 и sv-1), далее с полученным FilterTable делаем вызов ГР_ТРАНЗАКЦИЯ(какая-то-другая-транзакция), в этой другой транзакции находим счет и возвращаем то, что от него требуется (НСчДр возвращал номер счета).

            Комментарий


            • Товарищи,я ни фига не могу с помощью УТ найти документ (op), удовлетворяющий условию УСЛОВИЕ в назначении платежа и со счетом по кредиту (op-entry) Счет_Такой-То.

              Комментарий


              • Сообщение от kabysdox Посмотреть сообщение
                Товарищи,я ни фига не могу с помощью УТ найти документ (op)
                А как вы пытаетесь его искать ? Судя по тому, что нужен ещё отбор проводок, отбор может быть только фильтром (класс Filter и его подклассы).

                Комментарий


                • kabysdox,А документ такой единственный? А что будете делать если таких документов много?
                  А как выражаетс условие в назначении платежа?

                  Комментарий


                  • Я сделал шаблон ор с действием "поиск" с условием search(?,"matches ...") в реквизите details и подшаблон op-entry(1) с условием search(?,"eq ...") в реквизите acct-cr.
                    По ходу,Бисквит просто игнорирует подшаблон при поиске!

                    Комментарий


                    • Короче,пробовал такие варианты:
                      1)просто поиск проводки op-entry,чтобы счет кредита был такой-то - работает.
                      2)то же самое условие ,но как реквизит подшаблона op-entry у op с действием "поиск" - НЕ работает.Причем ругается именно на Op-entry: "не могу создать запрос"...
                      Может,я что-нибудь не так делаю...?)))

                      Комментарий


                      • Проблема была вот в чем:шаблон поиска в УТ перекомпилевывается в нечто типа FIND FIRST и т.д.,который НЕ понимает конструкции типа:
                        first op ...,first op-entry of op ...
                        Для этого нужно писать for each op...,first op-entry of op...Тогда понимает!
                        ТО есть надо делать с помощью фильтра...
                        Подшаблоны в поиске работать не будут!Вот так...

                        Комментарий


                        • Доброго всем дня!

                          Не могу разобраться со следующей проблемой.

                          Есть транзакция с шаблоном на классе FilterNAV. В нем функцией ГР_ТРАНЗАКЦИЯ() вызывается подчиненная транзакция.
                          Вопрос - как сделать, чтобы в случае возникновения ошибки в подчиненной транзакции, выполнение процесса не прерывалось и родительская транзакция не откатывалась?
                          ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                          Комментарий


                          • Сообщение от fetchxxx Посмотреть сообщение
                            Доброго всем дня!

                            Не могу разобраться со следующей проблемой.

                            Есть транзакция с шаблоном на классе FilterNAV. В нем функцией ГР_ТРАНЗАКЦИЯ() вызывается подчиненная транзакция.
                            Вопрос - как сделать, чтобы в случае возникновения ошибки в подчиненной транзакции, выполнение процесса не прерывалось и родительская транзакция не откатывалась?
                            Насколько я знаю, единственный способ - в подчиненной транзакции делать проверки и обходить ошибочные конструкции.

                            Комментарий


                            • Сообщение от fetchxxx Посмотреть сообщение
                              Вопрос - как сделать, чтобы в случае возникновения ошибки в подчиненной транзакции, выполнение процесса не прерывалось и родительская транзакция не откатывалась?

                              Это вообще-то уже на транзакцию не похоже.


                              Можно попробовать такой вариант:

                              ТРАНЗАКЦИЯ-1 вызвает ГР_ТРАНЗАКЦИЯ("ТРАНЗАКЦИЯ-2);

                              ТРАНЗАКЦИЯ-2 содержит RUN(run-op-kind-no-error,"ТРАНЗАКЦИЯ-3");

                              run-op-kind-no-error.p содержит:
                              {intrface.get pbase}
                              DEFINE INPUT PARAMETER iOpKind AS CHAR NO-UNDO.
                              DO ON ERROR UNDO,LEAVE
                              ON ENDKEY UNDO,LEAVE
                              ON STOP UNDO,LEAVE:
                              RUN RunTransaction IN h_pbase (iOpKind).
                              END.
                              {intrface.del}

                              Должны получить N-запусков транзакции ТРАНЗАКЦИЯ-3 , причем абсолютно неважно чем эти попытки закончаться.


                              Или можно попробовать прикрутить к ГР_ТРАНЗАКЦИЯ третий параметр.

                              Комментарий


                              • Сообщение от fetchxxx Посмотреть сообщение
                                Доброго всем дня!

                                Не могу разобраться со следующей проблемой.

                                Есть транзакция с шаблоном на классе FilterNAV. В нем функцией ГР_ТРАНЗАКЦИЯ() вызывается подчиненная транзакция.
                                Вопрос - как сделать, чтобы в случае возникновения ошибки в подчиненной транзакции, выполнение процесса не прерывалось и родительская транзакция не откатывалась?
                                легко. я для себя уже решил эту проблему в принципе и стандарт не меняется в общем то.
                                Делается "новое" действие без запуска валидации объекта, причем не важно какого, важно что шаблон будет обрабатываться в цикле с этим действием и валидация при сохранении объекта не вызовет "схлапывания" цикла.
                                далее на нужном обьекте(в поле after шаблона) запускаешь RUN-ом "свою" валидацию. я написал универсальную внешнюю валидацию любого обьекта.
                                если валидация не прошла, то шаблон с этим обьектом откатывается(break(1) в поле after),
                                и цикл работает дальше, а вы в протокол пишете что вам надо.

                                и всё!

                                все сказаное касается защиты самого цикла, если же вы хотите чтобы вызывающая транзация продолжила цикл, то включайте на ней транзакцию прогресса, и в этом случае как раз break(1) просто позволяет пропустить итерацию и внешнему циклу работать дальше.
                                Последний раз редактировалось DWP; 20.10.2009, 07:17.
                                С уважением, Дмитрий.

                                Комментарий


                                • Сообщение от fetchxxx Посмотреть сообщение
                                  Доброго всем дня!

                                  Не могу разобраться со следующей проблемой.

                                  Есть транзакция с шаблоном на классе FilterNAV. В нем функцией ГР_ТРАНЗАКЦИЯ() вызывается подчиненная транзакция.
                                  Вопрос - как сделать, чтобы в случае возникновения ошибки в подчиненной транзакции, выполнение процесса не прерывалось и родительская транзакция не откатывалась?
                                  Ну еще и я попробую сказать свое слово:попробуйте на "верхней" транзакции,которая вызывает подчиненную снять флаг "транзакция".

                                  Комментарий


                                  • Добрый день всем!

                                    Вопрос по "Выполнить после".
                                    Итак имеем УТ, в ней создаются Приходник (шаблон 10) и Платежка (шаблон 20)
                                    В поле "Выполнить после" пишем:
                                    ПЕЧАТЬ(@op(10), 'cashord2'); ПЕЧАТЬ(@op(20), 'pp-uni_1');
                                    RUN('zayavbo',@op(20),ДА)

                                    Функции ПЕЧАТЬ отрабатывают прекрасно, а вот RUN('zayavbo',@op(20),ДА) не т.

                                    уточню: в процедуре zayavbo ищется op по op.op переданному в нее, а затем если найдена такая Op из полей дергаются нужные данные для вывода на экран (например заявление на перевод физ.лица).
                                    FIND FIRST op WHERE op.op = vOp NO-LOCK NO-ERROR.

                                    Так вот: Получается что все поля записи op пустые пока транзакция не выполнится полностью и никакие данные не достать. Как это правильно реализовать?

                                    Комментарий


                                    • Сообщение от mns17 Посмотреть сообщение
                                      Добрый день всем!

                                      Вопрос по "Выполнить после".
                                      Итак имеем УТ, в ней создаются Приходник (шаблон 10) и Платежка (шаблон 20)
                                      В поле "Выполнить после" пишем:
                                      ПЕЧАТЬ(@op(10), 'cashord2'); ПЕЧАТЬ(@op(20), 'pp-uni_1');
                                      RUN('zayavbo',@op(20),ДА)

                                      Функции ПЕЧАТЬ отрабатывают прекрасно, а вот RUN('zayavbo',@op(20),ДА) не т.

                                      уточню: в процедуре zayavbo ищется op по op.op переданному в нее, а затем если найдена такая Op из полей дергаются нужные данные для вывода на экран (например заявление на перевод физ.лица).
                                      FIND FIRST op WHERE op.op = vOp NO-LOCK NO-ERROR.

                                      Так вот: Получается что все поля записи op пустые пока транзакция не выполнится полностью и никакие данные не достать. Как это правильно реализовать?
                                      Я точно не знаю,но ор неоднозначно идентифицирует документ.Попробуй передать еще и дату опердня.Может поможет....

                                      Комментарий


                                      • kabysdox, Я точно не знаю,но ор неоднозначно идентифицирует документ.
                                        емнис op.op - уникально

                                        Комментарий


                                        • Сообщение от mns17 Посмотреть сообщение
                                          RUN('zayavbo',@op(20),ДА)

                                          Функции ПЕЧАТЬ отрабатывают прекрасно, а вот RUN('zayavbo',@op(20),ДА) не т.

                                          Так вот: Получается что все поля записи op пустые пока транзакция не выполнится полностью и никакие данные не достать.
                                          Нет. Получается вовсе другое: что zayavbo получает какие-то параметры, которые ей не нужны, и завершается, ничего не сделав. Попробуйте поднять message с значением vOp внутри этой процедуры.

                                          Кстати, если zayavbo переделать так, чтобы она на входе принимала recid(op), то звать её можно будет через ту же ПЕЧАТЬ(). И в меню печати на документе тоже.

                                          Кстати, op.op уникален в таблице op.
                                          /kiv

                                          Комментарий


                                          • Нет. Получается вовсе другое: что zayavbo получает какие-то параметры, которые ей не нужны, и завершается, ничего не сделав. Попробуйте поднять message с значением vOp внутри этой процедуры.

                                            zayavbo получает как раз op.op и по message его правильно выдает.
                                            Но проблема в том что выдает он только op.op а все остальное пусто.

                                            Кстати, если zayavbo переделать так, чтобы она на входе принимала recid(op), то звать её можно будет через ту же ПЕЧАТЬ(). И в меню печати на документе тоже.

                                            Я не нашел как из УТ передать RecId(op)?

                                            Вот текст zayavbo:

                                            {globals.i}
                                            {setdest.i}

                                            DEFINE INPUT PARAMETER numop AS CHARACTER NO-UNDO.

                                            DEFINE VARIABLE vOp AS INTEGER NO-UNDO.

                                            DEF VAR namepol like op.name-ben NO-UNDO.
                                            DEF VAR innpol like op.inn NO-UNDO.
                                            DEF VAR schetpol like op.ben-acct NO-UNDO.
                                            DEF VAR summp like op-entry.amt-cur NO-UNDO.
                                            DEF VAR bankname like op-bank.bank-name NO-UNDO.
                                            DEF VAR banknum like op-bank.bank-code NO-UNDO.
                                            DEF VAR bankschet like op-bank.corr-acct NO-UNDO.

                                            vOp = INTEGER(numop) NO-ERROR.

                                            FIND FIRST op WHERE op.op = vOp NO-LOCK NO-ERROR.

                                            if avail op then do:
                                            namepol = op.name-ben.
                                            innpol = op.inn.
                                            schetpol = op.ben-acct.
                                            FIND FIRST op-entry where op-entry.op = op.op
                                            NO-LOCK NO-ERROR.
                                            if avail op-entry then do:
                                            summp = op-entry.amt-cur.
                                            end.
                                            FIND FIRST op-bank where op-bank.op = op.op
                                            NO-LOCK NO-ERROR.
                                            if avail op-bank then do:
                                            bankname = op-bank.bank-name.
                                            banknum = op-bank.bank-code.
                                            bankschet = op-bank.corr-acct.
                                            end.
                                            end.

                                            PUT UNFORMATTED
                                            "numop " numop SKIP
                                            "vOp " vOp SKIP
                                            "namepol " namepol SKIP
                                            "innpol " innpol SKIP
                                            "schetpol " schetpol SKIP
                                            "summp " summp FORMAT ">>>,>>9.99" SKIP
                                            "bankname " bankname SKIP
                                            "banknum " banknum SKIP
                                            "bankschet " bankschet SKIP.

                                            {preview.i}

                                            Комментарий


                                            • Сообщение от simsimd Посмотреть сообщение
                                              kabysdox, Я точно не знаю,но ор неоднозначно идентифицирует документ.
                                              емнис op.op - уникально
                                              Привет,Дим.
                                              Может и уникально,только когда я искал только по ор документ в УТ,у меня какая-то хрень получалась.Времени проверять не было и я добавлял еще условие по дате.Тогда прокатывало...

                                              Комментарий


                                              • Сообщение от kabysdox Посмотреть сообщение
                                                Привет,Дим.
                                                Может и уникально,только когда я искал только по ор документ в УТ,у меня какая-то хрень получалась.Времени проверять не было и я добавлял еще условие по дате.Тогда прокатывало...

                                                ничего не могу сказать, так как на такое в УТ не наступал

                                                Комментарий


                                                • Вариант с поиском по op.op and op.op-date также не дает результатов :-(
                                                  Больше идей нету ?

                                                  Комментарий


                                                  • mns17, а почему не попробовать вместо входящего параметра op.op взять RECID?

                                                    DEFINE INPUT PARAM RID AS RECID NO-UNDO.

                                                    А затем FIND FIRST op WHERE RECID(op) = RID NO-LOCK NO-ERROR.
                                                    Ну и соответственно вызвать ПЕЧАТЬ()

                                                    У меня сработало

                                                    Комментарий


                                                    • Сообщение от mns17 Посмотреть сообщение
                                                      Вариант с поиском по op.op and op.op-date также не дает результатов :-(
                                                      Больше идей нету ?
                                                      Идей сколько хочешь:1)передавай любые параметры, только чтобы найти необходимый документ.2)В конце концов вместо @op напиши его значение.3)наконец поменяй процедуру, чтобы просто что-то вывела.Найди первый попавшийся документ.Убедись что работает...

                                                      Комментарий


                                                      • Сообщение от mns17 Посмотреть сообщение
                                                        Добрый день всем!

                                                        Вопрос по "Выполнить после".
                                                        Итак имеем УТ, в ней создаются Приходник (шаблон 10) и Платежка (шаблон 20)
                                                        В поле "Выполнить после" пишем:
                                                        ПЕЧАТЬ(@op(10), 'cashord2'); ПЕЧАТЬ(@op(20), 'pp-uni_1');
                                                        RUN('zayavbo',@op(20),ДА)

                                                        Функции ПЕЧАТЬ отрабатывают прекрасно, а вот RUN('zayavbo',@op(20),ДА) не т.

                                                        уточню: в процедуре zayavbo ищется op по op.op переданному в нее, а затем если найдена такая Op из полей дергаются нужные данные для вывода на экран (например заявление на перевод физ.лица).
                                                        FIND FIRST op WHERE op.op = vOp NO-LOCK NO-ERROR.

                                                        Так вот: Получается что все поля записи op пустые пока транзакция не выполнится полностью и никакие данные не достать. Как это правильно реализовать?
                                                        Собственно,в чем проблема-то?Файл пустой получается?Если пустой,то попробуй выйти в ОС и оттуда его просмотреть...
                                                        Последний раз редактировалось kabysdox; 22.10.2009, 17:46.

                                                        Комментарий


                                                        • Ну, посмотрим в отладку; отладочный вариант процедуры:

                                                          Код:
                                                          {globals.i}
                                                          {setdest.i}
                                                          
                                                          DEFINE INPUT PARAMETER numop    AS CHARACTER  NO-UNDO.
                                                          
                                                          DEFINE VARIABLE vOp   AS INTEGER NO-UNDO.
                                                          
                                                          DEF VAR namepol     like op.name-ben  NO-UNDO.
                                                          DEF VAR innpol      like op.inn  NO-UNDO.
                                                          DEF VAR schetpol    like op.ben-acct  NO-UNDO.
                                                          DEF VAR summp       like op-entry.amt-cur  NO-UNDO.
                                                          DEF VAR bankname    like op-bank.bank-name  NO-UNDO.
                                                          DEF VAR banknum     like op-bank.bank-code  NO-UNDO.
                                                          DEF VAR bankschet   like op-bank.corr-acct  NO-UNDO.
                                                          
                                                          vOp = INTEGER(numop) NO-ERROR.
                                                          
                                                          message string(vOp) view-as alert-box.
                                                          
                                                          FIND FIRST op WHERE op.op = vOp NO-LOCK NO-ERROR.
                                                          
                                                          if avail op then do:
                                                            message "op found" view-as alert-box.
                                                            namepol = op.name-ben.
                                                            innpol = op.inn.
                                                            message "op num=" op.doc-num view-as alert-box.
                                                            schetpol = op.ben-acct.
                                                            FIND FIRST op-entry where op-entry.op = op.op
                                                                                NO-LOCK NO-ERROR.
                                                            if avail op-entry then do:                    
                                                              summp = op-entry.amt-cur.
                                                            end.
                                                            FIND FIRST op-bank where op-bank.op = op.op
                                                                                NO-LOCK NO-ERROR.
                                                            if avail op-bank then do:                    
                                                               bankname = op-bank.bank-name.
                                                               banknum = op-bank.bank-code.
                                                               bankschet = op-bank.corr-acct.
                                                            end.  
                                                          
                                                          PUT UNFORMATTED 
                                                          "numop " numop SKIP
                                                          "vOp " vOp SKIP
                                                          "namepol " namepol SKIP
                                                          "innpol " innpol SKIP
                                                          "schetpol " schetpol SKIP
                                                          "summp " summp FORMAT ">>>,>>9.99" SKIP
                                                          "bankname " bankname SKIP
                                                          "banknum " banknum SKIP
                                                          "bankschet " bankschet SKIP.
                                                          
                                                          end.                    
                                                           
                                                          {preview.i}
                                                          У меня - кстати - Ваш код работает.
                                                          /kiv

                                                          Комментарий


                                                          • Я не нашел как из УТ передать RecId(op)?
                                                            Думаю, что RECID никак, а вот ROWID, что правильнее, можно, например,

                                                            Код:
                                                            @__rowid(20)
                                                            Я точно не знаю,но ор неоднозначно идентифицирует документ.
                                                            Однозначно идентифицирует - это уникальный индекс.
                                                            Правда есть лазейка, если op = ?, но это тоже невозможно, т.к. поле MANDATORY, короче, вероятность успешного поиска 99,99%

                                                            Комментарий


                                                            • Сообщение от bulklodd Посмотреть сообщение
                                                              Думаю, что RECID никак
                                                              Пф-ф. Во-первых, именно его передаёт ПЕЧАТЬ(). Говорил я о другом - что любую процедуру печати надо уметь звать не только из транзакции, но и из документа, а также списка документов. Потому, что бумажка может испачкаться, потеряться etc, а op уже создан. А чтобы получить бумажку, его не нужно стирать и создавать заново. А просто найти и позвать процедуру печати.

                                                              Ну и наконец pp-ptmp нам дана не зря
                                                              /kiv

                                                              Комментарий

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