Проблема Не могу придумать универсальное средство для LS и SCJS

Ficoos

Lotus Team
15.03.2016
150
5
BIT
272
Доброго времени суток, гуру! У меня появилась проблема с СЭД. В каждой базе есть документ оприсания маршрута, причем для каждого статуса имеется отдельный документ маршрута. В нем описывается:
-№ статуса текущего
-Намиенование статуса текущего
-Из какого поля документа заявки брать имя пользователя, который должен согласовать документ на этом статусе
-Какой следующий статус. - вот тут загвоздка. В самом документе заявки есть поле checkBox, если в нем есть значение, то документ должен идти по большому кругу согласования. В
карточке описания маршрута в специальном поле записывалась @формула, которая вычисляла на какой следующий статус должен переидти документ. Например:
Код:
@if(SmallPath = "1"; 10; 5)
Тут: Если поле "SmallPath" = "1", то следующий статус = 10, иначе следующий статус = 5.
Так вот. В LS есть такая команда "EVAL()", которая компилирует текст в поле и выдает вычисленной значение этой формулы.
Я перевожу базу в работу через xPages. И тут не нашел, как можно компилировать @формулу средствами JS.

Может кто подскажет, как можно компилировать @формулу средствами js или сделать обходной маневр. В принципе есть запасной вариант, но это отдельные поля для вычислений на @формуле и на js, что
само по себе громоздко..
 
ожидалось совсем другое. Не программное вычисление формулы, вычисление текста в значении поля, записанной как формула. Причем документ описания маршрута( статуса) не имеет поля "SamallPath" - оно в документе-заявке.
Во вложении как раз документ описания маршрута для одного статуса. Вот что бы переидти на следующий статус, надо вычислить значение формулы, записанной как текст в поле "Next Stage Number". Но это не все. Нужно еще сделать такие же вычисления по остальным полям.
 

Вложения

  • StageDoc.jpg
    StageDoc.jpg
    80,6 КБ · Просмотры: 569
Т.е. если я напишу то же самое, что и выше вот так

Код:
var d = session.evaluate( docStatus.getItemValueString('fldNextStage')  , docOrder )

где:
  • docStatus это документ описания маршрута
  • docOrder это документ-заявка
  • fldNextStage это имя поля с текстом, записанным как формула в документе описания маршрута
  • var d это результат вычисления
то получится, что ожидалось?

ЗЫЖ тему на зеленом прочел

  • в LotusScript нет EVAL, есть Evaluate
  • @EVAL - это @Function
В каком месте ты вычисляешь? Покажи кусочек кода и место, где он находится.
 
Последнее редактирование:
Т.е. если я напишу то же самое, что и выше вот так

Код:
var d = session.evaluate( docStatus.getItemValueString('fldNextStage')  , docOrder )

где:
  • docStatus это документ описания маршрута
  • docOrder это документ-заявка
  • fldNextStage это имя поля с текстом, записанным как формула в документе описания маршрута
  • var d это результат вычисления
то получится, что ожидалось?

ЗЫЖ тему на зеленом прочел

  • в LotusScript нет EVAL, есть Evaluate
  • @EVAL - это @Function
