// Пример 14. Использование Map (читается как мэп)

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

int idxTN  =0, // табельный номер
    idxPODR=1, // подразделение
    idxFIO =2, // ФИО
    CntIdx =3;

int fld[CntIdx];

char str[256];

Primer14()
{
  Tabl = CreateObject("CurPrnTbl");

  FillFld();

  var Map = CreateObject("MMapLong"); // используем мульти-Map, т.е. допустимы одинаковые значения ключа
  FillMap(Map);

  for ( bool Cur=Map.InitIterator(); Cur; )
  {
    // работаем с первым (из одинаковых) значением key
    long rcr = atol(Map.GetCurValue());
    long key = Map.GetCurKey();

    long   tn   = atol(Tabl.Text(fld[idxTN],rcr)),
           podr = atol(Tabl.Text(fld[idxPODR],rcr));
    string fio  = Tabl.Text(fld[idxFIO],rcr); 

    FreeSpaceString(fio,3,""); // убираем лишние пробелы

    sprintf(str,"%7d %7d %-40.40s",tn,podr,fio); 
    print(str);

    for ( Cur=Map.Next(); Cur; Cur=Map.Next() )
    {
      // идем по следующим элементам map с таким же ключом key
      if ( key!=Map.GetCurKey() ) break; // если ключ сменился, выходим из этого цикла
      rcr = Map.GetCurValue();

      tn   = atol(Tabl.Text(fld[idxTN],rcr)),
      podr = atol(Tabl.Text(fld[idxPODR],rcr));
      fio  = Tabl.Text(fld[idxFIO],rcr); 

      FreeSpaceString(fio,3,""); // убираем лишние пробелы

      sprintf(str,"%7d %7d %-40.40s",tn,podr,fio); 
      print(str);
    }
  }
}


FillFld()
// находим поля в таблице и определяем их номера
{
  fld[idxTN]   = Tabl.Find_Name_Fld("TN");
  fld[idxPODR] = Tabl.Find_Name_Fld("PODR");
  fld[idxFIO]  = Tabl.Find_Name_Fld("FIO");
}

FillMap(&Map)
// заполяяем map
{
  int cnt=Tabl.Count_Rcr(); // полное число записей   
  long key;

  for ( long rcr=0; rcr<cnt; ++rcr) // идем по всей таблице
  {
    key = atol(Tabl.Text(fld[idxPODR],rcr));
    Map.Add(key,rcr); // элементом map в данном случае будет пара "подразделение, номер записи в таблице"
  }
}
