Package com.ipc.oce

Source Code of com.ipc.oce.OCValueTable

/**
*
*/
package com.ipc.oce;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jinterop.dcom.common.JIException;
import org.jinterop.dcom.core.JIVariant;
import org.jinterop.dcom.impls.automation.IJIDispatch;

import com.ipc.oce.objects.OCCollectionIndexes;

/**
* Таблица значений предназначена для хранения значений в табличном виде. Все
* основные операции с таблицей производятся именно через этот объект. Он
* позволяет манипулировать строками таблицы значений и предоставляет доступ к
* коллекции колонок. Колонки могут быть различных типов (в том числе
* множественных).
*
* @author Konovalov
*
*/
public class OCValueTable extends OCObject implements Iterable<OCValueTableRow>{

  private int size = -1;
  /**
   * @param object
   */
  public OCValueTable(OCObject object) {
    super(object);
  }

  /**
   * @param aDispatch
   */
  public OCValueTable(IJIDispatch aDispatch) {
    super(aDispatch);
  }

  /**
   * @param aDispatch
   * @throws JIException
   */
  public OCValueTable(JIVariant aDispatch) throws JIException {
    super(aDispatch);
  }
 
  /**
   * Содержит коллекцию колонок таблицы значений.
   * @return
   * @throws JIException
   */
  public OCValueTableColumnCollection getColumns() throws JIException {
    return new OCValueTableColumnCollection(get("Columns"));
  }
 
  /**
   * Получить список полей талицы.
   * @return
   * @throws JIException
   */
  public List<String> listColumns() throws JIException {
    List<String> res = new ArrayList<String>();
    OCValueTableColumnCollection cols = getColumns();
    int sz = cols.size();
    for (int z = 0; z < sz; z++) {
      res.add(cols.getTableColumn(z).getName());
    }
    return res;
  }
 
  /**
   * Содержит коллекцию индексов таблицы значений.
   * @return OCCollectionIndexes
   * @throws JIException
   */
  public OCCollectionIndexes getIndexes() throws JIException {
    return new OCCollectionIndexes(get("Indexes"));
  }
 
  /**
   * Вставляет строку на позицию в таблице значений, соответствующую указанному индексу.
   * @param index Индекс вставляемой строки
   * @return Вставленная строка
   * @throws JIException
   */
  public OCValueTableRow insert(int index) throws JIException {
    return new OCValueTableRow(callMethodA("Insert", new Object[]{new JIVariant(index)})[0]);
  }
 
  /**
   * Создает массив и копирует в него значения, содержащиеся в колонке таблицы значений.
   * @param index - Колонка, значения которой необходимо выгрузить. В качестве значения параметра выступает индекс колонки
   * @return
   * @throws JIException
   */
  public OCArray unloadColumn(int index) throws JIException {
    return new OCArray(callMethodA("UnloadColumn", new JIVariant(index))[0]);
  }
 
  /**
   * Создает массив и копирует в него значения, содержащиеся в колонке таблицы значений.
   * @param columnName - имя колонки.
   * @return
   * @throws JIException
   */
  public OCArray unloadColumn(String columnName) throws JIException {
    return new OCArray(callMethodA("UnloadColumn", new JIVariant(columnName))[0]);
  }
 
  /**
   * Создает массив и копирует в него значения, содержащиеся в колонке таблицы значений.
   * @param column - объект представляющий колонку
   * @return
   * @throws JIException
   */
  public OCArray unloadColumn(OCValueTableColumn column) throws JIException {
    return new OCArray(callMethodA("UnloadColumn", new JIVariant(ocObject2Dispatch(column)))[0]);
  }
 
  /**
   * Добавляет строку в конец таблицы значений.
   * @return
   * @throws JIException
   */
  public OCValueTableRow add() throws JIException {
    return new OCValueTableRow(callMethodA("Add"));
  }
 
  /**
   * Загружает колонку таблицы значений из массива значений.
   * @param index -  Колонка, в которую будут загружены значения из массива. Индекс.
   * @param array - Массив значений, который выступает в качестве источника данных для колонки.
   * @throws JIException
   */
  public void loadColumn(int index, OCArray array) throws JIException {
    callMethod("LoadColumn", new Object[]{
        new JIVariant(index),
        new JIVariant(ocObject2Dispatch(array))
    });
  }
 
