Получить Objectid аттача

  • Автор темы D!m@n
  • Дата начала
D

D!m@n

#1
Добрый день, уважаемые участники!

Есть ли какой-нибудь способ программно получить ObjectID файлового вложения в документе?
У NotesEmbeddedObject такого свойства нет. Экспорт документа (и даже всей базы с потрохами) в DXL не помогает.

Заранее спасибо!
 

Вложения

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 572
265
#3
а он вам зачем? (просто интересно)
 
D

D!m@n

#4
Можно, конечно, попробовать... Но пока я не нашел ни одной функции, возвращающей Object Id, кроме NSFDbAllocObject(), но это не то, что мне нужно...
а он вам зачем? (просто интересно)
Есть такая проблемка известная - "Attachment found in more than one document". Возникает, если не ошибаюсь, когда вследствие ошибки в базе создается два аттача с одинаковыми Object Id. У меня такая проблемка возникла с одной юзерской почтовой базой. Fixup и compact не помогли. Можно, конечно, еще реплику создать, но этот вариант я приберегаю на потом, т.к. он слишком простой, скучный и не дает понимания проблемы.
А хочется найти пару проблемных документов и разобраться с ними в индивидуальном порядке :)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#5
А хочется найти пару проблемных документов и разобраться с ними в индивидуальном порядке
о, такой же любитель извращений :)
тоесть у вас получается в одном доке два аттача с одни и тем же именем? :(
 
D

D!m@n

#7
Да речь же не про имя аттача, а про идентификатор объекта аттача (который по идее должен быть уникален не в пределах документа, а в пределах базы)... :)
 

TIA

:-)
Lotus team
15.05.2009
790
3
#10
Пример на С.
[codebox] OBJECT_DESCRIPTOR objDescr;
unsigned char* pMyValue;
STATUS error;
WORD value_datatype;
BLOCKID value_blockid;
BLOCKID item_blockid;
BLOCKID prev_item_blockid;
DWORD value_len;
unsigned char* pNValue;
unsigned char* pValue = NULL;


error = NSFItemInfo(hNote,ITEM_NAME_ATTACHMENT, strlen(ITEM_NAME_ATTACHMENT),
&(item_blockid), &value_datatype, &value_blockid, &value_len);

while (NOERROR == error)
{
if (TYPE_OBJECT == value_datatype)
{
pMyValue = new unsigned char[value_len];
pNValue = (unsigned char *)OSLockBlock(char,value_blockid);
pNValue += sizeof(WORD);
value_len -= sizeof(WORD);
memcpy(pMyValue, pNValue, value_len);
OSUnlockBlock(value_blockid);

ODSReadMemory( &pMyValue, _OBJECT_DESCRIPTOR, &objDescr, 1 );

if (OBJECT_FILE == objDescr.ObjectType)
{
//Искомый RRV получен в objDescr.RRV
...
}
delete pMyValue;
}

prev_item_blockid = item_blockid;
error = NSFItemInfoNext(hNote,
prev_item_blockid,
ITEM_NAME_ATTACHMENT,
strlen(ITEM_NAME_ATTACHMENT),
&item_blockid,
&value_datatype,
&value_blockid,
&value_len);
}[/codebox]
 
D

D!m@n

#11
TIA, спасибо за помощь!
Вернусь из отпуска - буду ковырять, как Ваш исходник использовать! :)
(свою проблему вынужден был решить созданием реплики... но инфа все равно пригодится :))
 

maliy

Well-known member
20.03.2007
164
2
#12
to D!m@n , у Вас получилось получить программно доступ к свойствам аттачмента? Если да , не могли бы подсказать как ?
 

maliy

Well-known member
20.03.2007
164
2
#13
to TIA, а нет примера на С полного , или примера базы на лотусе с использованием С API чтоб более наглядно можно было разобраться?
 

TIA

:-)
Lotus team
15.05.2009
790
3
#14
Про вызов dll из LS погугли книги
EntwickerCamp2007-Calling-The-C-API-From-LotusScript.pdf
ls2capi-ebook-to.pdf
 

maliy

Well-known member
20.03.2007
164
2
#15
ок, это я просмотрю , но я имел ввиду код , или пример как получить Objectid аттача , тобой код приведен , но я так понял он не полный вот может где-то завалялся примерчик неплохо было бы...
 

TIA

:-)
Lotus team
15.05.2009
790
3
#16
тобой код приведен , но я так понял он не полный
Куда полнее то? Там есть всё необходимое. Разве что константа ITEM_NAME_ATTACHMENT имеет значение "$FILE". Ты скажи что не понятно, в чём по твоему неполнота, может смогу ответить.
 

maliy

Well-known member
20.03.2007
164
2
#18
to TIA про неполный код я имел ввиду
if (OBJECT_FILE == objDescr.ObjectType)
{
//Искомый RRV получен в objDescr.RRV
...
}
То есть не понятно что тут должно обрабатываться....
Я просто никогда не работал с Вызовом C API из лотуса, по этому вот примерчик был бы кстати , ну и к тому же стоит задача получить каким то образом приаттаченный файл.

to Klido, спасибо за ссылки.
 

TIA

:-)
Lotus team
15.05.2009
790
3
#19
maliy
Задача стояла так:
Есть ли какой-нибудь способ программно получить ObjectID файлового вложения в документе?
Искомый ObjectID это ни что иное как RRV. Если угодно:
DWORD ObjectID = objDescr.RRV;

Почему Вам не подходит получать приаттаченный файл через штатный EmbeddedObject, getAttachment, тоже "Attachment found in more than one document"?
 

maliy

Well-known member
20.03.2007
164
2
#20
Вообщем хочу сделать чтобы зная, UNID документа , можно было бы иметь доступ к его аттачу из реляционной субд , пока не знаю как это сделать ...
То есть - в лотус в базе в определенных документах имеются аттачи, и вот пользователь например скопировал в реляционку в поле UNID дока, а потом чтоб написать какую то функцую , которая по этому UNID из лотусовой базы перетягивала аттач в реляционку.