Package com.ipc.oce.objects

Source Code of com.ipc.oce.objects.OCDocumentManager

package com.ipc.oce.objects;

import java.util.ArrayList;
import java.util.Date;
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.OCApp;
import com.ipc.oce.OCObject;
import com.ipc.oce.OCStructure;
import com.ipc.oce.OCVariant;
import com.ipc.oce.metadata.objects.OCDocumentMetadataObject;
import com.ipc.oce.metadata.objects._OCCommonMetadataObject;
import com.ipc.oce.query.OCQuery;
import com.ipc.oce.query.OCQueryResult;
import com.ipc.oce.query.OCQueryResultSelection;

/**
* Предназначен для управления документом, как объектом конфигурации. С помощью этого объекта осуществляется поиск документов, получение выборки документов, создание нового документа, работа с формами и макетами документа. Доступ к объекту осуществляется через свойства объекта ДокументыМенеджер. Полное имя типа объекта определяется с учетом имени документа конфигурации. Например, для документа "Расходная накладная" имя типа будет выглядеть ДокументМенеджер.РасходнаяНакладная.
*  Возможен обмен с сервером.
* @author Konovalov
*
*/
public class OCDocumentManager extends _OCAbstractManager {

  public OCDocumentManager(OCObject object) {
    super(object);
  }

  public OCDocumentManager(IJIDispatch aDispatch) {
    super(aDispatch);
  }

  public OCDocumentManager(JIVariant aDispatch) throws JIException {
    super(aDispatch);
  }
 
  /**
   * Формирует выборку документов за определенный период.
   * @return
   * @throws JIException
   */
  public OCDocumentSelection select() throws JIException{
    return new OCDocumentSelection(callMethodA("Select"));
  }
  /**
   * Формирует выборку документов за определенный период.
   * @param dateStart Дата и время начала периода выборки документов. Если параметр не указан, то выбираются все документы, начиная с самого первого документа в базе данных.
   * @return
   * @throws JIException
   */
  public OCDocumentSelection select(Date dateStart) throws JIException{
    return new OCDocumentSelection(callMethodA("Select", new Object[]{new JIVariant(dateStart)})[0]);
  }
  /**
   * Формирует выборку документов за определенный период.
   * @param dateStart Дата и время начала периода выборки документов. Если параметр не указан, то выбираются все документы, начиная с самого первого документа в базе данных.
   * @param dateEnd Дата окончания периода выбираемых документов. Если параметр не указан, то выбираются все документы, заканчивая самым последним документом в базе данных.
   * @return
   * @throws JIException
   */
  public OCDocumentSelection select(Date dateStart, Date dateEnd) throws JIException{
    if (dateStart == null && dateEnd == null) {
      return select();
    }
    if (dateEnd == null) {
      return select(dateStart);
    }
    return new OCDocumentSelection(callMethodA(
        "Select", new Object[]{
            new JIVariant(dateStart),
            new JIVariant(dateEnd)}
        )[0]);
  }
 
  /**
   * Формирует выборку документов по заданным параметрам
   *
   * @param dateStart
   *            Дата и время начала периода выборки документов. Если параметр
   *            не указан, то выбираются все документы, начиная с самого
   *            первого документа в базе данных. Значение по умолчанию: Пустая
   *            дата
   * @param dateEnd
   *            Дата окончания периода выбираемых документов. Если параметр не
   *            указан, то выбираются все документы, заканчивая самым
   *            последним документом в базе данных. Значение по умолчанию:
   *            Пустая дата
   * @param structure
   *            Задает поле и значение отбора открываемой выборки. Ключ
   *            структуры описывает имя поля, а значение структуры - значение
   *            отбора по этому полю. В качестве полей для отбора могут
   *            задаваться только поля "Дата" и реквизиты документа, для
   *            которых в конфигураторе признак индексирования установлен в
   *            значение "Индексировать" или в значение
   *            "Индексировать с доп. упорядочиванием". Важно! Структура может
   *            содержать только один элемент. Если параметр не указан, то
   *            отбор не используется.
   * @param order
   *            Строка с именем реквизита документа, определяющая
   *            упорядочивание документов в выборке. Может быть указано поле
   *            "Дата" или имя реквизита документа, для которого признак
   *            индексирования в конфигураторе установлен в значения
   *            "Индексировать" или "Индексировать с доп. упорядочиванием".
   *            После указания имени через пробел может быть указано
   *            направление сортировки. Направление определяется: "Убыв"
   *            ("Desc") - упорядочивать по убыванию, и "Возр" ("Asc") -
   *            упорядочивать по возрастанию. По умолчанию выборка
   *            упорядочивается по возрастанию. Если параметр не задан,
   *            выборка упорядочивается по хронологии документов.
   * @return
   * @throws JIException
   */
  public OCDocumentSelection select(Date dateStart, Date dateEnd, OCStructure structure, String order) throws JIException {
    PreparedPredicateStruct wrapper = null;
    if (structure != null) {
      wrapper = new PreparedPredicateStruct(structure);
    }
    JIVariant structureVariant = new JIVariant(
        structure != null ? wrapper.dispatch() : null);
    return new OCDocumentSelection(callMethodA("Select", new Object[] {
        new JIVariant(dateStart), new JIVariant(dateEnd),
        structureVariant, new JIVariant(order) })[0]);
  }
 
