Код: Выделить всё
function CalculateNewSaldo( ModeCulc : word;
                              cPlans : comp;
                            coPutTab : integer;
                                 Sch : tSchet3;
                                 Sub : tSubSch;
                                Podr : tNRec;
                                 Kau : tGetKau;
                         dStart,dEnd : Date) : boolean;
var
  pServFin    : pBuhProcess;
  fSaldo      : pTable;
  bSaldo      : pSaldMoun;
  coGetTab    : integer;
  tiSaldo     : integer;
  KolKey      : byte;
  AllError    : longint;
  DateActSal  : date;
  ServerDate  : date;
  ServerTime  : time;
  MyS         : string;
  IORes       : word;
Label
  StopSaldo;
begin
  Result   := false;
  coGetTab := 0;
  tiSaldo  := 0;
  KolKey   := 0;
  AllError := 0;
  case coPutTab of
    coSaldMoun : coGetTab := coSaldMoun;
    coSaldDay  : coGetTab := coSaldDay;
    coSaldoNM  : coGetTab := coSaldMoun;
    else
      begin
        StrMessage('CalculateNewSaldo: Некорректный номер таблицы' +
                   FormatString(' %d',[coGetTab]), mfInformation);
        Exit;
      end;
  end;
  if (not InitBuhProcess(pServFin)) then
    Exit;
  with pServFin^ do
  begin
    CalcSaldo := ModeCulc;
    if not InitSaldoM(cPlans,coGetTab,Sch,Sub,Podr,Kau,dStart,dEnd) then
    begin
      Dispose(pServFin, Done);
      Exit;
    end;
    if (not CurDict^.WasOpenTable(fSaldo, bSaldo, coPutTab, fmNormal, Get_Name(coPutTab))) then
    begin
      Dispose(pServFin, Done);
      Exit;
    end;
    if (coPutTab = coSaldoNM) then
      fSaldo.DeleteAll;
  end;
  dEnd := D_AddDay(dEnd,1);                                // Дата нового сальдо
  if (cPlans = 0) then
  begin
    case (coPutTab) of
      coSaldMoun : tiSaldo := tiSaldMoun14;
      coSaldDay  : tiSaldo := tiSaldDay14;
      coSaldoNM  : tiSaldo := tiSaldoNM01;
    end;
    KolKey := 1;
  end
  else
  begin
    case (coPutTab) of
      coSaldMoun : GivenTuneIndexS(coSaldMoun,cPlans,Sch,Sub,Kau,tiSaldo,KolKey);
      coSaldDay  : GivenTuneIndexS(coSaldDay,cPlans,Sch,Sub,Kau,tiSaldo,KolKey);
      coSaldoNM  :
      begin
        tiSaldo := tiSaldoNM01;
        KolKey := 1;
      end;
    end;
  end;
  //----------------------------------------------------------------------------
  // Удаление старого сальдо
  StartNewVisual(New(PRotateVisual,Init(vfTimer,
                 'Удаление старого входящего сальдо ' +
                 #13'на ' + D_ToChar(dEnd,'DD/MM/YYYY'), 1)));
  bSaldo^.cPlansSch := cPlans;
  bSaldo^.SchetO    := Sch;
  bSaldo^.SubOsSch  := Sub;
  bSaldo^.KauOs[1]  := Kau[1];
  if dEnd = 0 then
    bSaldo^.DateSal := dStart
  else
    bSaldo^.DateSal := dEnd;
  DateActSal := bSaldo^.DateSal;
  //----------------------------------------------------------------------------
  // Сбросим актуальность сальдо, если удаляется входящее или исходящее
  // сальдо текущего отчетного периода
  if (coPutTab = coSaldMoun) then
    if (DateActSal = dGetTune('Dat_M_Ot')) or
       (DateActSal = D_AddMonths(dGetTune('Dat_M_Ot'),1)) then begin
      InitSaldoActuality;
      if (cPlans = 0) or ((cPlans <> 0) and (Sch = cgDefSch)) then
        DropActualityForPlansSch(cPlans)
      else
        DropActuality(Sch,Sub);
      DoneSaldoActuality;
    end;
  //----------------------------------------------------------------------------
  fSaldo^.SetBoundsAndRowSet(tiSaldo, KolKey);
  if (fSaldo^.GetFirst(tiSaldo) = tsOk) then
    if (fSaldo^.OpenBlock(KolKey, 50) = tsOk) then
    Repeat
      if (not NextVisual) then
        Goto StopSaldo;
      if (not KauInFilter(TGetKau(bSaldo^.KauOs),Kau)) then
        Continue;
      IORes := fSaldo^.Delete(tiSaldo);
      if IORes <> tsOk then
      begin
        StrMessage(FormatString('Ошибка #%d удаления записи с NRec=%s таблицы %s.',
                   [IORes, Comp2Str(bSaldo^.NRec, false), pServFin.Get_Name(fSaldo.Code)]), mfInformation);
        AllError := AllError + 1;
        Goto StopSaldo;
      end;
    Until fSaldo^.GetNextBlock <> tsOk;
    
  fSaldo^.CloseBlock;
  fSaldo^.ResetBoundsAndRowSet(tiSaldo, 0);
  StopVisual('',0);
  //----------------------------------------------------------------------------
  // Запись нового сальдо
  StartNewVisual(New(PIndicatorVisual,Init(vfTimer + vfBreak,
                 'Обновление входящего сальдо' +
                 #13'на ' + D_ToChar(dEnd,'DD/MM/YYYY'), pServFin^.RecordsInTable(pServFin^.fSaldRab))));
  if pServFin^.fSaldRab^.GetFirst(tiSaldRab01) = tsOk then
    Repeat
      if (not NextVisual) then
        Goto StopSaldo;
      bSaldo^ := tSaldMoun(pServFin^.bSaldRab^);
      bSaldo^.NRec := 0;
      IORes := fSaldo^.Insert(tiSaldo);
      if IORes <> tsOk then
      begin
        StrMessage(FormatString('Ошибка #%d вставки записи в таблицу %s',
                   [IORes, pServFin.Get_Name(fSaldo.Code)]), mfInformation);
        AllError := AllError + 1;
        Goto StopSaldo;
      end;
    Until pServFin^.fSaldRab^.GetNext <> tsOk;
  //----------------------------------------------------------------------------
  // Устанавливаем актуальность сальдо только если расчитано исходящее
  // сальдо текущего отчетного периода
  if (coPutTab = coSaldMoun) then
    if (D_AddMonths(dGetTune('Dat_M_Ot'),1) = DateActSal) then begin
      CurDict^.xFileF^.Driver^.GetDBDateTime(ServerDate,ServerTime,CurDict);
      InitSaldoActuality;
      if (cPlans = 0) or ((cPlans <> 0) and (Sch = cgDefSch)) then
        SetActualityForPlansSch(cPlans,ServerDate,ServerTime)
      else
        SetActuality(Sch,Sub,ServerDate,ServerTime);
      DoneSaldoActuality;
    end;
  //----------------------------------------------------------------------------
  Result := true;
StopSaldo : ;
  StopVisual('',0);
  pServFin.fSaldRab.DeleteAll;
  Dispose(pServFin, Done);
  CurDict^.CloseTable(fSaldo);
  if AllError <> 0 then
  begin
    case coPutTab of
      coSaldMoun : mys := 'САЛЬДО ЗА МЕСЯЦ';
       coSaldDay : mys := 'САЛЬДО ЗА ДЕНЬ';
       coSaldoNM : mys := 'САЛЬДО НА КОНЕЦ МЕСЯЦА';
    end;
    StrMessage(#3'Входящее сальдо на начало ' + D_ToChar(dEnd,'DD/MM/YYYYг.') +
                 'для проведения расчетов сформировано некорректно.' +
            #13#3'Проверьте данные о ' + myS,mfOkButton);
    Result := false;
  end;
end; {CalculateNewSaldo}
{------------------------------------------------------------------------------}
function Calc_NewSaldo;
var
  KauTemp  : tGetKau;
begin
  KauTemp[1] := Kau1;
  KauTemp[2] := Kau2;
  KauTemp[3] := Kau3;
  KauTemp[4] := Kau4;
  KauTemp[5] := Kau5;
  KauTemp[6] := Kau6;
  Calc_NewSaldo := CalculateNewSaldo(ModeCulc,cPlans,coPutTab,Sch,Sub,Podr,KauTemp,dStart,dEnd);
end; {Calc_NewSaldo}