ms使用循环访问查询以创建多个表

时间:2016-03-05 19:30:16

标签: sql vba loops ms-access

我在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;

ex:select * from A$A1;

项目名称,视图名称和行数(视图),视图中的列是动态的 - 将根据项目进行更改。

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

此致 穆拉利

2 个答案:

答案 0 :(得分:0)

您提出了多个问题,因此答案的结构相应:

要使用VBA创建MS Access Table,请参阅以下示例代码段:

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 DoCmd.RunSQL对象上使用Execute()函数代替Database,如下所示:

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

希望这可能会有所帮助。

答案 1 :(得分:0)

考虑迭代循环遍历记录集中的项目/视图名称查询,并创建传递查询,然后导出到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

<强>资源