Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 05.04.2009, 09:28   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Выбор оператора ЭВМ

Есть таблицы по результатам работы с которыми формируется ряд документом, нескольких видов (типов), состоящие из нескольких листов. Документы могут формироваться в произвольном порядке, количество и вид (тип) листов зависит от характеристик объектов. То есть для объекта формируются ограниченное количество листов каждого вида документов.
Планируется ведения лога в текстовый файл на каждое действия с объектом. В общем случае будет сохраняться: дата, время, оператор, объект, действие.
Возникают следующие сложности:
1. Выбор оператора. Необходимо что бы эксель знал кто за ним работает в настоящий момент. Вижу следующие пути реализации:
а) Через ячейку. ИМХО наиболее простой, и наиболее худший способ. Оператор банально может забыть изменить значение ячейки.
б) Через начальное окно. При запуске эксель проверяет наличие уже запущенных программ. Если такие есть имя оператора берется от туда, если таких нет выводим окно с просьбой указать имя оператор. Имя оператора сохраняется в переменную VBA. Без этого дальше не пропускаем. Пока это выглядит наиболее реалистичным.
в) Через USB ключ. Для защиты информации планируется в далекой перспективе использовать USB ключики. Для чего часть макросов будет перенесены в dll. (я пока нашел два способа: переписать на дельфи, попробовать создать dll в полном VB). Есть идей сделать такие ключи именными. Есть ключ работаем, имя оператора берем из ключа, нет ключа не работаем.
2. Как вести лог: в один файл или несколько? В идеале хотелось бы в один, но не будет ли конфликтов доступа при работе нескольких операторов на разных компьютерах в сети.
С уважением, Алексей.

Последний раз редактировалось tae1980; 05.04.2009 в 09:32.
tae1980 вне форума
Старый 05.04.2009, 09:40   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Environ("username") - login, под которым пользователь вошел в домен или систему.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 05.04.2009, 09:46   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Планируется ведения лога в текстовый файл на каждое действия с объектом. В общем случае будет сохраняться: дата, время, оператор, объект, действие.
Не проблема. У меня есть готовые функции для ведения логов (одного или нескольких одновременно)
Получается что-то вроде этого:
Код:
UserForm_Initialize                        Form_About 24.01.2009 23:32:35
Form_About: Настройки                      Change Page Event
Form_About: Регистрация                    Change Page Event
Form_About:                                Для работы с этой программой необходимо зарегистрироваться
Form_About: Для работы с этой программой   Попытка назначения новых прав доступа
Form_About: Для работы с этой программой   Предложение ввести мастер-пароль
Form_About: Для работы с этой программой   Master Password Field Change Event
Form_About: Для работы с этой программой   Access Granted - пользователь Администратор
Form_About: Для работы с этой программой   Изменено имя пользователя: ***********
Form_About: Для работы с этой программой   Выбран уровень доступа: 9
Form_About: Для работы с этой программой   Попытка генерации кода доступа
Form_About: Для работы с этой программой   Код доступа сгенерирован
Form_About: Для работы с этой программой   B_Reg_Click
Form_About: Для работы с этой программой   Регистрация пользователя: ***********
Form_About: Для работы с этой программой   Access Granted. Новый уровень доступа: 9
Form_About: О программе ...                Change Page Event
UserForm_Terminate                         Form_About 24.01.2009 23:32:50
====================                       
AppEv_WorkbookBeforeSave                   wb.Name = Twins2.xls
AppEv_WorkbookBeforeClose                  wb.Name = Twins2.xls
AppEv_WorkbookBeforeClose                  wb.Name = Копия A.218.01-01-2009.20-23-03.xla
====================                       
Starting Log Record                        01.02.2009 14:05:47
====================                       
FirstRun                                   Проверка наличия на диске старой версии файла
FirstRun                                   Удаление предыдущей версии программы не требуется
FirstRun                                   Записываем настройки программы в реестр
FirstRun                                   регистрируем свои типы файлов
FirstRun                                   CrossDir: before = C:\Program Files\A\Cross\, after = C:\Program Files\A\Cross\
AppEv_WorkbookOpen                         wb.Name = Копия At.218.01-01-2009.20-23-03.xla
AppEv_WorkbookBeforeSave                   wb.Name = CheckBox_Class.xls
Цитата:
1. Выбор оператора. Необходимо что бы эксель знал кто за ним работает в настоящий момент.
А в чём проблема? Простейшая авторизация при запуске файла excel (пример я недавно приводил здесь на форуме)