  /**
   * Загружает колонку таблицы значений из массива значений.
   * @param columnName - имя колонки
   * @param array - Массив значений, который выступает в качестве источника данных для колонки.
   * @throws JIException
   */
  public void loadColumn(String columnName, OCArray array) throws JIException {
    callMethod("LoadColumn", new Object[]{
        new JIVariant(columnName),
        new JIVariant(ocObject2Dispatch(array))
    });
  }
 
  /**
   * Загружает колонку таблицы значений из массива значений.
   * @param column - объект колонки
   * @param array - Массив значений, который выступает в качестве источника данных для колонки.
   * @throws JIException
   */
  public void loadColumn(OCValueTableColumn column, OCArray array) throws JIException {
    callMethod("LoadColumn", new Object[]{
        new JIVariant(ocObject2Dispatch(column)),
        new JIVariant(ocObject2Dispatch(array))
    });
  }
 
  /**
   * Получает индекс строки в коллекции строк таблицы значений.
   * @param row Строка таблицы значений, для которой нужно определить индекс
   * @return Индекс указанной строки в коллекции. Если не найдено, то возвращается -1.
   * @throws JIException
   */
  public Integer indexOf(OCValueTableRow row) throws JIException {
    return callMethodA("IndexOf", new Object[]{new JIVariant(row.dispatch())})[0].getObjectAsInt();
  }
 
  /**
   * Суммирует значения всех строк в указанной колонке.
   * Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
   * Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
   * Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
   * Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.
   * @param columnName  Имя колонки, по которой необходимо посчитать итог
   * @return Сумма значений по всем строкам указанной колонки
   * @throws JIException - ошибка DCOM
   */
  public Number total(String columnName) throws JIException {
    OCVariant var = new OCVariant(callMethodA("Total", new Object[]{new JIVariant(columnName)})[0]);
    return (Number) var.value();
  }
 
  /**
   * Получает количество строк таблицы значений.
   * @return Integer
   * @throws JIException - ошибка DCOM
   */
  public int size() throws JIException {
    if (size == -1) {
      size = callMethodA("Count").getObjectAsInt();
    }
    return size;
  }
 
  /**
   * Удаляет все строки таблицы значений. Структура колонок остается
   * неизменной
   *
   * @throws JIException
   *             - ошибка DCOM
   *
   */
  public void clear() throws JIException {
    callMethod("Clear");
  }

  /**
   * Получает значение по индексу.
   *
   * @param index
   *            - Индекс строки
   * @return Применяется в случаях, когда использование оператора []
   *         невозможно
   * @throws JIException
   */
  public OCValueTableRow get(int index) throws JIException {
    return new OCValueTableRow(callMethodA("Get", new Object[]{new JIVariant(index)})[0]);
  }
 
  public Iterator<OCValueTableRow> iterator() {
    Iterator<OCValueTableRow> iter = new Iterator<OCValueTableRow>() {
      int currentRow = 0;
      public void remove() {
        try {
          delete(currentRow);
        } catch (JIException e) {
          e.printStackTrace();
        }
      }
     
      public OCValueTableRow next() {
        try {
          return get(currentRow++);
        } catch (JIException e) {
          e.printStackTrace();
          return null;
        }
      }
     
      public boolean hasNext() {
        try {
          return (currentRow < size());
        } catch (JIException e) {
          e.printStackTrace();
          return false;
        }
      }
    };
    return iter;
  }
 
  /**
   * Осуществляет поиск значения в указанных колонках таблицы значений.
   *
   * @param value
   *            - Искомое значение.
   * @param columnFilter
   *            - Список имен колонок, разделенных запятыми, по которым
   *            производится поиск. Если параметр не указан, поиск
   *            осуществляется по всей таблице значений. Значение по
   *            умолчанию: Пустая строка
   * @return СтрокаТаблицыЗначений; Неопределено. Строка, в которой содержится
   *         искомое значение. Если значение не найдено, то возвращается
   *         значение Неопределено.
   * @throws JIException
   */
  public OCValueTableRow find(OCVariant value, String columnFilter) throws JIException {
    JIVariant var = callMethodA("Find", new Object[]{
        ocVariant2JI(value),
        columnFilter != null ? new JIVariant(columnFilter) : null
    })[0];
   
    if (var.getType() != JIVariant.VT_EMPTY) {
      return new OCValueTableRow(var);
    } else {
      return null;
    }
  }
 
