Форумы HiProg.com - MS ACCESS, VBA, VB

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

ник: час
Вопрос: Маленькие секреты от Кривцова Анатолия

Совет:
Удобные комбинации клавиш:

Ctrl + '(апостроф) - вносится значение элемента из предыдущей записи
Ctrl + Alt + Пробел - вносится значение по умолчанию
Ctrl + ; - вносится текущая дата


Чтобы прочитать значение из несвязанного столбца ListBox или ComboBox используйте ссылку:
Me![Имя].Column(1) - второй столбец выбранной строки
Me![Имя].Column(1,0) - второй столбец первой строки в списке.
Ссылка =Form![Имя].Column(2) может быть использована в DataSource вычисляемого элемента для отображения значения третьего столбца выбранной строки.
Следует напомнить, что все возвращаемые значения - текстовые.


Если в запросе источника строк ListBox или ComboBox есть ссылки на элементы той же формы, то их лучше указывать в виде:

Form![Имя элемента]

Можно смело менять название формы или копировать в подобную форму.


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

RunCommand acCmdSaveRecord '(выполнение команды меню)

Примечание:

Прочилал в умной книжке, что если запись не редактировалась - будет ошибка выполнения, и надо предварительно проверять свойство Dirty формы.

Попробовал - молчит.



* Рекомендую всем, кто этого еще не сделал, установить "СервисРелиз 2" (файл Dataacc.exe). Устраняются по меньшей мере следующие дефекты:

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

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




* Для автоматического добавления значения года при вводе даты в TextBox на форме предлагаю функцию:

Function AutoYearForInputDate() As Boolean
Dim ctl As Control, strText As String, _
strCurYear As String
On Error GoTo AutoYearForInputDate_err

strCurYear = Year(Date)
Set ctl = Screen.ActiveControl
strText = ctl.Text & ""

If strText Like "##.##.__" Then
strText = Left(strText, 6) & Right(strCurYear, 2)
ctl.Text = strText
AutoYearForInputDate = True
End If

AutoYearForInputDate_exit:
Exit Function

AutoYearForInputDate_err:
Resume AutoYearForInputDate_exit
End Function



TextBox должен иметь маску ввода ShortDate.Чтобы функция работала, необходимо по событию OnError
формы вставить код наподобие:

If DataErr = 2279 then
Response = acDataErrContinue
If AutoYearForInputDate Then
Exit Sub
End If
MsgBox "Введено некорректное значение! "
End If

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




* Для работы с денежными единицами, где число знаков после запятой не больше 2 предлагаю функцию округления:

Public Function Round_2(anyValue As Variant) As Currency
' Аргументы: Значение типа Variant
' Назначение: Округляет значение до 2 зн. после запятой
' по правилам бухгалтерии.
' Возвращает: Ненулевое значение или 0 формате Currency
Dim dblResult As Double

If Not IsNumeric(anyValue) Then
Round_2 = 0
Exit Function
End If

dblResult = anyValue * 100 + 0.5 * Sgn(anyValue)
Round_2 = Fix(dblResult)/100
End Function

Функция всегда возвращает число(Currency) и может с успехом использоваться для точных вычислений в процедурах или вычисляемых полях.




* При работе с RecordSetClone формы возникают ситуации, когда значения свойств BOF и EOF не соответствуют действительности(Access97).

Например:

Обращаемся к RecordSetClone, затем накладываем фильтр или меняем RecordSource формы так, что нет записей; снова обращаемся к RecordSetClone, и получаем BOF = False и, как следствие - ошибку выполнения. Чтобы застраховаться - можно добавить строку

If Not [Ссылка].BOF Then [Ссылка].MoveFirst

После этого BOF имеет правильное зачение.



* В качестве критерия типа Дата для строки SQL или функции по подмножеству в процедуре можно использовать конструкцию "...=" & CDbl(Дата), т.к. значение даты в базе хранится в виде числа(Double).
Строковый параметр в виде:

"...=" & Chr(34) & Строковый параметр & Chr(34)

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

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

Dim dbs As Database, qdf As QueryDef, rst As Recordset
Set dbs = CurrentDB
Set qdf = dbs.CreateQueryDef("")

qdf.SQL= "Parameters .... Select ..."
qdf.Parameters("Начало периода") = Дата1
qdf.Parameters("Минимальная сумма") = Сумма

Set rst = qdf.OpenRecordset

qdf.SQL= "Parameters .... Delete ..."
qdf.Parameters("Конец периода") = Дата2
qdf.Execute

Такая конструкция делает ваш код независимым от региональных установок (формат даты, десятичные разделители) и исключает лишние преобразования типа Число - Строка - Число



* Вместо метода DoCmd.Echo False|True правильнее применять метод Application.Echo. Если запрет на пере-рисовку относится к одной форме или подформе - можно использовать свойство формы Painting.



... О методе DoCmd.SetWarnings False|True лучше вообще забыть. В основном он применяется вместе с методом DoCmd.RunSQL, о котором тоже лучше забыть и применять метод CurrentDB.Execute. Этод метод лучше во всех отношениях, как уже отмечали предыдущие ораторы.



... Вместо комбинации Chr(13) & Chr(10) для перевода строки удобнее использовать встроенную константу vbCrLf.

Для функции MsgBox еще лучше использовать символы "@" в тексте сообщения. Таких символов должно быть два.


Ваше имя:

Пароль:

Цитировать: [quote][/quote] Код: [code][/code]
Жирный: [b][/b] Наклонный: [i][/i]
URL: [url][/url] 

Сообщение:

 Размер файла не более 50 Кбт. Большие файлы можно размещать на www.slil.ru

Прикрепить:

 

Для вставки смайлов в текст щелкните по значку.