Цитата:
2. Как вести лог: в один файл или несколько? В идеале хотелось бы в один, но не будет ли конфликтов доступа при работе нескольких операторов на разных компьютерах в сети.
Конфликтов не будет.
Просто записи будут неупорядочены.
Лог ведь как пишется: открывается текстовый файл в режиме "для добавления", записываются несколько текстовых строк в конец файла, и файл закрывается. Всё это происходит моментально.
Впрочем, я в этом случае использую буферизацию - запись непосредственно в файл производится только после накопления в буфере нескольких строк.

Запись буфера в файл произвожу примерно такой функцией:
Код:
Sub SaveLog(ByVal LogIndex As LogFileIndex)
    Dim FSO As New FileSystemObject, ts As TextStream, Filename As String
    Filename = CrossDir & CStr(LogIndex) & GetLogExtension(LogIndex)    'составляем имя лог-файла
    Set ts = FSO.OpenTextFile(Filename, ForAppending, True)    ' открываем его для добавления данных
    ts.Write LogArr(LogIndex): ts.Close    'пишем и закрываем файл
    Set ts = Nothing: Set FSO = Nothing: LogArr(LogIndex) = ""    ' затираем переменные и данные в массиве
End Sub
Вызов команды записи строки в лог имеет примерно такой вид:
Код:
    LogWI "LockAddIn", "запуск программы заблокирован", az_Log_Default
Ну и ещё используются несколько функций типа этого:
Код:
Sub SaveAllLogs()
    For i = LBound(LogArr) To UBound(LogArr)
        If Len(LogArr(i)) > 0 Then StopLog i: SaveLog i
    Next
End Sub
Sub StartLog(ByVal LogIndex As LogFileIndex)    ' старт записи лога
    LogWSep LogIndex: LogW "Starting Log Record", Now, LogIndex
    LogWSep LogIndex: SaveLog LogIndex
End Sub
Sub StopLog(ByVal LogIndex As LogFileIndex)    ' окончание записи лога
    LogWSep LogIndex: LogW "Finishing Log Record", Now, LogIndex
    LogWSep LogIndex: SaveLog LogIndex
End Sub
Sub LogWSep(ByVal LogIndex As LogFileIndex)    ' запись разделительной полосы в лог
    LogW String(20, "="), , LogIndex
End Sub
Если что-то подобное Вас устроит - переделаем с учётом Ваших пожеланий.
EducatedFool вне форума
Старый 05.04.2009, 10:35   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
Environ("username") - login, под которым пользователь вошел в домен или систему.
Принципиально не использую многопользовательские возможности (исключая ситивизмы). Считаю их чрезвычайно вредными, опасными. Ни разу не видел задачи которую нельзя было решить иным способом и средствами. А вот гемора от подобных решений набрался столько, что готов поделиться, так сказать от чистого сердца. Ибо предчувствую, что огребу еще больше с подобными вещами. То есть запасы гемора с это стороны не исчерпаем.
Тем более что это лишь частично решит задачу, при этом наложит кучу ограничений.
С уважением, Алексей.
tae1980 вне форума
Старый 05.04.2009, 12:01   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Не проблема. У меня есть готовые функции для ведения логов (одного или нескольких одновременно)
Получается что-то вроде этого:
Код:
UserForm_Initialize                        Form_About 24.01.2009 23:32:35
Думаю изменить вид сохраняемых фраз не проблема. :)
Цитата:
А в чём проблема? Простейшая авторизация при запуске файла excel (пример я недавно приводил здесь на форуме)
Поиск по слову "авторизация" в данном форуме (чуть не написал эхе :) ни чего не дал. :(
Вывести окошко с запросом имени не проблема, тем более я планировал выводить просто информационное окно о программе и т.п. Буду рад если есть уже стандартные заготовки.
Интересует вопрос: как лучше определять наличие уже открытых документов, при условии что имена могут быть любые, а так же могут быть открыты обычные файлы ексель не участвующие в работе? Как я вижу возможные варианты: 1) по флагу (классика), 2) по наличию объявленной переменной (теория: при старте проверяем объявлена ли переменная, если да используем ее, нет даем запрос и объявляем. Как система поведет себя если закрыть все окна с объектами, но остались окна с обычными листами ексель? Удалиться ли при этом переменная?).

