All Forums
 Категория Visio
 Форум Вопросы и ответы
 Не обновляются поля в SheetList
Author Previous Topic Topic Next Topic  

aignashev

8 Posts

Posted - 10/07/2010 :  16:59:12
Добрый вечер.

У подписи (подпись нарисована кривой) в рамке ГОСТ есть параметр в User-defined cells, например user.noshow, который зависит от определенных условий и в данный момент он равен true. У этой же подписи в Geometry1.Noshow стоит формула =User.noshow, но при просмотре значений она равняется False. Т.е. как это два одних и тех же значения значения не равны друг другу? Кстати если зайти в редактирование Geometry1.Noshow и нажать Enter, то значение сразу же обновится на TRUE. Видимо это значение обновляется, по какой-то причине.

Если поможет. Подпись состоит в группе нижней формы рамки, а нижняя форма в самой рамке. User-defined cell от которой зависит Noshow зависит от параметра в свойствах документа.

Tumanov

Russia
1198 Posts

Posted - 10/07/2010 :  18:17:19
Формулы в шейп-листе иногда могут не выполняться.
Это происходит, если в какой-то момент какая-то из ссылок, участвующих в формуле, становится недействительной или когда длина последовательности ссылок превышает определенную величину (например, десяток последовательных ссылок).
На второй случай у Вас вроде не похоже...
А для первого надо бы проанализировать все условия в формулах - не могут ли они когда-то стать невыполнимыми. Тогда формула временно перестает вычисляться, а после "встряски" типа редактирования опять восстанавливается. То есть, формулы, вроде, все правильные, но как бы отключены. Кажется я на такое натыкался.
Попробуйте максимально упростить цепочку ссылок и, если в таком состоянии будет работать, постепенно возвращать к теперяшнему состоянию и наблюдать, когда начнет ломаться.
Go to Top of Page

aignashev

8 Posts

Posted - 10/07/2010 :  18:21:31
Может быть когда я помещаю рамку в стенсил, а потом забираю ее оттуда?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 10/07/2010 :  21:08:02
Вполне возможно. Трафарет - это другой документ. И при переносе рамки из одного документа в другой формула может сбойнуть.
По возможности рамку с такой ссылкой лучше держать прямо на странице. В шаблоне.
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 10/08/2010 :  07:03:54  Visit Surrogate's Homepage
а если попробовать:
в ячейке User.Noshow.Prompt написать формулу

=if(0=0,setf("Geometry1.Noshow",user.noshow),setf("Geometry1.Noshow",user.noshow))

думаю, таким образом можно добиться обновления полей.

лично у меня нет ячейки user.noshow в моем аналоге штампа. у меня условие видимости/невидимости подписи стоит в самом Geometry1.Noshow :)
Go to Top of Page

aignashev

8 Posts

Posted - 10/08/2010 :  12:00:05
Когда подпись состоит из одной кривой это удобно, а когда из многих или из группы, то удобнее группе присвоить какое-то значение, от которого зависят все фигуры, в нее входящие, а потом менять условия и экспериментировать.
Go to Top of Page

aignashev

8 Posts

Posted - 10/09/2010 :  16:03:21
Попытался еще вот так сделать
=GUARD(IF(0=0,SETF("User.noshow","User.noshow"),SETF("User.noshow","User.noshow")))
в самое ячейке выдает "310", если поставить просмотр значений, а сама ячейка User.noshow не изменяется, хотя теперь уже в ячейке User.noshow не обновляются данные.

В ячейке User.noshow стоит формула
=GUARD(AND(OR(User.form1,User.sign),OR(User.Form3,User.sign),OR(User.form2,User.sign)))

Есть еще
USer.form1
USer.form2
USer.form3
они равны FALSE когда выбрана форма1, 2 или 3 соответственно
в User.sign формула
=GUARD(IF(STRSAME(User.sign.Prompt,TheDoc!User.razrabotal),0,1))

Всегда ли хорошо писать GUARD?
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 10/11/2010 :  08:55:30  Visit Surrogate's Homepage
я конечно не доктор, но мне кажется что применять оператор guard() в этом случае точно не надо
=GUARD(IF(0=0,SETF("User.noshow","User.noshow"),SETF("User.noshow","User.noshow"))),
т.к. в данном случае оператор setf() принудительно записывает в некую ячейку, какое-то значение. Кстати, не совсем понял в какой ячейке стоит вышеуказанная формула ?

эта формула заменяет в формулу Ячейке User.noshow, на ее конкретное значение в этот момент времени, в этой ячейке будет лишь значение False или True/ но не формула и поэтому обновления ячейки в дальнейшем не происходит.

IMHO guard() нужно применять когда нужно зафиксировать размеры шейпа или сделать неизменным какое-то текстовое поле. не ставить его в каждое вычисляемое значение. Как показал этот пример, Guard не помог, оператор Setf() спокойненько заменил значение в "защищенной" GUARD ячейке