  /**
   * Создает новый документ
   * @return OCDocumentObject
   * @throws JIException
   */
  public OCDocumentObject createDocument() throws JIException{
    return new OCDocumentObject(callMethodA("CreateDocument"));
  }
 
  /**
   * Создает новый документ
   * @param number номер документа
   * @param date дата документа
   * @return OCDocumentObject
   * @throws JIException
   */
  public OCDocumentObject createDocument(String number, Date date) throws JIException {
    OCDocumentObject object = createDocument();
    object.setNumber(number);
    object.setDate(date);
    return object;
  }
 
  /**
   * Создает новый документ
   * @param number номер документа
   * @param date дата документа
   * @return OCDocumentObject
   * @throws JIException
   */
  public OCDocumentObject createDocument(Integer number, Date date) throws JIException {
    OCDocumentObject object = createDocument();
    object.setNumber(number);
    object.setDate(date);
    return object;
  }
 
  /**
   * Осуществляет поиск документа по номеру. (Для документов не имеющих периода)
   * @param number
   * @return
   * @throws JIException
   */
  public OCDocumentRef findByNumber(String number) throws JIException{
    return new OCDocumentRef(callMethodA("FindByNumber", new Object[]{JIVariant.makeVariant(number)})[0]);
  }
 
  /**
   * Осуществляет поиск документа по номеру. (Для документов не имеющих периода)
   * @param number
   * @return
   * @throws JIException
   */
  public OCDocumentRef findByNumber(Integer number) throws JIException{
    return new OCDocumentRef(callMethodA("FindByNumber", new Object[]{JIVariant.makeVariant(number)})[0]);
  }
 
  /**
   * Осуществляет поиск документа по номеру с указанием даты в периоде документа
   * @param number Номер искомого документа.
   * @param docDate Дата из интервала, в котором проводится поиск по номеру. Сам интервал определяется как период уникальности номеров документа, в который входит указанная дата. Например, если номера документов уникальны в пределах месяца и задана дата 10 декабря 2001 года, то поиск будет проводиться в интервале с 01 по 31 декабря 2001 года. Параметр используется для документов с периодической нумерацией.
   * @return ссылка на документ с заданным номером относящийся к периоду для указанной даты
   * @throws JIException
   */
  public OCDocumentRef findByNumber(String number, Date docDate) throws JIException{
    return new OCDocumentRef(callMethodA("FindByNumber", new Object[]{JIVariant.makeVariant(number), JIVariant.makeVariant(docDate)})[0]);
  }
 
  /**
   * Осуществляет поиск документа по реквизиту. Примечание: Если существует несколько документов с указанным значением реквизита, то будет найдет только один из них. Для реквизитов типа Строка поиск осуществляется по точному соответствию.
   * ВАЖНО! Поиск может производиться ТОЛЬКО по индексированным.
   * @param attributeName Имя реквизита, как он задан в конфигураторе, по значению которого осуществляется поиск. Тип значения произвольный, кроме ХранилищеЗначения и строк произвольной длины.
   * @param variant  Произвольный. Значение реквизита, по которому должен выполняться поиск
   * @return Ссылка на найденный документ. Если не существует ни одного документа с требуемым значением реквизита, то будет возвращена пустая ссылка.
   * @throws JIException
   */
  public OCDocumentRef findByAttribute(String attributeName, OCVariant variant) throws JIException{
    return new OCDocumentRef(callMethodA(
                  "FindByAttribute",
                  new Object[]{
                      new JIVariant(attributeName),
                      ocVariant2JI(variant)
                  }
                  )[0]);
  }
 
  /**
   * Осуществляет поиск документа по номеру с указанием даты в периоде документа
   * @param number Номер искомого документа.
   * @param docDate Дата из интервала, в котором проводится поиск по номеру. Сам интервал определяется как период уникальности номеров документа, в который входит указанная дата. Например, если номера документов уникальны в пределах месяца и задана дата 10 декабря 2001 года, то поиск будет проводиться в интервале с 01 по 31 декабря 2001 года. Параметр используется для документов с периодической нумерацией.
   * @return ссылка на документ с заданным номером относящийся к периоду для указанной даты
   * @throws JIException
   */
  public OCDocumentRef findByNumber(Integer number, Date docDate) throws JIException{
    return new OCDocumentRef(callMethodA("FindByNumber", new Object[]{JIVariant.makeVariant(number), JIVariant.makeVariant(docDate)})[0]);
  }
 
