
//  форма "Средняя з-плата за месяц по подразделению"

int idxP = 0,
    idxN = 1,
    idxT = 2,
    idxS = 3,
    CountIdx=4;
int TblFld2[CountIdx];
//====================================================
int len = 512,
    n = 12;
char Dir[len]; // Рабочий каталог амбы (обычно ZPL)
string nm;     // Имя Excel шаблона
var WorkDir,   // Рабочий каталог модуля
    xls,       // объект Excel.Application
    wb,        // объект workbook
    wsh;       // объект worksheet
int cWsh=1,   // число worksheet'ов в workbook'е
    cWb=1,    // число workbook'ов
    cWbTmp=1; // число временных workbook'ов
//========================================================
var CMsg = 0,
    CFile,
    CTabl;
int cr=0, cfld=0, cr_ins=0, rec_ins=0, rec_work=0, CntHead=19, 
    CntFoot = 10, nStart = 12, tmpi=0, CntStr = 0, vp=0;
//=========================================================

int ind1  = 0,
    ind2  = 1,
    ind3  = 2,
    ind4  = 3,
    ind5  = 4,
    CountInd=5;
double Fld[CountInd];
  string tmpstr = "Всего по ";
  string itostr;
  double Kol[2];   //массив количеств по Nakl
  //Kol[0] = 0; // Kol[1]=0;
  double Sum[2];   //массив сумм      по Nakl
  //Sum[0]=0; Sum[1]=0;

  double Summ1=0, Summ2=0;
  int Kol1=0, Kol2=0;


char Buf3[512], Buf4[512];

  double SumPod1=0, SumPod2=0;   // суммы и колич по
  int KolPod1=0, KolPod2=0;   // укрупн подраздел



Tbl2()
{
  PreFld();
 
  Setup();
  
  char Buf[512], Buf1[512], Buf2[512];   

 
  var CTabl = CreateObject("CurPrnTbl");
  if ( !FillIdxFldTbl2(CTabl) )  return;
  

  int cr=CTabl.Count_Rcr(); // число рабочих записей в таблице
 

  int cntRcrTab  =0;       //int cntRcrVid  =0;
  double SumPod  =0,       //        SumVid  =0,
         ItSum   =0;
  string NewPod;
  string NwPodU;
  string NwPodN;

  int Nakl = 0;
  string OldPod  = CTabl.Text(TblFld2[idxP],0);
  string OlPodU  = CTabl.TextS("PODR_U",0);
  string OlPodN  = CTabl.TextS("PodrN",0);

  SetupExcel();

//______________ по записям таблицы _________________
  for (int zap=0; zap<cr; zap++)
  {
     NewPod  = CTabl.Text(TblFld2[idxP],zap);
     NwPodU  = CTabl.TextS("PODR_U",zap);
     NwPodN  = CTabl.TextS("PodrN",zap);    
     
     int cont = 0;

     if ( NwPodU != OlPodU ) 
      {             
        PrintTableToExcel(OlPodN);
        PrintTableToExcel2(OlPodU);
        
        OlPodU=NwPodU;
        cont = 1;
        OlPodN=NwPodN;      // OldPod=NewPod;
        Summ1=0; Summ2=0;
        Kol1=0; Kol2=0;
      }

     if ( cont == 0)
      { 
         if ( NwPodN != OlPodN )
         {     
           PrintTableToExcel(OlPodN);
           OlPodN=NwPodN;
           Summ1=0; Summ2=0;
           Kol1=0;  Kol2=0;
         }
      }
  
     Nakl = atof(CTabl.Text(TblFld2[idxN],zap));  // признак накладника
     if ( Nakl != 1 ) Nakl =0;

     if ( Nakl == 1 )  Summ1 +=  atof(CTabl.Text(TblFld2[idxS],zap));
     if ( Nakl != 1 )  Summ2 +=  atof(CTabl.Text(TblFld2[idxS],zap));

     if ( Nakl == 1 )  Kol1++;
     if ( Nakl != 1 )  Kol2++;

     if ( Nakl == 1 )
       {
        SumPod1 += atof(CTabl.TextS("Sum",zap));
        KolPod1++;
       }
     if ( Nakl != 1 )
       {
        SumPod2 += atof(CTabl.TextS("Sum",zap));
        KolPod2++;
       }

     //==================================================
     if(CMsg.Msg_Proc(" Подождите. Идёт экспорт данных в Excel.",100.*zap/cr)==ESC)
     {
        AmbaMessageBox("Печать не была завершена!","Предупреждение!",0,0);
        xls.Visible = true;
        return;
     }
     //==================================================
    
     Kol[Nakl]++;                                 // для численности

  }
  PrintTableToExcel(OlPodN);
  
  PrintTableToExcel2(OlPodU);
  
  
  xls.Visible = true;
  wsh.Rows(n-2).Delete();  
  wsh.Rows(6).Select();  // которую будем копировать
  xls.Selection.Copy(wsh.Rows(n-2)); // куда копировать
  wsh.Rows(6).Delete();    
}

