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