Не уверен, что для этого нужны оконные функции.
Приведенный ниже пример просто сам связывает таблицу и группы по продуктам C12.
blockquote>CREATE TABLE sales_performance ( product_ID varchar(3) not null, sales_period varchar(4) not null, sales_qty char(2) not null, sales_index char(2) not null, product_sub char(3) not null, goal_met char(1) not null, PRIMARY KEY (product_ID, sales_period) )
blockquote>INSERT INTO sales_performance (product_ID,sales_period,sales_qty,sales_index,product_sub,goal_met) VALUES ('C12','0001','15','20','D71','Y') ,('D71','0001','07','09','C12','N') ,('F20','0001','25','30','C05','Y') ,('C05','0001','10','15','F20','N') ,('C12','0002','15','30','C05','Y') ,('C05','0002','12','06','C12','N') ,('D71','0002','30','20','F20','Y') ,('F20','0002','20','15','D71','N') ,('C12','0003','05','04','F20','N') ,('F20','0003','40','35','C12','Y') ,('D71','0003','20','20','C05','Y') ,('C05','0003','12','10','D71','N') ;
SELECT c12.*, sub.sales_index FROM sales_performance c12 LEFT JOIN sales_performance sub ON sub.sales_period < c12.sales_period AND ( (sub.product_ID = c12.product_sub AND sub.goal_met = 'N') OR (sub.product_ID = c12.product_ID AND sub.goal_met = 'Y') ) WHERE c12.product_id = 'C12' ORDER BY c12.product_ID, c12.sales_period, sub.product_ID
product_ID | sales_period | sales_qty | sales_index | product_sub | goal_met | sales_index :--------- | :----------- | :-------- | :---------- | :---------- | :------- | :---------- C12 | 0001 | 15 | 20 | D71 | Y | null C12 | 0002 | 15 | 30 | C05 | Y | 15 C12 | 0002 | 15 | 30 | C05 | Y | 20 C12 | 0003 | 05 | 04 | F20 | N | 20 C12 | 0003 | 05 | 04 | F20 | N | 30 C12 | 0003 | 05 | 04 | F20 | N | 15blockquote>SELECT c12.* , ROUND(AVG(sub.sales_index),1) AS sales_index_goal FROM sales_performance c12 LEFT JOIN sales_performance sub ON sub.sales_period < c12.sales_period AND ( (sub.product_ID = c12.product_sub AND sub.goal_met = 'N') OR (sub.product_ID = c12.product_ID AND sub.goal_met = 'Y') ) WHERE c12.product_id = 'C12' GROUP BY c12.product_ID, c12.sales_period ORDER BY c12.product_ID, c12.sales_period;
product_ID | sales_period | sales_qty | sales_index | product_sub | goal_met | sales_index_goal :--------- | :----------- | :-------- | :---------- | :---------- | :------- | :--------------- C12 | 0001 | 15 | 20 | D71 | Y | null C12 | 0002 | 15 | 30 | C05 | Y | 17.5 C12 | 0003 | 05 | 04 | F20 | N | 21.7blockquote> [ 1110] db <> скрипка здесь
Как уже упоминалось другим автором, ваша проблема заключается в том, что исключение выдается в другом потоке, потоке отправки событий. Пара решений:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
// ... do something with exception here ...
}
});
В дополнение к этому, вы должны в принципе указывать код запуска вашего пользовательского интерфейса в SwingUtilities.invokeLater () .
Swing запускает вещи в потоке диспетчеризации событий. Вы пытаетесь перехватить его в главном потоке.
И обратите внимание, что Swing не является потокобезопасным, вы также должны делать что-то в потоке диспетчеризации событий.
Чтобы перехватить исключение, вы можете переопределить какой-то метод из этого стека. trace, как метод рисования из вашего компонента.
И для меня это исключение выглядит как ошибка, которую вы должны исправить, а не что-то, что вы должны скрыть, поймав.
Runtime exceptions like ArrayIndexOutOfBoundsException shows a programmer mistake. So it might be better to fix them rather catching and silently chewing it.
Just a wild guess for the cause of exception. Something concurrently remove rows from the table model's datavector once the JTable starts to draw the data on screen.
Как упоминалось выше, проблема заключается в том, где генерируется исключение - в потоке диспетчеризации событий.
Если если вы хотите установить блок try / catch, чтобы поймать эту конкретную проблему, я бы бросил его в метод рисования класса App. Переопределите его и поместите вызов super.paint в блок try catch.
Если вы хотите использовать универсальный способ перехвата необработанных исключений, взгляните на Thread.setUncaughtExceptionHandler . Вы вызываете этот метод с помощью обработчика исключений и можете работать со всеми исключениями, которые не попадают в ваше приложение.
Единственные подходящие способы, которые мне известны, для того, чтобы отлавливать исключения, выбрасываемые из EDT, это:
sun.awt.exception.handler
" (я использую
это и работает на всех Sun JDK 1.4,
1.5 и 1.6 минимум, плюс на IBM JDK 1.4 и 1.5 минимум; Я не проверял это на других JDK, хотя) Вы должны взглянуть на эту ветку , чтобы получить более полный обзор решений с их плюсами и минусами.