Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Совершенно не вьезжаю в вывод данных в JTable 
:(
    Опции темы
sanik
Дата 23.12.2004, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.12.2004

Репутация: нет
Всего: 1



Совершенно не вьезжаю в вывод данных в JTable!

И книги и статьи НЕ ПОМОГАЮТ, не надо гвоорить сразу что я тупой.

Суть задачи простая: надо вывести на грид данные из sql server из вызванной хранимой процедуры

вот текст ТОГО как я СУМЕЛ все-таки вывести на грид эти данные
Код

public static Object[][] ExecStoredProc(String myOffice, String myDept, String activeStatus) {
       int i = 0;
       int j = 0;
       int numColumns = 0;

       ArrayList tableRow = new ArrayList();
       ArrayList multiRow = new ArrayList();
       Object[][] resultArray2D;
       CallableStatement cs = null;

   System.out.println("activeStatus =" + activeStatus);
   System.out.println("myOffice =" + myOffice);
   System.out.println("myDept =" + myDept);

       try {
         cs = con.prepareCall("{CALL SpSelEmployees3(?,?,?,?,?,?,?,?)}");
         cs.setString(1, "OfficeName");
         cs.setInt(2, Integer.parseInt(myOffice));
         cs.setInt(3, Integer.parseInt(myDept));
         cs.setInt(4, -1);
         cs.setString(5, "");
         cs.setString(6, "");
         cs.setInt(7, Integer.parseInt(activeStatus));
         cs.setString(8, "");

         ResultSet result = cs.executeQuery();
         ResultSetMetaData rsmd = result.getMetaData();

   System.out.println("number of columns="+ rsmd.getColumnCount());

         for (i = 1; i <= rsmd.getColumnCount(); i++) {
           tableRow.add(rsmd.getColumnName(i));
           numColumns = tableRow.size();  
         }
         multiRow.add(tableRow);
          tableRow = new ArrayList();
         while (result.next()) {
           for (i = 1; i <= rsmd.getColumnCount(); i++) {
             tableRow.add(result.getString(i));
           }
           multiRow.add(tableRow);
           tableRow = new ArrayList();
         }
         cs.close();
       }
       catch (SQLException ex) {
         System.err.print("SQLException: ");
         System.err.println(ex.getMessage());
       }
       System.out.println("a=" + numColumns);
       resultArray2D = new Object[multiRow.size() - 1][numColumns];

       for (i = 1; i < multiRow.size(); i++) {
         tableRow = (ArrayList) multiRow.get(i);
         for (j = 0; j < numColumns; j++) {
           resultArray2D[i - 1][j] = (Object) tableRow.get(j);
         }
         tableRow = null;
       }
      System.out.println("Rows="+ i); //multiRow.size());
       return resultArray2D;
     }


 ! 
 


Пожалуйста, пользуйся тегами [cоdе=jаvа] [/codе]



мне просто показали как резултсет загнать в массив и я так сделал, но это этого не стало легче

я не могу управлять выводом данных в гриде теперь!!!!

мне надо чтоб я мог указать конкретно какие колонки из резултсета показать в гриде (избирательно), но в тоже время система должна знать о всех других колонках (так как по ним я собираюсь делать разные фильтрации)

в дельфи было гораздо проще и легче - имеется dataset и все что с ним связано, а тут блиииин!!!!

а вот в другом классе я обновляю содержимое грида после смены офиса в дереве
Код

public void RefreshTable() {

// тут просто по-тупому даны названия колонок в гриде - но это непрпавильно - так ак реальные
данные в массиве приходят в другой последовательности
 columnNames = new String[] { "Id", "FirstName", "LastName", "Office", "Department", "JobTitle"};

// тут просто взял и присвоил массив в JTable

 e_data = DB.ExecStoredProc(myOffice, myDept, activeStatus);     //  Call stored procedure
SpSelectEmployees3 from SQL SERVER
 tableEmployees = new JTable(e_data, columnNames);     // populating grid with data from result
set = stored procedure SpSelectEmployees3


Это сообщение отредактировал(а) Domestic Cat - 23.12.2004, 16:56
PM MAIL ICQ   Вверх
AntonSaburov
Дата 23.12.2004, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 118



Можно использовать Vector. Строки и столбцы.

Один вектор содержит строки, которые в свою очередь тоже являются векторами. И отдельный вектор столбцов.
Вот схема - работу не проверял, времени нет.

Код

       Vector all_data = new Vector();
       for (int i=0; i<MAX_ROW; i++) {
           Vector raw_data = new Vector(3);
           raw_data.add("row:"+i+" column:1");
           raw_data.add("row:"+i+" column:2");
           raw_data.add("row:"+i+" column:3");
           all_data.add(raw_data);
       }

       Vector columns = new Vector(3);
       columns.add("Column 1");
       columns.add("Column 2");
       columns.add("Column 3");

       JTable tbl = new JTable(all_data, columns);


PM MAIL WWW ICQ   Вверх
igon
Дата 23.12.2004, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Пример РАБОТАЮЩЕЙ программы отображения ResultSet в JTable
Взял с http://www.google.com/url?sa=U&start=1&q=h...ble.java&e=7634, настроил под себя
Не вдаваясь в подробности: здесь используются две взаимосвязанные структуры - model и table. Данные закачиваются в model, отображаются через table, т.е. table можно рассматривать как "окошко" на модель. Для твоего случая - отображаешь данные как нужно (я сделал вставку для демонстрации отображения 3 столбцов), настраивая table, а для фильтрации используешь столбцы из model.
Код

/**
  @version 1.01 2001-07-18
  @author Cay Horstmann
*/

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import oracle.jdbc.OracleConnection;
import oracle.jdbc.OracleDriver;

/**
  This program shows how to display the result of a
  database query in a table.
*/
public class ResultSetTable
{  
  public static void main(String[] args)
  {  
     JFrame frame = new ResultSetFrame();
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.show();
  }
}

/**
  This frame contains a combo box to select a database table
  and a table to show the data stored in the table
*/
class ResultSetFrame extends JFrame
{  
   public  Properties   configCommon = new Properties();
   public  Connection   conn;
   public  String       url;           //= "jdbc:oracle:thin:@localhost:1521:bank2";
   public  String       userName;      //= "probe";
   public  String       userPwd;       //= "probe";

  public ResultSetFrame()
  {  
     setTitle("ResultSet");
     setSize(WIDTH, HEIGHT);

       try
         {
           parseConfig();
         }
         catch(Exception e)
         {
           e.printStackTrace();
         }

     /* find all tables in the database and add them to
        a combo box
     */

     Container contentPane = getContentPane();
     tableNames = new JComboBox();
     tableNames.addActionListener(new
        ActionListener()
        {
           public void actionPerformed(ActionEvent evt)
           {
              try
              {  
                 if (scrollPane != null)
                    getContentPane().remove(scrollPane);
                 String tableName
                    = (String)tableNames.getSelectedItem();
                 if (rs != null) rs.close();
                 String query = "SELECT * FROM " + tableName;
                 rs = stat.executeQuery(query);
                 if (scrolling)
                    model
                       = new ScrollingResultSetTableModel(rs);
                 else
                    model = new CachingResultSetTableModel(rs);

                 JTable table = new JTable(model);
// Только demo -  
// Показываем только подмножество столбцов - три
TableColumnModel tablelumnModel = table.getColumnModel();
while (table.getColumnCount()>3)
 {
   table.removeColumn(tablelumnModel.getColumn(1));  
 };
// Из table лишние столбцы удалены
// В model все столбцы остались
System.out.println("В table: "+table.getColumnCount()+", в model: "+model.getColumnCount());

                 scrollPane = new JScrollPane(table);
                 getContentPane().add(scrollPane,
                    BorderLayout.CENTER);
                 pack();
                 doLayout();
              }            
              catch(SQLException e)
              {  
                 e.printStackTrace();
              }
           }
        });
     JPanel p = new JPanel();
     p.add(tableNames);
     contentPane.add(p, BorderLayout.NORTH);

     try
     {  
        conn = getConnection();
        DatabaseMetaData meta = conn.getMetaData();
        if (meta.supportsResultSetType(
           ResultSet.TYPE_SCROLL_INSENSITIVE))
        {
           scrolling = true;
           stat = conn.createStatement(
              ResultSet.TYPE_SCROLL_INSENSITIVE,
              ResultSet.CONCUR_READ_ONLY);
        }
        else
        {
           stat = conn.createStatement();
           scrolling = false;
        }
        ResultSet tables = meta.getTables(null, "PROBE", null,
           new String[] { "TABLE" });
        while (tables.next())
           tableNames.addItem(tables.getString(3));
        tables.close();
     }
     catch(SQLException e)
     {  
        e.printStackTrace();
     }

     addWindowListener(new
        WindowAdapter()
        {
           public void windowClosing(WindowEvent event)
           {
              try
              {
                 conn.close();
              }
              catch (SQLException e)
              {
                 e.printStackTrace();
              }              
           }
        });
  }

   void parseConfig()
     {
       try
         {
           InputStream  in  = new FileInputStream(new File("Config.ini"));
           configCommon.load(in);
           in.close();
           url = "jdbc:oracle:thin:@"+configCommon.getProperty("URL");                  
           userName = configCommon.getProperty("LOGIN");
           userPwd = configCommon.getProperty("PASSWORD");
         }
         catch (FileNotFoundException fileNotFound)
           {
             JOptionPane.showMessageDialog(null, "Файл Config.ini "+fileNotFound);
             System.exit(1);
           }
         catch (IOException ioException)
           {
             JOptionPane.showMessageDialog(null, "Файл Config.ini "+ioException);
             System.exit(1);
           }
     }

   private Connection setConnection() throws SQLException
     {
       DriverManager.registerDriver(new OracleDriver());
       conn = (OracleConnection)DriverManager.getConnection(url, userName, userPwd);
       return conn;
     }

   public Connection getConnection() throws SQLException
     {
       if (conn == null)
         {
           setConnection();  
         }
       return conn;
     }

  private JScrollPane scrollPane;
  private ResultSetTableModel model;
  private JComboBox tableNames;
  private ResultSet rs;
  private Statement stat;
  private boolean scrolling;

  private static final int WIDTH = 400;
  private static final int HEIGHT = 300;
}

/**
  This class is the superclass for the scrolling and the
  caching result set table model. It stores the result set
  and its metadata.
*/
abstract class ResultSetTableModel extends AbstractTableModel
{  
  /**
     Constructs the table model.
     @param aResultSet the result set to display.
  */
  public ResultSetTableModel(ResultSet aResultSet)
  {  
     rs = aResultSet;
     try
     {  
        rsmd = rs.getMetaData();
     }
     catch(SQLException e)
     {  
        e.printStackTrace();
     }
  }

  public String getColumnName(int c)
  {  
     try
     {  
        return rsmd.getColumnName(c + 1);
     }
     catch(SQLException e)
     {  
        e.printStackTrace();
        return "";
     }
  }

  public int getColumnCount()
  {  
     try
     {  
        return rsmd.getColumnCount();
     }
     catch(SQLException e)
     {  
        e.printStackTrace();
        return 0;
     }
  }

  /**
     Gets the result set that this model exposes.
     @return the result set
  */
  protected ResultSet getResultSet()
  {  
     return rs;
  }

  private ResultSet rs;
  private ResultSetMetaData rsmd;
}

/**
  This class uses a scrolling cursor, a JDBC 2 feature,
  to locate result set elements.
*/
class ScrollingResultSetTableModel extends ResultSetTableModel
{  
  /**
     Constructs the table model.
     @param aResultSet the result set to display.
  */
  public ScrollingResultSetTableModel(ResultSet aResultSet)
  {  
     super(aResultSet);
  }

  public Object getValueAt(int r, int c)
  {  
     try
     {  
        ResultSet rs = getResultSet();
        rs.absolute(r + 1);
        return rs.getObject(c + 1);
     }
     catch(SQLException e)
     {  
        e.printStackTrace();
        return null;
     }
  }

  public int getRowCount()
  {  
     try
     {  
        ResultSet rs = getResultSet();
        rs.last();
        return rs.getRow();
     }
     catch(SQLException e)
     {  
        e.printStackTrace();
        return 0;
     }
  }
}

/*
  This class caches the result set data; it can be used
  if scrolling cursors are not supported
*/
class CachingResultSetTableModel extends ResultSetTableModel
{  
  public CachingResultSetTableModel(ResultSet aResultSet)
  {  
     super(aResultSet);
     try
     {  
        cache = new ArrayList();
        int cols = getColumnCount();
        ResultSet rs = getResultSet();

        /* place all data in an array list of Object[] arrays
           We don't use an Object[][] because we don't know
           how many rows are in the result set
        */

        while (rs.next())
        {  
           Object[] row = new Object[cols];
           for (int j = 0; j < row.length; j++)
              row[j] = rs.getObject(j + 1);
           cache.add(row);
        }
     }
     catch(SQLException e)
     {  
        System.out.println("Error " + e);
     }
  }

  public Object getValueAt(int r, int c)
  {  
     if (r < cache.size())
        return ((Object[])cache.get(r))[c];
     else
        return null;
  }

  public int getRowCount()
  {  
     return cache.size();
  }

  private ArrayList cache;
}







--------------------
Хотите поговорить об этом?
PM   Вверх
sanik
Дата 23.12.2004, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.12.2004

Репутация: нет
Всего: 1



спасибо ребята, адаптировал пример - сижу ковыряюсь в механизме.


итак:

Цитата
(я сделал вставку для демонстрации отображения 3 столбцов),
// Только demo - 
// Показываем только подмножество столбцов - три
TableColumnModel tablelumnModel = table.getColumnModel();
while (table.getColumnCount()>3)
{
  table.removeColumn(tablelumnModel.getColumn(1)); 
};



тут я вижу только количественно - взяли и ограничили число показываемых колонок до 3, а как конкретно только нужные колонки показывать?

например, как показать данные из поля LastName, FirstName, OfficeName, Department

Это сообщение отредактировал(а) sanik - 23.12.2004, 23:15
PM MAIL ICQ   Вверх
Domestic Cat
Дата 24.12.2004, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Код

// добавление столбцов
  DefaultTableModel model = new DefaultTableModel();
   JTable table = new JTable(model);
   model.addColumn("Col1");
   model.addColumn("Col2", new Object[]{"v2"});
   table.setAutoCreateColumnsFromModel(false);
   betterAddColumn(table, "Col3", new Object[]{"v3"});
//...
   public void betterAddColumn(JTable table, Object headerLabel,
                               Object[] values)
     {
       DefaultTableModel model = (DefaultTableModel)table.getModel();
       TableColumn col = new TableColumn(model.getColumnCount());
       if (table.getAutoCreateColumnsFromModel())
      {
           throw new IllegalStateException();
       }
       col.setHeaderValue(headerLabel);
       table.addColumn(col);
       model.addColumn(headerLabel.toString(), values);
   }

// вставка столбцов
   int rows = 10;
   int cols = 5;
   JTable table = new JTable(rows, cols);
   table.setAutoCreateColumnsFromModel(false);
   insertColumn(table, "New Column", null, 2);
   insertColumn(table, "New Column", null, table.getColumnCount());
//....
   public void insertColumn(JTable table, Object headerLabel,
                            Object[] values, int vColIndex) {
       betterAddColumn(table, headerLabel, values);
       table.moveColumn(table.getColumnCount()-1, vColIndex);
   }
//удаление столбца
  table.getColumnModel().remove(table.getColumn("Name"))




--------------------

PM   Вверх
sanik
Дата 24.12.2004, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.12.2004

Репутация: нет
Всего: 1



трудно понять smile
имеется "добавление столбцов" и "вставка столбцов" и два варианта кода!?

попробовал - совместо они абсурдны - по одиночке каждый как-то работает, но не прозрачно все это.
Предлагаю smile для тех кто бронепоезде (пока я smile ) сделать ликбез на полигоне:

1) берем и создаем таблицу Employees =
LastName varchar 20
FirstName varchar 20
OfficeName varchar 20
Dept varchar 20
Position varchar 20

2) заполняем туда 20 как минимум строк работников
3) берем и создаем таблицу Office =
OfficeName varchar 50 и заполняем 3 строки
4) берем и создаем таблицу Dept =
DeptName varchar 50 и заполняем 3 строки
5) берем и создаем таблицу Position =
PositionName varchar 50 и заполняем 2 строки

