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_TransferTables
y lo haya compilado. Vaya a su ventana inmediata (CTRL + G). Luego simplemente escriba transferData
y presione ENTER
; puede tardar un poco según la cantidad de registros en la MainT
tabla. Una vez que esto esté completo. Deberías tener todos los datos en la nueva tabla.
Espero que esto ayude !