При использовании 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());
Думаю, будет не лишним немного дополнить пример.
ОтветитьУдалитьИ вопрос небольшой появился на этой почве. Исследованием причин времени заняться пока не было :(
В общем, ищу я таким образом все карточки, включая удалённые. Удалённые при этом необходимо восстанавливать, чтобы получить доступ к 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}
Из-за чего такое может возникнуть?
Да, интересно, попробую поэкспериментировать при возможности. Я бы попробовал найти и удалить эту карточку из Навигатора вручную. А так же посмотрел ссылки на неё
ОтветитьУдалить1. В свойства карточки, раздел "Ссылки"
2. В коде приложения методом GetLinksToCard
3. Либо в базе
SELECT * FROM dvsys_links WHERE DestinationCard = идентификатор карточки
Скорее всего забыли про ярлык в карточке папок - попробуйте использовать вместо CardManager.DeleteCard() метод FolderCard.DeleteCard()
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьПробовала проверить Ваш код,выдает ошибку "не удалось найти имя типа или пространства имен ViewSource (пропущена директива using или ссылка на сборку)", при том, что Docsvision.Platform.ObjectManager подключен.В чем может заключаться ошибка?
ОтветитьУдалитьВсе, ошибку нашла - ViewSource искался в Docsvision.Platform.ObjectManager.Interop.dll
ОтветитьУдалитьЭтот пример для старых версий (DocsVision 4.1 и ранее). В нем была одна .Net сборка - Docsvision.Platform.ObjectManager.Interop.dll, которая является оберткой над ObjectManager.dll.
ОтветитьУдалитьВ более старших версиях есть сборка Docsvision.Platform.ObjectManager.dll (обо всех этих библиотеках написано в руководстве разработчика). Структура классов этой библиотеки отличается от Docsvision.Platform.ObjectManager.Interop.dll.