- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 
                        class CStateShortMap
{
public:
  CStateShortMap(int id, TDateTime time, TZReadOnlyQuery* query);
  void Load(TZReadOnlyQuery* query, TDateTime time);
  int GetTypeSize() const { return Items.size(); }
  char GetType(int idx)
  {
    return Items[idx].first;
  }
  std::vector< std::vector<CStateShortItem> >& GetItems(char type)
  {
    for(int i=0; i < Items.size(); i++)
    {
      if( Items[i].first == type )
        return Items[i].second;
    }
    return Items[0].second;
  }
private:
  const int Id;
  std::vector< std::pair<char, std::vector< std::vector<CStateShortItem> > > > Items;
};
CStateShortMap::CStateShortMap(int id, TDateTime time, TZReadOnlyQuery* query)
 : Id(id)
{
  Load( query, time );
}
void CStateShortMap::Load(TZReadOnlyQuery* query, TDateTime time)
{
  Items.clear();
  String sql;
  sql.sprintf( "select map.id_, equipment.type_"
               " from map left join equipment on map.equipment_id=equipment.id_"
               " where map.station_id=%d order by equipment.type_", Id );
  query->SQL->Text = sql;
  query->Open();
  vector< pair<int, char> > mapId;
  while( !query->Eof )
  {
    mapId.push_back( pair<int, char>(query->FieldByName( "id_" )->AsInteger, query->FieldByName( "type_" )->AsString[1]) );
    query->Next();
  }
  Items.clear();
  for(int i=0; i<mapId.size(); i++)
  {
    sql.sprintf( "select status.color, status.name_, map.number_equipment, equipment_status.status_id, equipment_status.begin_, equipment_status.plan_end_"
                 " from equipment_status left join map on equipment_status.map_id=map.id_"
                 " left join status on equipment_status.status_id=status.id_"
                 " where equipment_status.map_id=%d and begin_<='%s' order by equipment_status.begin_ desc limit 1",
                 mapId[i].first, time.FormatString("yyyy-mm-dd hh:nn:ss") );   //equipment_status.id_
    query->SQL->Text = sql;
    query->Open();
    if( query->Eof ) continue;
    int id[] = { 0, 1, 1, 1, 1, 2, 3, 1, 1, 1 };
    int j;
    for(j=0; j<Items.size(); j++)
      if( Items[j].first==mapId[i].second )
        break;
    if( j!=Items.size() )
      Items[j].second[id[query->FieldByName( "status_id" )->AsInteger]].push_back( CStateShortItem( query ) );
    else
    {
      Items.push_back( std::pair<char, std::vector< std::vector<CStateShortItem> > >( mapId[i].second, std::vector< std::vector<CStateShortItem> >() ) );
      Items[ Items.size()-1 ].second.resize( 4 );
      Items[ Items.size()-1 ].second[ id[query->FieldByName( "status_id" )->AsInteger] ].push_back( CStateShortItem( query ) );
    }
  }
  for(int i=0; i<Items.size(); i++)
  {
    sort( Items[i].second[0].begin(), Items[i].second[0].end() );
    sort( Items[i].second[1].begin(), Items[i].second[1].end() );
    sort( Items[i].second[2].begin(), Items[i].second[2].end() );
    sort( Items[i].second[3].begin(), Items[i].second[3].end() );
  }
}