Kombinieren von Feldern einer Tabelle zu einem Feld einer anderen Tabelle in Access

Kombinieren von Feldern einer Tabelle zu einem Feld einer anderen Tabelle in Access

Ich versuche, mehrere Felder aus einer Tabelle zu kombinieren, die eine Benutzer-ID und 10 horizontal angeordnete Datenspalten enthält, die in zwei vertikalen Feldern angezeigt werden sollen, wobei ein Feld der Benutzer-ID und ein anderes den 10 vertikalen Feldern entspricht. In der zweiten Tabelle würde der Benutzername so oft wiederholt, wie Eingaben in den 10 horizontalen Feldern der Originaltabelle vorhanden sind.

Mein Beispiel ist im Wesentlichen:

MainT
`````
User ID
otherfields
Invoice1
:
Invoice10

Möchte in eine neue Tabelle einfügen:

InvoicesT
`````````
User ID
Invoices

Ich muss wissen, wie ich die Daten von MainT bekomme:

User    |   Othr Fld    |   Invoice1    |   Invoice2    |   Invoice3
--------+---------------+---------------+---------------+-------------
1       |   JF          |   Paid        |   Past Due    |  Civil Court
2       |   JN          |   Paid        |   Paid        |  Past Due
3       |   MO          |   Past Due    |   Paid        |  Paid

um sie in der von mir beschriebenen Weise in RechnungenT einzufügen.

User    |   Invoice
--------+--------------
1       |   Paid
1       |   Past Due 
1       |   Civil Court
2       |   Paid
2       |   Past Due

usw.

Antwort1

Ich kann mich nicht erinnern, eine einfache Abfrage gehabt zu haben, mit der ich die Daten so transformieren könnte, wie Sie es möchten. Das Erste, was mir in den Sinn kam, war eine Kreuztabellenabfrage, aber das ist mit der vorhandenen Datenstruktur nicht möglich. Ich möchte Ihnen eine VBA-Lösung anbieten, da ich der Meinung bin, dass Sie mit der Neugestaltung Ihrer Tabellendaten auf dem richtigen Weg sind.

Damit diese Lösung funktioniert, erstellen Sie zuerst die zweite Tabelle InvoicesTmit den folgenden Feldern.

InvoicesT
`````````
Field Name          |   Data Type
--------------------+------------------
invoiceID           |   Autonumber 
UserID              |   Number
InvoiceCategory     |   Text

Als nächstes kopieren Sie das folgende Sub in ein Standardmodul.

Public Sub transferData()
    Dim oldTbl As DAO.Recordset, newTbl As DAO.Recordset
    Dim dbObj As DAO.Database
    Dim fCtr As Integer

    Set dbObj = CurrentDB()

    'Open the MainT table to read the information.
    Set oldTbl = dbObj.OpenRecordSet("SELECT [User ID], Invoice1, Invoice2, Invoice3, Invoice4, " & _
                                     "Invoice5, Invoice6, Invoice7, Invoice8, Invoice9, Invoice10 FROM MainT")

    'Open the InvoicesT to write new information into.
    Set newTbl = dbObj.OpenRecordSet("InvoicesT")

    'Loop through the list of all entries in MainT
    Do While Not oldTbl.EOF
        'This will loop through the fields to create one entry for each field.
        'You can change the number 10 to any number depending on the Invoice fields in the table. 
        For fCtr = 1 To 10
            'I have put an IF condition to make sure there are not many empty records for a UserID
            'If the Invoice(n) is not available for a particular user, then it does not create an entry. 
            If Len(oldTbl.Fields("Invoice" & fCtr) & vbNullString) > 0 Then
                With newTbl
                    .AddNew
                    .Fields("UserID") = oldTbl.Fields(0)
                    .Fields("InvoiceCategory") = oldTbl.Fields("Invoice" & fCtr)
                    .Update
                End With
            End If
        Next
        'Go to the next record when one user is done with
        oldTbl.MoveNext
    Loop

    'Clean up
    Set newTbl = Nothing
    Set oldTbl = Nothing
    Set dbObj = Nothing
End Sub

Nachdem Sie das Modul nun unter einem Namen wie gespeichert mod_TransferTablesund kompiliert haben, gehen Sie zu Ihrem Direktfenster (STRG + G). Geben Sie dann einfach ein transferDataund drücken Sie ENTER. Dies kann je nach Anzahl der Datensätze in der MainTTabelle eine Weile dauern. Sobald dies abgeschlossen ist, sollten Sie alle Daten in der neuen Tabelle haben.

Hoffe das hilft !

verwandte Informationen