Типа массивы

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

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

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

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| на ключь=значение?
 

morpheus

скриптописец
07.08.2006
3 915
1
#2
LIGHT
чтото вроде

Код:
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)
пишу прямо тут, могут быть помарки
 
L

LIGHT

#5
Спасибо!

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

Код:
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
 
L

LIGHT

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

Код:
...
...
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

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

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

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#9
chr(13) - это не разделитель элементов.
Если цель записать значения в другие поля, то на собаках всё проще получится. :)
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#11
Формула для первого поля на выходе:
@Trim(@Left(@Replace(Поле 1 + "|" + @Right(@Explode("1=0|2=0|3=1|4=0|5=1|N=X|"; "|"); "="); Поле 1 + "|1"; ""); "|"))

А на скриптах можно так:
Код:
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))
...
 
L

LIGHT

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