Combinar campos de una tabla en un campo de otra tabla en Access

Combinar campos de una tabla en un campo de otra tabla en Access

Estoy tratando de combinar varios campos de una tabla que tiene una identificación de usuario y 10 columnas de datos dispuestas horizontalmente para mostrarse en dos campos verticalmente, teniendo un campo correspondiente a la identificación de usuario y otro correspondiente a los 10 campos verticales. En la segunda tabla, el nombre de usuario se repetiría tantas veces como haya entradas en los 10 campos horizontales de la tabla original.

Mi ejemplo es básicamente:

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

Queriendo poner en una nueva mesa:

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

Necesito saber cómo obtener los datos de MainT:

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

para completar en FacturasT de la manera que he prescrito.

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

etc.

Respuesta1

No recuerdo haber tenido una consulta simple que pueda transformar los datos como usted desea. Lo primero que me vino a la mente fue una consulta cruzada; sin embargo, esto no es algo que pueda hacer utilizando la estructura de datos que tiene. Me gustaría brindarle una solución VBA, ya que creo que va por el camino correcto al rediseñar los datos de su tabla.

Para que esta solución funcione, primero cree la segunda tabla InvoicesT, con los siguientes campos.

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

A continuación, copia el siguiente Sub en un módulo estándar.

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

Ahora, una vez que haya guardado el módulo con un nombre como mod_TransferTablesy lo haya compilado. Vaya a su ventana inmediata (CTRL + G). Luego simplemente escriba transferDatay presione ENTER; puede tardar un poco según la cantidad de registros en la MainTtabla. Una vez que esto esté completo. Deberías tener todos los datos en la nueva tabla.

Espero que esto ayude !

información relacionada