Estou tentando combinar vários campos de uma tabela que possui ID do usuário e 10 colunas de dados organizadas horizontalmente para serem exibidas em dois campos verticalmente tendo um campo correspondente ao ID do usuário e outro correspondente aos 10 campos verticais. Na segunda tabela, o nome do usuário seria repetido pelo número de vezes que houver entradas nos 10 campos horizontais da tabela original.
Meu exemplo é basicamente:
MainT
`````
User ID
otherfields
Invoice1
:
Invoice10
Querendo colocar em nova tabela:
InvoicesT
`````````
User ID
Invoices
Preciso saber como pegar os dados do 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
preencher em InvoicesT da maneira que prescrevi.
User | Invoice
--------+--------------
1 | Paid
1 | Past Due
1 | Civil Court
2 | Paid
2 | Past Due
etc.
Responder1
Não me lembro de ter uma consulta simples que possa transformar os dados da maneira que você deseja. A primeira coisa que me veio à mente foi uma consulta cruzada, porém isso não é algo que você possa fazer usando a estrutura de dados que possui. Gostaria de lhe dar uma solução VBA, pois sinto que você está no caminho certo ao redesenhar os dados da sua tabela.
Para que esta solução funcione, primeiro crie a segunda tabela InvoicesT
, com os seguintes campos.
InvoicesT
`````````
Field Name | Data Type
--------------------+------------------
invoiceID | Autonumber
UserID | Number
InvoiceCategory | Text
Em seguida, você copia o seguinte Sub em um Módulo Padrão.
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
Agora, depois de salvar o Módulo com um nome como mod_TransferTables
e compilá-lo. Vá para a sua janela imediata (CTRL + G). Em seguida, basta digitar transferData
e clicar ENTER
, pode demorar um pouco com base no número de registros na MainT
tabela. Assim que isso estiver concluído. Você deve ter todos os dados na nova tabela.
Espero que isto ajude !