6) кладем все это хозяйство на сервер (кто на какой - мне так удобно на sql server)

Employees
LastName FirstName OfficeName Dept Position
Burn Anna_o1 North IS Clerk
Baran Erwin_o1 North IS Manager
Testov Merlin_o1 North IS Manager
Xezes Stephen_o2 Central Admin Clerk
Golden Tana_o2 Central Admin Clerk
Molden Greggor_o2 Central Admin Clerk
Bugen Matthew_o2 Central Admin Manager
Ruben Warren_o2 Central Admin Manager
Logan Juliana_o2 Central Admin Manager
Kimal Kevin_o3 Zoo Workshop Clerk
Tupak Melissa_o3 Zoo Workshop Manager
Jameson Mark_o3 Zoo Workshop Manager
Limbo Pieter_o3 Zoo Workshop Manager
Kosh Joe_o3 Zoo Workshop Clerk
Kilian Lynette_o3 Zoo Workshop Manager
Hostings Dolores_o3 Zoo Workshop Manager
Jokinks Dorota_o3 Zoo Workshop Manager
Piskually Marty_o3 Zoo Workshop Clerk
Fredis Jeff_o3 Zoo Workshop Manager
Yammy Delilah_o3 Zoo Workshop Manager


Office
OfficeName
Central
North
Zoo

