Мелкие Вопросы Rtfm

  • Автор темы Автор темы serko
  • Дата начала Дата начала
в новом движке появляются уведомления (JS держит соединение с серваком), без принудительного обновления
 
@lmike, угу при условиях:
1. следишь за темой / тема открыта на экране
2. тебя процитировали
3. к тебе обратились
4. лайкнули/повысили репутацию

Общий список тем обновляется только при обновлении страницы.
 
Вы ещё карты Карно разложите. Не нужно всех этих Морган-преобразований. Правильно говорят - составьте формулу, когда кнопка должна быть видна и поставьте отрицание. Потому что в дальнейшем могут добавиться новые условия видимости и Вы запаритесь их скрещивать с имеющими.
И ещё рекомендация - если в формуле скрытия фигурируют тяжелые функции - не дай бог DBLookup-ы, то сначала надо проверить, а не выполняются ли более простые запрещения:

@if(DocIsDeleted="1";@Return(@True);"");

AcceptValues:=@Dblookup(...);
@isNotMember(...)
 
Последнее редактирование:
@DbLookUp может использовать [ReCache] а не ""
И еще можно на @IsError (например полученное значение) вместо Silent
смысл именно в перехвате ошибки а не замалчивании, ведь результат с пустым значением может оказаться и правильным (а о ненахождении - знать надо)
 
Не нужно всех этих Морган-преобразований...
;) Нужно. Условия видимости (да и другие ифы) могут быть весьма сложными и, в дальнейшем, изменяя (уточняя) "условие" достаточно добавить "новое" к максимально упрощённой формуле.
Кста, эквивалентные преобразования не исчерпываются Морганом - их десяток, и все нужны.
И ещё, причёсанная сложная формула может поставить мозги на место (в смысле дать толчок к упрощению наскоро написанной логики)
 
Убрав отрицание, получим перечень условий, когда объект виден. Чего проще-то?
Формула должна отображать реальные условия, а не оптимизированные преобразования, которые радуют автора своей изящностью. Когда приходится допиливать, то понять, чего хотел сказать уволившийся год назад автор порой действительно сложно - мозги разъезжаются.
 
Убрав отрицание, получим перечень условий, когда объект виден. Чего проще-то?...
Это, всего лишь , частный случай и, вообще, иллюстрация. Разговор об упрощении сложного выражения (да, тут не этот случай). Можешь упростить - упрости. ИМХО.
 
Я тоже поначалу всё оптимизировал и радовался ускорению открытия на 3 секунды!
Но через год заказчик оплатил доработку, и я всё проклял, пытаясь понять, что там изначально закладывалось.


ИМХО, надо всем прочитать "Complete Code". Сам себе спасибо через год скажешь. :)
 
в сложных формулах скрытия, я уже давно взял за правило использование след стру-ры:
a1:=@if(условие1;0;1);
a2:=@if(условие2;1;a1);
.....
an:=@if(условиеn;1;an-1);
@if(первое условие;1;an)

Соответственно когда надо понять причину видимости/невидимости смотрю условия с конца и смотрю какое конкретное условие косячит
 
@Shandrik, не это имел в виду.
Все сложные/спорные моменты надо документировать, сохранять релизность/версионность с документацией от заказчика.
Тогда проблемы типа:
заказчик оплатил доработку, и я всё проклял, пытаясь понять, что там изначально закладывалось.
должны пропасть в большей мере, так как всегда есть что требовалось и что было реализовано.
Это сложно, это требует времени, это реально тяжело поддерживать в актуальном состоянии, но это необходимо.
 
Вот с чем работать приходится - копипаст со скрытия кнопки: :dead:


Код:
tmp1:=@Trim(ProcessAdministratorsAccessDP:ProcessAdministratorsAccessDP_1:ProcessAdministratorsAccessDP_2:ProcessAdministratorsAccessDP_3:ProcessAdministratorsAccessDP_4:ProcessAdministratorsAccessDP_5:ProcessAdministratorsAccessDP_6:ProcessAdministratorsAccessDP_7:ProcessAdministratorsAccessDP_8:ProcessAdministratorsAccessDP_9:ProcessAdministratorsAccessDP_10);
 
tmp2:=@Trim(ProcessOwnersAccessDP:ProcessOwnersAccessDP_1:ProcessOwnersAccessDP_2:ProcessOwnersAccessDP_3:ProcessOwnersAccessDP_4:ProcessOwnersAccessDP_5:ProcessOwnersAccessDP_6:ProcessOwnersAccessDP_7:ProcessOwnersAccessDP_8:ProcessOwnersAccessDP_9:ProcessOwnersAccessDP_10);
 
