Остатки на корреспондентских счетах (отчет в Excel)

Автор:Alexander
Дата:06.08.2002
Просмотров:2972
Скачиваний:1997
Оценка:, Оценок - 1
Сохранить в файле

Обсудить в форуме

Описание

Ну там все из текста видно, читайте... :)
Можно использовать как наглядный пример работы с Excel.

Текст примера

 /*  ''Новиков А.В. 14.09.2001
     Остатки на корреспондентских счетах
     (служ. Токарева)
*/

Import BankInter,CurrInter,RslX,Lgxs;

CONST Код_А  = CodeFor("A")-1,  /*код 65 соответствует букве А*/
      Num_St = CodeFor("Z")-Код_А; /*число латинских букв от A до Z, потом идут AA,AB,AC...*/

VAR   ob,wb;

Array ws;
array mass0,mass1,mass2,mass3,mass4,mass5/*приоритет*/;
array Kod_Val_mass;

file accblnc(accblnc,"bank.def") key 0;
file account(account,"bank.def") key 0;
file client(client,"bank.def") key 0;
file currency(currency,"bank.def") key 0;

Macro mass_(mass0);
var i=0,tmp;
  while(GetParm( i+1, tmp ))
    mass0(i)=string(tmp);
    i=i+1;
  end;
  setparm(0,mass0);
end;

Macro Поиск_Валюты_СокрНазвание(код_валюты);
   currency.Code_Currency=код_валюты;
   if(GetEQ(currency))
      return currency.Short_Name;
   else
      return "";
   end;
end;
Macro Поиск_Валюты_Название(код_валюты);
   currency.Code_Currency=код_валюты;
   if(GetEQ(currency))
      return currency.Name_Currency;
   else
      return "";
   end;
end;

Macro sort_(a1,a2);
var a=a1;
  setparm(0,a2);
  setparm(1,a);
end;

Macro Sort_mass(a,a1,a2,a3,a4);
var i=0,k,j,n,m;
  n=asize(a);
  While (i<n)
    m=a(i);
    k=i;
    j=i;
    While (j<n)
      if (m>a(j))
        m=A(j);
        k=j;
      end;
      j=j+1;
    end;
    sort_(A(k),A(i));
    sort_(A1(k),A1(i));
    sort_(A2(k),A2(i));
    sort_(A3(k),A3(i));
    sort_(A4(k),A4(i));
    /*
    A[k]=A[i];
    A[i]=m;
    */
    i=i+1;
  end;
  setparm(0,a);
  setparm(1,a1);
  setparm(2,a2);
  setparm(3,a3);
  setparm(4,a4);
end;

Macro accBalance0(Balance0,Account_,Dat,i);
var kod_val,flag;
var flag_sort=true,k=0;
var n3=asize(Kod_val_mass);
 IF(I==0)
   ASIZE(mass1,0);
   ASIZE(mass2,0);
   ASIZE(mass3,0);
   ASIZE(mass4,0);
   ASIZE(mass5,0);
 END;
 accblnc.Balance0=Balance0;
 accblnc.Account=Account_;
 flag=GetGE(accblnc);
 While(flag and (accblnc.Balance0==Balance0))
   account.Account=accblnc.Account;
   if(    GetEQ(account)
      and(account.Open_Date<=Dat)
      and( (Dat<=account.Close_Date)or(account.Close_Date==date(0,0,0)) )
     )
     client.Client=account.Client;
     if(GetEQ(client))
       mass1(i)=string(account.NameAccount,/*" account.NameAccount ",client.szShortName," г. ",client.szSity,*/"      ",account.Account);
       kod_val=int(SubStr(account.Account,6,3));
       if(kod_val==810) /*если рубли то остаток в рублях*/
          mass2(i)=restA(account.Account,dat);
          mass3(i)=restA(account.Account,(dat-1));
          kod_val=0;
       else /* иначе остаток в валюте*/
          mass2(i)=restAC(account.Account,kod_val,dat);
          mass3(i)=restAC(account.Account,kod_val,(dat-1));
       end;
       /*
       if(mass2(i)<0)
          mass2(i)=-mass2(i);
       end;
       if(mass3(i)<0)
          mass3(i)=-mass3(i);
       end;
       */
       mass2(i)=-mass2(i);
       mass3(i)=-mass3(i);
       mass4(i)=Поиск_Валюты_СокрНазвание(kod_val);
       /*mass4(i)=Поиск_Валюты_Название(kod_val);*/
       k=0;flag_sort=true;/*расстановка приоритетов*/
       while((k<n3)and(flag_sort))
         if(Kod_val_mass(k)==mass4(i))
           flag_sort=false;
           mass5(i)=k;
         end;
         k=k+1;
       end;
       if(flag_sort) /*если такой код валюты еще не описан*/
         mass5(i)=k;
       end;
       i=i+1;
     end;
   end;
   flag=next(accblnc);
 end;
 /*сортировка имеющегося массива*/

 Sort_mass(mass5,mass1,mass2,mass3,mass4);

 return i;
