// Передача сумм в ОАО АКБ "РОСБАНК"
// ОСР_27.08.2014

var CTabl;  // объект класса для работы таблицей  

int idxOrder      = 0,  // №№
    idxF          = 1,  // Ф
    idxI          = 2,  // И
    idxO          = 3,  // О
    idxNSh        = 4,  // номер счета
    idxSum        = 5,  // сумма
	
    idxDog        = 6,  // номер контракта
    idxDateReestr = 7,  // дата реестра
    idxNumReestr  = 8,  // номер реестра
    idxNumPP      = 9,  // номер платежного поручения
    idxDatePP     = 10, // дата платежного поручения
    idxNumID      = 11, // ID-Клиента 6 знаков

    idxTN         = 12, // табельный номер
    idxPODR       = 13, // Подразделение
    
    nFld=14;  // число элементов в массиве Fld

int    Fld[nFld];

// Передача в файл
SendRosB(AdrCTabl, AdrCListTabl, RcrInList)
{
  var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
  CFile.SetFlagBrowse(0);               // запрещаем просмотр
  CFile.SetFlag_Print(0);

  CTabl=CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
  CTabl.Initial(AdrCTabl);
  int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице   
    if ( !cr || (cr==1 && CTabl.Check_Empty_Rcr(0)) ) return false;

  var xls=CreateObject("Excel.Application");  // создаем объект Excel.Application, т.е. запускаем Excel, если он установлен конечно
  char Dir[128];                              // строка для текущей директории
  GetCurrentDirectory(128,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="rosbank_sum.xlt";                        // имя Excel'евского файла
  var WorkDir = Dir + "\\"+NameCommonDir()+"\\";         
  xls.Caption=OemToAnsi("limit");// заголовок (в windows кодировке)
  var Workb=xls.Workbooks.Add(WorkDir+nm);    // открываем в Excel'е наш файл ls.xls

  var wsh = Workb.Worksheets.Item(1);       // создаем ссылку на на наш worksheet чтобы избежать впоследствии длинных записей
  wsh.Select();

  var CMsg = 0;    // Процент выполненной работы

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

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

  if ( !FillNumFld() ) return false; //определяем необходимые нам номера полей

  double sum, ItogSum=0; 
   // Запрос дополнительной информации
   char Numdog[256], DateR[256], NumR[256], NumP[256], DateP[256], ID[256];
   Numdog=CTabl.TextS("NumDog",0); // номер контракта
   DateR=CTabl.TextS("DateR",0); // дата реестра
   NumR=CTabl.TextS("NumR",0);   // номер реестра
   NumP=CTabl.TextS("NumPP",0);  // номер платежного поручения
   DateP=CTabl.TextS("DatePP",0); // Дата платежного поручения
   ID=CTabl.TextS("NumID",0);     // ID-клиента в банке
   
   
   if (ESC==Panel_Zapros(" Введите дополнительные данные ","",
                    "  ID клиента",ID, 6,
                    "  Номер контракта",Numdog, 10,
					"  Дата реестра",DateR, 10,
					"  Номер реестра",NumR, 10,
					"  Номер платежного поручения",NumP, 10,
					"  Дата платежного поручения",DateP, 10) 
      ) return ESC;
   FreeSpaceString(Numdog,3,"");
   CTabl.STextS("Numdog",0, static_cast_to_string(Numdog));
   FreeSpaceString(DateR,3,"");
   CTabl.STextS("DateR",0, static_cast_to_string(DateR));
   FreeSpaceString(NumR,3,"");
   CTabl.STextS("NumR",0, static_cast_to_string(NumR));
   FreeSpaceString(NumP,3,"");
   CTabl.STextS("NumPP",0, static_cast_to_string(NumP));
   FreeSpaceString(DateP,3,"");
   CTabl.STextS("DatePP",0, static_cast_to_string(DateP));
   FreeSpaceString(ID,3,"");
   CTabl.STextS("NumID",0, static_cast_to_string(ID));
   CTabl.Rewrite();
   
   char Org[256];
   GetEnterpriseVar("ИМЯП", Org,255);  // Наименование предприятия или отделения иностранной организации
   FreeSpaceString(Org,3,""); OemToChar(Org,Org);
   WriteToCell(wsh,"D10",Org);            // пишем в ячейку название организации
   
   // Шапка формы
   WriteToCell(wsh,"Contract",ID); // ID клиента
   
   WriteToCell(wsh,"D11",Numdog);
   WriteToCell(wsh,"D12",DateR);
   WriteToCell(wsh,"D13",NumR);
   WriteToCell(wsh,"D14",NumP);
   WriteToCell(wsh,"D15",DateP);
   
  int ShStr=20; int j=1;
  char nnn[256], str[256], str2[256], str3[256], dog_num[256];
  try
  {
  // цикл по записям таблицы
  for (int zap=0; zap<cr; zap++)
  {
    // progress bar - чтобы видеть процент выполненной работы до того как появится результат
    if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
    {
      return 0;
    }
    
    // ФИО
    str=CTabl.Text(Fld[idxF],zap);
    FreeSpaceString(str,3,""); OemToChar(str,str);
    str2=CTabl.Text(Fld[idxI],zap);
    FreeSpaceString(str2,3,""); OemToChar(str2,str2);
    str3=CTabl.Text(Fld[idxO],zap);
    FreeSpaceString(str3,3,""); OemToChar(str3,str3);

    sprintf(nnn,"A%d",ShStr);
    WriteToCell(wsh,nnn,str+" "+str2+" "+str3);  

    // табельный номер
     str=CTabl.Text(Fld[idxTN],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"B%d",ShStr); WriteToCell(wsh,nnn,str);

    // Отдел
     str=CTabl.Text(Fld[idxPODR],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"C%d",ShStr); WriteToCell(wsh,nnn,str);

    // № счета
    str=CTabl.Text(Fld[idxNSh],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"D%d",ShStr);
    WriteToCell(wsh,nnn,str);
	// Валюта
	sprintf(nnn,"E%d",ShStr);
    WriteToCell(wsh,nnn,"RUB");
	
    // summa
    sum = atof(CTabl.Text(Fld[idxSum],zap));
    sprintf(nnn,"F%d",ShStr);
    sprintf(str,"%14.2f",sum);
    WriteToCell(wsh,nnn,str); 

    ItogSum = ItogSum+sum; 

    if (zap>0)
    {   
         // добaвляем строку
         wsh.Rows(ShStr+1).Insert();
    }
    j++;
    ShStr++;
   }
  wsh.Rows(ShStr+1).Delete();
  wsh.Rows(ShStr).Delete();
  //ShStr++;
  
  
  //Itog summa
  sprintf(nnn,"F%d",ShStr);
  sprintf(str,"%.2f",ItogSum);
  OemToChar(str,str);
  WriteToCell(wsh,nnn,str); 
  // Расчетный счет организации
   GetEnterpriseVar("РСЧ", str,255);   // расчетный счет предприятия
   sprintf(nnn,"D%d",ShStr);
   FreeSpaceString(str,3,""); OemToChar(str,str);
   WriteToCell(wsh,nnn,str);


  xls.Visible=true;           // делаем Excel видимым
  }
 catch(object err)
   {
      SayError(err);
   }
   catch(...)
   {
      ;
   }

   return 0;
}

FillNumFld()
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
   Fld[idxOrder]      = CTabl.Find_Name_Fld("Order");    
   Fld[idxF]          = CTabl.Find_Name_Fld("FCf");
   Fld[idxI]          = CTabl.Find_Name_Fld("FCi");
   Fld[idxO]          = CTabl.Find_Name_Fld("FCo");
   Fld[idxNSh]        = CTabl.Find_Name_Fld("Account");
   Fld[idxSum]        = CTabl.Find_Name_Fld("Summa");
   Fld[idxDog]        = CTabl.Find_Name_Fld("NumDog");
   Fld[idxDateReestr] = CTabl.Find_Name_Fld("DateR");
   Fld[idxNumReestr]  = CTabl.Find_Name_Fld("NumR");
   Fld[idxNumPP]      = CTabl.Find_Name_Fld("NumPP");
   Fld[idxDatePP]     = CTabl.Find_Name_Fld("DatePP");
   Fld[idxNumID]      = CTabl.Find_Name_Fld("NumID");
   Fld[idxTN]         = CTabl.Find_Name_Fld("FCtn");
   Fld[idxPODR]       = CTabl.Find_Name_Fld("FCpodr");
  
   for ( int ii=0; ii<nFld; ii++ )
     if ( Fld[ii]==-1 )
     {
        AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
        return false;
     }
   return true;
}

WriteToCell(&WSheet,&Cell,&strok)
// WSheet - ссылка на worksheet
// Cell - имя ячейки
// str - значение, которое требуется записать в ячейку Cell рабочего листа WSheet
{
  string t = static_cast_to_string(strok);

  if ( strlen(t) )
    WSheet.Range(static_cast_to_string(Cell)).Value = t;
   
  return 0;
}
