• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы deeeman
  • Дата начала
D

deeeman

В виде в колонке (отображает иконки) стоит код:

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

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
А чего в @Adjust не DToday используешь?

Добавлено: И чем @TextToTime(@Environment("ENV_Today")) отличается от @TextToTime("Today")? Те же грабли с обновлением индексов.
 
T

turumbay

Т е если в общем говорить то код для каждого документа берет 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. А про "текстовые поля (в формате даты)" - см. link removed
 
A

Akupaka

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

Добавлено:
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";"Запланировано в календаре")
 
H

hosm

Что это ты такое советуеш? Вместо вчерашней даты использовать 01-01-1900?
все правильно он советует. там в итоге условие выбора картинки - проверка на дату больше или равно дате DToday - так что для пустой даты без разницы, будет ли она вчера или в 1900 году.
 
D

deeeman

спасибо вам огромное!
полегчало =)
 
T

TIA

turumbay, Akupaka

В колонках @Return -- табу! Если @Return выполнится, столбцы правее не будут вычисляться.
 
T

turumbay

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

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