Обсуждение:Визуальное копирование ветви меню одного пользователя другому

0 (0)
  • Развернуть Обсуждение:Визуальное копирование ветви меню одного пользователя другому ( Обсуждение примера  31.12.2003 12:23 )
    5(1)
    Визуальное копирование ветви меню одного пользвателя другому.
    -Две панели: меню-источник,меню-приемник с разной подсветкой развилок и листьев
    -Навигация по вложенным узлам вниз и вверх. Ускоренное перемещение в корень меню.
    -Копирование ветви со всеми подузлами без дублирования совпадающих узлов.
    Совпадающие узлы определяются: для развилок - по имени имя приводится в нижний
    регистр, ликвидируются "~", английские буквы, схожие по начертанию с русскими,
    заменяются на русские; для листьев - по типу и номеру модуля.
    Протокол копирования.
    -Печать меню
    -Сравнение меню
    -Поиск узлов-дублей

    08.01.2004
    Добавлено удаление пункта меню по F8.
    Изменены/добавлены управляющие клавиши:
    ALT+F5 - Фильтр, F5 - копирование, F7 - печать
    CTRL+F6 - поиск узлов-дубликатов, CTRL+F7 - сравнение меню
    При копировании появился доп.выбор: копировать текущую ветку меню или все
    текущие ветки.
    В список пользователей теперь не попадают закрытые.
    В список модулей попадают только те, которые имеются у источника.
    Если приемник не имеет доступа к выбранному модулю, то его можно добавить
    по запросу.

    05.03.2004
    Добавлено запоминание параметров копирования.
    Исправлено удаление ветки.

    09.03.2004
    Добавлена синхронизация позиции другой панели в соответствие с текущей
    насколько это возможно (Shift_F6).
    При выборе нового приемника через ALT_F5 делается автоматическая синхро-
    низация позиции (см.выше) для ускорения процесса многократного копирования.

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

    24.03.2004
    Процедура сравнения меню теперь выводит только новые пункты меню.

    25.03.2004
    Поправлен поиск дублей. Ранее повторный поиск работал неправильно.

    21.04.2004
    Уточнен поиск совпадающих узлов при копировании. Теперь если для источника-
    развилки найден приемник с тем же именем, но не развилка, то они будут
    считаться разными узлами. Для системных листов добавлена доп.проверка на
    совпадение названия. Т.е. системные листы с разными наименованиями будут
    считаться разными узлами.
    Добавлен выбор расположения приемника при запуске программы.
    Добавлен выбор расположения источника и приемника по ALT_F5.
    Месторасположение источника и приемника выведены на экран.

    26.04.2004
    Еще раз уточнен поиск совпадающих узлов при копировании. Для всех узлов
    добавлен контроль на значение узла operparm.Parm. Для листов убран контроль
    по имени.
    Уточнена связка opermenu.dbt и operparm.dbt:
    opermenu.iNumberPoint <-> operparm.iCaseItem

    Для работы требуются две dbt-структуры:
    Словарь: D:\rsbank\DBFile\OCB\DTB_OCB.DEF
    Структура файла: uchar.rec (Для наложения на запись )
    --------------------------------------------------------------------------
    | Имя поля | Тип |Длина|Смещ.| Примечание |
    |-----------------------|-------|-----|-----|----------------------------|
    Uchar UCHR 1 0
    ------------------------------------------------------------------------
    1

    Ключи файла
    --------------------------------------------------------------------------
    |Номер| Имя поля | Флаги | Тип |Длина|Смещ.|Примечание |
    |-----|-----------------------|----------|-------|-----|-----|-----------|

    Словарь: D:\rsbank\DBFile\OCB\DTB_OCB.DEF
    Структура файла: indexo.dbt (Внешний индекс )
    --------------------------------------------------------------------------
    | Имя поля | Тип |Длина|Смещ.| Примечание |
    |-----------------------|-------|-----|-----|----------------------------|
    Sort STRING 101 0
    Nrec LONG 4 101
    ------------------------------------------------------------------------
    105

    Ключи файла
    --------------------------------------------------------------------------
    |Номер| Имя поля | Флаги | Тип |Длина|Смещ.|Примечание |
    |-----|-----------------------|----------|-------|-----|-----|-----------|
    0 Sort DM E ZSTRING 101 0
    1 Nrec DM E INTEGER 4 0


    Посмотреть пример
    >> Ответить
    • Развернуть А словарь лениво было в пример добавить?(-) ( Sergey  31.12.2003 17:09 )
      0(0)
      Not specified
      >> Ответить
    • Развернуть Хорошая утилита, спасибо(+) ( Sergey  08.01.2004 09:44 )
      0(0)
      Предложения-
      1. Если бы удалось включить пользователя-приемника "Все", то цены вообще бы не было утилите.
      2. "Закрытых" пользователей можно было бы не включать в список.
      3. После копирования ветки с большим количеством вложений статус-строка портится.
      5. По умолчанию - утилита для копирования и по умолчанию же для файлеров копирование выполняется клавишей F5. Каждый раз почему-то нажимал ее :), а не F6 Work.
      6. Может тогда уж добавить и F8Delete - тоже удобства бы прибавилось.
      7. Глупая попытка скопировать ветку меню внутрь ее же (например и слева и справа мое меню, МВОДБ. Слева - корень, справа \Рубли. Копирую пункт "Рубли". Макрос начинает ругаться через минуту -
      Error: переполнен стек интерпретации.Модуль opermenu.mac Строка 371. В меню создается бесконечное вложение типа \Рубли\Рубли\Рубли\Рубли\Рубли\Рубли\...


      >> Ответить
      • Развернуть ОК. Чуть попозже посмотрю. Отчетность. (-) ( григ  08.01.2004 10:41 )
        0(0)
        Not specified
        >> Ответить
      • Развернуть Сделал все, что просил (+) ( григ  08.01.2004 14:39 )
        0(0)
        08.01.2004
        Добавлено удаление пункта меню по F8.
        Изменены/добавлены управляющие клавиши:
        ALT+F5 - Фильтр, F5 - копирование, F7 - печать
        CTRL+F6 - поиск узлов-дубликатов, CTRL+F7 - сравнение меню
        При копировании появился доп.выбор: копировать текущую ветку меню или все
        текущие ветки.
        В список пользователей теперь не попадают закрытые.
        В список модулей попадают только те, которые имеются у источника.
        Если приемник не имеет доступа к выбранному модулю, то его можно добавить
        по запросу.

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

        >> Ответить
        • Развернуть Еще лучше теперь, но хочется больше...(+) ( Sergey  08.01.2004 15:41 )
          0(0)
          1.А копирование ветки или выбора пользователю "Всем" не получается, да?
          2.Насчет предоставления доступа к модулю - я бы не делал этого. Получается, что пользователь, получивший возможность запустить макрос, получает и все админовские права на АБС. Тогда уж надо проверить - можно ли запустившему вообще меню формировать. Хотя, конечно, все относительно.
          3. Теперь дошло до сравнения меню - мне кажется, что то что представлено - красиво, но неудобно. Нагляднее - 2 таблички - одна - чего нового, другая - чего нет (я такой макрос простенький выкладывал в примерах) и потом RStyle стал такими табличками патчи сопровождать. Или дополнить ими внизу отчета. Тогда совсем ясно станет - видно - где отличие и видно - какое.

          >> Ответить
          • Развернуть Чем больше, тем лучше (+) ( григ  08.01.2004 16:36 )
            0(0)
            1. При копировании выдается 3-й запрос: копировать текущую ветку (ту на которой стоим) или все ветки (выше текущей, текущую, ниже текущей). Т.е. если стоим в корне дерева, то при выборе "все", будут скопированы все корневые узлы.
            2. Этот макрос вообще-то на админов и рассчитан, так что юзерам его давать не надо. А раз на админов, то автоматическое добавление буковки в person.dbt, экономит часть нашего бесценного времени :). С другой стороны - если у приемника этот модуль отсутствует, то можно и не давать ему ничего и меню не копировать.
            3. Табличку я посмотрел - красивая табличка. Только я прожку писал как раз за тем, чтобы уйти от номеров, и перейти к наглядности. Да и для данной программы номера пунктов роли не играют. Визуально выбираешь откуда, куда, копируешь. Но вообще я подумаю в плане добавления такой таблицы. И над тем, лаконичнее сделать текущий отчет.
            4. Еще круто было бы копировать меню сразу группе пользователей. Но это получится беспроблемно только для кореневых веток меню.

            Да, я посмотрел твой пример. У нас немножко разные подходы. Твой - когда все меню чохом копируешь пусть даже с дублированием. Это удобно когда есть меню-образец и копирование идет аналогичным пользователям. А вот когда пользователи резко разные, да скопировать надо не все а кусок, удобнее визуальный подход (грубо говоря ткнул чего и куда копировать, а не с номерами разбираться). Хотя я подумаю над совмещением.
            >> Ответить
            • Развернуть Re : (+) ( Sergey  08.01.2004 17:18 )
              0(0)
              1.Я видел про копирование всего = классно. А выпрашиваю копирование ВСЕМ. Т.е - слева меню источника и выбранная ветвь(выбор) - а справа никого - "Все" (ну или еще лучше группы - тогда я смогу сам организовать группу такую) - и шарах им без разбору -тем, у кого модуль данный подключен. Т.е. -получается тогда мне жизнь - сказка . Хочу - одному, хочу всем скопирую, а потом удалю чего не надо...
              2. согласен - просто уберем его подальше от греха. А то им можно чего хошь сделать при желании..
              3. Ну да, номера не нужны - отлично. Ты тогда внизу сводочку дай, чтобы не вглядываться в дерево. А уж в каком виде сводка - с номерами или без - тебе решать.

              >> Ответить
              • Развернуть Пункт первый сделал (руки дошли) (+) ( григ  11.03.2004 09:04 )
                0(0)
                05.03.2004
                Добавлено запоминание параметров копирования.
                Исправлено удаление ветки.

                09.03.2004
                Добавлена синхронизация позиции другой панели в соответствие с текущей
                насколько это возможно (Shift_F6).
                При выборе нового приемника через ALT_F5 делается автоматическая синхро-
                низация позиции (см.выше) для ускорения процесса многократного копирования.

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

                Т.е. можно просто в левой панели встать на самый глубокий пункт (или выше - как нравится), нажать SHIFT_F5, выбрать нужных оперов, ответить один раз про параметры копирования, а далее прога сама переберет всех оперов, добавит им отсутствующие родительские узлы (а не все содержимое род.узлов) + выбранный узел со всем содержимым.
                Пробуй.

                Насчет сводки потом подумаю.

                >> Ответить
                • Развернуть Попробовал - очень понравилось !(+) ( Sergey  11.03.2004 10:03 )
                  0(0)
                  Есть замечания:
                  1. Если копировать всем (Shift+F5) - то после входа в меню параметров и потом отказа (ESC) уже надо этой клавишей ESC перебирать всех работников банка :-).
                  2. Если копировать всем, то прога не смотрит - есть у данного пользователя этот модуль в подключенных или нет - слепо копирует ему. Лучше бы проверяла...
                  3. Если выбрать "Выборочные операционисты" отметить кого-нибудь (или не отмечать) и потом нажать ESC, то появляется MsgBox("0") и больше ничего не делается...
                  4. Если выбрать"Выборочные группы" - тишина совсем ...

                  >> Ответить
                  • Развернуть Все поправил. Пробуй. (+) ( григ  11.03.2004 10:59 )
                    0(0)
                    По п.4. - у меня работает. А у тебя группы юзеров заведены или нет?
                    >> Ответить
                    • Развернуть Может и работает, а я не знаю как :((+) ( Sergey  11.03.2004 11:35 )
                      0(0)
                      Нажимаю Shift+F5, выбираю пользователй (или группы) клавишей Enter (крестики появляются). Потом чего надо нажать, чтобы копирование началось? Если Esc - выхожу из панели выбора и все - тишина...
                      Группы заведены...

                      Ты убрал проход по меню настроек при массовом копировании - теперь захотелось GetTrue(TRUE,"Вы действительно...); А то выбрал из меню - всем, а она как начала....:).

                      Еще одно мелкое - если при попытке выбрать новый фильтр Alt+F5 не дожать клавишу Alt, то самопроизвольно мухой копируется чего попалось в этот момент под выделенную строку :).
                      >> Ответить
                      • Развернуть Еще раз поправил (+) ( григ  11.03.2004 12:16 )
                        0(0)
                        Выборочные группы и выборочные пользователи: окончание выбора - нажать Enter на самом первом пункте в меню "ЗАВЕРШИТЬ ВЫБОР". Он еще красным выделен и большими буквами написан. А ESC - отказ от выбора.
                        По поводу ALT+F5 - я добавил запрос на копирование, который должен срабатывать, если уже был выбор параметров копирования и функция копирования вызывается сама, а не из другой функции. Клавиши лучше дожимать: сначала нажать ALT и держать, а потом жать F5. Иначе у тебя будут траблы и с CTRL+, SHIFT+ и т.д. Кстати по F6 можно вызвать список возможных действий - не надо будет комбинации клавиш использовать.
                        Пробуй теперь.
                        >> Ответить
                        • Развернуть Попробовал - вкусно :-). ( Sergey  11.03.2004 14:52 )
                          0(0)
                          В упор не видел надписи этой "Завершить выбор" - вот же. Что значит - традиционализм. Привык - меню открывается обычно первым пуктом, а сверху - заголовок. А у тебя - выбор. Работает, конечно, все.

                          Удобная утилита и всем администраторам RS продуктов ее рекомендую.

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

                          И про кнопки - как их жать - это ты зря :(. Я их, слава богу, давно жму....лет двадцать уж или больше...:).
                          >> Ответить
                          • Развернуть Ну вот, почти добили, отлично (+) ( григ  11.03.2004 15:24 )
                            0(0)
                            Проверку я вроде сделал, даже потестил, там при массовом копировании в строке 853 стоит
                            /*проверяем есть ли у приемника доступ к выбранному модулю*/
                            if(index(person.szIdentProgram,StrFor(rpoiIdentProgram.MinValue))>0)
                            Т.е. если у юзера нет такого модуля, то он игнорируется.
                            И еще в фильтре при смене модуля переспрашивает, ну и в самом начале работы. Может мы про разные моменты говорим?

                            Про кнопки - извини, не прав, погорячился.

                            >> Ответить
                            • Развернуть да - точно - работает (+) ( Sergey  11.03.2004 16:01 )
                              0(0)
                              Видимо я уже закружился в текучке - PERSON.DBT не поменял на нужный, что ли. Сейчас поменял и порядок.

                              Я думаю, вот новый РС уже буду твоей утилитой ставить. Другие не нужны больше..:-)

                              Да я не обижаюсь..чего там...Просто так это, привычка.. Работа у нас с тобой такая, что все учить пытаются...:).

                              >> Ответить
                            • Развернуть Дошли руки до поиска дублей Ctrl+F6(+) ( Sergey  15.03.2004 11:57 )
                              0(0)
                              Ctrl+F6
                              - дублей нет
                              Запускаю второй раз Ctrl+F6:
                              перечислены все пункты моего меню.:(

                              >> Ответить
                              • Развернуть Там делается так: (+) ( григ  24.03.2004 12:32 )
                                0(0)
                                Во первых, сравнение идет относительно текущего местоположения приемника и источника (т.е. не делается отработка в корень, а где стоим там и сравниваем). Во-вторых, ранее сравнение выдавало в отчет все пункты меню, старые и новые, выделяя новые словом "- новый пункт" и прекращая движение по этой ветке внутрь. Теперь я переделал - выводятся только новые пункты меню у источника. Отчет значительно сократился и стал более удобен. Плюсом я добавил печать признака системного модуля и номера модуля.
                                >> Ответить
        • Развернуть Еще нашел баг...уж извини :-) ( Sergey  09.04.2004 14:44 )
          0(0)
          Взял 84-й РС, начал работать с меню твоим макросом. Вот что обнаружил -
          у 9999 в МВОДБ появилась ветка "Картотека 1" . Раньше это был просто выбор на модуль 1118. Копирую ветку от 9999 к себе на выбор - вроде все ОК. Но увы - выбор не становится веткой. Дальше - ладно, думаю. Удаляю у себя этот выбор и копирую ветку. Все опять вроде ОК - появилась ветка. Но у 9999 в ней 2 выбора "К акцепту" и " Все документы", которые обращаются к одному модулю 1118. У меня в ветке появляется только 1 выбор, а в протоколе загадочная фраза "пункт меню обновлен + нет значения". Пытаюсь недостающий скопировать прямо в ветку - нет. Название выбора меняется и все... Вот такая штука :(.

          >> Ответить
          • Развернуть Кинь мне opermenu и operparm в архиве на greg@ezmail.ru, я посмотрю (-) ( григ  12.04.2004 08:02 )
            0(0)
            Not specified
            >> Ответить
            • Развернуть лови (-) ( Sergey  12.04.2004 09:05 )
              0(0)
              Not specified
              >> Ответить
              • Развернуть Еще поправил (+) ( григ  21.04.2004 14:18 )
                0(0)
                21.04.2004
                Уточнен поиск совпадающих узлов при копировании. Теперь если для источника-
                развилки найден приемник с тем же именем, но не развилка, то они будут
                считаться разными узлами. Для системных листов добавлена доп.проверка на
                совпадение названия. Т.е. системные листы с разными наименованиями будут
                считаться разными узлами.
                Добавлен выбор расположения приемника при запуске программы.
                Добавлен выбор расположения источника и приемника по ALT_F5.
                Месторасположение источника и приемника выведены на экран.

                >> Ответить
                • Развернуть Попробовал - все ОК! (+) ( Sergey  21.04.2004 16:31 )
                  0(0)
                  А ты чего-же, у RSTyle научился - делаешь, а не рассказваешь...:)
                  Гляжу - появилось F6\Переименовать ... А в новостях - не нашел.
                  Так, ну а еще нам надо (загибаю пальцы)....:))))...
                  1. Слабо у приемника сделать изменение порядка выборов...Типа - взял выбор, вырезал (CTRL+X) или скопировал (Ctrl+C) его в карман , потом пошел по дереву куда надо и там нежно так (CTRL+V) - раз...

                  С огромным уважением,
                  С.Лопухов.

                  >> Ответить
                  • Развернуть Забыл я про переименование (+) ( григ  22.04.2004 07:45 )
                    0(0)
                    Сначала думал из-за имени у тебя копирование не идет, потому и сделал возможность переименовать просто для тестирования. Кстати, интересно узнать у разработчиков следующий момент: вот в 84 сборке "Картотека 1" содержит два конечных узла, причем оба системные и с одинаковым номером модуля, в operparm.dbt для них записей нет, различаются только наименованием: вроде "все документы" и "акцептованные". Как же интересно система определяет - весь список выводить или не весь?
                    Не слабо, но надо подумать. Попозжее. Тут более прикольные задачки имеются - ежедневные нормативы. Основное я написал, теперь надо всякие пользовательские функции реализовать: типа пассивы, истекающие в ближайшие 30 дней, инсайдеры, акционеры и пр. вещи, которые напрямую с баланса не взять. Но в целом мы уже считаем все, что надо посчитать.
                    >> Ответить
    • Развернуть Почему не работает визуальная часть? ( moleg  29.01.2004 05:54 )
      0(0)
      Я пытаюсь запустить это пример. В самом начале все вроде нормально, но до того момента пока не вызываю MainForm.Show. В ранних версиях dtb постоянно выскакивет сообщение с "0" при прорисовке окна, скачал самую свежую версию dtb вообще виснет в этом месте.
      Вещь очень полезная, но вот видимая часть dtb что-то у меня не работает. Может кто сталкивался с аналогичным, сам я обычно пользуюсь для таких случаев VCH.
      >> Ответить
      • Развернуть В dtb.d32 есть еще терминальные части: t_textgp.d32, t_textga.d32 (-) ( григ  29.01.2004 07:46 )
        0(0)
        Not specified
        >> Ответить
        • Развернуть Re:В dtb.d32 есть еще терминальные части: t_textgp.d32, t_textga.d32 ( moleg  29.01.2004 08:07 )
          0(0)
          Спасибо, Григорий, за участие. Да не было t_textga.d32 в терминальной части(стоит наверное изменить readme в выложенной версии на lib.itb.ru, там про эту часть ничего не сказано ). Перезапустил все: аналогично, виснет на том же месте.
          >> Ответить
          • Развернуть Вот цитата из readme: (+) ( григ  29.01.2004 08:43 )
            0(0)
            .. Для использования библиотеки DTB.D32 необходимо:
            1. Поместить файлы T_TEXTGP.D32 и T_TEXTGP.DLM на рабочую станцию в каталог
            C:\TERMINAL...
            У тебя в терминале лежит t_textgp.d32? Видимо нет, т.к. MsgBox(0) в этом случае и выдается. t_textga.d32 необязательна и используется в случае передачи пакованных пакетов (dtbPack).

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

            >> Ответить
            • Развернуть Все дело действительно в t_textgp.d32 ( moleg  29.01.2004 09:35 )
              0(0)
              Если на терминале нет t_textgp.d32, то вылетает "0" и окно кое как прорисовывается, если же он есть, то программа виснет.
              Если закоментировать .Show то программа естественно просто завершается.
              Пробовал вообще убрать все компоненты на форме, результат прежний.
              Ладно попробую как-нибудь по другому вывести это окошко, просто ужасно хочется победить и визуальную часть dtb.
              Спасибо Григорий за помощь.
              >> Ответить
    • Развернуть Что-то я не могу.... ( Boris  05.02.2004 15:43 )
      0(0)
      файл создать index0.dbt - ругается что неверная длина ключа, как от этого избавится????
      что надо поправить.....

      >> Ответить
    • Развернуть Ошибка при копировании пункта меню ( Freeman1  16.07.2004 16:17 )
      0(0)
      Большое спасибо автору за полезный инструмент, но при его экплуатации возникли следущие трудности:
      "Error: обращение за границу записи itemuser.dbt
      Модуль ..\mac\bank\opermenu.mac
      Строка 604",
      "Источник: iNumberFather= 354 Name= Визуальное копирование меню
      - пункт меню не найден"

      Причем, часть меню копирует успешно, остальную - нет.
      Чем это может быть вызвано?
      >> Ответить
      • Развернуть Видимо твоя структура itemuser.dbt отличается от моей (+) ( григ  19.07.2004 09:16 )
        0(0)
        В этом месте макроса находится функция, возвращающая имя пользовательского макроса (модули пользователей). Можешь вставить в нее первой строкой return "". А можешь разобраться со своей структурой и поправить функцию.
         /*Вернуть имя макроса пользовательского пункта меню*/
         macro MainForm_Macro(id)
          if(id.cSystemItem!="") return ""; end;
          if(id.iCaseItem==0) return ""; end;
          itemusercIdentProgram.Set(StrFor(id.iIdentProgram));
          itemuseriCaseItem.Set(id.iCaseItem);
          if(itemuser.GetEQ)                                
           GetDirect(itemu,itemuser.GetPos);
           base=FldOffset(itemu,"Parm")+259; i=0; t="";
           SetRecordAddr(Rec_UChar,itemu,i,base,true);
           while(Rec_UChar.UChar!=0)
            t=t+StrFor(Rec_UChar.UChar); i=i+1;
            SetRecordAddr(Rec_UChar,itemu,i,base,true);
           end;
           return "("+t+")";
          end;
          return "";
         end;
        


        >> Ответить