  /**
   * Осуществляет свертку таблицы значений по указанным колонкам группировки.
   * Строки, у которых совпадают значения в колонках, указанных в первом
   * параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в
   * колонках, указанных во втором параметре, накапливаются. Важно! Списки
   * колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков
   * колонок, после выполнения метода удаляются из таблицы значений.
   * Примечание: Если в колонке установлен тип и он единственный, то при
   * суммировании будет предприниматься попытка преобразования значения к типу
   * Число. Если колонке не присвоены типы, то в процессе суммирования будут
   * принимать участие только значения, имеющие тип Число, значения других
   * типов будут игнорироваться. Если в колонке несколько типов и среди них
   * есть тип Число, то в процессе суммирования будут принимать участие только
   * значения, имеющие тип Число, значения других типов будут игнорироваться.
   * Если в колонке несколько типов и среди них нет типа Число, то результат
   * суммирования будет 0, который будет присвоен в соответствующую колонку,
   * где будет преобразован к значению по умолчанию для типа, установленного в
   * колонке.
   *
   * @param groupingColumns
   *            Имена колонок, разделенные запятыми, по которым необходимо
   *            группировать строки таблицы значений.
   * @throws JIException - ошибка DCOM
   */
  public void groupBy(String groupingColumns) throws JIException {
    callMethod("GroupBy", new Object[]{new JIVariant(groupingColumns)});
  }
 
  /**
   * Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются.
   * Важно! Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.
   * Примечание:
   * Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
   * Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
   * Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
   * Если в колонке несколько типов и среди них нет типа Число, то результат суммирования будет 0, который будет присвоен в соответствующую колонку, где будет преобразован к значению по умолчанию для типа, установленного в колонке.
   * @param groupingColumns  Имена колонок, разделенные запятыми, по которым необходимо группировать строки таблицы значений.
   * @param totalColumns Имена колонок, разделенные запятыми, по которым необходимо суммировать значения в строках таблицы значений.
   * @throws JIException
   */
  public void groupBy(String groupingColumns, String totalColumns) throws JIException {
    callMethod("GroupBy", new Object[]{new JIVariant(groupingColumns), new JIVariant(totalColumns)});
  }
 
  /**
   * Сдвигает строку на указанное количество позиций.
   * @param index Индекс строки, которую нужно переместить, или сама строка
   * @param offset Количество строк, на которое необходимо переместить строку. Положительное значение означает, что строка будет передвинута ближе к концу таблицы значений (вниз), отрицательное - ближе к началу (вверх)
   * @throws JIException
   */
  public void move(int index, int offset) throws JIException {
    callMethod("Move", new Object[]{new JIVariant(index), new JIVariant(offset)});
  }
 
  /**
   * Создает копию исходной таблицы значений.
   * @return
   * @throws JIException
   */
  public OCValueTable copy() throws JIException {
    return new OCValueTable(callMethodA("Copy"));
  }
 
  /**
   * Создает таблицу значений с заданным списком колонок.
   * @param columnsForCopy Список колонок для копирования в формате: "Колонка1, Колонка2...". Если список не задан, то будут скопированы все колонки
   * @return
   * @throws JIException
   */
  public OCValueTable copyColumns(String columnsForCopy) throws JIException {
    return new OCValueTable(callMethodA("CopyColumns", new Object[]{new JIVariant(columnsForCopy)})[0]);
  }
 
  /**
   * Сортирует таблицу значений в соответствии с указанными правилами сортировки.
   * @param sortString Список имен колонок, разделенных запятыми, по которым производится сортировка таблицы. После каждого имени колонки через пробел может быть указано направление сортировки. Направление определяется: "Убыв" ("Desc") - упорядочивать по убыванию; "Возр" ("Asc") - упорядочивать по возрастанию. По умолчанию сортировка производится по возрастанию. Порядок указания имен колонок таблицы определяет порядок сортировки. Это означает, что сначала таблица сортируется по колонке, указанной первой. Затем группы строк с одинаковым значением в этой колонке сортируются по колонке, которая указана второй, и так далее.
   * @throws JIException
   */
  public void sort(String sortString) throws JIException {
    callMethod("Sort", new Object[]{new JIVariant(sortString)});
  }
 
  /**
   * Удаляет строку таблицы значений по индексу.
   * @param index Индекс строки, которую необходимо удалить
   * @throws JIException
   */
  public void delete(int index) throws JIException {
    callMethod("Delete", new Object[]{new JIVariant(index)});
  }
 
  /**
   * Удаляет строку таблицы значений по объекту.
   * @param row Удаляемая строка таблицы значений
   * @throws JIException
   */
  public void delete(OCValueTableRow row) throws JIException{
    callMethod("Delete", new Object[]{new JIVariant(row.dispatch())});
  }
}
TOP

Related Classes of com.ipc.oce.OCValueTable

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.