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

seoman2

Lotus team
17.02.2010
458
1
#1
Есть в базе в некоторых документах по два поля с одинаоквым именем.
Одно пустое, ненужное, другое непустое, нужное.
Как грамотно лотус-скриптом поудалять пустые дубли?

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

divankin

Senjor developer
13.08.2009
182
0
#2
А какой тип этих полей? Если RichText, то ничего не надо трогать, так и задумано.

Вообще правильный вопрос: откуда взялись эти поля? У вас есть какие-то идеи?
 
13.03.2009
625
1
#3
Айбиэмовцы данную ситуацию предлагают разруливать так:
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
11
#4
Ммм-дяяя....
Метод для дублирования item-ов онЕ оставили (doc.AppendItemValue), а метод для доступа к дублям (doc.GetNextItem. В 4.11 ещё был) - ликвидировали
 
13.03.2009
625
1
#5
а метод для доступа к дублям (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.
 

Akupaka

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

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

morpheus

скриптописец
07.08.2006
3 915
1
#7
мысь об удалении

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

Akupaka

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

morpheus

скриптописец
07.08.2006
3 915
1
#9
Akupaka
ну ты, блин, придираешся



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

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#10
И вообще!

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

Чёрный маг
Lotus team
06.11.2007
3 231
17
#14
всё правильно
1) берем первый итем - удаляем
2) при необходимости повторить

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

nvyush

Lotus team
22.04.2009
2 317
0
#15
А у меня на одну строчку меньше!
А у меня ещё на одну строчку меньше ;)!
Код:
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