не совсем понятно,
=GUARD(AND(OR(User.form1,User.sign),OR(User.Form3,User.sign),OR(User.form2,User.sign)))
что в данном случае делает оператор or ?
он используется для сравнения значений user.form1, user.form2, user.form3 и user.sign ?
quote:
Когда подпись состоит из одной кривой это удобно, а когда из многих или из группы, то удобнее группе присвоить какое-то значение, от которого зависят все фигуры, в нее входящие, а потом менять условия и экспериментировать.

например есть группа Sheet.5, состоящая из 4 шейпов Sheet.1, Sheet.2, Sheet.3 и Sheet.4
для ячейки Sheet.1 назначаем условие видимости формулой в поле user.noshow.prompt
=if(0=0,setf("Geometry1.Noshow",user.noshow),setf("Geometry1.Noshow",user.noshow))
для элементов остальных шейпов из группы можно в ячейке Geometry1.Noshow написать
Sheet.2!Geometry1.Noshow=Sheet.1!Geometry1.Noshow
Sheet.3!Geometry1.Noshow=Sheet.1!Geometry1.Noshow
Sheet.4!Geometry1.Noshow=Sheet.1!Geometry1.Noshow

Edited by - Surrogate on 10/11/2010 14:14:34
Go to Top of Page

aignashev

8 Posts

Posted - 10/11/2010 :  22:14:42
=GUARD(IF(0=0,SETF("User.noshow","User.noshow"),SETF("User.noshow","User.noshow")))
Этим я пытался сделать алтернативу нажатию два раза Enter по полю User.noshow (войти в режим редактирования формулы и присвоить), потому что если это сделать руками то все работает нормально.

=GUARD(AND(OR(User.form1,User.sign),OR(User.Form3,User.sign),OR(User.form2,User.sign)))
Это формула, что подпись должна быть видима, но действует по обратной логике. User.form1 = FALSE, когда выбрана форма 1 и т.д. User.sign равна FALSE когда подпись совпадает с фамилией в графе разработал. В общем, когда вся формула равна FALSE, то подпись отображается.
1. Если это форма 1 и подпись этого человека
2. Если это форма 2 и подпись этого человека
3. Если это форма 3 и подпись этого человека
Подпись должна быть видима если любое из этих условий равно FALSE



quote:
например есть группа Sheet.5, состоящая из 4 шейпов Sheet.1, Sheet.2, Sheet.3 и Sheet.4
для ячейки Sheet.1 назначаем условие видимости формулой в поле user.noshow.prompt
=if(0=0,setf("Geometry1.Noshow",user.noshow),setf("Geometry1.Noshow",user.noshow))
для элементов остальных шейпов из группы можно в ячейке Geometry1.Noshow написать
Sheet.2!Geometry1.Noshow=Sheet.1!Geometry1.Noshow
Sheet.3!Geometry1.Noshow=Sheet.1!Geometry1.Noshow
Sheet.4!Geometry1.Noshow=Sheet.1!Geometry1.Noshow

а какая разница откуда берется условие, что фигура должна быть показана? Тем более к одной из десятка закорючек в подписи цеплять условие видимости всей фигуры не очень удобно, подписей много у каждой своя особенность - запутаешься.

На листе, где я создавал рамку все работает как надо. После того, как я поместил в стенсил и взял рамку оттуда, перестало работать. Хотя никаких REF() не выдает.
Go to Top of Page

Surrogate

Russia
122 Posts

Posted - 10/12/2010 :  07:17:11  Visit Surrogate's Homepage
quote:

=GUARD(IF(0=0,SETF("User.noshow","User.noshow"),SETF("User.noshow","User.noshow")))
Этим я пытался сделать алтернативу нажатию два раза Enter по полю User.noshow (войти в режим редактирования формулы и присвоить), потому что если это сделать руками то все работает нормально.



для чего используется конструкция if(0=0, ....) понятно! я просто еще раз повторюсь что происходит по данной логике
1. мы вводим в поле value ячейки user.noshow формулу
=GUARD(IF(0=0,SETF("User.noshow","User.noshow"),SETF("User.noshow","User.noshow")))
2. в ту же секунду вычисляется значение этой ячейки, например TRUE и оператор SETF() записывает в поле value ячейки user.noshow значение TRUE, и все формула введенная в пункте 1 БЕЗВОЗВРАТНО потеряна !!!

необходимо чтобы в вычисляемое выражение для подстановки в операторе SETF() отличалась от имени целевой ячейки
SETF("X",Y), где X<>Y

quote:
а какая разница откуда берется условие, что фигура должна быть показана? Тем более к одной из десятка закорючек в подписи цеплять условие видимости всей фигуры не очень удобно, подписей много у каждой своя особенность - запутаешься.

да, в принципе если логика прописана правильно то действительно не важно - откуда берется условие

quote:
На листе, где я создавал рамку все работает как надо. После того, как я поместил в стенсил и взял рамку оттуда, перестало работать. Хотя никаких REF() не выдает.


такое бывает, ссылка на шейп начинает работать неправильно. например на листе шейп имеет имя sheet.5, когда его переместили в стенсил стал называться sheet.1, когда потом из стенсила выносится на новый лист sheet.33! поэтому REF() не выдается

Edited by - Surrogate on 10/12/2010 07:40:34
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)