Уважаемые разработчики!
Возможно ли реализовать добавление данных в пустую табличную
функцию? Если в модель добавить пустую табличную функцию, с
любыми параметрами "Interpolation" и "Out of range", то происходит
ошибка при старте. Возможно каким-либо образом обойти данную
ошибку? Может имеется функция очищающая табличную функцию перед
добавлением данных?
При запуске модели происходит следующее исключение:
Error during model creation:
java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
at testing_model.Simulation.createRoot(Simulation.java:195)
at com.xj.anylogic.engine.ExperimentSimulation.a(ExperimentSimulation.java:202)
at com.xj.anylogic.engine.ExperimentSimulation.run(ExperimentSimulation.java:136)
at testing_model.Simulation.executeShapeControlAction(Simulation.java:84)
at testing_model.Simulation$1.action(Simulation.java:118)
at com.xj.anylogic.engine.presentation.ShapeControl.a(ShapeControl.java:175)
at
com.xj.anylogic.engine.presentation.ShapeControlManager$ControlActionThread.run(ShapeControlManager.java:236)
Caused by: java.lang.RuntimeException: Table function must have at least two arguments
at com.xj.anylogic.engine.TableFunction.setArgumentsAndValues(TableFunction.java:139)
at com.xj.anylogic.engine.TableFunction.<init>(TableFunction.java:48)
at testing_model.Main.<clinit>(Main.java:71)
... 7 more
Виктор Глейм — 03.12.07
Антон, создавая табличную функцию (Table Function), Вы должны задать как
минимум две пары аргументов и значений. Однако, если Вам
необходимо добавлять значения в таблицу уже в процессе
моделирования, то для этого можно использовать метод
setArgumentsAndValues(double[], double[]), которому в качестве параметров
передаются два массива чисел типа double.
Антон — 05.12.07
Каким образом метод setArgumentsAndValues(double[], double[]) добавляет значения в
табличную функцию?
Имеется ли возможность опускать значения в последовательности
при добавлении?
Если использовать массив для добавления, то argument получает
последовательность значений. Можно ли опускать при добавления
через метод function равное нулю? Или может быть имеется
альтернативный способ, добавления в табличную функцию по
значению (строке)?
Виктор Глейм — 05.12.07
Антон, честно говоря, не понял, что значит "опускать
значения"? Используя данный метод, Вы по сути заново задаете
значения аргумента и функции; другого метода для изменения этих
значений нет.
Антон — 05.12.07
Данные из массива добавляются строго по диапазону
Создаются массивы:
double[] ArgumentId;
double[] ResultPercent;
ArgumentId=new double[9];
ResultPercent=new double[9];
значение массивов ArgumentId[i] и ResultPercent[i]
1.0 - 0.24
2.0 - 0.29
3.0 - 0.25
4.0 - 0.16
5.0 - 0.04
6.0 - 0.01
7.0 - 0.0030
8.0 - 0.0015
9.0 - 5.0E-4
10.0 - 0.0010
после применения метода setArgumentsAndValues(ArgumentId[i], ResultPercent[i])
табличная функция содержит следующие данные (параметры
табличной функции "Interpolation" -> Linear и "Out of range" -> Nearest)
0 | 0.24
1 | 0.24
2 | 0.29
3 | 0.25
4 | 0.16
5 | 0.04
6 | 0.01
7 | 0.0030
8 | 0.0015
9 | 5.0E-4
Что я делаю не так?
Виктор Глейм — 05.12.07
Антон, а как Вы получаете значения функции после того, как
добавили новые значения?
Антон — 05.12.07
Исходные данные книги Excel:
-------------------------------------------------
количество чл. с. доля от об.с.
1 0,24
2 0,29
3 0,25
4 0,16
5 0,04
6 0,01
7 0,003
8 0,0015
9 0,0005
10 0,001
-------------------------------------------------
Текст функции:
-------------------------------------------------
double[] ArgumentId;
double[] ResultPercent;
try
{
// строка ининциализации подключения к книге Excel через ODBC по ранее
созданному алиасу "client_xls"
String connectionString = "jdbc:odbc:client_xls";
// региструем необходимый драйвер подключения к серверу
java.sql.DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
// определяем дескриптор подключения к книге Excel
sqlConnection = java.sql.DriverManager.getConnection(connectionString);
System.out.println("Начало инициализация к БД ===");
// инициализируем переменную для работы с интерфейсом сервера
// создаем дескриптор подключения для работы с сервером
// отключаем TYPE_FORWARD_ONLY, для включения функция last() и first()
Statement stmt = sqlConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
// создаем запрос возвращающий данные из книги Excel
ResultSet rs = stmt.executeQuery ("select * from [НаселениеСемьи$]");
// инициализируем курсор
rs.last();
// присваиваем значение количества строк
int count = rs.getRow();
rs.first();
System.out.println("Общее количество строк в запросе по членам семьи -
" + count);
// создаем массив с count количеством элементов
ArgumentId=new double[count];
ResultPercent=new double[count];
// создаем временные переменные для присваивания массивам
double percent = 0;
int id = 0;
// создаем переменную счетчика элементов массива
int i = 0;
// заполняем массивы
do
{
// записываем данные из текущей строки в переменные
percent = rs.getDouble(2);
id = rs.getInt(1);
// присваиваем переменную элементу массива
ArgumentId[i]=id;
ResultPercent[i]=percent;
i++;
}
while (rs.next());
// выводим данные из массивов
i=0;
while (i!=count)
{
System.out.println(ArgumentId[i] + " - " + ResultPercent[i]);
i++;
}
// заполняем табличные функции данными из массивов
probFamily.setArgumentsAndValues(ArgumentId, ResultPercent);
// выводим данные из табличной функции
System.out.println("Значения листа НаселениеСемьи === probFamily");
i=0;
while (i!=count)
{
System.out.println(i + " | " + probFamily.get(i));
i++;
}
System.out.println("Закрытие подключения ===");
rs.close();
stmt.close();
}
// Введено для контроля исключений
catch (Exception e)
{
// Ловим исключения
e.printStackTrace();
}
-------------------------------------------------
Виктор Глейм — 05.12.07
Антон, проверьте Ваш код: там есть ошибки, связанные с порядком
элементов и значением счетчиков. Метод setArgumentsAndValues здесь не при
чем.
Кстати, почему Вы не используете объект Database?
Антон — 06.12.07
На данный момент используется версия educational, не позволяющая
использовать полный функционал.
Все-таки неясно в виду чего данные массива, отличаются от данных
добавленных из массива в табличную функцию через метод?
Виктор Глейм — 06.12.07
Антон, я не могу указать места, где у Вас ошибки в коде. Просто
проверьте данные, которые Вы добавляете и те, которые потом
выводите на экран из табличной функции, и убедитесь, что они
совпадают.