powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запара с выполнением запроса из VBA
30 сообщений из 30, показаны все 2 страниц
Запара с выполнением запроса из VBA
    #32396369
Gedeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня на форме есть текстовые поля и поля со списком, юзер должон их заполнить, а потом жмакнуть на кнопку и в бд должна добавиться запись, вот сокращенный вариант кода (без проверок на незаполненность и т.д.)
Private Sub btnAdd_Click()
Dim NewsPaper As Boolean, PeriodText As String

Dim SQLStr As String

lstAddType.SetFocus
If (lstAddType.Text = "ãàçåòà") Then
NewsPaper = True
Else
NewsPaper = False
End If

SQLStr = "INSERT INTO PeriodMain(Title,YearPublication,Number,Rubric," _
& "TypeId,Country,PodpIndex"
SQLStr = SQLStr & ",Frequency)VALUES("
SQLStr = SQLStr & CStr(lstAddName.Value) & ","
SQLStr = SQLStr & txtAddYear.Text & ","
SQLStr = SQLStr & txtAddNumber.Text & ","
SQLStr = SQLStr & CStr(lstAddRubric.Value) & ","
SQLStr = SQLStr & CStr(lstAddType.Value) & ","
SQLStr = SQLStr & CStr(lstAddCountry.Value) & ","
SQLStr = SQLStr & txtAddPodpIndex.Text
SQLStr = SQLStr & "," & txtAddPeriod.Text & ");"

End If



DoCmd.RunSQL SQLStr

В результате выполнения манипуляций со строкой получайтся следующее:
"INSERT INTO PeriodMain(Title,YearPublication,Number,Rubric,TypeId,Country,PodpIndex,Frequency)VALUES(6,2003,233,1,2,1,23456,1000);" и выдается ошибка 3134 - Ошибка инструкции в INSERT INTO, а если этот запрос закинуть в QueryAnaliser, он пишет, что слишком длинное выражение и оно ограничено 128 символами, если убрать кавычки, то все выполняется, соответственно ? как можно запустить выполнение данного запроса из VBA
БД - MSSQLServer 2000



End Sub
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396372
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
авторесли убрать кавычки, то все выполняется
Какие кавычки??? Где выполняется???
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396386
Gedeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кавычки в Query Analiser, которые там есть при копировании значения переменной SQLStr из окошка Watch установленного на ней
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396410
Gedeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В ощем вопрос можно задать упрощенно:
Как выполнить из вба запрос, содержащийся в строковой переменной, который содержит более 128 символов?
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396421
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
CurrentDb.Execute - не должно быть никакого ограничения.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396429
gedeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. Не получается сделать даже следующее:

Код: plaintext
1.
2.
3.
4.
SQLStr = _
 "INSERT INTO PeriodMain(Title, YearPublication, Number, Rubric, TypeId, Country, PodpIndex, Frequency) VALUES (6 ,  2003 ,  233 ,  1 ,  2 ,  1 ,  23456 ,  1000 )"

DoCmd.RunSQL SQLStr


А этот запрос в Enterprise Manager Выполняется без проблем, что-то мне сдается, будто строка из VBA передается с кавычками, а на сервере какие-то установки воспринимают ее как какое-то имя, что делать не знаю, помогите!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396436
Gedeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор
CurrentDb.Execute - не должно быть никакого ограничения.

Пробовал, та же ошибка, боюсь виноват не вба , а настройки сервера
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32396666
Gedeon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин переназвал поля в таблице на более короткие, теперь запрос влазит, но это не выход, пока оставлю так, а потом или удастся переубедить народ сделать это на плюсах или как-то надо что-то думать.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710170
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица dolzhnost, в ней всего 2 поля: ID и ДОЛЖНОСТЬ. В листбоксе формы они видны, хочется ввести новую с помощью текстбокса (см. пример). Проще говоря, юзер вводит новую должность, жмет ВВОД, а программа должна проверить, есть ли уже такая должность, и если нет, добавить ей. Так вот с кодом запроса и запарка - как правильно выполнить инструкцию SQL?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Private Sub Поле3_AfterUpdate()
Dim stTemp As String
Dim SQL As String
    
