Pinochet Posted April 19, 2009 Report Share Posted April 19, 2009 Запросы Добавление записи в таблицуЗадача: Добавить в таблицу ("TableName") одну запись и задать текстовому полю ("TextFieldName") этой таблицы значение = "Любой Текст", причем, таблица содержит уникальный индекс по числовому полю ("RecordID") которое не является счетчиком.Примечание: Если вы используете имена полей с пробелами (что не рекомендуется) то имена полей в запросе должны обрамляться квадратными скобками - [Имя Поля]Dim lngID As LongDim var As VariantDim strSQL As String'Определяем максимально имеющиеся значение индекса var = DMax("RecordID", "TableName") If IsNull(var) Then var = 0 'на случай если запись первая'Получаем следующие значение индексного поля lngID = var + 1'Добавляем запись strSQL = "INSERT INTO TableName (RecordID, TextFieldName) " & _ "VALUES (" & lngID & ",'Любой Текст')" CurrentDb.Execute strSQL ОбновлениеПримечание: Если вы используете имена полей с пробелами (что не рекомендуется) то имена полей в запросе должны обрамляться квадратными скобками - [Имя Поля]Private Sub ЗапросРАЗ()'изменяет начальные значения полей:' TextFieldName (Текстовое) и' CurrFieldName (Денежное)'на новые, заданные в переменные, но только у тех записей, у которых'значение ключевого поля [RecordID] - больше двух (RecordID > 2)Dim strSQL As StringDim strNewValue As StringDim curNewSum As Currency'Задаем значения переменных strNewValue = "Новое Значение" curNewSum = 1234.32'Строим запрос strSQL = "UPDATE TableName SET " & _ "TextFieldName = '" & strNewValue & "', " & _ "CurrFieldName = '" & curNewSum & "' " & _ "WHERE RecordID > 2"'Выполняем запрос CurrentDb.Execute strSQLEnd Sub '================================================================= Private Sub ЗапросДВА()'Возвращает начальные значения в таблицуDim strSQL As String strSQL = "UPDATE TableName SET " & _ "TextFieldName='Начальное значение', " & _ "CurrFieldName = 0.00"'Выполнение запроса CurrentDb.Execute strSQLEnd Sub Удаление Записей по условию значения поляПримечание: Если вы используете имена полей с пробелами (что не рекомендуется) то имена полей в запросе должны обрамляться квадратными скобками - [Имя Поля]Dim strSQL As StringDim Msg As String, Style As Integer, Title As String, Response As Integer'Строим запрос подтверждения от пользователя Msg = "Внимание!" & vbCrLf & _ "Все записи из таблицы [TableName] с индексом больше ДВУХ будут удалены" & vbCrLf & _ "Действительно удалить?" Style = vbYesNo + vbExclamation + vbDefaultButton2 Title = "Вопрос"'Получаем ответ Response = MsgBox(Msg, Style, Title)'Если пользователь ответил "ДА!" If Response = vbYes Then strSQL = "DELETE FROM TableName WHERE RecordID > 2" CurrentDb.Execute strSQL End If Запуск Запроса (на изменение записей)DoCmd.SetWarnings FalseDoCmd.OpenQuery "MyQueryName", acNormal, acEdit'или такCurrentDb.QueryDefs("MyQueryName").Execute Изменение свойств всех запросов приложения (UseTransaction)Вместо пояснений, цитата из справочной системы: Задав для свойства Использовать транзакцию (UseTransaction) значение Нет, можно значительно повысить быстродействие при определенных обстоятельствах. В этом случае пользователь никогда не столкнется с проблемами, связанными со слишком большим количеством запросов на блокировку записей. Кроме того, ядро базы данных Jet не сохраняет результаты запроса во временной базе данных, что тоже повышает быстродействие.Если существует большое количество записей, которые должны быть записаны во временную базу данных, то выполнение запроса на изменение как отдельной транзакции может снизить быстродействие. Кроме того, при выполнении запроса на удаление или обновление в общей базе данных, возникает большое количество запросов на блокировку записей. Это может снизить быстродействие в некоторых сетевых операционных системах, например, в NetWare выполнение запроса будет прервано, если количество запросов на блокировку записей превысит 10000. Если завершение транзакции невозможно, появляется сообщение об ошибке и пользователь может сохранить или нет внесенные изменения.Private Sub ChangeQueriesPrp()'es 17.01.04'Изменение свойств сразу всех запросов приложенияDim dbs As Database, qdf As QueryDefOn Error GoTo ChangeQueriesPrpErr Set dbs = CurrentDb For Each qdf In dbs.QueryDefs 'если запрос не на выборку то меняем его свойства If qdf.Type <> dbQSelect Then 'Debug.Print qdf.Name qdf.Properties("UseTransaction") = False End If Next qdf Exit SubChangeQueriesPrpErr: MsgBox "Процедура [ChangeQueriesPrp] привела к ошибке:" & vbCrLf & _ Err.Description & vbCrLf & " Err#" & Err.Number, vbCriticalEnd Sub Как написать условие WHERE по полю типа "Date/Time"Андрей Митинhttp://am.rusimport.ru/MsAccess/topic.asp?id=134 Часто возникают вопросы типа "Почему у меня не работает выражение "select * from [Tbl] where [Date]=#" & me.Дата & "#" (или что то в этом роде).Чтобы корректно поставить условие по полю типа Date/Time необходимо всего лишь корректно отформатить значение - для Access формат даты должен быть следующим: #mm/dd/yy#. Для SQL-Server это выглядит чуть по-другому: yyyy-mm-dd (такой формат понимается при любых локальных настройках сервера).Для облегчения можно применять приведенную ниже функцию, например так: "select * from [Tbl] where [Date]=" & FormatSpDate(me.Дата)Public Function FormatSpDate(ByVal parDate As Date, Optional bSQL As Boolean = False) As StringIf bSQL Then FormatSpDate = Format$(parDate, "'mm\.dd\.yyyy'")'или можно так'FormatSpDate = Format$(parDate, "'yyyy\-mm\-dd'")Else FormatSpDate = Format$(parDate, "\#mm\/dd\/yy\#")End IfEnd Function Модуль преобразования величин для подстановки в SQL-запросМаксименко Юрий [email protected] http://db-maker.narod.ru/ Предлагаю Вашему вниманию Модуль преобразования величин для подстановки в SQL-запрос с моего сайта. Для тех, кто хотел бы разобраться и, возможно, внести усовершенствования, сделаю парочку пояснений. Назначение функции sqlReplace() Существует набор символов, имеющих специаьное значение в SQL, но которые могут оказаться и в Ваших текстовых данных. Самый заметный среди таких «проблемных» символов — апостроф. То есть если Вы, например, хотите ввести в выражение запроса название McDonald's, то, чтоб не получить ошибку, должны обработать вхождение апострофа. Так, для MS Access Вы должны будете заменить один апостроф двумя, а для MySQL поставить перед апострофом обратный слэш.НО если Вы просто примените для этого функцию Replace(), то совершите ошибку, которая Вам аукнется, например, когда Вы попытаетесь программно сохранить выражение запроса в поле таблицы. Надеюсь, Вам понятно, что в случае Replace() Вы получите McDonald''s.Функция sqlReplace() осуществляет замену корректно, без повторного «квочения» строки. Поддержка нескольких СУБД В число параметров функций ToSQL() и dateToSQL() входит параметр platform. Он-то и позволяет Вам перейти на другую СУБД, не переписывая те участки, в которых происходит собирание запросов. Пишете новый case в ToSQL() и dateToSQL(), заменяете принятый по уочанию Access на новую платформу — и все запросы теперь собираются в синтаксисе новой платформыOption Compare DatabaseOption Explicit'======================================================='Для подстановки даты и времени строкой в запрос SQL.'platform - СУБД, для которой составляется выражение Function dateToSQL(ByVal Date_ As Date, Optional ByVal platform As String) As String If platform = "" Then platform = "Access" Select Case platform Case "Access" dateToSQL = "#" & Trim(str(Month(Date_))) & "/" & Trim(str(Day(Date_))) & "/" & Trim(str(Year(Date_))) dateToSQL = dateToSQL & " " & Trim(str(Hour(Date_))) & ":" & Trim(str(Minute(Date_))) & ":" & Trim(str(Second(Date_))) dateToSQL = dateToSQL & "#" Case "MySQL" dateToSQL = "'" & Year(Date_) & "-" & Month(Date_) & "-" & Day(Date_) & " " & Hour(Date_) & ":" & Minute(Date_) & ":" & Second(Date_) & "'" Case Else End SelectEnd Function '======================================================='Заменяет в строке strToSQL спецсимвол specChar на replace - для вставки текстовой константы в запрос SQL'Отличается от обычной замены тем, что не заменяет спецсимвол specChar, если он уже ранее заменялся на replace'Примеры: 'sqlReplace("McDonald's")="McDonald''s" 'sqlReplace("McDonald''s")="McDonald''s" !!! заметьте - не "McDonald''''s" !!! 'sqlReplace("McDonald's","'","\'")="McDonald\'s" !!! заметьте - не McDonald''''s Function sqlReplace(ByVal strToSQL As String, Optional ByVal specChar As String, Optional ByVal replace As String) As String Dim Pos, r, s As Integer If specChar = "" Then specChar = "'" If replace = "" Then replace = "''" strToSQL = " " & strToSQL ' на случай начала строки с specChar s = Len(specChar) r = Len(replace): Pos = 2 Do While Len(strToSQL) >= Pos If (Mid(strToSQL, Pos, s) = specChar) And (Mid(strToSQL, Pos, 2) <> replace) And (Mid(strToSQL, Pos - 1, 2) <> replace) Then strToSQL = Left(strToSQL, Pos - 1) & replace & Mid(strToSQL, Pos + 1) Pos = Pos + r Else Pos = Pos + 1 End If Loop sqlReplace = Mid(strToSQL, 2) 'Убираем пробелы, которые подставили в началеEnd Function '======================================================='Преобразование величины для подстановки в запрос SQL Public Function ToSQL(ByVal Value, Optional platform As String) As String If IsNull(Value) Then Value = "" If platform = "" Then platform = "Access" Select Case platform Case "Access" Select Case VarType(Value) Case vbDate ToSQL = dateToSQL(Value) Case vbString ToSQL = "'" & sqlReplace(Value) & "'" Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency ToSQL = Trim(str(Value)) Case vbBoolean ToSQL = IIf(Value, "-1", "0") End Select Case Else End SelectEnd Function Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now