Как Оптимизировать Колонку

deeeman

Well-Known Member
04.12.2007
383
0
#1
В виде в колонке (отображает иконки) стоит код:

Код:
DToday := @Date(@TextToTime(@Environment("ENV_Today")));

@If(Status*="Фоновые":"Выполнено":"Удален":"Отменено":"Не выполнено";@Return("");"");
@If(@Text(isPlan)!="1";@Return("");"");

a:=@If(isPlanDatePerformer!="";
@If(@Contains(isPlanDatePerformer;",");
@Date(@TextToTime(@Right(@Left(isPlanDatePerformer;",");" ")));
@Date(@TextToTime(@Left(isPlanDatePerformer;" ")))
);
@Adjust(@Today;0;0;-1;0;0;0)
);


b:=@If(isPlanDateCheckPerformer!="";
@If(@Contains(isPlanDateCheckPerformer;",");
@Date(@TextToTime(@Right(@Left(isPlanDateCheckPerformer;",");" ")));
@Date(@TextToTime(@Left(isPlanDateCheckPerformer;" ")))
);
@Adjust(@Today;0;0;-1;0;0;0)
);


c:=@If(isPlanDateRukProekt!="";
@If(@Contains(isPlanDateRukProekt;",");
@Date(@TextToTime(@Right(@Left(isPlanDateRukProekt;",");" ")));
@Date(@TextToTime(@Left(isPlanDateRukProekt;" ")))
);
@Adjust(@Today;0;0;-1;0;0;0)
);


@If(a>=DToday | b>=DToday | c>=DToday;"Запланировано в календаре2";"Запланировано в календаре")

Т е если в общем говорить то код для каждого документа берет 3 поля и смотрит в них текстовые поля (в формате даты), и сравнивает с текущим днем, так вот этот вид каждый раз открывается минут по 5.
как оптимизировать этот код?

ЗЫ
функция @Date(@TextToTime()) нужна чтобы перевести текст в дату.
подругому не получается...
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
2
#2
А чего в @Adjust не DToday используешь?

Добавлено: И чем @TextToTime(@Environment("ENV_Today")) отличается от @TextToTime("Today")? Те же грабли с обновлением индексов.
 
13.03.2009
625
2
#6
Т е если в общем говорить то код для каждого документа берет 3 поля и смотрит в них текстовые поля (в формате даты), и сравнивает с текущим днем, так вот этот вид каждый раз открывается минут по 5.
как оптимизировать этот код?
1. Заменить @Adjust(@Today;0;0;-1;0;0;0) на @Date( 1900 , 1 ,1 )
2. Т.к. в конце концов используется логическое ИЛИ - закоротить вычисление:
сразу после вычисления "a" выполнить @If(a>=DToday ;@Return("Запланировано в календаре2"); "" ).
Аналогично для b и с.
3. Выяснить - какое из условий статистически срабатывает раньше и поменять местами порядок вычисления a,b,c
Должно значительно полегчать

P.S. А про "текстовые поля (в формате даты)" - см. date, text и уголовный кодекс
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
2
#7
тебе одного столбца мало?
а у меня что-то глюкануло, я видел только первую строку кода, подумал: "что же он хотел этим сказать?" )))
Вообще, то формулу отбора надо видеть также.

Добавлено:
1. Заменить @Adjust(@Today;0;0;-1;0;0;0) на @Date( 1900 , 1 ,1 )
Что это ты такое советуеш? Вместо вчерашней даты использовать 01-01-1900? О.о

А чего в @Adjust не DToday используешь?
вот Medevic абсолютно верно советует. Вместо @Today следует использовать либо DToday, либо @TextToTime("Today").

Добавлено: причем @Adjust(дата;0;0;-1;0;0;0) следует записать единожды в отдельную переменную.

Добавлено: Еще, для лучшей оптимизации результаты вычисления на основе полей isPlanDatePerformer, isPlanDateCheckPerformer, isPlanDateRukProekt и им подобные следует вычислять в момент записи документа! Т.е. на форме, или в определенном месте кода, создающего документ/изменяющего данные поля. А в представлении уже лишь сравнивать значения соответствующих полей с вычисленной датой.
Например, на форме добавить вычисляемое поле isPlanDatePerformerInView с формулой расчета
Код:
@If(isPlanDatePerformer!="";
@If(@Contains(isPlanDatePerformer;",");
@Date(@TextToTime(@Right(@Left(isPlanDatePerformer;",");" ")));
@Date(@TextToTime(@Left(isPlanDatePerformer;" ")))
);
@Adjust(@Today;0;0;-1;0;0;0)
);
И т.п.
А в представлении уже будет лишь:
Код:
DToday := @Date(@TextToTime(@Environment("ENV_Today")));

@If(Status*="Фоновые":"Выполнено":"Удален":"Отменено":"Не выполнено";@Return("");"");
@If(@Text(isPlan)!="1";@Return("");"");

@If(isPlanDatePerformerInView >=DToday | ...;"Запланировано в календаре2";"Запланировано в календаре")
 

hosm

* so what *
18.05.2009
2 442
9
#8
Что это ты такое советуеш? Вместо вчерашней даты использовать 01-01-1900?
все правильно он советует. там в итоге условие выбора картинки - проверка на дату больше или равно дате DToday - так что для пустой даты без разницы, будет ли она вчера или в 1900 году.
 

TIA

:-)
Lotus team
15.05.2009
790
2
#10
turumbay, Akupaka

В колонках @Return -- табу! Если @Return выполнится, столбцы правее не будут вычисляться.
 
13.03.2009
625
2
#11
В колонках @Return -- табу! Если @Return выполнится, столбцы правее не будут вычисляться.
гм. а ведь точно:
notes help сказал(а):
@Return should not be used in column formulas.
никогда раньше не доводилось по этим граблям пройтись...
но суть оптимизации не меняется: заменить вчерашний день на константу и закоротить ИЛИ.
без @Return-а это делаеца ацким вложенным @If....