//  модуль для приёма инфо по уже перечисленным суммам из таблиц,  выделенных в списках перечислений (алименты)
//  вызов из Ф-ция для приёма из файла   user\alim_ctrl,Dialog,0


int alim_kol = 100000;             //  колич алиментщиков
double alim_pre[alim_kol];         //  массив,  где  [Таб№] = сумма перечисленная ранее

string alim_pre2[100000][10];              //20230402   10000 алиментщиков и у каждого до 10 перечислений

var CTabl   = CreateObject("CurPrnTbl");         // текущая таблица
var SpTabl  = CreateObject("CurPrnTbl");         // таблицы из списка
int CountTabl = 0;

Dialog( AdrCTabl,              // адрес передаваемой таблицы
        AdrCListTabl,          // адрес списка таблиц
        RcrInList              // номер записи в списке таблиц
     )
{
   CTabl.Initial(AdrCTabl);
   var CListTabl = CreateObject("CurPrnTbl");       // список таблиц
   CListTabl.Initial(AdrCListTabl);

   init_001();     // инициализация массива  alim_pre[alim_kol]
   init_002();     // инициализация массива  alim_pre2[alim_kol]

   for ( int LRcr=0; LRcr<CListTabl.Count_Rcr(); LRcr++ )         // цикл по списку таблиц для чтения данных
    {
      if( CListTabl.Check_Empty_Rcr(LRcr) || !CListTabl.Flag_Action_0(LRcr) ) continue;
      long newt = CListTabl.GetTableFromList(LRcr);              if ( !newt ) continue;

      SpTabl.Initial(newt);
      CountTabl = CountTabl + 1;
                                   
      ReadTbl();            //  вызываем модуль чтения данных из  SpTabl, инициализированной newt
    }


   if (ESC==Panel_Zapros(" Прием информации из таблиц ","",
                        " Всего таблиц  ",CountTabl, 3 )) return ESC;
                                                                
   WritTbl();          //  вызываем модуль записи в текущую таблицу

   return 1;
}


ReadTbl()
{
   //   Читаем очередную таблицу из списка  выбранных таблиц 
   for ( int RcrTbl=0; RcrTbl<SpTabl.Count_Rcr(); ++RcrTbl )   // идём по строкам таблицы         
   {
    int tn  = atoi(SpTabl.TextS("C_FIO",RcrTbl));
    //int ls  = atoi(SpTabl.TextS("LS",RcrTbl));                 // 20230402  
    string ls  = to_string(SpTabl.TextS("LS",RcrTbl));    FreeSpaceString(ls,3,"");
    double sum_ls = atof(SpTabl.TextS("ALIM_PS",RcrTbl));      // 20230402

    string mes_Tbl = to_string(RcrTbl);
    string mes_tn = to_string(tn); string mes_ls = to_string(ls);
    string mess = mes_tn + "; " + mes_ls + "; " + mes_Tbl;

    int rec = 1;
    int rec_new = 1;

    for ( int zzz=0; zzz<3; zzz++)      // проверяем 10 записей в массиве у tn на наличие информации
    {
     rec = 0;
     string mes_zzz = to_string(zzz); 
     char Str[100];

     if((alim_pre2[tn][zzz] != ' ') && (rec_new != 0))      // если запись существует то расшифровываем её
     {      
//         string rec001 = to_string(alim_pre2[tn][zzz]); FreeSpaceString(rec001,3,"");
//         AmbaMessageBox("Таб№_ "+mes_tn+"  ЛС_"+mes_ls," Обнаружена запись  "+rec001,0, 0);

      sprintf(Str,"%s",to_string(alim_pre2[tn][zzz]));  FreeSpaceString(Str,3,"");              // из массива в Str  
      var ZParam = CreateObject("ParamFuncRW");  ZParam.IInitial(to_string(Str),";",3);         // инициализир с разделителем ( ; )

      char zz1[90];   sprintf(zz1,"%s", to_string(ZParam.Get(0))); FreeSpaceString(zz1,3,"");   // ЛС получателя
      char zz2[90];   sprintf(zz2,"%s", to_string(ZParam.Get(1))); FreeSpaceString(zz2,3,"");   // сумма  в формате  char
      double sm_zz2= atof(zz2);                                                                 // сумма  в формате  double

//      if(atoi(zz1) == ls)            // если запись с таким ЛС существует то складываем суммы ( таблица + запись )
      if(to_string(zz1) == ls)
       {
        sm_zz2 += sum_ls;                                                                       // добавляем сумму      
        sprintf(Str,"%s;%s",to_string(ls),to_string(sm_zz2));  FreeSpaceString(Str,3,"");       // создаём запись с новой суммой
        rec = 1;
       }
//      if(atoi(zz1) != ls) rec = 0;
      if(to_string(zz1) != ls) rec = 0;
     }

     if((alim_pre2[tn][zzz] == ' ') && (rec_new != 0))   // если записи ещё нет (пустая)
      {
       //   AmbaMessageBox("Таб№_ "+mes_tn+"  Строка_"+mes_zzz," Нет записи для ЛС_"+mes_ls,0, 0);
       sprintf(Str,"%s;%s",to_string(ls),to_string(sum_ls));  FreeSpaceString(Str,3,"");       // создаём запись в Str      
       rec = 1;
      }


     string mestnzz = mes_tn + "__" + mes_zzz;     string mes_sum = to_string(sum_ls);

     if((rec != 0) && (rec_new != 0))     
      {              
        alim_pre2[tn][zzz] = to_string(Str);           // пишем запись в массив
       
//        rec_alim2(tn,ls,sum_ls,zzz,Str);
        rec = 0;
        rec_new = 0;
      }
                                           //      if (rec == 0) break;
    }


    alim_pre[tn]  += atof(SpTabl.TextS("ALIM_PS",RcrTbl));     // добавляем сумму в массив по tn  !_-первый вариант  
   }
}


