Доступ: Как выполнить запрос и сохранить его результат в отчете

HI,

Я пытаюсь написать запрос в vba и сохранить его результат в отчете. Я начинающий. это то, что я пробовал, может кто-нибудь поправит меня

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim sql As String

Set cn = CurrentProject.Connection
sql = "Select * from table1 where empno is 0"

rs.Open sql, cn


While Not rs.EOF

' here i think i should save the result in a report but i am not sure how

  rs.MoveNext
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

Также как мне изменить этот запрос, чтобы запустить его на всех таблицах в базе данных


person Community    schedule 27.10.2008    source источник
comment
Что вы имеете в виду под отчетом? Вы имеете в виду HTML или текстовый документ?   -  person mohammedn    schedule 27.10.2008


Ответы (6)


ЕСЛИ вы хотите создать отчет с помощью генератора отчетов MS Access, вам придется использовать объект запроса (может быть способ обманом заставить MS Access запустить его из вашего набора записей, но это вероятно, не стоит ваших усилий).

Вы можете создать объект запроса в окне «База данных». Нажмите кнопку «Запрос» в списке объектов, а затем нажмите «Создать». В результирующем редакторе вы можете создать запрос графически или, если хотите, с помощью SQL. Сохраните запрос и дайте ему полное имя.

Аналогично отчет может быть создан в окне "База данных". Нажмите кнопку «Отчет», а затем «Новый». В появившемся мастере вы свяжете отчет с только что созданным запросом.
Обновление: Как сказал Д.В. Фентон сказал, что вы можете встроить запрос прямо в объект отчета, не создавая отдельный объект запроса. Я предпочитаю создать его в любом случае.

Проблема с этим методом заключается в том, что вам придется создавать отдельный запрос и отчет для каждой таблицы.

ЕСЛИ вы просто хотите вывести результат в текстовый файл (чтобы прочитать/распечатать позже), вы можете сделать это, используя наборы записей, как в коде VBA. Это будет выглядеть примерно так

'...
dim strFoo as string
dim strBar as string
'...
if not rs.bof then
    rd.MoveFirst
end if
While Not rs.EOF
   strFoo = rs("foo") 'copy the value in the field 
                      'named "foo" into strFoo.
   strBar = rs("bar")
   '... etc. for all fields you want
   '
   'write out the values to a text file 
   '(I'll leave this an exercise for the reader)
   '
   rs.MoveNext
Wend
'...

Разбор всех таблиц можно выполнить в цикле примерно так:

dim strTableName as string
dim db As Database
'...
Set db = CurrentDb
db.TableDefs.Refresh
For Each myTable In db.TableDefs
    If Len(myTable.Connect) > 0 Then
        strTableName = myTable.Name
        '...
        'Do something with the table
        '...
    End If
Next
set db = nothing

=======================ОБНОВЛЕНИЕ=======================
Можно запустить отчет MS-Access из набора записей. Чтобы повторить то, что я сказал, вопрос tksy From Доступ к Интернету можно использовать свойство "имя" набора записей. Полученный код будет выглядеть примерно так:

В отчете

Private Sub Report_Open(Cancel As Integer)
    Me.RecordSource = gMyRecordSet.Name
End Sub

В вызывающем объекте (модуле, форме и т. д.)

Public gMyRecordSet As Recordset
'...
Public Sub callMyReport()
    '...
    Set gMyRecordSet = CurrentDb.OpenRecordset("Select * " & _
                                               "from foo " & _
                                               "where bar='yaddah'")
    DoCmd.OpenReport "myReport", acViewPreview  
    '...
    gMyRecordSet.Close  
    Set gMyRecordSet = Nothing
    '...
End Sub

QED

person BIBD    schedule 27.10.2008
comment
Вам не нужно сохранять запрос, чтобы запустить отчет. Определение отчета имеет свойство Recordsource, которое хранится вместе с отчетом. - person David-W-Fenton; 27.10.2008
comment
Вам не нужно создавать набор записей перед открытием отчета. Просто назначьте строку SQL, которую вы используете в OpenRecordset, в качестве свойства Recordsource. И я не думаю, что ваш код в том виде, в каком он написан, будет работать, потому что вы назначаете имя набора записей, открытого в коде, свойству Recordsource. - person David-W-Fenton; 31.10.2008

Обычно вы разрабатываете отчет на основе источника данных. Затем, после того, как ваш отчет будет готов и работает правильно, вы используете VBA для отображения или сохранения отчета.

person Rune Grimstad    schedule 27.10.2008

Чтобы запустить это для каждой таблицы в базе данных, я бы предложил написать функцию, которая зацикливается на CurrentData.AllTables(i), а затем вызывает вашу функцию выше на каждой итерации.

Надеюсь это поможет

person James Green    schedule 27.10.2008

Если вы хотите просто просмотреть результаты, вы можете создать запрос. Например, вот какой-то грубый, в основном непроверенный VBA:

Sub ViewMySQL
Dim strSQL as String
Dim strName As String

'Note that this is not sensible in that you
'will end up with as many queries open as there are tables

    For Each tdf In CurrentDB.TableDefs
       If Left(tdf.Name,4)<>"Msys" Then
          strName = "tmp" & tdf.Name

          strSQL = "Select * from [" & tdf.Name & "] where empno = 0"
          UpdateQuery strName, strSQL
          DoCmd.OpenQuery strName, acViewNormal
       End If
    Next
End Sub

Function UpdateQuery(QueryName, SQL)

    If IsNull(DLookup("Name", "MsysObjects", "Name='" & QueryName & "'")) Then
        CurrentDb.CreateQueryDef QueryName, SQL
    Else
        CurrentDb.QueryDefs(QueryName).SQL = SQL
    End If

    UpdateQuery = True

End Function

Вас также может заинтересовать MDB Doc, надстройка для Microsoft Access 97-2003, которая позволяет документировать объекты/свойства в базе данных Access в файл HTML.

-- http://mdbdoc.sourceforge.net/

person Fionnuala    schedule 27.10.2008

Мне не совсем понятно, что вы хотите сделать. Если вы хотите просмотреть результаты оператора SQL, вы должны создать форму и установить для ее источника записей значение «Выбрать * из таблицы1, где empno равно 0». Затем вы можете просматривать результаты по одной записи за раз.

Если это не то, что вы хотите, то, боюсь, у меня просто недостаточно информации, чтобы ответить на ваш вопрос.

Из того, что вы сказали до сих пор, я не вижу причин, по которым вам нужен VBA или отчет, поскольку вы просто хотите просмотреть данные. Отчет для печати, форма для просмотра и редактирования. Отчет ориентирован на страницы и не так прост в навигации, в то время как форма ориентирована на записи и позволяет редактировать данные (если вы хотите).

Более подробная информация о том, чего вы хотите достичь, поможет нам дать вам более точные ответы.

person David-W-Fenton    schedule 27.10.2008

Был такой же вопрос. просто используйте буфер обмена!

  1. выберите результаты запроса, щелкнув/перетащив все показанные имена полей
  2. нажмите ctrl-c, чтобы скопировать в буфер обмена Windows
  3. откройте пустой документ в word и щелкните внутри него
  4. нажмите ctrl-v, чтобы вставить из буфера обмена.
person sean    schedule 10.08.2019