Типа массивы

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

  1. LIGHT

    LIGHT Гость

    Нуждаюсь в совете как реализовать.

    Имеем определенную строку которая формируется в результате определенной операции, суть в том что на выходе получем следующую запись

    1=0|2=0|3=1|4=0|5=1|N=X|

    Так же имеет огромную кучу много значных полей одинаковой разрядности, если рассматривать данный пример то 5+N

    Поля содаержат такие данные:

    Поле 1 = "Перовое","второе","третье","четвертое","пятое","энное"
    Поле 2 = "Яблоко","груша","слива","помидор","укроп","непонятное"
    Поле 3 = "Иванов","Петров","Сидоров","Александров","Николаев","Безымянный"

    Задача следующая:

    Исходя из заданной строки, удалить элементы поля при условии Номер_элемента=1

    Т.е. если рассмативать это:

    1=0|2=0|3=1|4=0|5=1|N=X|

    Получаем задачу:

    1=оставить|2=оставить|3=удалить|4=оставить|5=удалить|N=X|

    И на выходе имеем:

    Поле 1 = "Перовое","второе","четвертое",X
    Поле 2 = "Яблоко","груша","помидор",X
    Поле 3 = "Иванов","Петров","Александров",X

    Вопросы:

    Самая для меня загадка, как происходит удаление определенной элемента из многомерного поля?
    Как эту строку распарсить 1=0|2=0|3=1|4=0|5=1|N=X| на ключь=значение?
     
  2. morpheus

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

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

    Код (Text):
    Dim v as variant
    v = Split( "1=0|2=0|3=1|4=0|5=1|N=X|", "|" )
    forall x in v
    if StrToken( x,"=", 2 ) = "1" then x = ""
    end forall
    v = FullTrim(v)
    пишу прямо тут, могут быть помарки
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    На скрипте или на собаке? :rolleyes:
     
  4. LIGHT

    LIGHT Гость

    На скриптах ))
     
  5. LIGHT

    LIGHT Гость

    Спасибо!

    Но данная ф-ия

    Код (Text):
    Dim v as variant
    v = Split( "1=0|2=0|3=1|4=0|5=1|N=X|", "|" )
    forall x in v
    if StrToken( x,"=", 2 ) = "1" then x = ""
    end forall
    v = FullTrim(v)
    Работает только с конкретной строкой 1=0|2=0|3=1|4=0|5=1|N=X| а мне нужно значения этой строки пложить проекцией на другие поля. Но самое главное я так и не понял как удалить из поля одно из значений.
    Например

    a = doc.Getitemvalue("Pole")(0)
    b = doc.Getitemvalue("Pole")(1)
    c = doc.Getitemvalue("Pole")(2)
    Удаляем b
    val = a & c
    call doc.Repl.....value("Pole",val)
    не катит :rolleyes:

    А уж тем более не догоняю как это делать в потоке forall x in v
     
  6. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    чтото я не понял чему равен в данном случае а, b, c ?
     
  7. LIGHT

    LIGHT Гость

    Все разобрался вроде. Спасибо еще раз!
     
  8. LIGHT

    LIGHT Гость

    Получается интересный канделябр:

    Код (Text):
    ...
    ...
    Dim v as variant
    v = Split( "1=0|2=0|3=1|4=0|5=1|N=X|", "|" )
    stp = 0
    forall x in v
    if StrToken( x,"=", 2 ) = "0" then

    values1 = values1 & chr(13) & doc.GetItemvalue("MyField1")(stp)
    ' Тут я беру значение элемента stp в многозначном поле MyField1

    values2 = values1 & chr(13) & doc.GetItemvalue("MyField1")(stp)
    ' Тут я беру значение элемента stp в многозначном поле MyField2

    values3 = values3 & chr(13) & doc.GetItemvalue("MyField3")(stp)
    ' Тут я беру значение элемента stp в многозначном поле MyField3

    End If

    stp = stp + 1
    end forall

    ' Все нормально, проверям

    Msgbox value1
    Msgbox value2
    Msgbox value3

    ' Данные есть

    Call doc.Replace.....("MyField1",value1)
    Call doc.Replace.....("MyField2",value2)
    Call doc.Replace.....("MyField3",value3)
    Почему-то заполняются MyField1 и MyField3 а MyField2 - поле типа Author нет

    Это кусок кода, на самом деле полей порядка 40 штук, и все хорошо, заисключением полей типа Author

    Так тоже пробовал

    Код (Text):
    Dim item as NotesItem
    Set item = doc.Replace.....("MyField2",value2)
    Не помогло.

    PS: - писал прямо тут на в друг есть очепятки не смотрите на них.
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    chr(13) - это не разделитель элементов.
    Если цель записать значения в другие поля, то на собаках всё проще получится. :)
     
  10. LIGHT

    LIGHT Гость

    И как, можно примерчик не большой?
     
  11. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Формула для первого поля на выходе:
    @Trim(@Left(@Replace(Поле 1 + "|" + @Right(@Explode("1=0|2=0|3=1|4=0|5=1|N=X|"; "|"); "="); Поле 1 + "|1"; ""); "|"))

    А на скриптах можно так:
    Код (Text):
    Dim dummy As Variant
    Dim values1 As Variant
    ...
    Dim i As Long
    values1 = doc.GetItemvalue("MyField1")
    ...
    dummy = Split("1=0|2=0|3=1|4=0|5=1|N=1|", "|")
    For i = Lbound(dummy) To Ubound(dummy)
    If Strright(dummy(i), "=") = "1" Then values1(i) = ""
    ...
    Next
    Call doc.ReplaceItemValue("MyField1", Fulltrim(values1))
    ...
     
  12. LIGHT

    LIGHT Гость

    C этим все понятно, на саобаки перейти не получиться там много еще чего интересного :rolleyes:
    Еденственная запара это то что в моей ф-ии не реплейсится
    Call doc.ReplaceItemValue("MyField1", Fulltrim(values1)) если values1 = лотусовые имена! Остальные данные реплейсятся. Почему с именами глючи не как понять не могу
     
  13. LIGHT

    LIGHT Гость

    Отбой воздушной тревоги!

    Победил через массивы
     
Загрузка...

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