Dept
DeptName
IS
Admin
Workshop

Position
PositionName
Clerk
Manager

а потом шаг за шагом показываем как сделать приложение (скажем, на IntelliJ IDEA),
чтоб вывести на экране форму с деревом офисов
с комбобоксом для списка должностей и
с комбобоксом для списка отделов
и гридом для списка работников

PS. Готов принимать посильное участие в проекте smile

Это сообщение отредактировал(а) sanik - 24.12.2004, 01:27
PM MAIL ICQ   Вверх
igon
Дата 24.12.2004, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Цитата
тут я вижу только количественно - взяли и ограничили число показываемых колонок до 3, а как конкретно только нужные колонки показывать?


ОК, теперь можно перейти к подробностям.
Идея такая - не показывать нужные, а не показывать ненужные smile
И в model, и в table у тебя есть список столбцов и методы манипулирования с ним.
Из списка столбцов model извлекаешь их индексы и имена, например, в структуру типа HashTable в виде key=индекс, value=имя_столбца . Затем показываешь юзеру все value в виде, скажем, checkbox'ов. Он отмечает те, которые хочет видеть, а ты, зная индексы неотмеченных, удаляешь их из table. Причем удалять нужно в ОБРАТНОМ порядке, начиная с максимального индекса.
Примерно так (в предположении, что столбцы CODE,LOGIN,ROLE_TYPE показывать НЕ НАДО):