tmp3:=@Trim(StageAdministratorsAccessDP:StageAdministratorsAccessDP_1:StageAdministratorsAccessDP_2:StageAdministratorsAccessDP_3:StageAdministratorsAccessDP_4:StageAdministratorsAccessDP_5:StageAdministratorsAccessDP_6:StageAdministratorsAccessDP_7:StageAdministratorsAccessDP_8:StageAdministratorsAccessDP_9:StageAdministratorsAccessDP_10);
 
tmp4:=@Trim(StageExecutorsAccessDP:StageExecutorsAccessDP_1:StageExecutorsAccessDP_2:StageExecutorsAccessDP_3:StageExecutorsAccessDP_4:StageExecutorsAccessDP_5:StageExecutorsAccessDP_6:StageExecutorsAccessDP_7:StageExecutorsAccessDP_8:StageExecutorsAccessDP_9:StageExecutorsAccessDP_10);
 
tmp5:=@Trim(StagePExecutorsAccessDP:StagePExecutorsAccessDP_1:StagePExecutorsAccessDP_2:StagePExecutorsAccessDP_3:StagePExecutorsAccessDP_4:StagePExecutorsAccessDP_5:StagePExecutorsAccessDP_6:StagePExecutorsAccessDP_7:StagePExecutorsAccessDP_8:StagePExecutorsAccessDP_9:StagePExecutorsAccessDP_10);
 
tmpA:=@UserNamesList;
 
tmp1A:=@Trim(@Replace(tmpA; tmp1; ""));
 
tmp2A:=@Trim(@Replace(tmpA; tmp2; ""));
 
tmp3A:=@Trim(@Replace(tmpA; tmp3; ""));
 
tmp4A:=@Trim(@Replace(tmpA; tmp4; ""));
 
tmp5A:=@Trim(@Replace(tmpA; tmp5; ""));
 
CurrentStageStatusDP != "Visa" | !((@IsMember("Owner"; StageAdmin01VDP)  & @Elements(tmpA) != @Elements(tmp2A)) | (@IsMember("Admin"; StageAdmin01VDP)  & @Elements(tmpA) != @Elements(tmp1A))  | (@IsMember("StageAdmin"; StageAdmin01VDP)  & @Elements(tmpA) != @Elements(tmp3A))  | (@IsMember("Exec"; StageAdmin01VDP)  & @Elements(tmpA) != @Elements(tmp4A))  | (@IsMember("ExecP"; StageAdmin01VDP)  & @Elements(tmpA) != @Elements(tmp5A)) )

[DOUBLEPOST=1426168976,1426168924][/DOUBLEPOST]Чёрт, рожи вылезли. Но смысл, во всяком случае масштаб бедствия, ясен.
[DOUBLEPOST=1426169044][/DOUBLEPOST]И тут приходит менеджер и просит ещё сбокубантик :banghead:
 
Последнее редактирование:
Но смысл, во всяком случае масштаб бедствия, ясен.
да - надо было в CFD поле вынести списки и их пересечение
или написать CFD поле в LS, в PO ссылку на либу с обработкой прав видимости, еще можно в QR (QueryRecalc)
 
Последнее редактирование модератором:
  • Нравится
Реакции: alexas1
Код:
CurrentStageStatusDP != "Visa" | !((@IsMember("Owner"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp2A)) | (@IsMember("Admin"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp1A)) | (@IsMember("StageAdmin"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp3A)) | (@IsMember("Exec"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp4A)) | (@IsMember("ExecP"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp5A)) )
вот это переделать под структуру @if и уже более удобно и понятно следить что и как, если ничего не перепутал :)

Код:
n5:=@if(@IsMember("ExecP"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp5A);1;0)
n4:=@if(@IsMember("Exec"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp4A);1;n5);
n3:=@if(@IsMember("StageAdmin"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp3A);1;n4);
n2:=@if(@IsMember("Admin"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp1A);1;n3);
n1:=@if(@IsMember("Owner"; StageAdmin01VDP) & @Elements(tmpA) != @Elements(tmp2A);1;n2);
n0:=@if(n1;0;1);
@if(CurrentStageStatusDP != "Visa";1;n0)
главное определиться с приоритетом какое условие важнее
 
Мы в соцсетях:

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