Удаление дубля поля

seoman2

Green Team
17.02.2010
507
1
BIT
72
Есть в базе в некоторых документах по два поля с одинаоквым именем.
Одно пустое, ненужное, другое непустое, нужное.
Как грамотно лотус-скриптом поудалять пустые дубли?

Только вариант - перебор циклом всех имен полей в каждом документе?
 
D

divankin

А какой тип этих полей? Если RichText, то ничего не надо трогать, так и задумано.

Вообще правильный вопрос: откуда взялись эти поля? У вас есть какие-то идеи?
 
T

turumbay

Айбиэмовцы данную ситуацию предлагают разруливать так:
help сказал(а):
If multiple items in a document have the same name, programmatic access is limited to the first item. The remaining items yield invalid data. A work-around is to get the first item, process it, remove it, again get the first item (which was the second item), and so on until you process all the items with the same name. If you do not save the document, the items are not actually removed. However, the recommendation is that you avoid creating multiple items with the same name.
 
30.05.2006
1 345
12
BIT
0
Ммм-дяяя....
Метод для дублирования item-ов онЕ оставили (doc.AppendItemValue), а метод для доступа к дублям (doc.GetNextItem. В 4.11 ещё был) - ликвидировали
 
T

turumbay

а метод для доступа к дублям (doc.GetNextItem. В 4.11 ещё был) - ликвидировали
шальная мысль: а вот если найти эту древнюю четверку где-нить, написать агента, скомпилировать и скопипастить в R7 например...

Добавлено: есть кстати еще апишный вариант( для настоящих джедаев :) ):
Код:
STATUS LNPUBLIC NSFItemInfoNext(
NOTEHANDLE note_handle,
BLOCKID NextItem,
const char far *item_name,
WORD name_len,
BLOCKID far *item_blockid_ptr,
WORD far *value_type_ptr,
BLOCKID far *value_blockid_ptr,
DWORD far *value_len_ptr);
Так и пишут в описании: The function is used primarily to find all the items in a note that have the same name.
 
A

Akupaka

а вот если найти эту древнюю четверку где-нить, написать агента, скомпилировать и скопипастить в R7 например
Идея интересная, а LS разве линкуется в исполняемый код, разве он не исполняется виртуальной машиной, как Java?
Да и, в общем-то, перебор итемов тоже не накладный способ...

Подумав немного: хотя, возможно, пресловутая способность поддерживать старый код и тут сработает как надо ;)
 
M

morpheus

мысь об удалении

label_1:
doc.RemoveItem("")
call doc.Save(true, false )
doc = /// взять док опять
if doc.HasItem("") then goto label_1
 
A

Akupaka

мысь об удалении
Зачем там сохранение и "взять док опять", еще и гоу-ту-лейбл?!!! Турумбая на тебя не хватает! )))
Если просто удалить все итемы с таким-то именем, то:
Код:
while doc.HasItem(ItemName)
call doc.RemoveItem(ItemName)
wend
 
M

morpheus

Akupaka
ну ты, блин, придираешся



- Слушай, я был неправ, как мне загладить свою вину? С меня пару банок пива, ок?
- Один! ящик! водки!
- Какой ты, цуко, ранимый!!!!
 
A

Akupaka

И вообще!

HELP сказал(а):
Call notesDocument.RemoveItem( itemName$ )
Parameters
itemName$
String. The name of the item to delete from the document. If more than one item has the specified name, all items with this name are deleted. If there is no item with the specified name, the method does nothin

Значит надо так:
Код:
	While doc.HasItem(itemName)
Set item = doc.GetFirstItem(itemName)
Call item.Remove()
Wend
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
всё правильно
1) берем первый итем - удаляем
2) при необходимости повторить

я так в своё время антиспамер делал - в серверной записи было лишь одно поле куда можно было вносить "черные IP" приходилось создавать кучу одноименных полей дабы выйти за границы в 64K
 
N

nvyush

А у меня на одну строчку меньше!
А у меня ещё на одну строчку меньше ;)!
Код:
Do While doc.HasItem(itemName)
Call doc.GetFirstItem(itemName).remove()
Loop
Кстати, поэкспериментировав обнаружил, что если в цикле нет получения значения итема, то все итемы удаляются за один раз! doc.AppendItemValue помещает итемы не "перед", а "позади" (FIFO). <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код агента:</div></div><div class="sp-body"><div class="sp-content">
Код:
Sub Initialize
Print "--------------"
Dim s As New NotesSession
Dim db As NotesDatabase
Set db = s.CurrentDatabase
Dim doc As New NotesDocument(db)
Dim item As NotesItem
Const itemName = "i1"
Call doc.AppendItemValue(itemName, "1")
Call doc.AppendItemValue(itemName, "2")
Call doc.AppendItemValue(itemName, "3")
Do While doc.HasItem(itemName)
Print {item.Text = } + doc.GetFirstItem(itemName).Text 'если здесь закомментировать от плюса, цикл выполнится один раз
Call doc.GetFirstItem(itemName).remove()
Loop
End Sub
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!