Anylogic Distribution Network соединение с базой данных - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть конкретный вопрос, касающийся модели Anylogic, которую я пытаюсь построить.

У меня есть 3 таблицы:

  1. соединений с колонками подключен постоянного тока и подключен клиента
  2. клиент с колонками имя пользователя и спрос
  3. dcdetails со столбцами dcname и dccapactiy

Я пытаюсь написать код Java, который соединяет каждый DC в первой таблице ( connecteddc ) с каждым назначенным клиентом ( connectedcustomer ) и повторяет этот процесс несколько раз, чтобы создать точная сеть. Я попытался использовать несколько вариантов кода, как показано ниже.

for (int i=0; i<3 ; i++){
        dc.get(i).LinktoCustomers.connectTo(Locations.get(selectFirstValue(false, int.class, "SELECT connectedcustomer FROM connections WHERE connectedDC = "+i+";")));
}

Этот код подключает только 1 DC к 1 клиенту. Эта проблема возникает в части кода «selectFirstValue».

1 Ответ

0 голосов
/ 09 апреля 2019

Запрос к базе данных

Вам нужно использовать одну из возможностей для получения всех соответствующих записей базы данных, а не только первую, как вы делаете с 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;
...