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

Тема в разделе "Lotus - Программирование", создана пользователем deeeman, 7 окт 2011.

  1. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    В виде в колонке (отображает иконки) стоит код:

    Код (Text):
    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()) нужна чтобы перевести текст в дату.
    подругому не получается...
     
  2. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    А чего в @Adjust не DToday используешь?

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    вот Это кодик...
     
  4. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Формулу отбора и формулы столбцов покажи?
     
  5. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    тебе одного столбца мало?
    или хочешь в мемориз? :)
     
  6. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    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 и уголовный кодекс
     
  7. Akupaka

    Akupaka А че я?.. О.о

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

    Добавлено:
    Что это ты такое советуеш? Вместо вчерашней даты использовать 01-01-1900? О.о

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

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

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

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

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    все правильно он советует. там в итоге условие выбора картинки - проверка на дату больше или равно дате DToday - так что для пустой даты без разницы, будет ли она вчера или в 1900 году.
     
  9. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    спасибо вам огромное!
    полегчало =)
     
  10. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    turumbay, Akupaka

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

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    гм. а ведь точно:
    никогда раньше не доводилось по этим граблям пройтись...
    но суть оптимизации не меняется: заменить вчерашний день на константу и закоротить ИЛИ.
    без @Return-а это делаеца ацким вложенным @If....
     
Загрузка...

Поделиться этой страницей