Gustav Brock
Gustav at cactus.dk
Wed May 27 10:41:45 CDT 2009
Hi Andy
No, this is not a crosstab but a query that concatenates a value from several rows per some key.
The general method is to use a subquery and some code to concatenate but that is very slow for a large recordset. Using a temp table is very good and will run _much_ faster than any other method. The reason is that the source table is read once only, and the target table is opened once only and DAO is way fast at adding records.
In this example the key is Company + Location + Department. At you it could be Order + Materials. Of course, adjust the other field and table names too.
Note the comment on Text/Memo field.
<snip>
The trick is this:
' Select an ordered list of Company, Location, Department.
First, create a table (tblEmployeesList) with identical field structure as the master (here called tblEmployees).
If the list of employees can be very long, change the field type for Employees from Text to Memo.
Then run the code below, and the requested list will be filled into tblEmplyeesList.
Finally use tblEmployeesList as your source for a report or whatever.
<code>
Public Sub EmployeesConcatenate()
Dim dbs As DAO.Database
Dim rstRead As DAO.Recordset
Dim rstList As DAO.Recordset
Dim strKey As String
Dim strKeyLast As String
Set dbs = CurrentDb
' Clean tblEmployeesList.
dbs.Execute "Delete * From tblEmployeesList"
' Select an ordered list of Company, Location, Department.
Set rstRead = dbs.OpenRecordset("Select * From tblEmployees Order By Company, Location, Department")
Set rstList = dbs.OpenRecordset("Select * From tblEmployeesList")
With rstRead
' Loop through the records.
While .EOF = False
strKey = !Company.Value & !Location.Value & !Department.Value
If strKey <> strKeyLast Then
' New Company/Location/Department.
' Create new record.
rstList.AddNew
rstList!Company.Value = !Company.Value
rstList!Location.Value = !Location.Value
rstList!Department.Value = !Department.Value
rstList!Employees.Value = !Employees.Value
Else
' Same Company/Location/Department as previous record.
' Append separator and expand list of employees.
rstList.MoveLast
rstList.Edit
rstList!Employees.Value = rstList!Employees.Value & ", " & !Employees.Value
End If
' Save the record.
rstList.Update
' Store the key to compare for the next record.
strKeyLast = strKey
.MoveNext
Wend
.Close
End With
rstList.Close
Set rstList = Nothing
Set rstRead = Nothing
Set dbs = Nothing
End Sub
</code>
</snip>
/gustav
>>> andy at minstersystems.co.uk 27-05-2009 18:16 >>>
Hi folks
This should be simple but I can't see it.
Have a query which gives a list of raw materials and suppliers, ie
Mat1 SuppA
Mat1 SuppB
Mat1 SuppC
Mat2 SuppA
Mat2 SuppD
and so on
What I want is a query result for extract to Excel which transposes the
suppliers into columns giving a single row per material. Thus:
Mat1 SuppA SuppB SuppC
Mat2 SuppA SuppD
Mat3 SupZZ
etc
We must have had this a zillion times but I can't get it to go.
Heeeeeeeeeeeellppppp!
--
Andy
________________________________________________
Message sent using UebiMiau 2.7.2
--
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com