Цитата:
Конфликтов не будет.
Просто записи будут неупорядочены.
Это не проблема. :)
Цитата:
Лог ведь как пишется: открывается текстовый файл в режиме "для добавления", записываются несколько текстовых строк в конец файла, и файл закрывается. Всё это происходит моментально.
Впрочем, я в этом случае использую буферизацию - запись непосредственно в файл производится только после накопления в буфере нескольких строк.
Буферизация вещь очень нужная, и полезная, но понижающая отказоустойчивость системы, т.к. в случае проблем буфер удалиться (теряется) без записи на диск.
Как поведет себя система при записи по сети, особенно в случае отказа сети, или полной потери связи на неопределенный период?
Цитата:
Запись буфера в файл произвожу примерно такой функцией:
<..... сожрал злобный хомяк .....>
Если что-то подобное Вас устроит - переделаем с учётом Ваших пожеланий.
Устроит любой образец решения, ссылка ни литературу. Особенно меня интересует процесс авторизации.
С уважением, Алексей.
tae1980 вне форума
Старый 05.04.2009, 12:22   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Особенно меня интересует процесс авторизации.
Давайте сделаем так: Вы прикрепляете к сообщению свой основной файл, а я встраиваю в него нужную функциональность.

От Вас нужна информация:

1) где хранить логины и пароли?

Есть 2 уже реализованных мной варианта:
первый - все учётки хранятся на скрытом листе
(могу выслать готовый проект Вам на почту)



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





Но с этим вариантом сложнее - придётся выдирать кучу кода из проекта.


Цитата:
Как поведет себя система при записи по сети, особенно в случае отказа сети, или полной потери связи на неопределенный период?
У меня на это случай 2 функции: LogW и LogWI
Первая записывает в файл только после того, как в буфере накопилось хотя бы 5000 символов, а вторая осуществляет немедленную запись строки в файл (для критичных событий)

Но всего, разумеется, не предусмотришь.
А вдруг система вылетит с синим экраном? Или электричество отключат?

Цитата:
т.к. в случае проблем буфер удалиться (теряется) без записи на диск.
Буфер в моём случае - не что иное, как глобальная переменная в проекте.
Если Ваш код не вылетает с ошибками - с буфером ничего не случится
(ну можно писать буфер в ячейки скрытого листа, если уж так важна отказоустойчивость)

Последний раз редактировалось EducatedFool; 05.04.2009 в 12:25.
EducatedFool вне форума
Старый 05.04.2009, 12:40   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
в) Через USB ключ. Для защиты информации планируется в далекой перспективе использовать USB ключики. Для чего часть макросов будет перенесены в dll. (я пока нашел два способа: переписать на дельфи, попробовать создать dll в полном VB). Есть идей сделать такие ключи именными. Есть ключ работаем, имя оператора берем из ключа, нет ключа не работаем.
USB-ключ в случае проекта VBA использовать не имеет смысла - все пароли VBA легко взламываются.

Критичные в плане безопасности функции (если в случае использования VBA вообще можно говорить о какой-то безопасности) можно при желании вынести в Com AddIn

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

