I have a SQL Server table with a trigger after insert, update, and delete. If a certain condition is found, the trigger rolls back the transaction and raises a custom error using raise error. I’ve verified it works properly. The basic idea is that during
such times as I need to «freeze» all record updating, I will execute a stored procedure that simply places a value in a SQL table that indicates the «freeze» is turned «on». The trigger will look at that, and if turned on, and
if SQL current_user is not me or admin, then roll back, raiseerror, etc.
In MS Access, I was hoping to utilize this and only this in order to communicate back to the users. Meaning, for example, I realize I could totally re-structure this method and have MS Access «look up» that value (if freeze is ‘on’) every time
a record is updated… but
1) that would mean identifying a LOT of places where the Access app gives the user a method to update a record, and write dlookup() code all over, and
2) that would mean the slowness of a dlookup, and I don’t need to add any slowness to this app.
I wanted to be a «good boy» and handle this on the server side. Admirable, right?? I know.
My problem is trapping the custom SQL error in Access.
I read an old post by Dirk on msdn about getting it… .. and tried Dirk’s method of using the DAO.Errors collection. Unfortunately what I
think I have found out is that that entire method only works if you have actually triggered the error using DAO (vba). (which makes sense). NOT, if an error has occurred that was form-based and not necessarily having used DAO in code.
Does anyone know of a way to trap the SQL server error in MS Access? And not just get «odbc — update on a linked table failed» (or Call Failed, etc etc).
My last option will be to create custom error handling in the Access app that looks up the record in the SQL table to see if the freeze is on, but only does this in an error handling routine that sees if we are getting a cruddy vague «odbc-update…»
type of error description in the first place. <br />But this will still involve the hope that I identify all places in the app that does the update.
I don’t see your image as it is blocked at work.
The only one way to debug the application when errors occurs is to break the execution using the keyboard combination :
CTRL + Pause/Break
Do it when the error message appears
This obviously doesnt work if the application is compiled in a mde/accde
When the CTRL-Break doesnt work, you have to add a break point in your code.
Bring the VBA window using
ALT + F11
Open the code of your form, go in the procedure that triggers the queries, select a line of code at the beginning and add a breakpoint using F9
Then run the form, it will stop the execution on the breakpoint and show you the VBA window, continue to execute the code step-by-step using F8
until the error occurs
I am working on a Attendance table in Access, where I have InTime
and OutTime
. These fields are of Date/Time Field.
Some records contains only Time like 11:40:00
, some contain Date as well as time like 21-07-2015 11:45:00
. Hence have used the below code for getting hours worked.
HrsPresent: Round(DateDiff("n",TimeValue(TimeSerial(Hour([TimeIn]),Minute([TimeIn]),Second([TimeIn]))),TimeValue(TimeSerial(Hour([TimeOut]),Minute([TimeOut]),Second([TimeOut]))))/60,2)
Using this above code, in a Column in making query gives correct Number of hours worked, but if any of the field is blank, i get #error
in result.
I have tried using Nz
, IsError
, IsNumeric
but all in Vain.
- What is it that, I am doing wrong?
- Is other way of getting hours worked?
I do use ADO. I just saw that DAO code on a website and thought I would try it. The problem is some procedures do pass the info to Access through Access’s error channel and other procedures pass the message, but not through the error channel. Here is an example and the results that work:
ALTER PROCEDURE dbo.usp_DisplayResults
AS
DECLARE @strMsg varchar(100)
SET @strMsg = ‘All results have been sent for this study!’
IF (SELECT COUNT(*)
FROM dbo.tempResults) < 1
BEGIN
RAISERROR (@strMsg, 18, 1)
SELECT @strMsg AS Message
RETURN
END
ELSE
SELECT * FROM dbo.tempResults
And here is an example that sends the message but not through the error handler which is the same in both calling subs:
IF (SELECT COUNT(*)
FROM dbo.tblRunSheets
WHERE Sequence_Created = 0
AND Method_ID = @MethodID
AND Study_Tracker = @StudyTracker
AND RunSheet_ID = @RunSheetID) < 1
BEGIN
RAISERROR (@strMsg, 18, 1)
RETURN
END
ELSE
IF (SELECT DISTINCT Cleanup_Analyst
FROM dbo.tblRunSheets
WHERE Method_ID = @MethodID
AND Study_Tracker = @StudyTracker
AND RunSheet_ID = @RunSheetID) IS NULL
BEGIN
SET @strMsg = ‘Cleanup has not been performed on this RunSheet. Please perform Cleanup before Sequencing’
RAISERROR (@strMsg, 18, 1)
RETURN
END
ELSE
BEGIN
As you can see it passed the message, but not through this error handler:
If Err.Number = 8008 Then
Resume Next
Else
MsgBox («Error # » & Err.Number & «: » & Err.Description)
Resume exit_cmdEmail_click
End If
converted to PDF by HupBaH9I
отработал
Resume Next Продолжает выполнение со строки, следующей за строкой, которая вызвала ошибку, после того как
обработчик ошибок отработал
Resume Строка Продолжает выполнение с указанной
строки и метки после обработки ошибки
Существуют три действия, которые можно применить к большинству обработчиков ошибок:
∙Установка перехватчика ошибок. Каждая процедура или функция, которая поддерживает перехват ошибок, должна включать выражение On Error, которое указывает Access, где искать инструкции по обработке ошибок. Хотя команда On Error должна указывать на метку или строку внутри той же самой процедуры, выражение после метки может вызывать другую процедуру.
∙Оформление обработчика ошибок. Обработчик ошибок обычно состоит из выражения Select Case (или похожего выражения для принятия решений), которое различает разные значения свойства Err и способ их обработки.
∙Выход из обработчика. Используйте одно из выражений Resume для указания выхода из процедуры, если ошибка приводит к тупиковой ситуации, или для продолжения выполнения программы.
Для отключения обработчика ошибок вставьте следующее выражение в код вашей процедуры:
On Error Goto 0
Когда Access наталкивается на ошибку времени выполнения, он ищет неактивный обработчик ошибок в следующей последовательности:
1.Текущая процедура.
2.Процедуры, перечисленные в списке Вызовы (начиная с самой последней вызываемой процедуры).
3.Обработчик ошибок внутри Access, который останавливает выполнение программы и выводит диалоговое окно ошибки времени выполнения.
Ошибки, связанные с работой процессора баз данных, вызывают событие Error. Это относится к ошибкам процессора баз данных Microsoft Jet, но не к ошибкам времени выполнения Access. Выполняя процедуру события или макроса при возникновения события Error, вы можете предотвратить вывод сообщения об ошибке Microsoft Access и вывести пользовательское сообщение об ошибке, которое может оказаться более подходящим по контексту для вашего приложения.
Свойство OnError используется для того, чтобы указать макрос или процедуру Access, которая будет выполняться при возникновении события Error. Устанавливайте это свойство тем же путем, которым вы устанавливаете остальные свойства.
Например, синтаксис для процедуры события Error формы должен иметь следующую конструкцию:
Sub Form_Error(DataErr As Integer, Response As Integer)
Аргумент DataErr является кодом ошибки, возвращаемым функцией Err при возникновении ошибки. Вы можете использовать аргумент DataErr вместе с функцией Error$, чтобы соотнести номер ошибки с соответствующим сообщением об ошибке. Аргумент Response определяет, будет ли выводиться сообщение об ошибке. Для задания значения этого аргумента можно использовать одну из следующих констант:
∙DATA_ERRCONTINUE — это значение приводит к игнорированию ошибки, и код продолжается без вывода сообщения об ошибке. Вы можете добавить свое собственное сообщение об ошибке.
converted to PDF by HupBaH9I
∙DATA_ERRDISPLAY — это значение по умолчанию. Будет выведено стандартное сообщение об ошибке Microsoft Access.
Отладка программы в Visual Basic
Основным визуальным средством отладки в Visual Basic является окно Debug. Это окно позволяет выполнять достаточно много функций, и его основные элементы представлены на рис. 12.7.
Рис. 12.7. Окно отладки Debug в Visual Basic
Это окно имеет две панели. В верхней части расположена панель Watch, которая позволяет выводить значения интересующих нас переменных, значений свойств или выражений во время выполнения программы. Переменная или выражение могут быть занесены на эту панель с помощью команды Add Watch меню Tools. После выполнения этой команды на экране появляется одноименное диалоговое окно, представленное на рис. 12.8.
converted to PDF by HupBaH9I
Рис. 12.8.
Заранее выделенное выражение автоматически помещается в поле Expression этого окна. В блоке Context определяется дипазон, в котором будет отслеживаться изменение наблюдаемой величины. Не увлекайтесь, попытка отследить значения во всем диапазоне работы программы (пункты All Procedures и All Modules) может резко замедлить выполнение программы. В блоке Watch Type вы можете задать способ реакции Visual Basic на изменение значения наблюдаемого выражения.
В нижней части окна отладки расположена панель Immediate, которая позволяет отображать информацию, связанную с отлаживаемыми операторами, а также непосредственно вводить необходимые команды, как это можно делать в окне Command Visual FoxPro.
Сама процедура выполнения отладки программы Visual Basic аналогична описанной ранее для программы Access.
12.3. Подготовка приложения для распространения
Если вы считаете, что разработанное вами приложение вполне подходит для работы пользователя, пора подумать о том, как наиболее удобно переместить его на другой компьютер, который к тому же вряд ли имеет соответствующую среду разработки.
В этом параграфе мы рассмотрим средства подготовки пользовательского приложения для распространения.
Современное приложение для обработки данных может представлять собой достаточно большое число различных модулей, включающих данные и программы для их обработки. В этом плане чрезвычайно большое количество файлов имеет приложение, разработанное на Visual FoxPro. С него и начнем.
В процессе создания пользовательского приложения по мере насыщения Project Manager различными модулями, Visual FoxPro автоматически создавал таблицу с расширением PJX, куда помещал необходимую информацию о составных элементах будущей прикладной программы. Используя эту таблицу, Project Manager может создать пользовательскую программу Visual FoxPro, которая будет включать в себя все элементы вашего проекта двух типов: в виде файла с расширением APP и в виде файла с расширением EXE (рис. 12.9). Для этого в Project Manager вам
converted to PDF by HupBaH9I
следует просто нажать кнопку Build. Но чуть—чуть терпения, перед тем как вы нажмете эту кнопку, нам следует рассказать еще о некоторых моментах, на которые следует обратить внимание перед построением пользовательской программы.
Рис. 12.9.
В Project Manager все внесенные в него файлы делятся на две группы: включенные в пользовательскую программу или не включаемые в нее. Например, по умолчанию не включаются в программу файлы БД и все связанные с ней файлы. Посмотрите на список файлов в Project Manager. Перед именем таких файлов вы обнаружите перечеркнутый кружок. Включаемый в пользовательскую программу файл компилируется в объектный код и недоступен для изменения. Файлы, не включаемые в пользовательскую программу, должны распространяться отдельно. Для того чтобы включить или исключить какой—то файл из пользовательской программы, в меню Project выберите команду Project Info. Появляющееся после этого диалоговое окно Project Information приведено на рис. 12.10. Для изменения статуса файла откройте вкладку Files. Таким образом, перед построением пользовательской программы вы должны проверить наличие всех файлов, которые должны войти в файл приложения. Например, файлы изображений автоматически не включаются в проект, и вы должны вручную добавить их, так как распространение их в виде отдельных файлов запрещено лицензионным соглашением.
converted to PDF by HupBaH9I
Рис. 12.10.
На вкладке Project того же окна, которая показана на рис. 12.11, мы можем указать авторские реквизиты, задать параметры компиляции и выбрать значок, который будет включен в EXE-файл и может использоваться для создания ссылки при его запуске. Для подготовки пользовательской программы в параметрах компиляции следует отменить опцию Debug Info, так как при включенной опции в объектный код помещается специальный отладочный модуль, позволяющий при ошибке с помощью окна Trace указать место ее возникновения при наличии исходного файла и самой СУБД. Так как в пользовательской программе исходных текстов программ нет, то этот модуль бесполезен и только занимает лишнее место.
Рис. 12.11.
converted to PDF by HupBaH9I
Вы можете также включить опцию Encrypted, которая исключает возможность просмотра символьных фрагментов в объектном коде. Правда, практика использования предыдущих версий FoxPro показывает, что это не слишком надежная защита от умелых хакеров. С другой стороны,
программы преобразования файлов пользовательской программы в исходный текст несколько раз помогали авторам спасти собственные разработки, для которых непостижимым образом исчезали исходные файлы, а в пользовательской программе вдруг обнаруживалась ошибка.
Для того чтобы при компиляции установить точку запуска приложения, в Project Manager необходимо указать главную программу, как это видно на рис. 12.9. Для этого достаточно поставить курсор на этот файл и вызвать команду Set Main в меню Project. Как правило, в качестве главной программы используется или специальная программа, или файл главного меню приложения.
Для построения приложения в Visual FoxPro можно использовать и специальную программу BUILDAPP.PRG, которая при установке профессиональной версии Visual FoxPro записывается в папку TOOLSBUILDAPP папки Visual FoxPro. Эта программа создает файл пользовательского приложения и удаляет из него исходный код событий и методов, который хранится в файлах форм SCX и визуальных библиотек VCX. Удаление исходного кода позволяет получить файл пользовательского приложения меньших размеров и более защищенный от вскрытия.
Для запуска программы используйте следующий синтаксис:
DO BUILDAPP [WITH ProjectName [, AppFileName [, DebugMode [, BuildEXE]]]]
Здесь параметр ProjectName задает имя проекта. Параметр AppFileName — имя файла пользовательского приложения, причем указываемое расширение (APP или EXE) будет устанавливать тип создаваемого файла. Параметр DebugMode имеет логический тип и позволяет включить или отключить отладочный режим (для SET DEBUG ON параметр DebugMode должен быть равен .T., а для SET DEBUG OFF — .F.). Если параметр BuildEXE равен .T., то будет создаваться выполняемый EXE-файл.
Программа BUILDAPP выполняет следующие действия:
1.Определяет местоположение файлов.
2.Открывает проект.
3.Создает файл пользовательского приложения на основе первоначального файла проекта для проверки того, что весь исходный код откомпилирован и объектный код записан в соответствующие поля файлов SCX и VCX. Для завершения работы программы проект не должен генерировать ошибок во время построения пользовательского приложения.
4.Физически удаляет помеченные для удаления записи в файлах VCX.
5.Переносит исходный код из файлов SCX и VCX в массив.
6.Перестраивает файл пользовательского приложения.
7.Восстанавливает исходный код в файлах SCX и VCX, возвращая тем самым проект в первоначальное состояние.
Теперь скажем несколько слов о двух типах пользовательской программы, которые можно создать в Visual FoxPro.
APP-файл предназначен для работы в среде СУБД. Таким образом, компьютер, на котором будет работать ваша программа, должен быть оснащен копией Visual FoxPro.
EXE-файл на несколько десятков килобайт больше APP-файла, но для своей работы не требует наличия на компьютере Visual FoxPro. Этот файл работает совместно с библиотекой поддержки VFP300.ESL. EXE-файл работает несколько быстрее, чем APP, вероятно, за счет того, что требует меньшего количества ресурсов.
При выборе типа файла для пользовательского приложения необходимо иметь в виду, что библиотека поддержки не включает некоторые функции СУБД. Следовательно, в приложении, распространяемом в виде EXE-файла, не должны присутствовать эти исключенные функции.
Из меню Visual FoxPro не доступны следующие возможности:
∙Database
∙Form
∙Menu
∙Program
∙Project
∙Query
∙Table
converted to PDF by HupBaH9I
Ниже приведен список команд, при выполнении которых в пользовательском приложении произойдет ошибка «Feature not available» (функция не доступна).
Команды, не доступные при использовании библиотеки поддержки:
BUILD APP MODIFY FORM
BUILD EXE MOFIFY MENU
BUILD PROJECT MODIFY PROJECT
COMPILE MODIFY QUERY
CREATE FORM MODIFY STORED PROCEDURE
CREATE MENU MODIFY STRUCTURE
CREATE QUERY MODIFY VIEW
CREATE VIEW SUSPEND
FILER SET
MODIFY CONNECTION SET STEP
MODIFY DATABASE
В следующем списке перечислены файлы, которые не могут распространяться путем включения в пользовательское приложение или вместе с ним.
ADDLABEL.APP
AUTONAME.PRG
BROWSER.APP
BUILDAPP.PRG
BUILDAPP.SCT
BUILDAPP.SCX
BUILDER.APP
CONPROCS.PRG
CONVERT.APP
CONVERT.H
CONVERT.PJT
CONVERT.PJX
CONVERT.PRG
CVTALERT.H
CVTSCX.H
FD3.FLL
FDKEYWRD.CDX
FOREIGN.H
FOREIGN.PRG
FORMPARM.PRG
FOXHELP.DBF
FOXHELP.FPT
FOXHELP.HLP
FPCNEW.PRG
GENDBC.PRG
GENERIC.PRG
GENMENU.PRG
HC35.ERR
HC35.EXE
IMAGEDIT.EXE
IMAGEDIT.HLP
JD.FKY
JD.PRG.
LOCWORD.H
LOCWORD.PRG
MIGDB4.H
MIGDB4.PRG
MIGNAVPR.TXT
MMSETUP.PRG
MRBC.EXE
MSGRAPH.HLP
MSINFO.EXE
PRO_EXT.H
PUTNAME.PRG
RESERVED.FLL
SHED.EXE
converted to PDF by HupBaH9I
SHED.HLP
SPELLCHK.APP
TRANSPRT.PRG
VFP.EXE
WINAPIMS.LIB
WIZARD.APP
WIZARD.FLL
WZFORM.APP
WZFOXDOC.APP
WZGRAPH.APP
WZIMPORT.APP
WZMAIL.APP
WZPIVOT.APP
WZQUERY.APP
WZREPORT.APP
WZSETUP.APP
WZTABLE.APP
WZUPSIZE.APP
В Visual Basic процедура подготовки пользовательского приложения очень похожа на только что описанную для Visual FoxPro. В Visual Basic мы можем получить только EXE-файл. Для этого достаточно выбрать команду Make EXE File в меню File. Подготовка дистрибутивного комплекта дискет в Visual Basic выполняется с помощью отдельного приложения — Application Setup Wizard, представленного на рис. 12.12. Это приложение работает аналогично Setup Wizard в Visual FoxPro и путем выполнения семи шагов позволяет программисту быстро определить набор файлов, необходимый для работы приложения на компьютере пользователя.
Рис. 12.12.
Приложение 1
Дополнительные возможности новой версии Visual FoxPro 5.0
Визуальные средства проектирования Поставка программного пакета Требования к установке
Project Manager
Соседние файлы в предмете Программирование на Delphi
- #
- #
- #
- #
28.06.201440.36 Mб90Джулипн Б. “Фундаментальные алгоритмы и структуры данных.pdf
- #
- #
- #
28.06.20145.41 Mб144Тексейра С. “Delphi 5. Руководство разработчика” (1 том).pdf