WritTbl()
{
  for ( int LRcr=0; LRcr<CTabl.Count_Rcr(); LRcr++ )       // цикл по текущей таблице
   {                                          //___информация по строке таблицы
    int tn  = atoi(CTabl.TextS("C_FIO",LRcr));
    //int ls  = atoi(CTabl.TextS("LS",LRcr));
    string ls  = to_string(CTabl.TextS("LS",LRcr));     FreeSpaceString(ls,3,"");
    double sm_tot  = atof(CTabl.TextS("Alim_tot",LRcr));   // общая сумма алим

    double sm_prch = 0.00;                                 // сумма из массива (перечисленная ранее)
         //   string mes_tn = to_string(tn);   string mes_LRcr = to_string(LRcr);         //   AmbaMessageBox("Таб№_ "+mes_tn+"  Строка_"+mes_LRcr,"  Процент",0, 0);


    for ( int zzz=0; zzz<3; zzz++)      // проверяем 10 записей в массиве у tn на наличие информации
     {
       char Str[100];

       string sTR = to_string(alim_pre2[tn][zzz]);
//       if (ESC==Panel_Zapros(" Запись №_ ","",
//                 "  zzz == : ",zzz, 10,
//                 "  ТН == : ",tn, 10,
//                 "  ЛС_таб == : ",ls, 30,
//                 "  Сум_таб == : ",sm_tot, 10,
//                 "  Str == : ",sTR, 30)
//                                                  ) return ESC;

       string mes_zzz = to_string(zzz);
       //AmbaMessageBox("ЛС_ "+ls+"  Строка_"+sTR,"  №_записи_"+mes_zzz,0, 0);

//       if(alim_pre2[tn][zzz] != ' ')       // если запись существует то расшифровываем её
       if(to_string(sTR) != ' ')
       {      
        sprintf(Str,"%s",to_string(alim_pre2[tn][zzz]));  FreeSpaceString(Str,3,"");               // пишем запись в Str  
        var ZParam = CreateObject("ParamFuncRW");  ZParam.IInitial(to_string(Str),";",3);         // инициализир с разделителем ( ; )

        char zz1[90];   sprintf(zz1,"%s", to_string(ZParam.Get(0))); FreeSpaceString(zz1,3,"");   // ЛС получателя
        char zz2[90];   sprintf(zz2,"%s", to_string(ZParam.Get(1))); FreeSpaceString(zz2,3,"");   // сумма  в формате  char
        double sm_zz2= atof(zz2);                                                                 // сумма  в формате  double

        string mes_zz1 = to_string(zz1);
        

        //if(atoi(zz1) == ls)            // если LS из таблицы (ls)  совпадает с ЛС строки массива (zz1)
        if(mes_zz1 == ls)
        {
          //AmbaMessageBox("ЛС_ "+ls+"  zz1_"+mes_zz1,"  №_записи_"+mes_zzz,0, 0);

          sm_prch = sm_tot - sm_zz2;                          // сумма к перечислению
          CTabl.STextS("Alim_pre",LRcr,to_string(sm_zz2));
          CTabl.STextS("ALIM_PS",LRcr,to_string(sm_prch));      


        }
       }
     }


//    if (alim_pre[tn])
//     {
//      double sm_tot  = atof(CTabl.TextS("Alim_tot",LRcr));   // общая сумма алим
//      double sm_prch = sm_tot - alim_pre[tn];                // сумма к перечислению
         //double sm= alim_pre[tn];  //string mes_sm = to_string(sm);  AmbaMessageBox("Таб№_ "+mes_tn+"   Сумма_"+mes_sm,"  Процент",0, 0);
//      CTabl.STextS("Alim_pre",LRcr,to_string(alim_pre[tn]));
//      CTabl.STextS("ALIM_PS",LRcr,to_string(sm_prch));
//     }

   }

  CTabl.Rewrite();
}

init_001()
{
 for(int zap=0; zap<99999; zap++)
  {
   alim_pre[zap] = 0;
  }
}

init_002()
{
 for(int zap=0; zap<99999; zap++)
  {
   for(int zap2=0; zap2<9; zap2++)  alim_pre2[zap][zap2] = ' ';
  }
}

rec_alim2(tn1,ls1,sum_ls1,zzz1,str)
{
 int zzz = atoi(zzz1);
 int tn = atoi(tn1);
 string ls = to_string(ls1);
 double sum_ls = atof(sum_ls1);
 string Str = to_string(str);
       if (ESC==Panel_Zapros(" Запись в массив  ","",
                 "  ТН == : ",tn, 10,
                 "  ЛС_таб == : ",ls, 30,
                 "  Сум_таб == : ",sum_ls, 10,
                 "  zzz == : ",zzz, 10,
                 "  Str == : ",Str, 30)
                                                  ) return ESC;

       // alim_pre2[tn][zzz] = to_string(Str);           // пишем запись в массив
}