end;

/*==========================================================================
  Процедуры выгрузки в EXCEL
===========================================================================*/
Macro My_exit(i);
  ob.Workbooks.Close (false);
  ob.Quit;
  exit(i);
end;

Macro ОткрытиеТаблицы_Книги(path1,NameFile1)
    if(IsStandAlone())
       ob=ActiveX ("Excel.Application");
    else
       ob=TlgActiveX ("Excel.Application");
    end;
    if(SelectFile(NameFile1,path1,"Выбор файла *.xls, ESC - отмена"))
      /*файл с шапкой (таблицами и графиками) найден*/
      ob.Workbooks.Open(NameFile1,0,true); /*true - только для чтения*/
    else
      msgbox("Файл с таблицей-шаблоном не найден!!!","| Нажмите ESC");
      My_exit(1);
      ob.Workbooks.add;/*новый файл*/
    end;;
    wb=ob.Workbooks.Item(1); /* Item - извлечение части объектов из группы*/
    wb.Activate;
end;

Macro ИнициализацияЛистов(ЧислоЛистов);
var i=1;
    while(i<=ЧислоЛистов)
       ws(i)=wb.Worksheets.Item (i);
 /*(*
       ws(i).Activate;/*можно писать сразу во все листы*/
   *)*/
       i=i+1;
    end;
end;

Macro ФорматированиеСтолбца_Ячейки(лист,Код_Ячейки1,Код_Ячейки2,
                                   HorizontalAlignment,
                                   VerticalAlignment,
                                   MergeCells
                                   );
var Код_Ячейки=Код_Ячейки1+":"+Код_Ячейки2;
    ws(лист).Range(Код_Ячейки).HorizontalAlignment = HorizontalAlignment;
    ws(лист).Range(Код_Ячейки).VerticalAlignment   = VerticalAlignment;
    ws(лист).Range(Код_Ячейки).MergeCells          = MergeCells;
    ws(лист).Range(Код_Ячейки).WrapText = False;
end;

Macro ЦветЯчейки(лист,Код_Ячейки1,Код_Ячейки2,Цвет);
var Код_Ячейки=Код_Ячейки1+":"+Код_Ячейки2;
    ws(лист).Range(Код_Ячейки).Interior.ColorIndex = Цвет;
end;

Macro Шрифт(лист,Код_Ячейки,Name,FontStyle,Size);
    ws(лист).Range(Код_Ячейки).Font.Name = Name;
    ws(лист).Range(Код_Ячейки).Font.FontStyle = FontStyle;
    ws(лист).Range(Код_Ячейки).Font.Size = Size;
    /*Шрифт(лист,Код_Ячейки,"Arial Cyr","полужирный",14)*/
end;

Macro КопирСтрок(лист,Код_Ячейки1,Код_Ячейки2);
var Код_Ячейки=Код_Ячейки1+":"+Код_Ячейки2;
    ws(лист).Range(Код_Ячейки).Copy;
end;

Macro ВставкаСтрок(лист,Код_Ячейки1,Код_Ячейки2);
var Код_Ячейки=Код_Ячейки1+":"+Код_Ячейки2;
    ws(лист).Range(Код_Ячейки).Insert;
end;

Macro УдалениеСтрок(лист,Код_Ячейки1,Код_Ячейки2);
var Код_Ячейки=Код_Ячейки1+":"+Код_Ячейки2;
    ws(лист).Range(Код_Ячейки).Delete;
end;

Macro Запись_ячейка(лист,Код_Ячейки,Value);
   ws(лист).Range(Код_Ячейки).Value = Value;
end;