Кстати, нашел у себя ещё кусок кода для определения имени пользователя (которое прописано в настройках Excel):
Код:
Sub MsgboxUserStatus(): With ThisWorkbook    ' отображает имя пользователя и текущее время
        If Not .ReadOnly Then MsgBox .UserStatus(1, 1) Else: MsgBox "Увы", , ""
    End With:
End Sub
Цитата:
Интересует вопрос: как лучше определять наличие уже открытых документов, при условии что имена могут быть любые, а так же могут быть открыты обычные файлы ексель не участвующие в работе?
Я распознаю файлы по тексту определённых ячеек (присутствует функция, возвращающая логическое значение по имени книги - является ли она книгой, подлежащей обработке, или нет)

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

Используется примерно такой код:
Код:
'======================= запись и чтение свойств документа, определённых пользователем ======================

Sub SDoc(ByVal VarName As String, ByVal VarValue As Variant)    ' запись в документ (возможна ошибка с типом данных!)
    DDoc VarName
    ThisWorkbook.CustomDocumentProperties.Add VarName, False, msoPropertyTypeString, CStr(VarValue)
End Sub

Sub SDocB(ByVal VarName As String, ByVal VarValue As Boolean)    ' запись в документ (возможна ошибка с типом данных!)
    DDoc VarName
    ThisWorkbook.CustomDocumentProperties.Add VarName, False, msoPropertyTypeBoolean, CBool(VarValue)
End Sub

Sub DDoc(ByVal VarName As String)    ' удаление переменной из документа
    If ThisWorkbook.CustomDocumentProperties.count > 0 Then
        For Each cdp In ThisWorkbook.CustomDocumentProperties
            If cdp.Name = VarName Then cdp.Delete
        Next
    End If
End Sub

Function GDoc(ByVal VarName As String) As String    'чтение из документа
    GDoc = ""
    If ThisWorkbook.CustomDocumentProperties.count > 0 Then
        For Each cdp In ThisWorkbook.CustomDocumentProperties
            If cdp.Name = VarName Then GDoc = cdp.Value
        Next
    End If
End Function

Function GDocB(ByVal VarName As String) As Boolean   'чтение из документа
    GDocB = False
    If ThisWorkbook.CustomDocumentProperties.count > 0 Then
        For Each cdp In ThisWorkbook.CustomDocumentProperties
            If cdp.Name = VarName Then GDocB = CBool(cdp.Value)
        Next
    End If
End Function
Используются эти функции примерно так:
Код:
    ' проверка  tb
    If IsDate(EnDeCrypt(GDoc("tb"), az_pw_3)) Then
        If DateDiff("d", Now, CDate(EnDeCrypt(GDoc("tb"), az_pw_3))) > 0 Then    ' ещё есть время
            'ничего не делаем
        Else    ' срок действия программы истёк
            LogWI "FirstRun", "~~~~~~~~~ tb ~~~~~~~~~~~  " & CDate(EnDeCrypt(GDoc("tb"), az_pw_3)), az_Log_Default
            Call DeleteMenu: Call DeleteButtons
            Msg = "Срок действия программы окончен." & NL(2) & "Продолжение работы с программой невозможно."
            MsgBox Msg, vbCritical, "Cross Project"
            SReg "locked", True, az_Reg_Root: ThisWorkbook.Close False
        End If
    Else    ' повреждена информация tb
        LogWI "FirstRun", "~~~~~~~~~~ tb info corrupted ~~~~~~~", az_Log_Default
        Call DeleteMenu: Call DeleteButtons
        Msg = "Файл программы повреждён." & NL(2) & "Продолжение работы с программой невозможно."
        MsgBox Msg, vbCritical, "Cross Project"
        SReg "locked", True, az_Reg_Root: ThisWorkbook.Close False
    End If