Код

for (int i=table.getColumnCount()-1;i>=0;i--)
 {
   if (table.getColumnName(i).equalsIgnoreCase("CODE") ||
       table.getColumnName(i).equalsIgnoreCase("LOGIN") ||
       table.getColumnName(i).equalsIgnoreCase("ROLE_TYPE"))
   table.removeColumn(tablelumnModel.getColumn(i));  
 };
// Из table лишние столбцы удалены
// В model все столбцы остались
System.out.println("В table: "+table.getColumnCount()+", в model: "+model.getColumnCount());





--------------------
Хотите поговорить об этом?
PM   Вверх
igon
Дата 24.12.2004, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Возможно, что OFFTOPIC, но:
Не ясна структура таблиц: если в таблицах Office. Dept, Position только по ОДНОМУ полю, то они представляются избыточными, потому что дублируются в Employees.
Если же Office. Dept, Position задумывались как справочники, то нужно добавить в них поле, ну, скажем, ID, на которое надо будет организовать foreign key из Employees.
Или это особенности sql server?

И какова "сверхзадача" предполагаемой формы и проекта в целом?
Это должно быть что-то вроде поисковой системы? По выбраным из комбобоксов Office. Dept, Position показать тех, кто им соответствует? Тогда зачем скрывать поля в гриде?

