Добавление строки в список

Gor

Well-known member
07.06.2005
517
1
#1
Здравствуйте!
Помогите решить такую задачку.

У меня есть мультивалуйное поле с разделителями New Line.
Значение я туда записываю просто @SetField ом
@SetField("DCL_P";DCL_P:DCL_AddEncl1_1);

т.е. пополняю список значений.

Как можно добавить в этот список значений своё, но в определённом месте, т.е. по ключу?

например
DCL_P = ОДИН:ДВА:ТРИ

key:= ДВА
Value:= МОЙ ТЕКСТ

Чтобы результат поля DCL_P по выполнению какой то функции был таким DCL_P = ОДИН:ДВА:МОЙ ТЕКСТ:ТРИ ????

Пытаюсь пройти в цикле весь список, но чёто торможу... непойму как вставить значение в следующую линию и сдвинуть список на 1
Код:
@For(n := 1;n <= @Elements(DCL_P); n := n+1;
@If(@Contains(Key;DCL_P[n]);@SetField(DCL_P[n+1];"МОЙ ТЕКСТ");@Success));
@Command([ViewRefreshFields])
не работает( да наверно и не должно... неправильно делаю... но догадаться не могу что то как надо...
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#2
Например так:
Код:
@Explode(@Replace("ОДИН" : "ДВА" : "ТРИ"; "ДВА"; "ДВА" + "~" + "МОЙ ТЕКСТ"); "~")
 

Gor

Well-known member
07.06.2005
517
1
#3
спасибо))
извиняюсь, но на самом деле немного задачку наверно я описал не так, точнее не полностью. Скорее через @Explode здесь не всё получится сделать...

Я по кнопке пишу значения сразу в несколько полей одновременно

@SetField("DCL_P";DCL_P:DCL_AddEncl1_1);
@SetField("DCL_P1";DCL_P1:DCL_Add_1);
@SetField("DCL_P2";DCL_P2:DCL_Add_2);

И ключ есть только для одного поля. В остальные поля строчка должна добавляться на том же уровне.

т.е.

DCL_P = ОДИН:ДВА:ТРИ
DCL_P1 = 1:2:3
DCL_P1 = 10:20:30

key:= ДВА

Value = МОЙ ТЕКСТ
Value1 = МОЙ ТЕКСТ1
Value2 = МОЙ ТЕКСТ2

Результат:
DCL_P = ОДИН:ДВА:МОЙ ТЕКСТ:ТРИ
DCL_P1 = 1:2:МОЙ ТЕКСТ1:3
DCL_P2 = 10:20:МОЙ ТЕКСТ2:3

Как то здесь через цикл наверно надо делать, массив строк чтоли обрабатывать... вставлять в n-ый элемент...
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Немного сложнее:
Код:
@SetField("DCL_P1"; @Explode(@Right(@Replace(DCL_P + "~" + DCL_P1; key + "~" + DCL_P1; "~" + DCL_P1 + "|" + Value1); "~"); "|"));
@SetField("DCL_P2"; @Explode(@Right(@Replace(DCL_P + "~" + DCL_P2; key + "~" + DCL_P2; "~" + DCL_P2 + "|" + Value2); "~"); "|"));
@SetField("DCL_P"; @Explode(@Right(@Replace(DCL_P + "~" + DCL_P; key + "~" + DCL_P; "~" + DCL_P + "|" + Value); "~"); "|"));
 

Gor

Well-known member
07.06.2005
517
1
#6
Код:
А почему не на скрипте?
Web форма... и документ на этапе создания (т.е. ещё не сохранён)
 

Gor

Well-known member
07.06.2005
517
1
#8
to: Medevic

Я на js дальше валидации и регулярных выражений к сожалению не продвинулся =)
да и редактор js в лотусе ужасный... с синтиксисом у меня проблемы... а другой редактор на рабочем месте
нет возможности использовать...

Спасибо огромное!!! Работает! +1
 

Gor

Well-known member
07.06.2005
517
1
#9
to: Medevic
Немного сложнее:

@SetField("DCL_P1"; @Explode(@Right(@Replace(DCL_P + "~" + DCL_P1; key + "~" + DCL_P1; "~" + DCL_P1 + "|" + Value1); "~"); "|"));@SetField("DCL_P2"; @Explode(@Right(@Replace(DCL_P + "~" + DCL_P2; key + "~" + DCL_P2; "~" + DCL_P2 + "|" + Value2); "~"); "|"));@SetField("DCL_P"; @Explode(@Right(@Replace(DCL_P + "~" + DCL_P; key + "~" + DCL_P; "~" + DCL_P + "|" + Value); "~"); "|"));
Единственно эта формула почему то при наличии в строке только одной записи записывает сразу две сроки ниже...

т.е. если
DCL_P = ОДИН
DCL_P1 = 1
DCL_P1 = 10

key:= ОДИН

Value = МОЙ ТЕКСТ
Value1 = МОЙ ТЕКСТ1
Value2 = МОЙ ТЕКСТ2

