访问拆分列数据w分号到规范化表结构

时间:2017-03-13 14:50:40

标签: vba ms-access split normalize

我有一张表,它是从一些XML数据中提取的。我试图做一个交叉引用,所以我可以列出一个组织数据的计划。这1个表有一个变量列表。不同数据类型,计算以及对话框的字段。其中一列有选项。如果变量的数据类型是对话框,则其选项有一个变量列表,用分号分隔。

所以主表的结构如下:

XML Table Image

对于对话框记录,我需要查看其选项列并将记录插入到规范化表中。对于每个字段,在该列中,我想添加一个带有该对话框名称的记录,以及该表中行的ID(我向表中添加了一个PK)。例如,在对话框记录Options列中,有一个名为BusinessName TE的字段。我需要在这个主表中搜索具有相同变量名称的行的PK ID。我需要将该记录的ID与对话框的名称放在一起,然后将它们插入到我设置的新表中。这将为我创建一个交叉引用,因此我可以知道哪些对话框正在使用哪些变量。

我感谢任何人都能给予的帮助。我看到有关使用拆分函数,数组和循环来获取每个值的内容,但我找到的示例是字符串,而不是表中的列。

谢谢!

编辑:添加我正在使用的VBA代码。我将它附加到表单上的按钮,这样我就可以点击它来运行它。

Private Sub RunParse_Click()
Dim db As DAO.Database
Dim rs As Recordset
Set db = CurrentDb()
Dim sqlStr, insertSQL, arrayVal As String
Dim TestArray As Variant
Dim Options As String
Dim Dialog As String
Dim FieldName As Long
Dim i As Integer

sqlStr = "SELECT [MASTER Fields].Options,[MASTER Fields].[Variable Name]  FROM [MASTER Fields] WHERE ((([MASTER Fields].[Variable Type])='dialog'));"

Set rs = db.OpenRecordset(sqlStr)
rs.MoveLast
rs.MoveFirst

Do While Not rs.EOF
    Options = rs.Fields(0)
    Dialog = rs.Fields(1)
    If InStr(Options, ";") Then
        TestArray = Split(Options, ";")

        For i = 0 To UBound(TestArray) - LBound(TestArray) + 1
            If TestArray(i) <> "" Then

                arrayVal = TestArray(i)

                FieldName = DLookup("ID", "MASTER Fields", "[Variable Name] = " & "'" & arrayVal & "'")

                insertSQL = "INSERT INTO FieldTemplatesUse(FID, TemplateAK) " _
                & "VALUES(""" & FieldName & """, """ & Dialog & """)"
                DoCmd.RunSQL (insertSQL)

            End If
        Next i
    End If
    rs.MoveNext
Loop


End Sub

现在就在说

If TestArray(i) <> "" Then

创建错误&#34;&#34;

如果有人可以提供帮助,我真的很感激!

另一个编辑:

Parfait发现了我的问题。我发布了我正在使用的最终代码,以防它帮助其他人!附:我添加了一个条件来检查dlookup是否成功,并在故障表中捕获故障。这样我就可以检查出来了。

Private Sub RunParse_Click()
Dim db As DAO.Database
Dim rs As Recordset
Set db = CurrentDb()
Dim sqlStr, insertSQL, arrayVal As String
Dim TestArray As Variant
Dim Options As String
Dim Dialog As String
Dim FieldName As Long
Dim i As Integer

sqlStr = "SELECT [Master Fields].Options,[Master Fields].[Variable Name]  FROM [Master Fields] WHERE ((([Master Fields].[Variable Type])='dialog'));"

Set rs = db.OpenRecordset(sqlStr)
rs.MoveLast
rs.MoveFirst

Do While Not rs.EOF
    Options = rs.Fields(0)
    Dialog = rs.Fields(1)
    If InStr(Options, ";") Then
        TestArray = Split(Options, ";")

        For i = 0 To UBound(TestArray) - LBound(TestArray)
            If TestArray(i) <> "" Then

                arrayVal = TestArray(i)
                If Not (IsNull(DLookup("ID", "Master Fields", "[Variable Name] = " & "'" & arrayVal & "'"))) Then

                    FieldName = DLookup("ID", "Master Fields", "[Variable Name] = " & "'" & arrayVal & "'")

                    insertSQL = "INSERT INTO FieldTemplatesUse(FID, TemplateAK) " _
                    & "VALUES(""" & FieldName & """, """ & Dialog & """)"
                    DoCmd.RunSQL (insertSQL)
                    'MsgBox "Adding ID = " & FieldName & "for Dialog: " & Dialog & "Now"
                Else
                     insertSQL = "INSERT INTO tblFieldsNotFound(Dialog, FieldNotFound) " _
                    & "VALUES(""" & Dialog & """, """ & arrayVal & """)"
                    DoCmd.RunSQL (insertSQL)

                End If
            End If
        Next i
    End If
    rs.MoveNext
Loop

MsgBox "All Done!"


End Sub

0 个答案:

没有答案