Форум пользователей Visio
http://visio.getbb.ru/

Вопросы синхронизации между схемой и внешним источником данных
http://visio.getbb.ru/viewtopic.php?f=26&t=334
Страница 1 из 2

Автор:  Tumanov [ 25 апр 2013, 20:48 ]
Заголовок сообщения:  Вопросы синхронизации между схемой и внешним источником данных

Постольку поскольку с шейпами мы далеко не продвинулись, движок пока не сильно специализирован. Поэтому спрашивать можно не только про однолинейные схемы, а про любые возможные применения такого движка. Основные его особенности в том, что: данные идут только в одну сторону (от источника в схему); обновление данных должно автоматически отслеживаться; можно придумать алгоритм построения схемы по данным (например, размещения шейпов).

Автор:  9rey [ 25 апр 2013, 21:30 ]
Заголовок сообщения:  Re: Временный простой ?

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

Автор:  Surrogate [ 25 апр 2013, 23:07 ]
Заголовок сообщения:  Re: Временный простой ?

Tumanov писал(а):
Постольку поскольку с шейпами мы далеко не продвинулись, движок пока не сильно специализирован.
Я то думал, что от шейпов в движке мало чего зависит. ведь можно пойти двумя путями:
1. запихивать программно данные в каждый конкретный шейп внутри группового шейпа например типа 6
2. запихивать программно все данные в групповой шейп, а конкретные шейпы будут средствами шейпшита считывать свои значения с shapedata или с user-defined cells
9rey писал(а):
можно сделать двустороннюю передачу данных и туда и обратно. тогда можно синхронизировать изменения между несколькими чертежами на нескольких машинах. организовать многопользовательскую работу и тп.
во втором случае это точно недостижимо

Автор:  9rey [ 26 апр 2013, 06:48 ]
Заголовок сообщения:  Re: Временный простой ?

Цитата:
во втором случае это точно недостижимо

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

Автор:  Surrogate [ 26 апр 2013, 07:03 ]
Заголовок сообщения:  Re: Временный простой ?

9rey писал(а):
достаточно выбрать форму хранения данных в визио.
какие предлагаешь варианты ?

Автор:  9rey [ 26 апр 2013, 09:15 ]
Заголовок сообщения:  Re: Временный простой ?

ну как ты и предложил: либо в каждом шейпе держать его данные, либо в групповом шейпе. при любом способе данные хранятся в shapedata и user секциях (в зависимости от того какие данные должен видеть и редактировать пользователь). при любом способе нет проблем в организации связи с внешним источником

Автор:  Surrogate [ 26 апр 2013, 11:08 ]
Заголовок сообщения:  Re: Временный простой ?

я с утра не проснулся еще, поэтому задал такой вопрос :)
наверно User предпочтительнее ! в каждой ячейке два поля Value и Prompt
Изображение
пришлось добавить ячейку User.Text, т.к. при попытке написать формулу в
Events->TheText
TheText=SETF("User.Data.Prompt",SHAPETEXT(TheText)),
выдает ошибку 310 и ругается на циклическую ссылку
TheText=SETF("User.data.Prompt",User.text),
тоже ругается на циклическую ссылку, но работает :)

А сначала я хотел все в TheDoc!User данные хранить. но данных будет немерено в здании могут быть десятки щитов, в каждом щите до 36 групп. в каждой группе до 20 параметров !

Автор:  9rey [ 26 апр 2013, 12:11 ]
Заголовок сообщения:  Re: Временный простой ?

что-то я не понял суть этой конструкции с TheText
зачем вообще использовать Events?
SHAPETEXT(TheText) в ячейке user УЖЕ выполняет все что надо. ты меняешь текст в шейпе, и он сразу появляется в ячейке user

Автор:  Surrogate [ 26 апр 2013, 12:20 ]
Заголовок сообщения:  Re: Временный простой ?

когда в шейп передались данные из внешнего источника, мы сделаем так чтоб они подставились в текст шейпа.
Но если вдруг пользователь поменяет текст ручками. то значение из ячейки User.Text подставится в User.Data.Prompt с помощью Events.
Далее нужно написать код который будет сравнивать User.Data и User.Data.Prompt, если они будут разными. но надо обновить соответствующую ячейку во внешнем источнике, например файле Эксель

так я хотел реализовать "обратную связь" :)

Автор:  9rey [ 26 апр 2013, 12:44 ]
Заголовок сообщения:  Re: Временный простой ?

а не проще тогда в ячейку events.thetext прописать runmacro или callthis и вызывать процедуру обновления данных в эксель, как только пользователь изменит данные руками?
и не городить огород

Автор:  Surrogate [ 26 апр 2013, 12:56 ]
Заголовок сообщения:  Re: Временный простой ?

хороший вариант !
получается, даже не надо придумывать код который будет пробегать по всем групповым шейпам и анализировать различие значений в этих полях :)
будет в режиме реального времени синхронизировать изменения с внешним источником данных
и наверно в коде макроса будет проще реализовать формирование формулы с параметром CALLTHIS, чем в ShapeSheet. там такая морока с этими кавычками