Macro Код_Столбца_(Номер_Столбца1);
var t=0,       /*t = 0, если от A до Z ,  t = 1,если от AA до AZ и т.д.*/
    Код_Столбца=StrFor(Код_А+Номер_Столбца1);
    t=int((Номер_Столбца1-1)/Num_St);
    if(t==0)
       Код_Столбца="";
    else
       Код_Столбца=StrFor(Код_А+t);
    end;
    return Код_Столбца+StrFor(Код_А+Номер_Столбца1-(Num_St*t) );
end;

Macro formula2(Столбец,n,НомерСтрокиИтог,per);
var ячейки=Столбец,i1=2,i=НомерСтрокиИтог,formula="";
  i=i-per;
  ячейки=string(Столбец,i);
  formula=ячейки;
  while (i1<n)
        i=i-per;
        ячейки=string(Столбец,i);
        formula=ячейки+";"+formula;
        i1=i1+1;
  end;
  return string("=СУММ(",formula,")");
end;

/*********************************************************/
/***** Главная процедура расчета и записи в EXCEL *********/
/**************************************************        *******/
/*Все объединено в одну процедурку*/
Macro MainEXCEL(DateC);
var ЧислоЛистов=1,      /*const?*/
    path_    =GetIniString("XLSDIR","bank.ini")+"\\NOV\\",
    NameFile1="ost_*.xls",
    path1=path_+NameFile1;

var dat=DateC,i=0,j=0;

var Код_Ячейки="",Переменная;
var Код_Ячейки1,Код_Ячейки2;
var Номер_Столбца  = 3,
    Номер_Строки  = 3,  /*с которой начинается заполнение данных*/
    лист = 1;
