Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Подмена данных отображения


Автор: zss 13.12.2005, 21:49
В JBuilderX есть компанент JdbTable. котоый работает с БД.

Он отображает данные БД, одно из полей которых BigDecimal. Это число представляет собой 4 байтное значение IP-адреса.
Если ничего не менять, то будут просто отображаться числа как они и хранятся в БД.

Можно ли в процессе отображения поймать момент когда происходит чтение данных таблицы для этого поля и подменить число на строку "xxx.xxx.xxx.xxx"

Какое сообщение нужно ловить и не будет ли конфликта с типами.

Автор: LSD 13.12.2005, 23:28
Есть несколько вариантов
  • определить для колонки свой painter и editor
  • создать cacl field, а реальное сделать невидимым, но тогда IP адрес нельзя будет редактировать

Автор: carper 14.12.2005, 09:36
Цитата(zss @ 13.12.2005, 21:49)
Можно ли в процессе отображения поймать момент когда происходит чтение данных таблицы для этого поля и подменить число на строку "xxx.xxx.xxx.xxx"


С JBuilderX не работал, но думаю, что самый простой выход уже в запросе получать число преобразованное в нужную строку. Например, в Oracle для этого можно написать небольшую хранимую процедурку, которую можно будет вставлять прямо в текст SQL запроса.

PS. И вообще, а какой философский смысл хранения IP адреса как одного числового поля?
IMHO разумнее хранить его либо в виде строки (распарсить ее на октеты (или преобразовать в число), в случае надобности, более чем просто) либо в виде 4-х отдельных полей - по полю на октет.

Автор: zss 14.12.2005, 10:21
Цитата(LSD @ 13.12.2005, 23:28)
создать cacl field, а реальное сделать невидимым, но тогда IP адрес нельзя будет редактировать


мне не нужно его редактировать - а так вроде подойдет



LSD, а можно подробнее - я не очень силен в Java

Автор: LSD 14.12.2005, 11:27
Что-то типа такого (код полностью не тестил но принцип такой)
Код
QueryDataSet dataSet = new QueryDataSet();
dataSet.setQuery(new QueryDescriptor(database, "select * from v$version", null, true, Load.AS_NEEDED));
Column ipAdressColumn = new Column("IP_ADRESS", "IP адрес RAW", Variant.BIGDECIMAL);
ipAdressColumn.setVisible(TriStateProperty.FALSE);
Column ipFormatedColumn = new Column("IP_FORMATED", "IP адрес", Variant.STRING);
ipFormatedColumn.setVisible(TriStateProperty.TRUE);
ipFormatedColumn.setCalcType(CalcType.CALC);
dataSet.addColumn(ipAdressColumn);
dataSet.addColumn(ipFormatedColumn);
dataSet.addCalcFieldsListener(new IPField());

Код
  private static class IPField implements CalcFieldsListener
  {
    private DecimalFormat format = new DecimalFormat("000.000.000.000");
    
    public IPField()
    {
      DecimalFormatSymbols dfs = new DecimalFormatSymbols();
      dfs.setDecimalSeparator('.');
      format = new DecimalFormat("000.000.000.000", dfs);
    }
    
    public void calcFields(ReadRow readRow, DataRow dataRow, boolean _boolean)
    {
      BigDecimal ip = readRow.getBigDecimal("IP_ADRESS");
      dataRow.setString("IP_FORMATED", format.format(ip));
    }
  }

Автор: Andyb 14.12.2005, 11:32
jdbTable берет данные из queryDataSet в ней должна быть описана данная колонка(в сорсе как класс Column) вот для этой колонки можно поставить свойства displayMask и editMask

Автор: zss 14.12.2005, 11:33
LSD, непонятно 3 вопроса

1. Что за тип CalcType.CALC
2. почему добавление происходит в dataSet
3. где связь между ipAdressColumn и ipFormatedColumn

Автор: LSD 14.12.2005, 11:41
Цитата(zss @ 14.12.2005, 11:33)
1. Что за тип CalcType.CALC

Это интерфейс который содержит типы столбцов, калькулируемое, обычное или агрегатное.

Цитата(zss @ 14.12.2005, 11:33)
2. почему добавление происходит в dataSet

Потому что это добавление новых данных, а не просто изменение отображения.

Цитата(zss @ 14.12.2005, 11:33)
3. где связь между ipAdressColumn и ipFormatedColumn

Это реализуется в классе IPField. Он кстати неправильно реализует преобразование.


Цитата(Andyb @ 14.12.2005, 11:32)
jdbTable берет данные из queryDataSet в ней должна быть описана данная колонка(в сорсе как класс Column) вот для этой колонки можно поставить свойства displayMask и editMask

Нет, это не прокатит. Там нужно работать с байтами, простым форматированием не обойтись.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)