Автор:  9rey [ 26 апр 2013, 13:29 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

тут есть нюанс: когда данные поступят с экселя в шейпы, автоматически сработают все ивенты, т.к. текст то изменится. и запустится обратное обновление. это надо отслеживать и запрещать

Автор:  Surrogate [ 26 апр 2013, 13:59 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

теперь огород с отслеживанием и запрещением образовался :)
думаю, это сложнее добавления лишней ячейки User.Text…
Может Геннадий предложит свой вариант или найдем компромисс :)

Автор:  9rey [ 26 апр 2013, 14:49 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

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

Автор:  Surrogate [ 26 апр 2013, 15:17 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

Я сразу же признавал, что мне нужен некий костыль который еще должен запустить процесс обновления. Думаю, запихать его в Document_BeforeDocumentClose
насчет перебора всех шейпов я бы так не горячился :)
нашел для себя Document_ShapeExitedTextEdit, буду думать как его применить

Автор:  9rey [ 26 апр 2013, 15:36 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

во, так с этим Document_ShapeExitedTextEdit мой вариант превращается вообще в элементарщину.
никаких User секций. просто тупо принимаешь из экселя в шейповый текст. по Document_ShapeExitedTextEdit отсылаешь обратно в эксель
даже скучно

Автор:  Tumanov [ 26 апр 2013, 19:11 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

Цитата:
Может Геннадий предложит свой вариант или найдем компромисс

Да в принципе, практиковаться можно на любых вариантах... Вдруг что-то интересное получится :)
Лично мне вариант с отслеживанием события редактирования шейпа не нравится. Но это не должно никого останавливать.
Если проанализировать уже имеющиеся решения, то чаще всего по двойному щелчку на шейпе выскакивает специальная форма. По кнопке ОК данные с формы уходят в базу и отображаются в шейпе. Почему?
1. Так проще.
2. Шейп чаще всего отображает несколько полей из базы. Например, идентификатор, название, какую-нибудь характеристику. Щелкать для редактирования по внутренним полям группы - довольно некрасиво. Обычно их стараются скрыть от прямого редактирования.
3. Если результат редактирования сразу уходит в базу, то могут быть неприятности при случайном щелчке. Промазал, попал не в тот шейп - оно уже в базу улетело. Надо как-то возвращать... А при работе через форму всегда есть ОК и Cancel.
Скорее всего есть и другие веские аргументы, это только первое, что пришло в голову.
Но, опять же повторяю, в принципе всегда могут неожиданно появиться интересные оригинальные решения...
-----------
По поводу хранения данных.
Хранение желательно делать так, чтобы порция данных улетала вместе с шейпом, к которому она относится. Если все данные засунуть в какую-нибудь группу, а через некоторое время удалится один из входящих шейпов, потребляющий эти данные, нужно думать, что делать с обрубленными связями. А так - шейп удалился и данные с ним.
Или вторая крайность - все данные засовывать в документ. По второй схеме, например, работает аддон моделирования базы.

Автор:  9rey [ 26 апр 2013, 19:23 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

очень верно все сказано.
я именно так в своей софтине и сделал. с окошечком, ок, отмена, все дела. даже отмену (Undo) прикрутил.
согласен с Геннадием, я бы тоже пошел по этому пути, но надо же мозговой штурм то поустраивать :) варианты всякие и тп.

Еще я за то, чтобы можно было редактировать через окошко Custom Properties (Shape Data Window). Удобно же - выделил фигуру и увидел все ее параметры в этом окне. и при желании чтобы пользователь мог изменять там данные. Нельзя пренебрегать интерфейсом визио...

Автор:  9rey [ 26 апр 2013, 19:27 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

Цитата:
Хранение желательно делать так, чтобы порция данных улетала вместе с шейпом, к которому она относится. Если все данные засунуть в какую-нибудь группу, а через некоторое время удалится один из входящих шейпов, потребляющий эти данные, нужно думать, что делать с обрубленными связями. А так - шейп удалился и данные с ним.
Или вторая крайность - все данные засовывать в документ. По второй схеме, например, работает аддон моделирования базы.


Я за то чтобы хранилось все на шейпе. шейп - запись (группа записей).

Автор:  Surrogate [ 26 апр 2013, 23:57 ]
Заголовок сообщения:  Re: Вопросы синхронизации между схемой и внешним источником данн

Я согласен с аргументами за shape data. Действительно не стоит менять текст каждого шейпа. а проще менять свойства shape data группового шейпа. а текст дочерних шейпов будет брать эти значения
на этой форме Shape Data (Custom Properties) есть кнопки OK и Cancel.
Изменения произойдут после нажатия ОК
Такую форму лучше как-то заблокировать. Возможно случайное изменение параметров
 
Групповому шейпу можно через Ctrl+F9 добавить поле Fields.Value. Это поле сделать невидимым, оно будет составным
Fields.Value
= Prop.Tok&Prop.Faza&Prop.Py

Если хоть одно из полей изменится, то это событие мы отработаем с помощью Document_ShapeExitedTextEdit


Раз мы заговорили про синхронизацию данных! Есть еще одна проблема, для нас входной информацией являлась таблица предоставленная snake100771. Я вспомнил эти его слова
snake100771 писал(а):
snake100771 писал(а):

!
т.е. нам придется решать задачу максимально равномерного распределения нагрузки по фазам в Визио!
Кода распределения по фазам в эксель у нас тоже нет!

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/