Возвращет результат
DCL_P = ОДИН:МОЙ ТЕКСТ:ОДИН
DCL_P1 = 1:МОЙ ТЕКСТ1:1
DCL_P2 = 10:МОЙ ТЕКСТ2:10

это наверное потому что нет списка уже?
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#10
Попробуй везде @Trim поставить.
Т.е. @Trim(DCL_P) + "~" + @Trim(DCL_P1) и т.д.
 

Gor

Well-known member
07.06.2005
517
1
#11
@SetField("DCL_P1_1O"; @Explode(@Right(@Replace(@Trim(DCL_P1_1O) + "~" + @Trim(DCL_P1_1O); @Trim(enclToO) + "~" + @Trim(DCL_P1_1O); "~" + @Trim(DCL_P1_1O) + "|" + @Trim(DCL_LA_1O)); "~"); "|"));
@SetField("DCL_PO"; @Explode(@Right(@Replace(@Trim(DCL_P1_1O) + "~" + @Trim(DCL_PO); enclToO + "~" + @Trim(DCL_PO); "~" + @Trim(DCL_PO) + "|" + @Trim(DCL_AddEncl1O)); "~"); "|"));
@SetField("DCL_P2_1O"; @Explode(@Right(@Replace(@Trim(DCL_P1_1O) + "~" + @Trim(DCL_P2_1O); @Trim(enclToO) + "~" + @Trim(DCL_P2_1O); "~" + @Trim(DCL_P2_1O) + "|" + @Trim(DCL_R2O)); "~"); "|"));
нипомогает(

хотя я наврал...
она немного по другому делает... Независимо от того сколько уже линий в поле.
Вот так хитро она возвращет=))):

DCL_P = ОДИН:ДВА:ТРИ
DCL_P1 = 1:2:3
DCL_P1 = 10:20:30

key:= ОДИН

Value = МОЙ ТЕКСТ
Value1 = МОЙ ТЕКСТ1
Value2 = МОЙ ТЕКСТ2

Возвращет результат
DCL_P = ОДИН:МОЙ ТЕКСТ:ДВА:ТРИ
DCL_P1 = 1:МОЙ ТЕКСТ1:2:3:1
DCL_P2 = 10:МОЙ ТЕКСТ2:20:30:10

т.е. дублирует строчку где она ключевой не является, а в ключевую пишет нормально. И дублирует причём только один раз=)))
Если повоторно функцию прогать больше строчек лишних она не добавляет,т.е. нормально возвращает, хотя лишняя строчка записанная остаётся...

DCL_P = ОДИН:МОЙ ТЕКСТ:МОЙ ТЕКСТ:ДВА:ТРИ
DCL_P1 = 1:МОЙ ТЕКСТ1:МОЙ ТЕКСТ1:2:3:1
DCL_P2 = 10:МОЙ ТЕКСТ2:МОЙ ТЕКСТ2:20:30:10

Может быть с полями у меня что то не то((
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#12
получайте @SubSet используя @Member
 

Gor

Well-known member
07.06.2005
517
1
#15
@member вернёт позицию элемента в массиве
ну можно попробовать же и так сделать?

@For(n := 1;n <= @Elements(DCL_P1); n := n+1;
@If(DCL_P1[n]=key;@SetField("DCL_P1";@Subset(DCL_P1;n-1):Value:mad:Subset(DCL_P1;n+1));@Success);@Success);


только что то не работает=) буду разбираться=)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#17
вы неправильно пользуетесь ф-цией
циклы в собаках - это излишне (зачастую)
n:=@Member(key;list);
nAll:=@Elements(list)
newvalue:=@SubSet(list;n):value:mad:SubSet(list;n-nAll);
в границах мог ошибиться на 1
 

Gor

Well-known member
07.06.2005
517
1
#18
вы неправильно пользуетесь ф-цией
циклы в собаках - это излишне (зачастую)
n:=@Member(key;list);
Я уже понял :(
С сабсетом ещё и проверка на ноль нужна...
У меня вот так работает

f:= @Member(enclTo;DCL_P1_1);
s:= -(@Elements(DCL_P1_1)-@Elements(@Subset(DCL_P1_1;f)));

qoute:= " + " +DCL_AddEncl1;
m:=" * "+DCL_LA_1;
m1:=" * "+DCL_R2;

@If(s=0;@SetField("DCL_P";DCL_P:qoute);@SetField("DCL_P";@Subset(DCL_P;f):qoute:mad:Subset(DCL_P;s)));
@If(s=0;@SetField("DCL_P1_1";DCL_P1_1:m);@SetField("DCL_P1_1";@Subset(DCL_P1_1;f):m:mad:Subset(DCL_P1_1;s)));
@If(s=0;@SetField("DCL_P2_1";DCL_P2_1:m1);@SetField("DCL_P2_1";@Subset(DCL_P2_1;f):m1:mad:Subset(DCL_P2_1;s)));