【问题标题】:ms access query with loop to create multiple tables带循环的 ms 访问查询以创建多个表
【发布时间】:2016-06-19 12:46:30
【问题描述】:

我在 oracle 数据库中有一个表 - 它将有两列(项目名称,视图名称)。在该表中,当您过滤项目名称时,我们将获取与该项目相关的所有视图名称,再次基于这些视图名称,我们需要编写像 select * from projectname$viewaname; 这样的查询来获取该视图相关数据。

手动执行此操作对于每个项目都需要很长时间。所以我的想法是创建 MS ACCESS 数据库来为选定的项目创建表并将它们作为 excel 文件导出到C:\temp folder

我需要您的帮助,以便在 MS Access 中一次性创建多个表(使用查询/直通查询或任何其他选项)从 oracle 数据库中获取数据。

为此,我创建了 MS 访问文件,创建了一个链接表(其中我有项目和视图名称)。

之后我创建了一个表单,使用项目字段作为链接表中的组合框并更新了设置,例如,这个表单应该在启动时打开。

当我打开访问文件时,此表单会自动打开并要求我输入 oracle 数据库用户 ID 和密码 - 输入凭据后,组合框正在更新,我可以在该列表中选择我的项目。

之后,我使用主表创建了一个查询,并根据表单中的选择应用了过滤条件。现在我得到了最终用户选择的项目的项目和视图名称等结果。

我需要你的帮助,例如,

现在我们在下表中有数据。

Project | Viewname
A       | A1  
A       | A2
A       | A3
A       | A4
A       | A5

查看单个视图数据的 SQL 查询是:

select * from projectname$view_name;

例如:select * from A$A1;

项目名称、视图名称和行数(视图)、视图中的列是动态的 - 将根据项目而变化。

我需要您的帮助来动态创建多个表(每个视图一个) - 请建议我最好的选择。

问候, 壁画

【问题讨论】:

  • 您的问题过于宽泛。请缩小范围,添加您的代码并指定有问题的部分。谢谢和问候,
  • 我有 ms 访问的表。每行与每个查询有关。我的问题是如何通过(查询/直通查询)连接到数据库来运行每一行(每个查询),获取与查询相关的数据 - 使用在 ms 访问中创建表。然后移动到第二条记录-传递该查询-获取-创建表... .对于所有记录所有表...如何创建表从现有表中获取查询并循环。请帮忙。
  • 您的问题听起来仍然像是开发请求。只需将其缩小到单个编程问题并向您展示导致问题的代码(VBA、SQL、表定义等)。最好的问候,
  • Sql : create table tablename as select * from tablename - 这里它将从源表中创建表。当您在一个表中有多个这样的查询时 - 在 MS access Query 中使用 select into 语句 - 如何创建循环并自动创建这些表?

标签: sql vba loops ms-access


【解决方案1】:

考虑迭代循环遍历记录集中的项目/视图名称查询并创建传递查询,然后导出到 Excel 电子表格。

Public Sub ImportOracleProjectViews()
    Dim db As Database, rst As Recordset, qdef As QueryDef
    Dim constr As String, strSQL As String, mkTBL As String

    Set db = CurrentDb
    ' ENTER QUERY HOLDING PROJECT AND VIEW NAMES '
    Set rst = db.OpenRecordset("QUERYNAME")

    ' DELETE TEMP QUERYDEF IF EXISTS '
    For Each qdef In db.QueryDefs
        If qdef.Name = "temp" Then
            db.QueryDefs.Delete ("temp")
        End If
    Next qdef

    If rst.RecordCount = 0 Then Exit Sub
    rst.MoveLast: rst.MoveFirst

    ' LOOP THROUGH EACH RECORD OF RECORDSET ' 
    Do While Not rst.EOF

        ' SQL STATEMENTS '
        strSQL = "SELECT * FROM " & rst!projectname & "$" & rst!viewname

        ' ORACLE CONNECTION STRING '
        constr = "ODBC;Driver={Microsoft ODBC for Oracle};Server=myServerAddress;" _
                              & "Uid=myUsername;Pwd=myPassword;"

        ' PASS THRU QUERY '
        Set qdef = db.CreateQueryDef("temp")
        qdef.Connect = constr
        qdef.SQL = strSQL
        qdef.Close

        ' EXPORT TO MS EXCEL SPREADSHEET '
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, temp, _
           "C:\Path\To\Output\Folder\" & rst!projectname & "_" & rst!viewname & ".xlsx", _
           True

        rst.MoveNext
    Loop

    rst.Close

    Set rst = Nothing
    Set qdef = Nothing
    Set db = Nothing

    MsgBox "Successfully imported views to local tables and " _
                    & "Excel spreadsheets!", vbInformation

End Sub

资源

【讨论】:

  • 嗨 Parfait,我收到运行时错误 3010(表已存在) - 这里创建了第一个表 - 导出了第一个表,并且在临时视图中第一个表数据在那里。但它不会移动到下一张桌子。请帮忙。另一件事是在导出到 C: 驱动器文件夹后,我不需要数据库中的表 - 我只需要输出 excel 文件。
  • 跳过生成表查询(您之前必须删除先前的表)。查看更新,您只需将temp querydef 输出到电子表格。
  • 嗨 Parfait,我收到运行时错误 2495 - 我在 Google 中检查并应用“”到 temp 像“temp” - 现在代码正在运行,现在它正在显示 - 运行时错误 3146 - 表/视图不退出。
  • 嗨,我使用了旧代码,将“DELETE TEMP QUERYDEF IF EXISTS”部分移到最后 - 添加了另一个字符串作为 dltbl(删除表) - 最后执行。现在工作正常。感谢您的帮助。
【解决方案2】:

您已经问了多个问题,所以答案的结构是相应的:

要使用 VBA 创建 MS 访问表,请参考以下示例代码 sn-p:

Public Sub CreateTableVBA() 
    Dim SQL As String 
    SQL = "CREATE TABLE ThisTable " & "(FirstName CHAR, LastName CHAR);" 
    DoCmd.RunSQL SQL 
End Sub

为了创建多个表,您应该有一个表名数组和相应的 SQL 语句数组,如上图所示。然后您可以使用 VBA For-Next 代码块循环遍历数组,运行 DoCmd.RunSQL 命令。

或者,您可以在 VBA Database 对象上使用 Execute() 函数而不是 DoCmd.RunSQL,如下所示:

Sub CreateTableXSQL() 

    Dim dbs As Database 

    ' include the path to MyDb.mdb on your computer. 
    Set dbs = OpenDatabase([Path to MyDb.mdb]) 

    ' create a table SQL with two text fields. 
    dbs.Execute "CREATE TABLE ThisTable " & "(FirstName CHAR, LastName CHAR);" 

    dbs.Close 

End Sub

希望这会有所帮助。

【讨论】:

  • 谢谢。我会试试这个。
  • 不客气。祝你的项目好运。问候,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2011-03-16
  • 2022-01-20
  • 2015-08-14
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
相关资源
最近更新 更多