17 октября, среда 16:29
Bankir.Ru

Объявление

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

Скорость "Подсчета оборотов за период"

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

  • Скорость "Подсчета оборотов за период"

    В отчете за период нужно отобразить остатки (вход.-исх.) и суммы оборотов (Дб-Кр) по счетам, которые участвуют во "взаиморасчетах" 2-х банков.
    Каждой позиции(строке) отчета соответствует одна или набор масок по счетам или корреспонденции. Например (N - символы номера клиента, X - любой):
    1. "Кредиты предоставленные" - 320(01-10)ХХХХХХХХХХNNNNN
    2. "Комиссии уплаченные" - "Д" 70209ХХХХ(9201-9205)ХХХХХХХ - "К" 30109ХХХХХХХХХХNNNNN
    3. "НКД уплаченный" - "В" 50406XXXXXXXXXXXXXXX

    1.В первом случае проблем не возникает - остатки и обороты по данному виду маски (отсутствие флагов "Д","К","В" ) берутся из баланса по RestA (RestAC), DebetA, KreditA.

    2.Наличие маски "Д" Маска1_счета - "К" Маска2_счета означает, что данные по остаткам счетов Маска1 формируются только по документам, удовлетворяющим данной корреспонденции. Т.е. входящий остаток на 01.01.2004 по каждому из счету Маска1 будет являться разница оборотов Дб-Кр со счетами Маска2 с момента открытия счета Маска1. Аналогично Сумма оборотов по Дб и Кр счета будет являться только сумма документов, где выполняется данное условие корреспонденции счетов.
    Проблема и заключается в том, что для нахождения остатков необходимо просматривать все документы по счету, начиная с его открытия, т.е. в большом времени выполнения обработки.

    3. Флаг "В" перед маской счета означает, что данные по остаткам счетов формируются только по документам, которые содержит определенное значение пользовательского типа. Остатки и обороты считаются по принципу п.2 - нужен "просмотр" всех документов с даты открытия счета.

    Каждый счет может учавствовать в нескольких позициях по разным маскам. В отчете содержатся позиции "Прочие пассивы /активы> с маской "В" XXXXXXXXXXXXXXXNNNNN - т.е. проход> по всем документам клиента за период с даты открытия 1-го счета до даты окончания периода отчета неизбежен. Как в п.3 счета не обязательно должны принадлежать заданному клиенту - т.е. нужно будет просмотреть все лицевые счета балансового счета .
    Позиций в отчете много, и их количество, как и маски по ним постоянно меняются - прописать расчет каждую позицию в отдельности в макросе невозможно.

    Хотел бы услышать советы над решением проблемы времени выполнения отчета (в т.ч. многократных проходов по одним документам). Что можно помещать в таблицы для хранения данных, которые ускорят процесс? И вообще по технологии выполнения отчета. На данный момент выполняется по шагам - Анализ масок позиции => Создание списка счетов по маскам => Поиск документов по счетам

  • #2
    может так?
    Код:
    file arhdeb (arhdoc) key 1;
    file arhkre (arhdoc) key 2;
    file acc (account);
    file docdeb (document) key 3;
    file dockre (document) key 4;
    
    while(next(acc))
      if(СчетНужныйИОткрыт(acc.Account))
         rewind(_arhkre);
         arhkre.Date_Carry = НачалоГода;//Месяца, Недели
         arhkre.Real_Receiver = acc.Account;
         stat=getge(arhkre);
         while(stat)
           if(
              (arhkre.Real_Receiver==arhkre.Account_Receiver)
              and
              (arhkre.Result_Carry!=23)
              and
              (НужнаяМаска(arhkre.Account_Payer, arhkre.Account.Receiver))
              )
              СчитаемОбороты;
           end;
           stat=next(arhkre);
         end;
      end;
      //...тоже самое по arhdeb, docdeb, и dockre
    end;
    первый класс прям.
    можно эту задачу использовать для проверки знаний RSL-я.

    Комментарий


    • #3
      Проблема не в том, как посчитать обороты. Меня интересует, как построить алгоритм решения задачи формирования отчета, чтобы как можно уменьшить время выполнения самого расчета. В принципе, тут код не нужен, на словах объясни :-)

      Комментарий


      • #4
        Adyan
        Я тебе мыло отправил только что Сорри за задержку, работал
        Там рассказано как решить вот это (в т.ч. многократных проходов по одним документам).

        Комментарий


        • #5
          vsv
          Спасибо! :-)
          Решение проблемы "повторных проходов" путем одного упорядоченного просмотра каждого документа за весь интервал и отнесение сумм на нужные счета позиций так же не подходит, т.к. начальная дата интервала всегда будет датой открытия первого счета клиента (банка). Правда я не подсчитывал, сколько документов просматриваю, отталкиваясь от "позиция-счета-просмотр докментов по счету". Но, кажется, меньше будет на порядок при том, что на каждый нужный мне документ приходится как минимум еще 500 других.

          Комментарий


          • #6
            Adyan вообще-то, чтобы сделать нормальную отчётность, желательно сначала наладить учёт

            а общий совет может быть такой - если всё равно от многократного прохода никуда не деться, то выполнять всё это обязательно на трёхзвенке, и кэш битрива поставить достаточно большой...

            а ещё - может быть, постараться как-то разделить задачу на кусочки... например, при проходе для Д_счёт формировать остатки по дням в корреспонденции с каждым уникальным К_счёт, а потом эти остатки суммировать, уже с учётом маски для К_счёт...

            Комментарий


            • #7
              Adyan А еще можно создать временный файл со структурой document.dbt, скопировать туда все необходимые документы за один проход, а потом шерстить его как душа пожелает.
              В каждой программе есть по крайней мере одна ошибка

              Комментарий


              • #8
                dd
                при проходе для Д_счёт формировать остатки по дням в корреспонденции с каждым уникальным К_счёт

                Вообще, нужен ключ по Real_Payer+Real_Receiver ^-) Почему его нет-то.
                Такой подход (хранить остатки по дням) я использовал для масок 3 вида ("В"). Да, можно в этот момент относить суммы на этот же счет в корреспонденции с каждым уникальным К_счёт, а потом эти остатки суммировать, уже с учётом маски для К_счёт...Просто я просматривая одну позицию не знаю, что будет в другой - придется узнавать. Не продумал что-то.

                Комментарий


                • #9
                  Big_Mike
                  ну эт только один день будет, а как же архивные документы?

                  Adyan
                  Real_Payer+Real_Receiver ^-) Почему его нет-то.
                  создай и переналей файл, кто те мешает? религия не позволяет?

                  или два файловых указателя с ключами по Real_Payer и по Real_Receiver.

                  Комментарий


                  • #10
                    KaMPiLeR а как же архивные документы?
                    Временный файл со структурой arhdoc.dbt
                    В каждой программе есть по крайней мере одна ошибка

                    Комментарий


                    • #11
                      KaMPiLeRну эт только один день будет, а как же архивные документы?

                      Не умничай, всем и так всё ясно :-) Просто идею же обозначили.
                      Big_MikeВременный файл со структурой arhdoc.dbt
                      Можно, наверное, какую-нибудь одну табличку да еще с ключами Payer+Receiver, и туда лить arh, arh$, obdoc и т.д. Вообще я ищу способ не временного харнения, а накапливающихся данных, на основе которых удастся избежать ранее расчитанных сумм. Но с записью документов немного страшно, что он со временем "разрастется" - при увеличении клиентов (банков), по которым будет делаться отчет получу почти копию arhdoc-а, со временем такая оптимизация будет маловыигрышной.

                      а кто пользовался запросами SQL в RS? долго Select выполняется?

                      Комментарий


                      • #12
                        Adyan долго Select выполняется?
                        а зачем это тебе? быстрее точно не будет...

                        Вообще я ищу способ не временного харнения, а накапливающихся данных
                        ну и закачивай каждый день в свою базульку... типа хранилища данных... или - купи вон Контур в Интерсофте

                        а всё-таки самый первый мой совет был самый дельный

                        Комментарий


                        • #13
                          кстати, KaMPiLeR
                          stat=next(arhkre); измени на stat=(next(arhkre))and(arhkre.Real_Receiver == acc.Account)(с GetGE тоже) и в If можно убрать условие по счету. Быстрее будет :-) А так ты ведь просматриваешь документы по счетам, которые тебе точно не нужны.

                          Комментарий


                          • #14
                            ddа всё-таки самый первый мой совет был самый дельный
                            Да, vsvтак же предложил(mail) таблицу с ключем по счету и полями остатков, оборотов. Так и сделаю, буду лить туда обороты по счету за дату. У меня похежее и было, но "убило" то, что счет может быть в разной корреспонденции и, соответственно, суммы различные.
                            Вообщем-то всё ясно, да и изменять не так уж много.

                            Спасибо всем, кто ответил!

                            Комментарий


                            • #15
                              Adyan Вообще я ищу способ не временного харнения, а накапливающихся данных,
                              Во-первых, это не способ временного хранения, а инструмент, повышающий производительность макроса при многократных выборках на ограниченных наборах данных.
                              Во-вторых, уж если что хранить, так это значения оборотов и остатков на даты выпуска отчета, а расчет производить с даты выпуска последнего отчета.
                              В каждой программе есть по крайней мере одна ошибка

                              Комментарий


                              • #16
                                Adyan Да, vsvтак же предложил
                                да нет, ты первый совет просто пропустил... вот он: чтобы сделать нормальную отчётность, желательно сначала наладить учёт

                                Комментарий


                                • #17
                                  Big_Mike
                                  Во-первых, главное тут ясна идея. А назвать это можно по всякому. Смысл же понятен - это ускоряет сам процесс расчета. Я хотел лишь к этому получить еще совет, как ускорить за счет раннее расчитанных данных.
                                  Во-вторых, расчет производить не с даты выпуска последнего отчета, а с даты окончания периода, заданного в последнем расчете.

                                  Комментарий


                                  • #18
                                    Adyan
                                    главное тут ясна идея Ок
                                    заданного в последнем расчете
                                    Или любой другой (на случай архивных проводок)
                                    dd , желательно сначала наладить учёт
                                    Хороший совет автоматизатору
                                    В каждой программе есть по крайней мере одна ошибка

                                    Комментарий


                                    • #19
                                      Big_Mike dd , желательно сначала наладить учёт
                                      Хороший совет автоматизатору

                                      ну дык, если он автоматизатор (а не кодер) - то должен хоть как-то направлять своих бухов в нужное русло

                                      Комментарий


                                      • #20
                                        dd
                                        направлять своих бухов
                                        понеслась
                                        Жить надо так, чтоб тебя помнили сволочи!

                                        Комментарий


                                        • #21
                                          dd желательно сначала наладить учёт
                                          А вообще, это просто фраза или что не так в учете? Просто не пойму, к чему и на основе чего сказано.

                                          Комментарий


                                          • #22
                                            Adyan это просто фраза или что не так в учете
                                            что не так - не знаю... но терзают смутные сомнения, что именно что-то не так...
                                            потому как сливать все в одну "помойку", а потом это всё разгребать - дело не самое правильное... в конце концов, существует такое понятие, как субсчета, аналитический учёт и т.п.

                                            alanf понеслась
                                            да ладно, не буду больше брюзжать... 8-е марта близко-близко

                                            Комментарий


                                            • #23
                                              dd направлять своих бухов
                                              Особенно главных
                                              В каждой программе есть по крайней мере одна ошибка

                                              Комментарий


                                              • #24
                                                нужна за большой период времени по большому количеству счетов вывести все даты изменения остатков (ну и сами остатки, соотв.)
                                                что можно придумать для ускорения процесса, кроме как сравнения остатка по счету за каждый день с предыдущим?

                                                это с учетом того, что остатки по счетам в таблице restdate при их неизменении всё равно записывались за каждый день.
                                                Последний раз редактировалось Adyan; 01.09.2005, 10:02.

                                                Комментарий


                                                • #25
                                                  остатки по счетам в таблице restdate при их неизменении всё равно записывались за каждый день
                                                  зачем?

                                                  что можно придумать
                                                  пожалуй, в твоём случае - ничего...

                                                  Комментарий


                                                  • #26
                                                    почему ничего - ключ добавить в restdate.
                                                    и прыгать на изменившийся остаток.

                                                    или строить промежуточные таблицы заранее - например после закрытия дня. DataWareHouse так сказать...
                                                    ______________________________
                                                    даешь автомафикацию в колхозы!

                                                    Комментарий


                                                    • #27
                                                      baatar
                                                      почему ничего - ключ добавить в restdate.
                                                      Добавлять свои ключи в стандартные таблицы - моветон А внешний сгенерить - тоже время

                                                      Как вариант - посмотреть на документы Если размер arhdoc.dbt документов меньше restdate.dbt, то бежать по ней

                                                      Комментарий


                                                      • #28
                                                        ага, или по оперлогу... извратиться-то можно по-разному... только зачем?

                                                        Комментарий


                                                        • #29
                                                          ну в любом случае прищлось бежать по restdate.
                                                          baatar ключ добавить в restdate
                                                          так ведь в том то и дело, что остатки там одинаковы по дням, где не было изменений :-)
                                                          ключ то есть - он же и единственный

                                                          проблему "дублирования" остатков потом устраним, просто отчет срочно нужен был.
                                                          была тоже идея бегать по документам, как vsv предлагает, но потом подумал... Нафик, сделаю "стандартно", потом всё равно болезнь дублирования вылечим.

                                                          Комментарий


                                                          • #30
                                                            У нас в банке составлен собственный Баланс-Нетто, в котором в одном показателе могут содержаться, как активные, так и пасивные счета, т. е если показатель находится в активе, то вычитаются пассивные счета.
                                                            Может кто знает как правильно составить оборот по показателю, содержащему активные счета за минусом пассивных.
                                                            Заранее спасибо.

                                                            Комментарий

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

                                                            Свернуть

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

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