If Поле3.text <> "" Then
             
        SQL = "SELECT * " _
        & "FROM dolzhnost " _
        & "WHERE (((dolzhnost.Должность)=""" & Поле3.text & """));"
        
        stTemp = SQL
        MsgBox stTemp
        
        DoCmd.RunSQL (SQL)
             
        if ЕСТЬ ТАКАЯ ДОЛЖНОСТЬ Then
            stTemp = "Уже существует"
            MsgBox stTemp
        Edn If
        Else
            ВСТАВИТЬ И ОБНОВИТЬ ЛИСТБОКС Список1
        End
    End If
    
End Sub

заранее спасибо.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710207
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо бы начать с того, что всем всегда рекомендуется делать:
- adp - mdb?
- версия офиса.

Если adp , то строковые переменные заключаются в апострофы
Код: plaintext
SQLStr = SQLStr & & "'" & CStr(lstAddName.Value) & "'," 

выполнение запроса
Код: plaintext
CurrentProject.Connection.Execute SQLStr 
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710233
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВиталХорошо бы начать с того, что всем всегда рекомендуется делать:
- adp - mdb?
- версия офиса.

Приму к сведению;) База mdb, офис XP.

выполнение запроса
Код: plaintext
CurrentProject.Connection.Execute SQLStr 
[/quot]

А вот тут будте добры поподробнее. Я использую doCmd.RunSQL с переданной строкой запроса, но выполнение его спотыкается на ошибке №2342 "Для макрокоманды ЗапускЗапросаSQL требуется аргумент, состоящий из инструкции запроса".
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710271
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
CurrentProject.Connection.Execute SQLStr 
Это для проектов adp - я предположил, что у Вас именно проект, поскольку ссылки были на проверку в Query Analyzer. И еще я надеюсь, что у Вас не "гибрид с ушами" - файл mdb + SQL server.

Если чистый мэдэбэшник, то попробуйте как посоветовал Владимир Саныч
Код: plaintext
CurrentDB.Execute SQLStr 

Хотя в этой ситуации я предпочел бы добавлять через рекордсет, но это дело вкуса.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710287
Andres 1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gedeonТ.е. Не получается сделать даже следующее:

Код: plaintext
1.
2.
3.
4.
SQLStr = _
"INSERT INTO PeriodMain(Title, YearPublication, Number, Rubric, TypeId, Country, PodpIndex, Frequency) VALUES (6, 2003, 233, 1, 2, 1, 23456, 1000)"

DoCmd.RunSQL SQLStr

А этот запрос в Enterprise Manager Выполняется без проблем, что-то мне сдается, будто строка из VBA передается с кавычками, а на сервере какие-то установки воспринимают ее как какое-то имя, что делать не знаю, помогите!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Может попробовать все имена полей заключить в квадратные скобки?
Код: plaintext
1.
2.
3.
4.
SQLStr = _
"INSERT INTO PeriodMain([Title], [YearPublication], [Number], [Rubric], [TypeId], [Country], [PodpIndex], [Frequency]) VALUES (6, 2003, 233, 1, 2, 1, 23456, 1000)"

DoCmd.RunSQL SQLStr

А вообще-то я бы посоветовал скопировать эту строку SQL в запрос Access, попытаться сохранить и посмотреть, на что ругаться будет.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710313
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Витал
Код: plaintext
CurrentProject.Connection.Execute SQLStr 
Это для проектов adp - я предположил, что у Вас именно проект, поскольку ссылки были на проверку в Query Analyzer. И еще я надеюсь, что у Вас не "гибрид с ушами" - файл mdb + SQL server.

нет, чистый mdb, хотя будь моя воля, все бы сделал на Web[Perl] + SQLServer2000;-) А в Акцесе я не силен, только учусь, поэтому много чего в базе сделано не через код VBA (эти самые рекордсеты - вот бы знать, с чем его едят и как привязать к листбоксу, к форме и еще есть много вопросов ;-)))
[/quot]
Хотя в этой ситуации я предпочел бы добавлять через рекордсет, но это дело вкуса.[/quot]
вкус к программированию на VBA у меня появится, когда я стану более-менее в нем разбираться, а пока что я стараюсь сделать так, как сделали бы профессионалы (вроде вас и Саныча), а так как за неимением опыта и знающего чела под рукой - спрашиваю вас;-)
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710396
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнет, чистый mdb,

А каким боком здесь ентерпрайз с анализером? Таблицы в файле аксеса или на серваке (SQL server)?

На всяки пожарный - как с рекордсетом управиться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Dim rst As New ADODB.Recordset
With rst
  .Open "Select * From PeriodMain", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 
  .AddNew
  .Fields("Title") = CStr(lstAddName.Value)
  .Fields("YearPublication") = txtAddYear.Value
............
  .Update
End With

rst.Close
Set rst = Nothing

не забудь в референсис библиотеку Адо подключить. :о) Успеха.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710399
[Number]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
INSERT INTO tabl ( Number )
VALUES (0);
- ашибка
INSERT INTO tabl ( [Number] )
VALUES (0);
- работает

см. зарезервированные слова jet
авторDOUBLE PRECISION, FLOAT DOUBLE FLOAT, FLOAT8, IEEEDOUBLE, NUMBER, NUMERIC
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710454
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Витал авторнет, чистый mdb,

А каким боком здесь ентерпрайз с анализером? Таблицы в файле аксеса или на серваке (SQL server)?



тут небольшая неувязка получилась. Мой вопрос не относится к предыдущему, в котором упоминается SQLServer;)

у меня локальная база mdb, в которой мне нужно вставить запрос в VBA, проанализировать и выдать некоторое сообщение. Вот и все.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710568
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автору меня локальная база mdb, в которой мне нужно вставить запрос в VBA, проанализировать и выдать некоторое сообщение
Все что я написал про рекордсет - годится и для решения твоей проблемы (добавленние новой должности?).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim rst As New ADODB.Recordset
With rst
  .Open "Select * From dolzhnost", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 
(вариант: Set rst = Список1.RecordsetClone)
  .Find "Должность = " & Поле3.text 
  If .EOF Then
   .AddNew
   .Fields("Должность") = Поле3.text
   .Update
  Else
    MsgBox "Такая должность уже есть!!! Не забивайте базу мусором!!!"
  End If
End With

rst.Close
Set rst = Nothing
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32710641
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все что я написал про рекордсет - годится и для решения твоей проблемы (добавленние новой должности?).
мдя, либо я совсем тупой (ламер то бишь), либо плохому танцору ноги мешают...
Сделал все как вы сказали, в коде разобрался, все логически понятно что куда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Sub Поле3_AfterUpdate()
    Dim stTemp As String
    Dim SQL As String
    Dim rst As New ADODB.Recordset

    With rst
        .Open "Select * From dolzhnost", CurrentProject.Connection, adOpenKeyset, 
adLockOptimistic
        .Find "Должность = " & Поле3.text
        
        If .EOF Then
        .AddNew
        .Fields("Должность") = Поле3.text
        .Update
        Else
            MsgBox "Такая должность уже есть!!! Не забивайте базу мусором!!!"
  End If
End With

rst.Close
Set rst = Nothing

но вываливается такая фигня:

В таблице dolzhnost.Должность типа Text (50), введенная строка гораздо меньше, что к чему - не пойму...
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32712261
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
никому не интересно или больше мыслей нету?
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32712285
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Orlicникому не интересно или больше мыслей нету?
Ecть :)
Код: plaintext
.Find "Должность = '" & Поле3.text & "'"
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32712627
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(c)VIG
Ecть :)
Код: plaintext
.Find "Должность = '" & Поле3.text & "'"

сейчас попробую...
И вообще, как я понял, без чтения вышеуказанного Кена Гетца создавать более-менее порядочную БД (я имею ввиду использование VBA, а не стандартных мастеров) бесполезно - разобьешься о подводные рифы мелких проблем, которые как острые зубы пираний грызут программистский ум... Эх, выложит начальство тысящу, или зажмотит?:-)
(лирической отступление)
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32712924
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Усе, благодаря общим усилиям и пытливому уму, запрос заработал. Кому интересно - вот код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub Поле3_AfterUpdate()
    Dim rst As New ADODB.Recordset
    
    With rst
        .Open "Select * From dolzhnost", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        .Find "Должность = '" & Поле3.text & "'"
        
        If .EOF Then
        .AddNew
        .Fields("Должность") = Поле3.text
        .Update
        Me.Список1.Requery
        Me.Список1.SetFocus
        Else
            MsgBox "Такая должность уже существует!!!"
  End If
End With
rst.Close
Set rst = Nothing
End Sub

Теперь буду биться над ьем, как из этого листбокса удалить выделенную запись ;-)
Есть идеи?
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32716843
Dmitry-SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не поздно "включился"?
Если в таблице, в свойствах поля стоит "индексация без повторов" (не дословно :),
то по строке "INSERT ..." новая запись не добавится!!!
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32716939
Dmitry-SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО - нет смысла назыать форму и делать заголовок одинаковыми,
а для корректировки/удаления лучше предусмотреть отдельную форму!

А удалять можно запросом "DELETE..." - синтаксис где-то есть,
правда в справке я его нашел лишь один раз - как - не помню (быстрее в интернете),
либо кнопкой с визардом "удаление записи".
Ок?
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32717027
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry-SQLИМХО - нет смысла назыать форму и делать заголовок одинаковыми,
Виноват, исправлюсь ;-) ТОлько это была как бы тест-форма, вот удаление добавлю - будет её релиз...

а для корректировки/удаления лучше предусмотреть отдельную форму!

так хочется все в одном. Листбокс - он наглядный, простой как пень, не хочется делать ленточную форму.
Предполагаю, что нужно добавить еще 1 поле в этот листбокс, в него добавить кнопочку "УДАЛИТЬ"... Так будет универсально, и удобно.

Ок?
ОК, теперь новый вопрос. Хочется сделать сортировку по любому полю. То бишь есть листбокс с 3-4 полями, со строкой заголовком, с сортировкой по умолчанию. Щелкаешь на название поля - данные пересортировываются по нему (я такое делал на Perl в связке Web+SQL2000)...
во-о-от... сижу репу чешу. Так что ты в самый раз включился ;-)
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32717083
Dmitry-SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, я листбоксами еще не разу не пользовался :)
Но можно попробовать вместо заголовков над листбоксом разместить кнопки
с нужными подписями - и орудуй! Так и нагляднее :)
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32717164
Dmitry-SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удаляюсь, до завтра.
Успехов в труде.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32721594
Фотография drbond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последняя проблема штатными средствами Access'а не реализуется. Нужно писать дополнительный класс, который активирует заголовки в ListBox. Где-то я его реализацию видел. Найду - дам ссылку.
...
Рейтинг: 0 / 0
Запара с выполнением запроса из VBA
    #32767856
Orlic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drbondПоследняя проблема штатными средствами Access'а не реализуется. Нужно писать дополнительный класс, который активирует заголовки в ListBox. Где-то я его реализацию видел. Найду - дам ссылку.
Как то я скачал один пример, там есть и классы, и модули... Вставил в свою базу и не нарадуюсь: тут тебе и посик подстроки в строке (причем с гибкими параметрами), и сортировка по любому полю листбокса, и динамическое формирование отчетов... Класс просто...
Скачивайте, изменяйте RowSource в коде формы и работайте наздоровье;-) Вот только ссылку я не помню, а файл почти 500кб в архиве... Если надо - вышлю на мыло.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запара с выполнением запроса из VBA
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]