Последний раз редактировалось EducatedFool; 06.04.2009 в 10:51.
EducatedFool вне форума
Старый 05.04.2009, 12:53   #8
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Давайте сделаем так: Вы прикрепляете к сообщению свой основной файл, а я встраиваю в него нужную функциональность.
Спасибо, но если возможно я бы хотел помучатся сам. Пока не пое... не поймешь как работает, а понимание я ценю очень высоко.
Цитата:
От Вас нужна информация:
1) где хранить логины и пароли?
Особенное не принципиально. Возможно:
а) в текстовом файле на сервере.
б) у меня планируется постоянное присутствие надстройки расположенной на сервере, так что можно там.
Можно вообще без пароля, так как интересует имя оператора. А факт истинности ввода, можно решать административными мерами.
Цитата:
Есть 2 уже реализованных мной варианта:
первый - все учётки хранятся на скрытом листе
(могу выслать готовый проект Вам на почту)
Буду очень благодарен. Адрес вроде указал в карточке, но на всякий случай: tae(очень злая собака)mail15.com
Цитата:
и второй - список логинов хранится в коде (но можно ввести любой логин, вот только за паролем в этом случае придётся обращаться к разработчику), а после авторизации в реестр записываются учётные данные: (пароль и уровень доступа шифруются)
О каком коде речь? О VBA?
Цитата:
Но с этим вариантом сложнее - придётся выдирать кучу кода из проекта.
ИМХО Интересен вариант хранения в реестре системы. Я правда ни разу с ним не работал.
Цитата:
Но всего, разумеется, не предусмотришь.
А вдруг система вылетит с синим экраном? Или электричество отключат?
В этом случае важно что бы запись в лог была максимально поздняя, для дальнейшего анализа причины сбоя. Может это программа виновата, довела систему до синего экрана?
Цитата:
Буфер в моём случае - не что иное, как глобальная переменная в проекте.
Если Ваш код не вылетает с ошибками - с буфером ничего не случится
(ну можно писать буфер в ячейки скрытого листа, если уж так важна отказоустойчивость)
"В коде всегда будут ошибки, написать без ошибочный код невозможно" (с) :) Отказоустойчивость важна в любой программе. Идеал не нужен, это большие временные и иные затраты, а вот максимально возможно в данных условиях приближение к идеалу, весьма желательно.
С уважением, Алексей.
tae1980 вне форума
Старый 05.04.2009, 13:15   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Адрес вроде указал в карточке, но на всякий случай
Посмотреть адрес в профиле не получится.
Только если отправить текст на Ваш адрес.
Скинул пример файла на почту.

Цитата:
"В коде всегда будут ошибки, написать без ошибочный код невозможно" (с)
Не стал бы этого утверждать
Код:
Sub Main()
    MsgBox "Это безошибочный код"
End Sub
По крайней мере, если Вы предусмотрите достаточное количество обработчиков ошибок в коде, ( или в крайнем случае on error resume next), значения глобальных переменных в случае возникновения ошибки сбрасываться не будут.

Цитата:
О каком коде речь? О VBA?
Конечно, о VBA.

Цитата:
ИМХО Интересен вариант хранения в реестре системы.
Смотрите пример кода во вложении:
Вложения
Тип файла: txt Код для работы с реестром.txt (7.8 Кб, 138 просмотров)
EducatedFool вне форума
Старый 11.04.2009, 16:52   #10
Deni55
Пользователь
 
Регистрация: 10.04.2009
Сообщений: 64
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Есть 2 уже реализованных мной варианта:
первый - все учётки хранятся на скрытом листе
(могу выслать готовый проект Вам на почту)


а можно мне как-нибудь глянуть на этот вариант??
Deni55 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десятично-двоичный преобразователь (хрестоматийная задача любой ЭВМ) Sasha_Smirnov Microsoft Office Word 13 06.10.2013 11:01
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06
Перегрузка оператора Crucian Общие вопросы C/C++ 2 22.10.2007 09:44
Сумма ряда на ЭВМ и вычисленная аналитически, программы на языке Pascal SunCHO Помощь студентам 2 02.05.2007 22:37