Community

Уважаемые разработчики! Возможно ли реализовать добавление данных в пустую табличную функцию? Если в модель добавить пустую табличную функцию, с любыми параметрами "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
Антон, создавая табличную функцию (Table Function), Вы должны задать как минимум две пары аргументов и значений. Однако, если Вам необходимо добавлять значения в таблицу уже в процессе моделирования, то для этого можно использовать метод setArgumentsAndValues(double[], double[]), которому в качестве параметров передаются два массива чисел типа double.
Каким образом метод setArgumentsAndValues(double[], double[]) добавляет значения в табличную функцию? Имеется ли возможность опускать значения в последовательности при добавлении? Если использовать массив для добавления, то argument получает последовательность значений. Можно ли опускать при добавления через метод function равное нулю? Или может быть имеется альтернативный способ, добавления в табличную функцию по значению (строке)?
Антон, честно говоря, не понял, что значит "опускать значения"? Используя данный метод, Вы по сути заново задаете значения аргумента и функции; другого метода для изменения этих значений нет.
Данные из массива добавляются строго по диапазону Создаются массивы: 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 Что я делаю не так?
Антон, а как Вы получаете значения функции после того, как добавили новые значения?
Исходные данные книги 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(); } -------------------------------------------------
Антон, проверьте Ваш код: там есть ошибки, связанные с порядком элементов и значением счетчиков. Метод setArgumentsAndValues здесь не при чем. Кстати, почему Вы не используете объект Database?
На данный момент используется версия educational, не позволяющая использовать полный функционал. Все-таки неясно в виду чего данные массива, отличаются от данных добавленных из массива в табличную функцию через метод?
Антон, я не могу указать места, где у Вас ошибки в коде. Просто проверьте данные, которые Вы добавляете и те, которые потом выводите на экран из табличной функции, и убедитесь, что они совпадают.
MESSAGE
MESSAGE
MESSAGE