Код: Выделить всё
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}