Для поисковой системы реализация достаточно тривиальная:
по кнопке "Show" формируется и выполняется Statement
Select * from Employees where Office=comboOffice.getSelectedItem and Dept=comboDept.getSelectedItem.. и т.д.
Полученный ResultSet запихивается в грид, а потом ...всё smile


--------------------
Хотите поговорить об этом?
PM   Вверх
sanik
Дата 24.12.2004, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.12.2004

Репутация: нет
Всего: 1



igon

да все правильно мыслишь по поводу избыточности - это я просто чтоб не городить всякие линки и связки

ессно все надо нормализовать и т.д.
и данные у меня вытаскиваются в основном при помощи хранимых процедур, в которые я передаю параметры из формы.

ессно в работниках токо Lastname, FirstName, Id_office, Id_Dept, Id_Position + куча других полей (но это пока не важно)

а в справочниках еще по одному Int полю для кода.

я просто хочу - азбуку понять на примере, который готов последовательно сделать

(вот к примеру форма, которую мне месяц пришлось делать, осваивая SWING (на Дельфи это уже пашет как танк 3 год - причем там мне нужно всего 5-10 минут чтоб отладить функциональность самой формы)
образец формы)
www.geocities.com/moontraps/Forma.html

Это сообщение отредактировал(а) sanik - 24.12.2004, 05:44
PM MAIL ICQ   Вверх
igon
Дата 24.12.2004, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Цитата
образец формы
- не грузится smile Ну, да не страшно.
А что с отображением нужных столбцов? Разобрался?


