Программы "Простой софт" www.prostoysoft.ru

ВНИМАНИЕ! РЕКЛАМНЫЕ СООБЩЕНИЯ И ГИПЕРССЫЛКИ В ФОРУМЕ ЗАПРЕЩЕНЫ (посты удаляются автоматически)
Текущее время: 25.11.2024 06:35

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: 22.05.2013 16:38 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
Добрый день.
Не нашёл на форуме ответа на свой вопрос, поэтому задам его в новой теме.
Тема такая.
Функционал триггеров меня не устроил (это и не триггеры вовсе в стандартном их понимании(т.е. таких которые существуют во "взрослых" БД типа MSQL), в Access насколько я знаю, вообще, нет такого понятия, есть только ограничения). Самая большая проблема в том, что все они срабатывают после какого-либо действия, а не перед ним или вместо него.
Мне нужно чтобы данные проверялись по нескольким условиям и только после этого заносились в таблицы. Сделать это с помощью ограничений и триггеров программы оказалось очень сложно и потом трудно разобраться в этом, если ещё раз нужно всё менять. Решил, что проще и надёжнее это сделать с помощью скрипта VBS, тем более, что его родственник VBA и SQL мне хорошо знакомы :wink: .
С написанием скрипта проблем не возникло, пошагово проверил его работу, назначил кнопку на панель инструментов, все как надо, но возникла одна проблема... Таблица, которая в это время активна по задумке должна обновиться после завершения работы скрипта, этого не происходит... Таблица обновляется только если обновить её вручную или сначала переключиться на другую таблицу, а потом вернуться. Это, конечно, не есть гуд.
При настройке кнопки мною в поле "команда" было выбрано значение "запустить файл", сам скрипт при этом работает, но с недостатком описанном выше.
В том же поле есть ещё пункт "запустить файл и обновить" :!: , логично было бы предположить, что этот пункт именно для того и существует, чтобы после выполнения обновить активную таблицу (а ещё лучше все таблицы на открытых вкладках), я выбрал его и ещё раз запустил скрипт. При таком раскладе, вообще, ничего не запускается :(.

Подскажите, может я не правильно понял смысл этого пункта ( "запустить файл и обновить")? Может на самом деле он для другого предназначен (для чего?)? Если именно для этого, то почему не работает? Если не для этого, то как добиться немедленного автоматического обновления после работы скрипта?
Ну, и кстати, для чего нужны остальные пункты в этом меню? Некоторые, конечно, интуитивно понятны, но не все.

Есть и другие вопросы.
1. Можно ли как-то задать условия, при которых пользовательская кнопка на панели инструментов будет иметь режимы "активна", "недоступна", "невидна"?
2. Удобно иметь краткое представление таблицы, а при добавлении в эту таблицу новых записей заполнять и дополнительные, поля, которые в таблице есть, но не отображены. Если сделать краткое представление, то и в форме для добавления записи (я использую только формы в этом случае) остаются только те пункты, что видны в данный момент. Я пробовал так: в конструкторе формы добавил новую вкладку и в поле "поля вкладки" отметил эти дополнительные поля... однако, скрытые поля таблицы на вкладке так и не появляются... :(. Можно ли сделать так чтобы визуально иметь краткую таблицу, а при добавлении записи в форме заполнять и дополнительные(скрытые) поля?
3. При добавлении глобальной константы возможно в поле "значение" задать SQL-запрос с подстановкой данных из активной таблицы?

Это пока всё что сразу вспомнил.

Программа - "Учет книг", версия 2.66
ОС - WinXP SP3 Prof
БД - Access


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.05.2013 11:46 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
Нашёл ответ на вопрос №2.
За скрытие и показ этих полей отвечает параметр "ShowHiddenFields" в свойствах формы, соответственно, 1 или 0. По умолчанию 0 - скрывать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.05.2013 11:47 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
Добрый день.
Время, когда срабатывает триггер, вы задаете в параметре "Когда срабатывает". Когда-то можно, когда-то нельзя.

>нужно чтобы данные проверялись по нескольким условиям
Рекомендую вам задать Условие на значение в свойствах соответствующего поля. Там можно вводить сложные условия, выражения, подзапросы.
Но лучше обозначить вашу конкретный пример.

>"запустить файл", "запустить файл и обновить".
При нажатии пользовательской кнопки происходит деактивация программы, и при последующей активации обновление текущей таблицы должно происходить автоматически. Если что-то не работает, нужно обращаться к нам в поддержкуп с конкретно вашим примером.

1. Видимость и доступность кнопок панелей инструментов может настраиваться персонально для каждого пользователя. Только такое условие, другой лолгики нет. Других возможных контекстов применения пока не встречали. Можете описать ваш случай, когда вам это надо.
2. Можно. Выставите свойство ShowAllFields в настройках автоформы.
3. А для какого конкретного случая вам нужна константа? (там и надо подзапрос задавать)

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.05.2013 13:29 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
По поводу проверки условий. Да, можно и сложносочинённое условие придумать. Вначале я так и сделал. Но меня интересовала ситуация, при которой видно на каком условии споткнулась проверка и выводилось соответствующее сообщение. Согласитесь, с помощью VBS этого проще добиться, да и возможностей в этом случае поболее будет. Опять же не уверен, но подозреваю, что если понадобиться в будущем перевод из ACCESS на MSSQL, то триггеры и связи вообще при этом пропадут и придётся их заново ручками настраивать (во всяком случае так у меня было уже...).


>При нажатии пользовательской кнопки происходит деактивация программы, и при последующей активации обновление текущей таблицы должно происходить автоматически. Если что-то не работает, нужно обращаться к нам в поддержкуп с конкретно вашим примером.
Тут, собственно, я уже описал, по моему, довольно точно суть проблемы и поведение программы.
Добавлю ещё то, что сейчас проверил и заметил: при добавлении своей кнопки если выбираешь в поле "команда" пункт "запустить файл", то в поле "параметры" появляется кнопка с троеточием, указывая на необходимость выбрать файл, а когда выбираешь пункт "запустить файл и обновить" ничего в поле "параметры" не появляется. Определённо это на уровне программного кода какой-то косяк.
На всякий случай вот текст скрипта, может в нём найдёте "интересные" моменты, поскольку всё же VBA, который знаю я это не совсем VBS, который нужен для скрипта, хоть и брат его...

/////////////////////////////////////////
'скрипт для списания книги из библиотеки
'C:\Program Files\BooksCount\списание.vbs /<ConnectionString>/<ID>/<CurrentUserID>

Dim objArgs 'объект для чтения параметров строки запуска файла
Dim sDbPath'путь к файлу БД
Dim Con 'объект Connection для открытия БД
Dim sSql 'SQL инструкция
Dim Rst 'объект Recordset для работы с БД

Dim config ' конфигурация сообщения MsgBox
Dim Nal
Dim DelBook
Dim UserID
Dim BookID
Dim DateDel
Dim Filial1
Dim Filial2

Set objArgs = WScript.Arguments 'получаем объект для чтения параметров строки запуска файла

If objArgs.Count <> 3 Then
' msgbox objArgs.Count
WScript.Quit 1 'выходим, если не все аргументы переданы в функцию
Else
'читаем параметры и записываем их в переменные
UserID = mid(objArgs(2), 2, len(objArgs(2))-1)
BookID = mid(objArgs(1), 2, len(objArgs(1))-1)
sDbPath = mid(objArgs(0), 2, len(objArgs(0))-1)
End If

config = vbOKOnly + vbDefaultButton2 + vbCritical
If MsgBox("Продолжить списание книги?",vbYesNo) = vbNo Then WScript.Quit 1 'выходим, если операция отменена пользователем

Set Con = CreateObject("ADODB.Connection") 'создание объекта Connection
Con.Open sDbPath ' открываем соединение с базой

'///// проверяем условия для правильного списания

Set Rst = CreateObject("ADODB.Recordset") 'создание объекта Recordset

'получаем значение филиала, в котором находится книга, а также наличия книги и состояние поля "списание"
sSql = "select FilialName, DelBook, Nal from tblmain where id=" & BookID
Rst.open sSql, Con
Filial1 = Rst.Fields("FilialName")
DelBook = Rst.Fields("DelBook")
Nal = Rst.Fields("Nal")
msgbox Filial1 & " " & DellBook & " " & Nal
Rst.Close

'получаем значение филиала, в котором работает пользователь
sSql = "select Division from tblUsers where id=" & UserID
Rst.open sSql, Con
Filial2 = Rst.Fields("Division")
Rst.Close

'сравниваем значение филиалов книги и пользователя
'они должны быть идентичны, иначе завершение работы скрипта
if Filial1 <> Filial2 then
MsgBox "Вы не можете списать книгу из другого филиала.", config, "Неудача"
WScript.Quit 1 'выходим
end if

' проверяем состояние поля "DelBook"(списание)
if DelBook <> false then
MsgBox "Эта книга уже имеет статус 'списано'.", config, "Неудача"
WScript.Quit 1 'выходим
end if

' проверяем состояние поля "Nal"(наличие)
if Nal = false then
MsgBox "Этой книги нет в библиотеке. Для списания книга должна иметь статус 'в библиотеке'.", config, "Неудача"
WScript.Quit 1 'выходим
end if

'///// завершаем обновление таблиц
'заносим данные в таблицу tblDelBook (списание)
DateDel = now()
sSql = "INSERT INTO tblDelBook(BookID,DateDel, UserID) VALUES ("
sSql = sSql & BookID & ", '" & DateDel & "'," & UserID & ")"
Con.Execute sSql 'выполняем SQL-инструкцию, которая изменяет данные в таблице

If Err.Number <> 0 Then 'если ошибка
MsgBox "Списание не выполнено из-за ошибки базы данных.", config, "Неудача"
WScript.Quit 1 'выходим, если обновление не удалось
End If

'обновляем таблицу tblMain (книги)
sSql = "UPDATE tblMain SET DelBook=1, Nal=0 WHERE ID=" & BookID 'строим SQL-команду
Con.Execute sSql 'выполняем SQL-инструкцию, которая изменяет данные в таблице

If Err.Number = 0 Then 'если ошибки нет
MsgBox "Списание прошло успешно.", vbInformation, "Выполнено" 'сообщение об успешном выполнении SQL-инструкции
else
MsgBox "Списание не выполнено из-за ошибки базы данных.", config, "Неудача" '
End If

Con.Close 'закрываем открытую БД
Set Con = Nothing 'очищаем переменную Connection
/////////////////////////////////////////

>1. Видимость и доступность кнопок панелей инструментов может настраиваться персонально для каждого пользователя. Только такое условие, другой лолгики нет. Других возможных контекстов применения пока не встречали. Можете описать ваш случай, когда вам это надо.
Описываю. Если поле таблицы в данном случае назовём его "DelBook"(списание) имеет значение 1 (списано), то кнопка на панели задач (назовём её "списание") видна, но деактивирована.
Есть и другие операции в которых мне нужна та же логика, т.е. активация кнопки в зависимости от значения некоторого поля в активной записи текущей таблицы.

>3. А для какого конкретного случая вам нужна константа? (там и надо подзапрос задавать)
Мне часто нужно в кач-ве параметра запроса(для проверок, ограничений, подстановок) передавать ID филиала из таблицы "филиалы"(которую я связал с таблицей "пользователи"), в котором работает активный пользователь. Каждый раз это отдельный запрос. Не то чтобы это как-то сильно напрягало, но раз уж этот запрос постоянно используется удобнее его запихнуть в какую-нть константу, потому и интересуюсь.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.05.2013 17:44 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
Разобрался и с вопросом №3.

Собственно, только обновление таблицы после запуска скрипта меня пока ещё беспокоит...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.05.2013 18:04 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
При переводе с Access на MSSQL ничего не пропадет. Правильный путь - как я вам сказал, задавать формулы в условии на значение, использовать триггеры и другие встроенные возможности программы. Писать на VBScript - крайний случай, это работает в другом процессе. Отсюда получаются некоторые неудобства. Проблема с обновлением одно из них.

Как именно разобрались с вопросом №3? (всем же интересно ))

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 23.05.2013 22:30 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
освоил синтасис :D
задал имя константы и записал в значение запрос SQL? поставив его в скобки (...SQL запрос ....)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24.05.2013 12:13 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
На счёт решения проблемы обновления таблицы с помощью триггеров и правил я всё же думаю, что это как раз не лучший вариант.
Против этого у меня всё те же аргументы.
1. Если бы триггеры в программе срабатывали "перед", "во время" или "вместо" :!: вызвавшего их события, то это было бы реально полезно и похоже на триггер в его классическом понимании, но здесь (в программе) они срабатывают только "после" :!: завершения события. Этот факт не даёт возможность организовать проверку условия добавления или удаления (особенно удаления) записи в/из таблицы непосредственно из триггера до обработки события.
2. Если условий несколько, то для того чтобы понять на каком этапе условие не сошлось нужно обработать каждое условие отдельно, а триггер этого сделать не сможет.
3. Почему VBS крайний случай? Может случиться так, что вы забудете про триггер в таблице и изменив что-то в ней через какое-то время не сразу поймёте, что он перестал работать. Применив же скрипт вы сразу увидите работает он или нет и если не работает, то известно где он находится, достаточно его открыть и отредактировать. При этом всё что нужно изменить находится в одном месте, а при связке триггер+условия_проверки_в_таблицах нужно ещё будет полазить по разным закоулкам чтобы всё проверить. Кроме того триггеры не позволяют писать более или менее большие процедуры обработки данных, а в скрипте это вполне возможно.

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

Вот ещё вспомнил один косяк. При удалении одной записи из таблицы, триггер "при удалении" срабатывает (опять же уже только "после" удаления и нужно ещё помучиться чтобы "запретить" удаление), а при удалении всех записей разом триггер не срабатывает, так что здесь уж если накосячил, то всё, как говориться - на бэкап надейся, а сам не плошай.
P.S. А может это и не косяк вовсе. Может так задумано :D .


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 28.05.2013 16:48 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
В последней версии 2.67 проверьте, плз, там при выборе "Запустить файл и обновить" должно происходить обновление.
1. Не следует использовать триггеры для контроля ввода данных ни здесь, в программе "Учет книг", ни где-то в других системах мы также вам не рекомендуем. Хоть в "классическом", хоть в неклассическом понимании... триггеры изначально не для этого. А для того, чтобы при выполнении операций в одной таблице, делать также какие-то изменения в других таблицах. Но не для контроля возможности/невозможности выполнения всей операции (валидации). Для этого как раз предназначен интерфейс и конкретно в случае наших программ - параметр "Условие на значение".
2. "Условие на значение" может.
3. >Применив же скрипт, вы сразу увидите, работает он или нет
Как это? Ошибка явная не всегда возникает.
Да, в общем-то, используйте то, что вам удобнее и больше нравится. Только всегда нужно помнить, что плодя много сторонних файлов, необходимых для работы всей системы, вы усложняете общую инфраструктуру - при переносе БД, надо переносить и их, шлете БД по емейл - не забудьте про них. Под "Простой сайт" они не перенесутся автоматом, кстати. А что произойдет после миграции на MS SQL? Многие ваши VBS-файлы могут не заработать.
Да, при удалении всех записей, триггеры не срабатывают, так и задумано. Эту кнопку администраторы, как правило, вообще скрывают для простых пользователей.

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.05.2013 14:11 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
Ок. Спасибо, скачаю посмотрю.
Хотя, по правде сказать я уже переделал всё на безскриптовый вариант :wink: .
Уже месяц конфигурирую (не то чтоб я такой тупой был, просто времени не всегда хватает :D ), только что доделал, обратно, конечно, переделывать не буду. Пришлось, правда, слегка запутать пользователя для этого, ну, да привыкнут, куда ж им деваться :D .
Ну, а кнопки я само-собой подобные ("удалить всё" и т.п. поскрывал все, вообще любое удаление запретил, собственно).

Один момент не смог разобрать. Хотел дать пользователям возможность менять цвета полей и выстраивать дерево самостоятельно, но не нашёл возможностей это сделать. Это не важно, конечно, так... деталька небольшая. Я правильно понял - нет такой возможности?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29.05.2013 14:30 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
>менять цвета полей
Цвет фона и шрифта поля задается в "Настройках полей" (есть такая кнопка на панели инструментов).

>выстраивать дерево самостоятельно
1. В свойствах таблицы.
2. Из меню по правому клику на дереве можно сохранять/загружать различные варианты построения дерева.

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 30.05.2013 14:21 
Не в сети

Зарегистрирован: 21.05.2013 15:17
Сообщения: 13
1.Точно, есть такое :)
2.Ну, хотя бы так.

Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02.01.2015 11:12 
Не в сети

Зарегистрирован: 02.01.2015 00:29
Сообщения: 4
Откуда: Namibia
А на первый вопрос ответьте
1 Можно ли при создании документа по шаблону, вставить в него не одну текущую, а две таблицы. С полным количеством записей в одной и отфильтрованной в другой?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02.01.2015 12:44 
Не в сети
Администратор

Зарегистрирован: 15.02.2006 20:16
Сообщения: 3690
Откуда: Санкт-Петербург
Да, можно.

_________________
2B OR NOT 2B = TRUE


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB