10 апреля, пятница 09:00
Bankir.Ru

Объявление

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

Помогите новичку

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

  • Помогите новичку

    Добрый день!
    у меня нет опыта в программировании на 4gl и я пока не умею писать различного рода процедуры...
    Хотелось бы узнать что нужно чтобы выполнить простые запросы к базе из разных, например выбрать всех юриков у которых остаток на лицевом счете превышает N рублей....
    по идее понятно что данные из разных таблиц - но из каких - договра(loan), счета(acct) и т.д. - не очень понятно - смотрел через table relations и пока не разобрал отношения между таблицами в бисквите.... довольно непростая организация связи....
    так же не очень понятно с чего начать написание программы - смотрю на другие p-файлы - и вижу, что там подключаются различные системные модули, бибоиотеки - а какие в них процедуры и функции заложены и как использовать тоже не очень понятно... ну видно если их открыть коды и описания, но как вызывать, как передавать в функцию параметры - не понятно... документаций что в саппорте есть не хватает чтобы понять весь процесс разработки....
    опыт программирования и работы с БД есть а вот с progress'ом не сталкивался прежде и не очень понятна технология программирования для бисквита...

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



    инфы нет а жажда знаний - большая...

  • #2
    Информацию можете посмотреть здесь www.bqu41d.ru .
    Указанный Вами пример я бы решал вот так:
    Код:
    {globals.i}
    DEF VAR oAcct     AS TAcct NO-UNDO.
    DEF VAR currDate AS DATE NO-UNDO.
    
    {getdate.i}
    currDate = end-date.
    FOR EACH acct WHERE acct MATCHES '4*':
    oAcct = new TAcct(acct.acct).
    MESSAGE oAcct:getLastPos2Date(currDate) VIEW-AS ALERT-BOX.
    DELETE OBJECT oAcct.
    END.
    Для расчета остатка так же можно использовать БИСовский инклюд sh-bal .
    Остаток является величиной расчетной. Расчетом остатка совершенно не оправданно любят пугать новичков. :-)

    Комментарий


    • #3
      Пример в лоб с расчетом остатка

      Код:
      {globals.i new}
      {sh-defs.i}
      /*
      run acct-pos in h_base (acct.acct, acct.currency,beg-date,end-date,?).
      После этого в переменных
      sh-in-bal - Входящий в рублях
      sh-db - Дебет в рублях
      sh-cr - Кредит в рублях
      sh-bal - Исходящий в рублях
      lastmove Дата последнего движения в рублях
      sh-in-val - Входящий в валюте
      sh-vdb - Дебет в валюте
      sh-vcr - Кредит в валюте
      sh-val - Исходящий в валюте
      lastcurr Дата последнего движения в валюте
      */
      
      {getdate.i}
      {justasec}
      def var cRep as logical no-undo. 
      def var MinRest as decimal no-undo.
      MinRest = 100000.00 .
      
      {setdest.i}
      
      for each cust-corp no-lock:  
       cRep = no.
       for each acct where acct.cust-cat = "Ю" and 
                           acct.cust-id = cust-corp.cust-id and 
                           acct.acct-cat = "b" and 
                           acct.side = "П"  no-lock:
        run acct-pos in h_base (acct.acct, acct.currency,end-date,end-date,?).
        if abs(sh-bal) >= MinRest then 
         cRep = yes
        .
       end.
       if cRep then
        display cust-corp.cust-id cust-corp.name-corp
       .
      end.
      {preview.i}

      Комментарий


      • #4
        а как сделать выборку кред.договоров чтобы были видны счета с определенными ролями? Пытался создать транзакцию выборки на основе base-op-kind с шаблонами выборки на основе класа Filter, но ничего не вышло(( может кто скинет готовую транзакцию выборки из БД данных, чтоб сравнить... видимо я что-то не так делаю


        и еще как реализовать такое if exist(определенный счет у договора ) Then (Выбрать договор)

        Комментарий


        • #5
          Счета связываются с договорами через таблицу loan-acct.
          К примеру, если вам нужны кредитные договоры, имеющие привязанный счет с ролью "КредВозмУб", поможет запрос типа:

          Код:
          for each loan no-lock,
              first loan-acct where
                  loan-acct.cont-code eq loan.cont-code and
                  loan-acct.contract eq loan.contract and
                  loan-acct.acct-type eq "КредВозмУб"
              no-lock:
              disp loan.cont-code.
          end.
          ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

          Комментарий


          • #6
            Сообщение от fetchxxx Посмотреть сообщение
            for each loan no-lock, first loan-acct where loan-acct.cont-code eq loan.cont-code and loan-acct.contract eq loan.contract and loan-acct.acct-type eq "КредВозмУб" no-lock: disp loan.cont-code. end.
            а можете описать процесс создания транзакции которая производит выборку данных из БД?

            Комментарий


            • #7
              Опишите подробнее задачу. Транзакция (в бисквитовской трактовке) - это бизнес-операция, порождающая (либо обрабатывающая) различного рода финансовые объекты - документы, проводки, счета. Вам же, как я понял, нужен отчет.
              ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

              Комментарий


              • #8
                Сообщение от fetchxxx Посмотреть сообщение
                Опишите подробнее задачу. Транзакция (в бисквитовской трактовке) - это бизнес-операция, порождающая (либо обрабатывающая) различного рода финансовые объекты - документы, проводки, счета. Вам же, как я понял, нужен отчет.
                в общем задача такая - у юрлиц выбрать кред/договора с остатками по счетам срочной и просроченной задолженности
                для которых открыты счета резерва по % либо по ссудной задолженности и взять сумму фактически сформированного резерва по % или по ссудной задолженности...

                Комментарий


                • #9
                  Сообщение от shumamura Посмотреть сообщение
                  в общем задача такая - у юрлиц выбрать кред/договора с остатками по счетам срочной и просроченной задолженности
                  для которых открыты счета резерва по % либо по ссудной задолженности и взять сумму фактически сформированного резерва по % или по ссудной задолженности...
                  А дальше? Что с этими суммами делать? Просто вывести отчет?
                  ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                  Комментарий


                  • #10
                    Сообщение от fetchxxx Посмотреть сообщение
                    А дальше? Что с этими суммами делать? Просто вывести отчет?
                    дальше к отобранным договорам вычислить сумму начисленных % на конец дня и сумму уже сформированного резерва, затем их перевести в excell и там еще надо обрабатывать. в конце всей этой процедуры получим сумму досоздания или восстановления резерва

                    Комментарий


                    • #11
                      Сообщение от fetchxxx Посмотреть сообщение
                      Счета связываются с договорами через таблицу loan-acct.
                      К примеру, если вам нужны кредитные договоры, имеющие привязанный счет с ролью "КредВозмУб", поможет запрос типа:

                      Код:
                      for each loan no-lock,
                          first loan-acct where
                              loan-acct.cont-code eq loan.cont-code and
                              loan-acct.contract eq loan.contract and
                              loan-acct.acct-type eq "КредВозмУб"
                          no-lock:
                          disp loan.cont-code.
                      end.
                      можно ли здесь вывести на экран вместе с номером договора и счета с ролями Кредит, КредПр и КредРасч?
                      я не смог вывести в одной итерации больше одного счета............

                      Комментарий


                      • #12
                        Сообщение от shumamura Посмотреть сообщение
                        можно ли здесь вывести на экран вместе с номером договора и счета с ролями Кредит, КредПр и КредРасч?
                        я не смог вывести в одной итерации больше одного счета............
                        Да, можно. Но в этом случае нужно немного конструкцию изменить....
                        например:

                        Код:
                        for each loan no-lock:
                         find first...
                         find first...
                         find first...
                        end.
                        ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                        Комментарий


                        • #13
                          Сообщение от fetchxxx Посмотреть сообщение
                          Да, можно. Но в этом случае нужно немного конструкцию изменить....
                          например:

                          Код:
                          for each loan no-lock:
                           find first...
                           find first...
                           find first...
                          end.
                          я примерно так и сделал - запустил сначала цикл по незакрытым кредитным договорам затем последовательно в теле этого цикла запустил 2 цикла еще.

                          {globals.i}


                          def var nomdog as character FORMAT "x(15)".
                          def var cred as character FORMAT "x(22)".
                          def var credpr as character FORMAT "x(20)".
                          def var credprproc as character.
                          def var credras4 as character.
                          def var credrez as character.

                          for each loan where(loan.loan-status ne "ЗАКР" and loan.contract eq "кредит") no-lock:

                          for each loan-acct where
                          ( loan.cont-code eq loan-acct.cont-code
                          and loan-acct.acct-type eq "ЉаҐ¤Ёв")
                          no-lock:
                          cred=loan-acct.acct.
                          end.

                          for each loan-acct where
                          loan.cont-code eq loan-acct.cont-code
                          and loan-acct.acct-type eq "ЉаҐ¤Џа".
                          credpr=loan-acct.acct.
                          end.

                          nomdog=loan.cont-code.

                          disp nomdog space cred space credpr.


                          end.

                          но считает оооочень медленно.... выводит примерно 1 строка в 2 сек.


                          сейчас проверил через find first - работает в 100 раз быстрее!)) Спасибо!

                          а как сделать так чтобы на экране помещались несколько счетов - чтобы ширина экрана не была ограничена? а то помещабтся только номер договора и два счета((
                          и как результат работы этой программки подогнать под печатную форму бисквита, чтобы можно было распечатать или соохранять в файлике?
                          Последний раз редактировалось shumamura; 13.04.2012, 17:43.

                          Комментарий


                          • #14
                            Сообщение от shumamura Посмотреть сообщение

                            а как сделать так чтобы на экране помещались несколько счетов - чтобы ширина экрана не была ограничена? а то помещабтся только номер договора и два счета((
                            и как результат работы этой программки подогнать под печатную форму бисквита, чтобы можно было распечатать или соохранять в файлике?
                            С этим ничего не поделать - таковы ограничения терминальной версии (80х25 символов). Если число строк еще можно увеличить, поигравшись с настройками терминала (для некоторых экранных форм, например, браузера операционного дня), то ширину вряд ли получится изменить.

                            Альтернативное решение - подобрать настройки принтера таким образом, чтобы при выводе на печать происходило масштабирование текста до нужных размеров, либо выводить информацию в Word/Excel через BISPC.
                            ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                            Комментарий


                            • #15
                              Сообщение от fetchxxx Посмотреть сообщение
                              С этим ничего не поделать - таковы ограничения терминальной версии (80х25 символов). Если число строк еще можно увеличить, поигравшись с настройками терминала (для некоторых экранных форм, например, браузера операционного дня), то ширину вряд ли получится изменить.

                              Альтернативное решение - подобрать настройки принтера таким образом, чтобы при выводе на печать происходило масштабирование текста до нужных размеров, либо выводить информацию в Word/Excel через BISPC.
                              а нельзя ли выводимую информацию как-нибудь распечатать? чтобы работали F5 и shift+f5 или для этого в генераторе отчетов создавать форму надо? этот момент чуть непонятен...
                              и еще при выполнении команды find first вощникают ошибки вида finf first/last failed to table loan-acct но выполнение программы не прерывается... может ли это ошибка возникнуть если запись не найдена?

                              Комментарий


                              • #16
                                но считает оооочень медленно.... выводит примерно 1 строка в 2 сек.
                                сейчас проверил через find first - работает в 100 раз быстрее!))
                                Чтобы работало быстрее, нуждно старатся чтобы условие поиска как можно ближе подходило под индекс(ы) - в данном случае (под рукой нет базы поэтому примерно) в условие нужно добавить поле loan.contract eq loan-acct.contract и возможно currency - и тогда будет пулей - find first тоже будет быстрей - в данном случае он быстрей потому как нет дальнейшего перебора после нахождение первой же попавшейся записи.

                                Вобщем вам как новичку совет - всегда подгоняйте условия под состав индексов.

                                Комментарий


                                • #17
                                  Сообщение от shumamura Посмотреть сообщение
                                  а нельзя ли выводимую информацию как-нибудь распечатать? чтобы работали F5 и shift+f5 или для этого в генераторе отчетов создавать форму надо? этот момент чуть непонятен...
                                  и еще при выполнении команды find first вощникают ошибки вида finf first/last failed to table loan-acct но выполнение программы не прерывается... может ли это ошибка возникнуть если запись не найдена?
                                  1. Для вывода информации в preview:

                                  Код:
                                  {setdest.i}
                                  PUT UNFORMATTED xxx SKIP.
                                  PUT UNFORMATTED yyy SKIP.
                                  {preview.i}
                                  2.Добавьте no-error, а запись обрабатывайте только в том случае, если она найдена.

                                  NO-ERROR

                                  Tells the AVM not to display error messages for any errors it might encounter. Instead, error information is passed the ERROR-STATUS system handle. Possible errors include: not finding a record that satisfies the record-phrase, finding more than one record that satisfies the record-phrase for a unique find, or finding a record that is locked with the NO-WAIT option on the FIND. If you use the NO-ERROR option, you can also use the AVAILABLE function to test if FIND found a record.
                                  Код:
                                  find first loan where loan.cont-code eq 'xxx' and loan.cont-type eq 'yyy' no-lock no-error.
                                  if avail(loan) then do:
                                   /..../
                                  end.
                                  ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                                  Комментарий


                                  • #18
                                    а нельзя ли выводимую информацию как-нибудь распечатать? чтобы работали F5 и shift+f5 или для этого в генераторе отчетов создавать форму надо? этот момент чуть непонятен...
                                    нет не надо - выше я вам приводил пример который выодит отчет на экран БИСквита - который потом можно и F5 и shift+F5

                                    {setdest.i}
                                    display bla-bla.
                                    {preview.i}

                                    и еще при выполнении команды find first вощникают ошибки вида finf first/last failed to table loan-acct
                                    find first loan-acct .... no-error.
                                    if avail loan-acct then ...

                                    Все есть в документации по прогрессу

                                    Комментарий


                                    • #19
                                      {setdest.i}
                                      {globals.i}

                                      DEF VAR nomdog AS CHARACTER format "X(15)".
                                      DEF VAR cred AS CHARACTER format "X(20)".
                                      DEF VAR credpr AS CHARACTER format "X(20)".
                                      DEF VAR credproc AS CHARACTER format "X(20)".
                                      DEF VAR credprproc AS CHARACTER format "X(20)".
                                      DEF VAR credras4 AS CHARACTER format "X(20)".
                                      DEF VAR credrez AS CHARACTER format "X(20)".
                                      DEF VAR credrez1 AS CHARACTER format "X(20)".
                                      DEF VAR credt AS CHARACTER format "X(20)".


                                      FOR EACH loan WHERE ((loan.loan-status ne "ЗАКР") and (loan.contract eq
                                      "Кредит")) use-index dps-close no-lock.

                                      find first loan-acct where (loan.cont-code eq loan-acct.cont-code and
                                      loan-acct.acct-type eq "Кредит") use-index acct-type no-lock no-error.
                                      if avail loan-acct then cred=loan-acct.acct.
                                      else cred="Net takogo".


                                      find first loan-acct where loan.cont-code eq loan-acct.cont-code
                                      and loan-acct.acct-type eq "кредпр" use-index acct-type no-lock no-error.
                                      if avail(loan-acct) then credpr=loan-acct.acct.
                                      else credpr="Net takogo".

                                      find first loan-acct where loan.cont-code eq loan-acct.cont-code
                                      and loan-acct.acct-type eq "КредПР%" use-index acct-type no-lock no-error.
                                      if avail(loan-acct) then credprproc=loan-acct.acct.
                                      else credproc="Net takogo".


                                      find first loan-acct where loan.cont-code eq loan-acct.cont-code
                                      and loan-acct.acct-type eq "КредРасч" use-index acct-type no-lock no-error.
                                      if avail loan-acct then credras4=loan-acct.acct.
                                      else credras4="Net takogo ".


                                      find first loan-acct where loan.cont-code eq loan-acct.cont-code
                                      and loan-acct.acct-type eq "КредРез" use-index acct-type no-lock no-error.
                                      if avail loan-acct then credrez=loan-acct.acct.


                                      find first loan-acct where
                                      loan.cont-code eq loan-acct.cont-code and loan-acct.acct-type eq "КредРез1" use-index acct-type no-lock no-error.
                                      if available loan-acct then credrez1=loan-acct.acct.

                                      find first loan-acct where loan.cont-code eq loan-acct.cont-code and loan-acct~ .acct-type eq "КредТ" use-index acct-type no-lock no-error.
                                      if available loan-acct then credt=loan-acct.acct.


                                      nomdog=loan.cont-code.

                                      {setdest.i}
                                      displaY nomdog cred credpr credproc credprproc credras4 credrez credrez1 credt.
                                      {preview.i}
                                      end.

                                      пояснения
                                      индех dps-close содержит contract, close-date,open-date,loan-status и cont-code
                                      индекс acct-type содержит contact, cont-code,acct-type и since

                                      блок
                                      ***
                                      {setdest.i}
                                      displaY nomdog cred credpr credproc credprproc credras4 credrez credrez1 credt.
                                      {preview.i}

                                      ****
                                      показывает результат за одну итерацию
                                      Так вот - время, затраченное на одну итерацию составляет почти 9 секунд!!!!!

                                      вопросы -
                                      как оптимизировать скорость обработки записей? возможно я неправильно использую индексы...
                                      уточните пожалуйста, где заканчивается тело цикла find first? он находит первую запись удовлетворяющую условию where и на этом поиск просто останавливается?
                                      как вывести результат выполненичя программы в виде таблицы через {preview.i} и есть ли команды для увеличения ширины рабочего окна?
                                      подозреваю что так не получится и придется записывать результаты каждой итерации во временную таблицу и оттуда уже выводить... или не так?

                                      Комментарий


                                      • #20
                                        По порядку...
                                        Сообщение от shumamura Посмотреть сообщение
                                        {
                                        уточните пожалуйста, где заканчивается тело цикла find first?
                                        FIRST

                                        Finds the first record in the table that meets the characteristics you might have specified with record. If the buffer named in the record was preselected in a DO or REPEAT statement, FIND locates the first record in that preselected subset of records.
                                        ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                                        Комментарий


                                        • #21
                                          Сообщение от shumamura Посмотреть сообщение
                                          как вывести результат выполненичя программы в виде таблицы через {preview.i} и есть ли команды для увеличения ширины рабочего окна?
                                          В вашем случае лучше всего поместить результаты выборки в temp-table, и уже далее выводить данные (в нужном порядке) в таблицу (с псевдографическими рамками, либо с разделителями, для последующей обработки в Excel).
                                          Увеличить ширину окна штатными средствами не получится.
                                          Чем не устраивает вывод в BISPC?

                                          setdest.i и preview.i не нужно вызывать в каждой итерации.
                                          Достаточно вызвать setdest.i перед началом вывода строк PUT UNFORMATTED (этот инклюдник перенаправляет поток вывода по-умолчанию в _spool.tmp) и preview.i перед непосредственным отображением на экране.
                                          ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                                          Комментарий


                                          • #22
                                            [QUOTE=fetchxxx;2948492]
                                            Чем не устраивает вывод в BISPC?
                                            я его пока не освоил ((

                                            так получается setdest.i перенаправляет вывод в файл _spool.tmp а preview.i отображает содержимое этого файла..?

                                            а как быть с тем что поиск проходит очень медленно? есть ли возможность оптимизировать код?

                                            Комментарий


                                            • #23
                                              есть ли возможность оптимизировать код?
                                              да добавив loan-acct.contract EQ loan.contract в блоки find

                                              find first loan-acct where loan.cont-code eq loan-acct.cont-code and loan-acct.contract EQ loan.contract
                                              and loan-acct.acct-type eq "кредпр" use-index acct-type no-lock no-error.

                                              Комментарий


                                              • #24
                                                Сообщение от ericnn Посмотреть сообщение
                                                есть ли возможность оптимизировать код?
                                                да добавив loan-acct.contract EQ loan.contract в блоки find

                                                find first loan-acct where loan.cont-code eq loan-acct.cont-code and loan-acct.contract EQ loan.contract
                                                and loan-acct.acct-type eq "кредпр" use-index acct-type no-lock no-error.
                                                теперь летает!! Спасибо! весь результат за несколько секунд теперь выдает!

                                                но чуть все еще не понимаю принцип вывода через _spool.tmp.....

                                                Комментарий


                                                • #25
                                                  Сообщение от shumamura Посмотреть сообщение
                                                  но чуть все еще не понимаю принцип вывода через _spool.tmp.....
                                                  setdest.i перенаправляет вывод по-умолчанию в _spool.tmp.
                                                  preview.i отображает его содержимое на экране.
                                                  ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                                                  Комментарий


                                                  • #26
                                                    Сообщение от fetchxxx Посмотреть сообщение
                                                    setdest.i перенаправляет вывод по-умолчанию в _spool.tmp.
                                                    preview.i отображает его содержимое на экране.

                                                    все, наконец разобрался! оказывается я не в том месте использовал setdest.i
                                                    теперь записал вначале программы а после циклов вызвал preview.i и получилось. принцип теперь понятен! Спасибо!

                                                    а есть возможность чтобы данные не переносились? чтобы результат одной итерации был на одной строке и вывод в spool.tmp был не постраничным, а то после определенного количествоа строк туда снова выводятся имена выводимых переменных
                                                    Последний раз редактировалось shumamura; 17.04.2012, 10:15.

                                                    Комментарий


                                                    • #27
                                                      Сообщение от shumamura Посмотреть сообщение

                                                      а есть возможность чтобы данные не переносились? чтобы результат одной итерации был на одной строке и вывод в spool.tmp был не постраничным, а то после определенного количествоа строк туда снова выводятся имена выводимых переменных
                                                      Есть. Грубо говоря - делайте два цикла. В первом - помещаете результаты выборки в temp-table.
                                                      Во-втором - выводите данные из получившейся временной таблицы.
                                                      ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                                                      Комментарий


                                                      • #28
                                                        Сообщение от fetchxxx Посмотреть сообщение
                                                        Есть. Грубо говоря - делайте два цикла. В первом - помещаете результаты выборки в temp-table.
                                                        Во-втором - выводите данные из получившейся временной таблицы.
                                                        а есть ли разница если все равно выводить через preview.i ?

                                                        Комментарий


                                                        • #29
                                                          Сообщение от shumamura Посмотреть сообщение
                                                          а есть ли разница если все равно выводить через preview.i ?
                                                          Особой разницы нет. Но используя temp-table, можно отсортировать данные, да и вообще... нагляднее, например...
                                                          ИБС БИСКВИТ: Внедрение, консалтинг: www.reunico.ru

                                                          Комментарий


                                                          • #30
                                                            Имена переменных и столбцов выводятся из-за того что используется вывод через оператор display. Вывод через этот оператор странично зависим (еще раз читаем доку на прогресс) размер страницы устанавливается в инклюднике {setdest.i} в зависимости от выбранного принтера в БИСквите и/или переданных параметров в этот инклюдник.

                                                            Помимо display есть еще вывод через операторы put unformatted и export. Читаем доку - смотрим примеры (а их не одна тысяча в БИСквите) осмысливаем, тыкаемся пробуем, а потом задаем вопросы.
                                                            Вот первый попавшийся не сложный пример использования temp-table и put unformatted – dublacct.p

                                                            Комментарий

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