--------------------
Хотите поговорить об этом?
PM   Вверх
Domestic Cat
Дата 24.12.2004, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 13
Всего: 172



Цитата(igon @ 23.12.2004, 18:48)
- не грузится smile Ну, да не страшно.

-

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  My_Design.JPG


--------------------

PM   Вверх
sanik
Дата 24.12.2004, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.12.2004

Репутация: нет
Всего: 1



Как у меня уже сделано:

DB класс для установки соединения с sql server 2000 и там я расположил свои "датасеты"= запросы к серверу, которые возвращают некий резултсет, в одном случае это вызов хранимой процедуры, а в другом простой query

затем у меня есть

Main_KHR класс - главный это запуск приложения и показ главного меню программы

допустим в меню я выбрал показать список работников

formEmployees класс - это та форма, которая на экране.

Как это все должно работать:

При открытии формы идет заполнение дерева офисов и ...

Открывается форма - юзер выбирает какой-нибудь офис из списка и ...вызывается хранимая процедура и возвращает резултсет.

Моя SP возвращает
Id_Code,
Surname,
FirstName,
MiddleName,
EmployeeID,
Initials,
...
...
Office_Status,
JobTitle,
Position


но показывать я хочу только
Surname,
FirstName,
MR,
UserName,
Local_Number,
PrimeTask,
Department,
EmploymentType,
W_Group,
Discipline,
City_Name,
JobTitle,
Position

вот из примера igon для моего случая как это сделать?

ХАААААААААААА кое-что получилось!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1


//================= User selects the table and refreshes the grid
Код

public void actionPerformed(ActionEvent evt)
  {  if (evt.getSource() == tableNames)
     {  // show the selected table from the combo box
        if (scrollPane != null)
           getContentPane().remove(scrollPane);
        try
        {  String tableName = (String)tableNames.getSelectedItem();
           if (rs != null) rs.close();
           String query = "SELECT * FROM " + tableName;
           rs = stmt.executeQuery(query);
           if (SCROLLABLE)
              model = new ScrollingResultSetTableModel(rs);
           else
              model = new CachingResultSetTableModel(rs);

             JTable table = new JTable(model);

             DefaultTableModel model = new DefaultTableModel();          


//=====================================================================
TableColumnModel tablelumnModel = table.getColumnModel();
            for (int i=table.getColumnCount()-1;i>=0;i--)
             {
               if (table.getColumnName(i).equalsIgnoreCase("VoiceMessage") ||
                  table.getColumnName(i).equalsIgnoreCase("VideoMessage") ||
                  table.getColumnName(i).equalsIgnoreCase("OutStatus")       ||
                  table.getColumnName(i).equalsIgnoreCase("Active_Status")  ||
                        table.getColumnName(i).equalsIgnoreCase("Id_Position") ||
                        table.getColumnName(i).equalsIgnoreCase("Id_Office") ||
                        table.getColumnName(i).equalsIgnoreCase("Id_Dept") ||
                         table.getColumnName(i).equalsIgnoreCase("ThumbNailphoto") ||
                        table.getColumnName(i).equalsIgnoreCase("Women") ||
                   table.getColumnName(i).equalsIgnoreCase("CountriesExcluded") ||
                   table.getColumnName(i).equalsIgnoreCase("Aboriginal"))
               table.removeColumn(tablelumnModel.getColumn(i));
             };
// Из table лишние столбцы удалены
// В model все столбцы остались
//=====================================================================


           scrollPane = new JScrollPane(table);
           getContentPane().add(scrollPane, "Center");
           pack();
           doLayout();
        }
        catch(SQLException e)
        {  System.out.println("Error " + e);
        }
     }
  }


