Страница 1 из 1

Сальдо по счету в разрезе КАУ Calc_NewSaldo

Добавлено: 07 дек 2015, 14:39
Masygreen
Что-то совершенно запутался с Calc_NewSaldo

Задача - получит развернутое сальдо по счет\субсет КАУ1, КАУ2 на любую дату ..

Вопрос 1. Какое сальдо возвращает Calc_NewSaldo (расчетное или ближайшее)?
Вопрос 2. Можно ли Calc_NewSaldo получить сальдо на произвольную дату?
Вопрос 3. Правильно ли использую?

Код: Выделить всё

    if (GetFirst BuhSchet where ((_nRec == BuhSchet.nrec)) = tsOk)
    {

Код: Выделить всё

  //1
      delete all SaldoNM;//очищаем таблицу сальдо
  //2
      var
        iSaldoActuality: SaldoActuality;
      iSaldoActuality.DropActualityForPlansSch(0); // сброс актуальности сальдо для всех планов счетов

Код: Выделить всё

 //3 ближайшее на дату формирования отчета

      _pdStr := if((getlast saldmoun WHERE ((BuhSchet.SCHET == saldmoun.scheto
            AND BuhSchet.SUBSch == saldmoun.subossch))
          and _CPLANSSCHWork = saldmoun.cplanssch
          and saldmoun.datesal <= _pdStr) = tsOK,
          saldmoun.datesal, date(1, month(_pdStr), year(_pdStr)));

      _pdEnd := Sub_Day (_dEnd, 1);   

Код: Выделить всё

      Calc_NewSaldo(word(0),
      _CPLANSSCHWork, //план счетов
      coSaldoNM, //таблица
      BuhSchet.SCHET, BuhSchet.SUBSch, //счет, субчет
      Comp(0), //подразделение
      Comp(0), Comp(0), Comp(0),
      Comp(0), Comp(0), Comp(0),
      _pdStr, _pdEnd// дата с - по
      );
      rereadrecord(#saldonm);//обязательно   

Код: Выделить всё

      _LOOP SaldoNM
      {
        if(getfirst tmSaldoM where ((SaldoNM.SchetO == tmSaldoM.sSchet and SaldoNM.SubOsSch == tmSaldoM.sSubSch
              and SaldoNM.KauOS[1] == tmSaldoM.cKatOrg and SaldoNM.KauOS[2] == tmSaldoM.cBaseDoc)) <> tsOK)
        {
          ClearBuffer(#tmSaldoM);
          set tmSaldoM.sSchet := SaldoNM.SchetO;
          set tmSaldoM.sSubSch := SaldoNM.SubOsSch;
          set tmSaldoM.cKatOrg := SaldoNM.KauOS[1];
          set tmSaldoM.cBaseDoc := SaldoNM.KauOS[2];
          set tmSaldoM.SumOb := round(if(SaldoNM.VIOB = 1, SaldoNM.SumS, (-1 * SaldoNM.SumS)), 2);
          insert current tmSaldoM;
        }
        else
        {
          set tmSaldoM.SumOb := tmSaldoM.SumOb + round(if(SaldoNM.VIOB = 1, SaldoNM.SumS, (-1 * SaldoNM.SumS)), 2);
          update current tmSaldoM;
        }

      }//_LOOP SaldoNM     

Re: Сальдо по счету в разрезе КАУ Calc_NewSaldo

Добавлено: 09 дек 2015, 07:53
Алексей
1. расчетное.
2. можно, если верно зададите период, она возьмёт ближайшее и оборотами добьёт до даты, как аналитические отчеты.
3. Да вроде правильно, попробуйте для начала подставить туда явные значения.

Re: Сальдо по счету в разрезе КАУ Calc_NewSaldo

Добавлено: 09 дек 2015, 12:39
Masygreen
Алексей писал(а):1. расчетное.
2. можно, если верно зададите период, она возьмёт ближайшее и оборотами добьёт до даты, как аналитические отчеты.
3. Да вроде правильно, попробуйте для начала подставить туда явные значения.
1) тогда уж не расчетное, а берет ближайшее
2) хз.. наверно не правильно задал вопрос .. на начало дня или на конец?
3) вот с правильным заданием даты скорее всего и проблема .. я как себе представляю нужно мне сальдо на 15/10/2015 (включительно) на конец дня т.е.

Код: Выделить всё

//дата начала - дата ближайшего сальдо
  _pdStr := if((getlast saldmoun WHERE ((BuhSchet.SCHET == saldmoun.scheto AND BuhSchet.SUBSch == saldmoun.subossch))    and _CPLANSSCHWork = saldmoun.cplanssch
          and saldmoun.datesal <= date(1, 10, 2015)) = tsOK,
          saldmoun.datesal, 'пока не суть..сальдо есть всегда');
_pdEnd :=date(15, 10, 2015)

Код: Выделить всё

      Calc_NewSaldo(word(0),      _CPLANSSCHWork, //план счетов      coSaldoNM, //таблица
      BuhSchet.SCHET, BuhSchet.SUBSch, //счет, субчет
      Comp(0), //подразделение      Comp(0), Comp(0), Comp(0),      Comp(0), Comp(0), Comp(0),  
    _pdStr, _pdEnd// дата с - по
      );
      rereadrecord(#saldonm);//обязательно   
получаю какой-то бред ..

Re: Сальдо по счету в разрезе КАУ Calc_NewSaldo

Добавлено: 09 дек 2015, 14:47
Den
отсчитываем от dgettune('Dat_M_Ot') - типа подразумеваем что там нормальное сальдо на месяц закрытый бухами.

ну и далее что то вроде :

Код: Выделить всё

         data_otch:=dgettune('Dat_M_Ot');

          if dbegin<=data_otch // дата получения заданная юзером раньше отчетной даты ?
          {
           salpoint1:=dbegin
           salpoint2:=date(0,0,0);
          }
          else // иначе берет от отчетного сальдо + рассчиытваем за период на нужную дату
          {
           salpoint1:=data_otch;
           salpoint2:=sub_day(dbegin,1); // ну тут может и не нужно день вычитать )
          }

 ...
              // последние два параметра отдаем 
              Rez:=Calc_NewSaldo(
                               ....
                               salpoint1,
                               salpoint2
                             );

ну + если вам на любую дату, а не на 1е число месяц , как в примере привел, то salpoint1 придется подвысчитать еще перед тем как отдать ее в CalcNewSaldo. Т.е. задали N-й день месяца (не 1й !), то нужно брать 1й день этого месяца + нужно количество дней от 1го - это при условии что задали дату раньше dgettune('Dat_M_Ot') . Если позже, то получается ветка else как я привел 1:1

Re: Сальдо по счету в разрезе КАУ Calc_NewSaldo

Добавлено: 10 дек 2015, 06:40
Алексей
Masygreen - функция полностью рабочая, хоть и давно, но пользовались неоднократно в разных отчетах.
Ещё раз - попробуйте задать в неё статичные данные, нреки, счета, даты явным образом и посмотрите что выдает, на простом счёте где немного данных.
Я просто не помню нюансов, например какие даты давать, но у меня в датах стоит дата минус день. :) Вычислялось всё опытным путём и сравнивая с аналитической ведомостью из ФРО.