  /**
   * Поиск ссылки на документ по номеру и дате. ПРИМЕЧАНИЕ: Использует механизм запросов (OCQuery). В отличии от findByNumber дата документа указывается точно, а не должна попадать в определенный период
   * @param number номер документа
   * @param docDate (дата документа). ВНИМАНИЕ: Используется точное сравнение (=)
   * @return Ссылка на документ с заданным домером и у конкретной датой
   * @throws JIException
   */
  public OCDocumentRef findByNumber2(String number, Date docDate) throws JIException {
    OCApp instance = OCApp.getInstance(getAssociatedSessionID());
   
    // prepare query
    OCQuery query = instance.newQuery(
        "SELECT Doc.Ref FROM Document."
        + managerName
        + " AS Doc WHERE Doc.Number = &NUM_A AND Doc.Date = &DATE_A");
   
    // set parameters
    query.setParameter("NUM_A", new OCVariant(number));
    query.setParameter("DATE_A", new OCVariant(docDate));
   
    OCQueryResult result = query.execute();
    OCQueryResultSelection selection = result.choose();
    OCDocumentRef ref = null;
    if (selection.next()) {
      ref = new OCDocumentRef(selection.getObject(0));
    } else {
      ref = emptyRef();
    }
    return ref;
  }
 
  /**
   * Поиск ссылок на документы по номеру во всех периодах. ПРИМЕЧАНИЕ: Использует механизм запросов (OCQuery).
   * @param number номер документа
   * @return Массив ссылок на документы. (С одним номером может быть несколько документов в различных периодах)
   * @throws JIException
   */
  public OCDocumentRef[] findByNumber2(String number) throws JIException {
    OCApp instance = OCApp.getInstance(getAssociatedSessionID());
    OCQuery query = instance.newQuery("SELECT Doc.Ref FROM Document." + managerName + " AS Doc WHERE Doc.Number = &NUM_A");
   
    query.setParameter("NUM_A", new OCVariant(number));
   
    OCQueryResult result = query.execute();
    OCQueryResultSelection selection = result.choose();
    int selectionSZ = selection.size();
    List<OCDocumentRef> refList = new ArrayList<OCDocumentRef>(selectionSZ);
    while (selection.next()) {
      refList.add(new OCDocumentRef(selection.getObject(0)));
    }
   
    return refList.toArray(new OCDocumentRef[selectionSZ]);
  }
 
  /**
   * @deprecated since 0.5.2 use emptyRef.
   * Получает пустое значение ссылки на документ данного вида. (кто его знает как это тут применить)
   * Примечание:
   * Может использоваться, например, когда нужно передать пустую ссылку в параметр метода.
   * @return
   * @throws JIException
   */
  public OCDocumentRef getEmptyRef() throws JIException{
    return new OCDocumentRef(callMethodA("EmptyRef"));
  }

  @Override
  protected _OCCommonMetadataObject loadMetadata() throws JIException {
    return OCApp.getInstance(getAssociatedSessionID()).getMetadata().getDocuments().find(managerName);
  }

  @Override
  public OCDocumentMetadataObject getMetadata() throws JIException {
    return new OCDocumentMetadataObject(super.getMetadata());
  }

  /**
   * Формирует ссылку из значения типа УникальныйИдентификатор.
   * Данный уникальный идентификатор может быть в дальнейшем получен из ссылки методом УникальныйИдентификатор.
   * @param uuid
   * @return
   * @throws JIException
   */
  public OCDocumentRef getRef(OCUUID uuid) throws JIException {
    if (uuid != null) {
    return new OCDocumentRef(callMethodA("GetRef",
        new Object[] { uuid.dispatch() })[0]);
    } else {
      return newRef();
    }
  }
 
  /**
   * Создание новой ссылки на документ. Аналог getRef без параметра.
   * @return
   * @throws JIException
   */
  public OCDocumentRef newRef() throws JIException{
    return new OCDocumentRef(callMethodA("GetRef"));
  }
 
  /**
   *
   * Получает пустое значение ссылки на документ данного вида.
   * @return ДокументСсылка. Может использоваться, например, когда нужно передать пустую ссылку в параметр метода.
   * @throws JIException
   */
  public OCDocumentRef emptyRef() throws JIException{
    return new OCDocumentRef(callMethodA("EmptyRef"));
  }
 
 
}
TOP

Related Classes of com.ipc.oce.objects.OCDocumentManager

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.