а вот ка к вреальности работает у менея - вызывается хранимая процедура и потом я генерю массив(но хотел бы избавится от этого метода а работать с моделью с чекто указанными колонками, вернее показывать нужные колокни только в гриде)

Код

public static Object[][] ExecStoredProc(String myOffice, String myDept, String activeStatus) {
   int i = 0;
   int j = 0;
   int numColumns = 0;

   ArrayList tableRow = new ArrayList();
   ArrayList multiRow = new ArrayList();
   Object[][] resultArray2D;
   CallableStatement cs = null;

System.out.println("activeStatus =" + activeStatus);
System.out.println("myOffice =" + myOffice);
System.out.println("myDept =" + myDept);

   try {
     cs = con.prepareCall("{CALL SpSelEmployees3(?,?,?,?,?,?,?,?)}");
     cs.setString(1, "OfficeName");  // @strOrder char(100) = ' OfficeName,Department, Surname, W_Group, Discipline',
     cs.setInt(2, Integer.parseInt(myOffice));         // @office int = -1,
     cs.setInt(3, Integer.parseInt(myDept));          // @dept int = -1,
     cs.setInt(4, -1);                                                // @position int = -1,
     cs.setString(5, "");                                            // @workgroup char(50) ='',
     cs.setString(6, "");                                            // @discipline char(50) ='',
     cs.setInt(7, Integer.parseInt(activeStatus));    // @terminated int = -1
     cs.setString(8, "");                                            // @my_select varchar(1000) = ''

     ResultSet result = cs.executeQuery();
//=========================================
      ResultSetMetaData rsmd = result.getMetaData();
System.out.println("number of columns="+ rsmd.getColumnCount());
//System.out.println("number of rows="+ rsmd.
     for (i = 1; i <= rsmd.getColumnCount(); i++) {
       tableRow.add(rsmd.getColumnName(i));
       numColumns = tableRow.size();
       //resultArray2D[j][i] = rsmd.getColumnName(i);
     }
     multiRow.add(tableRow);
      tableRow = new ArrayList();
     while (result.next()) {
       for (i = 1; i <= rsmd.getColumnCount(); i++) {
         tableRow.add(result.getString(i));
         //resultArray2D[j][i] = result.getString(i);
       }
       multiRow.add(tableRow);
       tableRow = new ArrayList();
     }
     cs.close();
   }
   catch (SQLException ex) {
     System.err.print("SQLException: ");
     System.err.println(ex.getMessage());
   }
   System.out.println("a=" + numColumns);
   resultArray2D = new Object[multiRow.size() - 1][numColumns];

   for (i = 1; i < multiRow.size(); i++) {
     tableRow = (ArrayList) multiRow.get(i);
     for (j = 0; j < numColumns; j++) {
       resultArray2D[i - 1][j] = (Object) tableRow.get(j);
     }
     tableRow = null;
   }
  System.out.println("Rows="+ i); //multiRow.size());
   return resultArray2D;
 }


Это сообщение отредактировал(а) sanik - 24.12.2004, 22:19
PM MAIL ICQ   Вверх
igon
Дата 24.12.2004, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 30.10.2004

Репутация: 7
Всего: 21



Замени в моем примере подготовку к получению ResultSet
Код

          rs = stmt.executeQuery(query);
на свою
Код

          ResultSet result = cs.executeQuery();

Дальше можешь использовать код из моего примера.
Вызов подготовки (которая у меня привязана к combobox) привяжи к событию в твоем дереве офисов.

Механизм сокрытия ненужных столбцов смотри в моем посте от 24.12.2004, 02:19



Это сообщение отредактировал(а) igon - 24.12.2004, 23:51


--------------------
Хотите поговорить об этом?
PM   Вверх
sanik
Дата 29.12.2004, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 23.12.2004

Репутация: нет
Всего: 1



Вот выкладываю диаграмму базы данных:

Схема строения базы и форма
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0948 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.