четверг, 2 апреля 2009 г.

Программный поиск карточек с включением удаленных в результаты поиска

При использовании UserSession.CardManager.FindCards() из Managed ObjectManager поиск не возвращает удаленные карточки в результатах поиска.
Метод FindCards в принципе не умеет возвращать удаленные карточки, т.к. он возвращает объекты CardData, а для удаленной карточки этот объект получить нельзя.

То же условие касается архивных карточек.

Для поиска таких карточек, лучше использовать не FindCards, а представление.

Пример кода:

ViewSource source = ViewSource.FromSearch(QueryText); source.ShowDeleted = true;
InfoRowCollection rows = m_oUserSession.CardManager.GetViewData(source, Guid.Empty); MessageBox.Show(rows.Count.ToString());

7 комментариев:

  1. Думаю, будет не лишним немного дополнить пример.
    И вопрос небольшой появился на этой почве. Исследованием причин времени заняться пока не было :(

    В общем, ищу я таким образом все карточки, включая удалённые. Удалённые при этом необходимо восстанавливать, чтобы получить доступ к CardData, а потом удалить... уже окончательно.
    И вот почему-то на этом моменте возникает затык. Только что восстановленная карточка не удаляется. По ссылкам зависимостей нет, через навигатор она тоже нормально удаляется, а кодом нет :( В итоге в базе появляются карточки-призраки.
    Ниже упрощённый кусок кода (как продолжение вышеприведённого):

    foreach (InfoRow iIR in rows)
    {
    // Для получения данных из удалённой карточки - нужно её восстановить

    // Если карточка имеет атрибут "помечена на удаление"
    if (iIR["_DeletedCard"].ToString() == "True")
    {
    deleted = true;
    m_oUserSession.CardManager.RestoreCard(new Guid(iIR["_InstanceID"].ToString()));
    }
    else
    deleted = false;

    oCurCardData = m_oUserSession.CardManager.GetCardData(new Guid(iIR["_InstanceID"].ToString()));
    // Получаем основную секцию
    oCurCardDataRow = oCurCardData.Sections[new Guid(cIncDocMainInfo)].FirstRow;
    string FullNumber = oCurCardDataRow.GetString("Number").ToString();
    //.....ну и далее получаем необходимые данные

    // Удаляем карточку ОКОНЧАТЕЛЬНО (shift+del), если она была восстановлена.
    try
    {
    if (deleted) m_oUserSession.CardManager.DeleteCard(oCurCardData.Id);
    }
    catch (Exception ex)
    {
    // и попадаем почему-то сюда :(
    }
    }

    В логе следующее...

    31.01.2009 7:00:25 Произошла ошибка DocsVision.Platform.StorageServer.StorageServerException: Карточка не может быть удалена, так как она используется в других карточках.
    at DocsVision.Platform.ObjectManager.Helpers.ExceptionHelper.ThrowExceptionForHR(Int32 hr)
    at DocsVision.Platform.ObjectManager.CardManagerImpl.DeleteCard(Guid cardId, Boolean permanently)
    at DocsVision.Platform.ObjectManager.CardManager.DeleteCard(Guid cardId)
    at DV2ODOU.DVFunctions.OutDataExport(UserSession m_oUserSession, String destFolder, Int32 console, RichTextBox richTextBox_LOG) in C:\Programming\DV2ODOU\DVFunctions.cs:line 1405 при попытке окончательного удаления временно восстановленной карточки входящего с CardID={7FE561F5-7A3C-4599-829A-1C1DCD64AE79}



    Из-за чего такое может возникнуть?

    ОтветитьУдалить
  2. Да, интересно, попробую поэкспериментировать при возможности. Я бы попробовал найти и удалить эту карточку из Навигатора вручную. А так же посмотрел ссылки на неё
    1. В свойства карточки, раздел "Ссылки"
    2. В коде приложения методом GetLinksToCard
    3. Либо в базе
    SELECT * FROM dvsys_links WHERE DestinationCard = идентификатор карточки

    ОтветитьУдалить
  3. Скорее всего забыли про ярлык в карточке папок - попробуйте использовать вместо CardManager.DeleteCard() метод FolderCard.DeleteCard()

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Пробовала проверить Ваш код,выдает ошибку "не удалось найти имя типа или пространства имен ViewSource (пропущена директива using или ссылка на сборку)", при том, что Docsvision.Platform.ObjectManager подключен.В чем может заключаться ошибка?

    ОтветитьУдалить
  6. Все, ошибку нашла - ViewSource искался в Docsvision.Platform.ObjectManager.Interop.dll

    ОтветитьУдалить
  7. Этот пример для старых версий (DocsVision 4.1 и ранее). В нем была одна .Net сборка - Docsvision.Platform.ObjectManager.Interop.dll, которая является оберткой над ObjectManager.dll.

    В более старших версиях есть сборка Docsvision.Platform.ObjectManager.dll (обо всех этих библиотеках написано в руководстве разработчика). Структура классов этой библиотеки отличается от Docsvision.Platform.ObjectManager.Interop.dll.

    ОтветитьУдалить