Запрос к базе данных
Вам нужно использовать одну из возможностей для получения всех соответствующих записей базы данных, а не только первую, как вы делаете с selectFirstValue()
.Вот один из способов сделать это:
for (int i=0; i<dc.size() ; i++){
List<Tuple> rows = selectFrom(connection)
.where(connection.connecteddc.eq(dc.get(i).dcName))
.list();
for (Tuple row : rows) {
dc.get(i).connectTo(getCustomerByName(row.get(connection.connectedcustomer)));
}
}
Тип: AnyLogic предлагает вам помощника для создания таких запросов, которые вы найдете на панели инструментов AnyLogic в разделе «Вставка запроса к базе данных».Выглядит это так: AnyLogic Database Query Assistant
Другие вещи
Я изменил пару других вещей, которые привлекли мое внимание:
- Чтобы добавить соединение, вы используете
dc.get(i).LinktoCustomers.connectTo(...)
.Нет необходимости использовать специальную переменную для соединений, достаточно просто добавить ее к стандартным соединениям, используя: dc.get(i).connectTo(...)
- Вы просматриваете список контроллеров домена с жестко закодированным индексом max.Как только вы измените количество записей в таблице DC, код больше не будет работать.Я рекомендую что-то вроде этого:
for (int i=0; i<dc.size() ; i++){...}
. - Вы дали название «Местоположение» своему населению типа агента «Клиент».Это сбивает с толку использование имени популяции, которое вообще не отражает базовый тип агента.Я рекомендую переименовать его, например, «Клиенты».
- Для доступа к вашим DC вы сохраняете и используете индексный номер DC в качестве целого числа в таблицах.Чтобы быть в безопасности, я рекомендую вместо этого использовать уникальные строковые идентификаторы, которые будут работать, даже если вы измените порядок таблицы.Чтобы это работало, вам нужно «проанализировать» Id (хранящийся в таблицах) для объекта Customer.
Это может быть сделано в функции getCustomerByName(String name)
, подобной этой (хотя очевидно, что здесь отсутствует обработка ошибок):
for(Customer c:Customers){
if(c.custName.equals(name)){
return c;
}
}
return null;