В каком месте ты вычисляешь? Покажи кусочек кода и место, где он находится.
Ты прав! Eval вычислялось на собаках. Просто из LS запускался код собак, что бы вычислить все.
Код:
res= Evaluate(endstmacro,doc)
А само вычисление:
кусочек
Код:
Const endstmacro = {
key := "formProfileSetup" + "_" + @Subset( @DbName; 1 );
tmp := @DbLookup("":"";"":"";"viewSetupByKey";key; "fldInfoServer");
field fldServer := @If( @IsError(tmp) ; ""; @Subset( tmp; 1 ));
tmp := @DbLookup("":"";"":"";"viewSetupByKey";key; "fldInfoPath");
field fldPath := @If( @IsError(tmp) ; ""; @Subset( tmp; 1 ));

@Eval( fld_Docflow_Stage_Canceled_Run);

next_number := @ToNumber( fld_Docflow_Stage_Current_Number ) - 1;

FIELD fld_Docflow_Stage_Current_Number := next_number;
FIELD fld_Docflow_Stage_Current_Commnt := "";
FIELD fld_Docflow_Stage_Current_IsLast :="" ;


buff:=@GetField(@Text("fld_DFH_Cancel_Name"));
tmp:=@Text(fld_Docflow_Stage_Current_Status);
@SetField("fld_DFH_Cancel_Name";buff:tmp);
LenNam:=@Integer(@Length(tmp)/30)+1;

buff:=@GetField("fld_DFH_Cancel_Performer");
tmp:=@Text(@Name([CN];@UserName));
@SetField("fld_DFH_Cancel_Performer";buff:tmp);
LenPer:=@Integer(@Length(tmp)/20)+1;

buff:=@GetField("fld_DFH_Cancel_Date");
tmp:=@Text(@Now([ServerTime] : [LocalTimeOnError];@Subset( @DbName; 1 )));
@SetField("fld_DFH_Cancel_Date";buff:tmp);
LenDat:=@Integer(@Length(tmp)/15)+1;
Ну и так далее..
Спасибо за идею. А то занимаюсь только 1 месяц xPages, а уже задание перевести все СЭД на xPages. Вот и приходится
просить помощи.
 
Не думаю что такие формулы проканают через evaluate. У него там я вижу и @Prompt есть. Если под XPages, то скорее всего это всё надо будет переписать на JavaScript.
 
Не думаю что такие формулы проканают через evaluate. У него там я вижу и @Prompt есть. Если под XPages, то скорее всего это всё надо будет переписать на JavaScript.
Да! Это кусок от кода на LS. Вот я его и адаптирую под xPages.
 
Да! Это кусок от кода на LS. Вот я его и адаптирую под xPages.
если есть интерактив - это все CSJS , т.е. оставить на собаках нельзя, надо переделывать логику
плохая идея - хранить интерактивные ф-ции в настроечном доке
 
А само вычисление:
кусочек
такой легаси - реальная жесть, повторить формулы на др. языке - это переписать логику надо, а вот учесть все нюансы нереально
засада будет и с датами, они везде работают несколько иначе (в хэпагах они больше -> Java Date)
 
еще момент, при постановке - "надо вчера" не стоит ляпать весь ф-ционал с 0
этапы м.б.:
  • обертка в виде агентов для LS, для вызова из xPages, можно передавать WithContext ! (т.е. док будет изменен и изменения отобразятся на странице)
  • переписывание на Java, не используйте SSJS (только как точку входа) , вызывайте сразу классы Java
  • подключение доп. библиотек типа ODA OpenLog - упростит обработку документов и логирование
 
такой легаси - реальная жесть, повторить формулы на др. языке - это переписать логику надо, а вот учесть все нюансы нереально
засада будет и с датами, они везде работают несколько иначе (в хэпагах они больше -> Java Date)
Спасибо! Все получилось как я хотел. Конечно @prompt в формуле будет опущен. Вычисление даты для записи в поле будет на JS.
 
Вычисление даты для записи в поле будет на JS.
лучше так не делать (хотя проще), потом замучаетесь код искать и править + JS освобождает объекты (нотусевые) по правилам Java (recycle())
 
  • Нравится
Реакции: VladSh и Ficoos
Появился еще один вопрос:
"Как объединить значения в одно поле?"
Ну например на собаках:
Код:
tmp:=@Unique(Field1 : Field2 : field3)

а как на хэпаге это сделать?
там есть свои @формулы, но вот объединение по тем же правилам? через ":"?
 
лучше так не делать (хотя проще), потом замучаетесь код искать и править + JS освобождает объекты (нотусевые) по правилам Java (recycle())
А что там мучатся? есть собачный код дя хэпаги: @Now()
или для JS:
Код:
doc.replaceItemValue("fld_DateSignSubDivChief", session.createDateTime(@Now()))
У меня пока еще нет вычислений разницы в минутах, часах, днях ... между датами. Хотя эта задача уже на подходе.
Пока делаю как проще.
 
А что там мучатся? есть собачный код дя хэпаги: @Now()
или для JS:
Код:
doc.replaceItemValue("fld_DateSignSubDivChief", session.createDateTime(@Now()))
У меня пока еще нет вычислений разницы в минутах, часах, днях ... между датами. Хотя эта задача уже на подходе.
Пока делаю как проще.
потом замучаетесь искать, переносите код в Java, его проще редактировать и отлаживать, редактор кода в дизайнере для JS - никакой
Java:
DateTime datumtijd = session.createDateTime("Today");
datumtijd.setNow();
 
В результате получается tmp - обычный массив. Вам следует использовать массив JavaScript и методы работы с ним. см
Да! Мне нужен массив, что бы его затолкать в поле, а не делать его перебор и извлекать из них (в него) по-одному.
 
Да! Мне нужен массив, что бы его затолкать в поле, а не делать его перебор и извлекать из них (в него) по-одному.
Как ты пишешь, на выходе будет стринга из кусков, соединённых ";"
Можешь показать в хепаге, как многострочник
 
Как ты пишешь, на выходе будет стринга из кусков, соединённых ";"
Можешь показать в хепаге, как многострочник
В хэпаге я работаю с NotesDocument классом. По-этому мне в хепаге не нужен многострочник. Просто для показа значений в хепаге я использую список для отображения значения мультивалуйного поля из NotesDocument.
Есть идея, но еще не проверял:
Код:
var listusers = doc.GetItemValueString('Field1') += doc.GetItemValueString('Field2') += doc.GetItemValueString('Field3')
так можно собрать массив?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!