FillIdxFldTbl2(&CTabl)
{
   TblFld2[idxP] = CTabl.Find_Name_Fld("FCpodr");
   TblFld2[idxN] = CTabl.Find_Name_Fld("FCnakl");
   TblFld2[idxT] = CTabl.Find_Name_Fld("C_FIO");
   TblFld2[idxS] = CTabl.Find_Name_Fld("Sum");
  // for ( int idx=0; idx<CountIdx; ++idx )
  // {
  //    if ( TblFld2[idx]<0 )
  //    {   
  //       AmbaMessageBox("Не найдены нужные столбцы","Ошибка",1,0);
  //       return 0;
  //    }
   //}
   return 1;
}


PreFld()
{

  for ( int ind=0; ind<CountInd; ind++ )
   {
     Fld[ind] = 0;  
   }

}


SetupExcel()
{
  xls = CreateObject("Excel.Application");
  GetCurrentDirectory(len,Dir);
  nm = "t_razved\\KB002.xls";
  WorkDir = Dir + "\\";
  xls.Caption = OemToAnsi("Ведомость");
  xls.Workbooks.Add(WorkDir+nm);
  wb = xls.Workbooks(1);
  wsh = wb.Worksheets.Item(1);
  return 0;
}
            

WriteToCell(cel,s)
{
  wsh.Range(static_cast_to_string(cel)).Value = static_cast_to_string(s);
  return 0;
}

Setup()
{ 
  int bTime = false;   // false-показывать процент,
                       // true-показывать оставшееся время

  CMsg = CreateObject("ProgressBar");
  CMsg.Initial(0,100,1);
  CMsg.SetShowTime(static_cast_to_int(bTime));

  CFile = CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
  CFile.SetFlagBrowse(0);             // запрещаем просмотр

  CTabl = CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
  cr = CTabl.Count_Rcr();             // число рабочих записей в таблице   
  cfld = CTabl.Count_Fld();           // число полей в таблице
  cr_ins = CTabl.GetCountInsertRcr(); // число выделенных записей

  if ( cr_ins ) rec_work = cr_ins;    // число записей которые должны быть обработаны
  else          rec_work = cr;

  tmpi = rec_work + CntHead + CntFoot;

  if ( tmpi > CntStr * 2 )
    vp = 2;

  if ( tmpi > CntStr && tmpi <= CntStr * 2 )
    vp = 1;

  if ( tmpi <= CntStr || rec_work <= 1 )
    vp = 0;

  return 0;
}

PrintTableToExcel(Frst)
{ // печать строки в Excel
  wsh.Rows(n).EntireRow.Insert();
  wsh.Rows(n-2).Select();  // которую будем копировать
  xls.Selection.Copy(wsh.Rows(n-1)); // куда копировать
    
 
  
  char c1[9], c2[9], c3[9], c4[9], c5[9];
       
       

  sprintf(c1,"B%d",n-2);
  sprintf(c2,"C%d",n-2);
  sprintf(c3,"D%d",n-2);
  sprintf(c4,"E%d",n-2);
  sprintf(c5,"F%d",n-2);
    

  WriteToCell(c1,atoi(Frst));       
  WriteToCell(c2,Kol1);  
  WriteToCell(c3,static_cast_to_double(Summ1));
  WriteToCell(c4,static_cast_to_double(Kol2));
  WriteToCell(c5,static_cast_to_double(Summ2));
  
  PreFld();
  n=n+1;
   return 0;
}

PrintTableToExcel2(Frst)
{ // печать строки в Excel
  wsh.Rows(n).EntireRow.Insert();
  wsh.Rows(n-2).Select();  // которую будем копировать
  xls.Selection.Copy(wsh.Rows(n-1)); // куда копировать
  char c1[19], c2[9], c3[9], c4[9], c5[9], c6[9];
  itostr=tmpstr+Frst;     
      
  sprintf(c1,"B%d",n-2);
  sprintf(c2,"C%d",n-2);
  sprintf(c3,"D%d",n-2);
  sprintf(c4,"E%d",n-2);
  sprintf(c5,"F%d",n-2);
  sprintf(c6,"G%d",n-2);
  
  WriteToCell(c1,OemToAnsi(itostr));       
  WriteToCell(c2,KolPod1);  
  WriteToCell(c3,static_cast_to_double(SumPod1));
  WriteToCell(c4,KolPod2);
  WriteToCell(c5,static_cast_to_double(SumPod2));
  SumPod1=0; SumPod2=0;
  KolPod1=0; KolPod2=0;
  
  n=n+1;
  return 0;
 
}