var n1=0,n2=0,k=0,K1=0;
var flag_sort=true;

  ОткрытиеТаблицы_Книги(path1,NameFile1);
  ИнициализацияЛистов(ЧислоЛистов);
  ws(лист).Activate;/*можно писать в этот лист*/
  ob.Visible=true;

  Переменная="Остаток по состоянию на "+string(dat);
  Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
  Запись_ячейка(лист,Код_Ячейки,Переменная);
  Переменная="Остаток по состоянию на "+string(dat-1);
  Код_Ячейки=string(Код_Столбца_(Номер_Столбца+1),Номер_Строки);
  Запись_ячейка(лист,Код_Ячейки,Переменная);

  mass_(mass0,"30102","30110","30114","30109");
  n1=asize(mass0);
  mass_(Kod_val_mass,"RUR","USD","DEM","UAH");
  While(j<n1)  /*цикл по балансовым счетам*/
    Номер_Столбца=1;
    Номер_Строки=Номер_Строки+1;
      Код_Ячейки =string(Номер_Строки+1);
      КопирСтрок(лист,Код_Ячейки,Код_Ячейки);
      Код_Ячейки=string(Номер_Строки);
      ВставкаСтрок(лист,Код_Ячейки,Код_Ячейки);
    if(mass0(j)=="30109")
      Переменная="КОРСЧЕТА ЛОРО";
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);
      n2=accBalance0(mass0(j),"",Dat,0);
      Переменная=15;
    else
      Переменная="КОРСЧЕТА НОСТРО";
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);
      n2=accBalance0(mass0(j),"",Dat,0);
      j=j+1;
      n2=accBalance0(mass0(j),"",Dat,n2);
      j=j+1;
      n2=accBalance0(mass0(j),"",Dat,n2);
      Переменная=48;
    end;

    Код_Ячейки1=Код_Ячейки;
    Код_Ячейки2=string(Код_Столбца_(Номер_Столбца+5),Номер_Строки);
    ФорматированиеСтолбца_Ячейки(лист,Код_Ячейки1,Код_Ячейки2,1,-4107,false);
    ФорматированиеСтолбца_Ячейки(лист,Код_Ячейки1,Код_Ячейки2,-4108,-4108,true);
    Шрифт(лист,Код_Ячейки,"Arial Cyr","полужирный",14);
    ЦветЯчейки(лист,Код_Ячейки,Код_Ячейки,Переменная);

    k=0;
    K1=0;
    While(k<n2)   /*цикл по счетам каждого балансового счета*/
      Номер_Строки=Номер_Строки+1;
        Код_Ячейки =string(Номер_Строки+1);
        КопирСтрок(лист,Код_Ячейки,Код_Ячейки);
        Код_Ячейки=string(Номер_Строки);
        ВставкаСтрок(лист,Код_Ячейки,Код_Ячейки);

      Номер_Столбца=1;
      Переменная=i+1;
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);

      Номер_Столбца=Номер_Столбца+1;
      Переменная=mass1(k);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);

      Номер_Столбца=Номер_Столбца+1;
      Переменная=double(mass2(k)/100);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);

      Номер_Столбца=Номер_Столбца+1;
      Переменная=double(mass3(k)/100);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);

      Номер_Столбца=Номер_Столбца+1;/*пропуск одного столбца*/
      Переменная=double(mass2(k)/100)-double(mass3(k)/100);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);

      if(Переменная==0)
      elif(Переменная>0)
        Переменная=43;
      else
        Переменная=38;
      end;
      ЦветЯчейки(лист,Код_Ячейки,Код_Ячейки,Переменная);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца-1),Номер_Строки);
      ЦветЯчейки(лист,Код_Ячейки,Код_Ячейки,Переменная);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца-2),Номер_Строки);
      ЦветЯчейки(лист,Код_Ячейки,Код_Ячейки,Переменная);


      Номер_Столбца=Номер_Столбца+1;
      Переменная=mass4(k);
      Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
      Запись_ячейка(лист,Код_Ячейки,Переменная);

      i=i+1;
      k=k+1;K1=K1+1;
      if(Переменная!=mass4(k)) /*итого по валюте*/
         Номер_Строки=Номер_Строки+1;
         Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
         Запись_ячейка(лист,Код_Ячейки,Переменная);

         Номер_Столбца=1;
         Код_Ячейки =string(Номер_Строки);
         КопирСтрок(лист,Код_Ячейки,Код_Ячейки);
         Код_Ячейки=string(Номер_Строки);
         ВставкаСтрок(лист,Код_Ячейки,Код_Ячейки);

         Переменная="Итого "+Переменная;
         Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
         Запись_ячейка(лист,Код_Ячейки,Переменная);
         Шрифт(лист,Код_Ячейки,"Arial Cyr","полужирный",12);
         ЦветЯчейки(лист,Код_Ячейки,Код_Ячейки,16);

         Код_Ячейки1=Код_Ячейки;
         Код_Ячейки2=string(Код_Столбца_(Номер_Столбца+1),Номер_Строки);
         ФорматированиеСтолбца_Ячейки(лист,Код_Ячейки1,Код_Ячейки2,1,-4107,false);
         ФорматированиеСтолбца_Ячейки(лист,Код_Ячейки1,Код_Ячейки2,-4108,-4108,true);

         Номер_Столбца=Номер_Столбца+1;
         Номер_Столбца=Номер_Столбца+1;
         Переменная=formula2(string(Код_Столбца_(Номер_Столбца)),
                             K1+1,
                             Номер_Строки,1);
         Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
         Запись_ячейка(лист,Код_Ячейки,Переменная);

         Номер_Столбца=Номер_Столбца+1;
         Переменная=formula2(string(Код_Столбца_(Номер_Столбца)),
                             K1+1,
                             Номер_Строки,1);
         Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
         Запись_ячейка(лист,Код_Ячейки,Переменная);

         Номер_Столбца=Номер_Столбца+1;
         Переменная=formula2(string(Код_Столбца_(Номер_Столбца)),
                             K1+1,
                             Номер_Строки,1);
         Код_Ячейки=string(Код_Столбца_(Номер_Столбца),Номер_Строки);
         Запись_ячейка(лист,Код_Ячейки,Переменная);
         K1=0;
      end;
    end; /*цикл по счетам каждого балансового счета*/

    j=j+1;
  end; /*цикл по балансовым счетам*/
  Номер_Строки=Номер_Строки+1;
  Код_Ячейки=string(Номер_Строки);
  УдалениеСтрок(лист,Код_Ячейки,Код_Ячейки);
  УдалениеСтрок(лист,Код_Ячейки,Код_Ячейки);
  msgbox("Все! Теперь можете просмотреть полученный отчет в EXCEL","| Нажмите ESC");
  ob.Visible=true;
end;

var datC=date;
if(not GetDate(datC,"Введите дату отчета"))
 msgbox("А надо было нажать ENTER!!!");
 exit(1);
end;
MainEXCEL(datC/*ДатаОтчета*/);
exit(1);