Webmethods: можем ли мы удалить элемент из documentList во время его циклического прохождения - PullRequest
4 голосов
/ 21 марта 2012

В WEBMETHODS можно ли удалить элемент из DocumentList во время циклического перемещения по DocumentList? Если да, то как? Если нет, то как мы можем установить значение переменной DocumentList на ноль.

спасибо
nohsib

Ответы [ 3 ]

4 голосов
/ 30 сентября 2012

Тундра включает в себя службу удаления элемента из списка документов (com.wm.data.IData[]): tundra.list.document:drop($list[], $index).

  • $list - это список документов (com.wm.data.IData[]), из которого вы хотите удалить элемент из
  • $index - индекс массива с нуля для удаляемого элемента

Соответствующий код Java выглядит следующим образом:

public static final void drop(IData pipeline) throws ServiceException {
  IDataCursor cursor = pipeline.getCursor();

  try {
    Object[] list = IDataUtil.getObjectArray(cursor, "$list");
    String index = IDataUtil.getString(cursor, "$index");

    if (index != null) IDataUtil.put(cursor, "$list", drop(list, index));
  } finally {
    cursor.destroy();
  }
}

// returns a new array which contains all the elements from the given arrays
public static <T> T[] concatenate(T[] array, T[] items) {
  if (array == null) return items;
  if (items == null) return array;

  java.util.List<T> list = new java.util.ArrayList<T>(array.length + items.length);

  java.util.Collections.addAll(list, array);
  java.util.Collections.addAll(list, items);

  return list.toArray(java.util.Arrays.copyOf(array, 0));
}

// removes the element at the given index from the given list
public static <T> T[] drop(T[] array, String index) {
  return drop(array, Integer.parseInt(index));
}

// removes the element at the given index from the given list
public static <T> T[] drop(T[] array, int index) {
  if (array != null) {
    // support reverse/tail indexing
    if (index < 0) index += array.length;
    if (index < 0 || array.length <= index) throw new ArrayIndexOutOfBoundsException(index);

    T[] head = slice(array, 0, index);
    T[] tail = slice(array, index + 1, array.length - index);

    array = concatenate(head, tail);      
  }
  return array;
}

// returns a new array which is a subset of elements from the given array
public static <T> T[] slice(T[] array, int index, int length) {
  if (array == null || array.length == 0) return array;
  // support reverse/tail length
  if (length < 0) length = array.length + length;
  // support reverse/tail indexing
  if (index < 0) index += array.length;
  // don't slice past the end of the array
  if ((length += index) > array.length) length = array.length;

  return java.util.Arrays.copyOfRange(array, index, length);
}

Однако я согласен с MrJames : лучший и самый простой подход - создать новый список документов и добавлять в него только те элементы, которые вы хотите, используя pub.list:appendToDocumentList (или tundra.list.document:append, если вы используете Tundra ) внутри вашего шага петли.

2 голосов
/ 29 января 2015

Для этого вы можете использовать встроенный сервис удаления документов.

Вот очень простой пример, надеюсь, это отражает использование функции.

  1. Просмотрите эти документы
  2. Ветка для сбора индексов нежелательных документов в цикле на шаге отображения
  3. Вне цикла используйте pub.document: deleteDocuments, чтобы удалить этот список документов из исходного документа.

Надеюсь, это поможет.

1 голос
/ 07 апреля 2012

У меня есть несколько тестов, и можно установить для определенного элемента документа значение null (с помощью службы pub.list: setListItem), но список документов останется с тем же размером.

Другой способ - циклическое выполнениесписок документов и добавление в новый список документов интересующих вас (pub.list: appendToDocumentList).

Другой вопрос о том, как задать для переменной значение null, вы можете использовать Drop on the pipe

PS: использование webMethods 7.1.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...