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

Тема в разделе "Lotus - Программирование", создана пользователем seoman2, 16 июн 2010.

  1. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Есть в базе в некоторых документах по два поля с одинаоквым именем.
    Одно пустое, ненужное, другое непустое, нужное.
    Как грамотно лотус-скриптом поудалять пустые дубли?

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

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    А какой тип этих полей? Если RichText, то ничего не надо трогать, так и задумано.

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

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Айбиэмовцы данную ситуацию предлагают разруливать так:
     
  4. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    Ммм-дяяя....
    Метод для дублирования item-ов онЕ оставили (doc.AppendItemValue), а метод для доступа к дублям (doc.GetNextItem. В 4.11 ещё был) - ликвидировали
     
  5. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    шальная мысль: а вот если найти эту древнюю четверку где-нить, написать агента, скомпилировать и скопипастить в R7 например...

    Добавлено: есть кстати еще апишный вариант( для настоящих джедаев :) ):
    Код (Text):
    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.
     
  6. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Идея интересная, а LS разве линкуется в исполняемый код, разве он не исполняется виртуальной машиной, как Java?
    Да и, в общем-то, перебор итемов тоже не накладный способ...

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    мысь об удалении

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

    Akupaka А че я?.. О.о

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Akupaka
    ну ты, блин, придираешся



     
  10. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    И вообще!

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    хм... надо проверить, я хэлпу на 100% не доверяю (могу просто не правильно понять)
     
  12. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Код (Text):
    Set item = doc.getFirstItem( ITEM_NAME )
    while not item is nothing
    ' сюда код по сохранению значений поля, если надо....
    Call item.remove()
    Set item = doc.getFirstItem( ITEM_NAME )
    wend
     
  13. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Работает как написано.

    turumbay
    А у меня на одну строчку меньше! ;)
     
  14. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    всё правильно
    1) берем первый итем - удаляем
    2) при необходимости повторить

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А у меня ещё на одну строчку меньше ;)!
    Код (LotusScript):
    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">
    Код (LotusScript):
    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
     
Загрузка...

Поделиться этой страницей