I think Ajax meant 'recordsource' instead of 'rowsource'.
Getting the sizes and quantities to line up with the ConcatRelated function can be done. Have to decide how many spaces to set fixed column widths. I used 10.
Query calling the function:
Code:
SELECT Products.ProductName, Products.ProductNumber, ConcatRelated("String(10-Len([Size]),' ') & [Size]","Products","ProductNumber='" & [ProductNumber] & "'","Size"," /") AS Sizes, ConcatRelated("String(10-Len([Stock]),' ') & [Stock]","Products","ProductNumber='" & [ProductNumber] & "'","SIze"," /") AS Stocks
FROM Products
GROUP BY Products.ProductName, Products.ProductNumber, ConcatRelated("String(10-Len([Size]),' ') & [Size]","Products","ProductNumber='" & [ProductNumber] & "'","Size"," /"), ConcatRelated("String(10-Len([Stock]),' ') & [Stock]","Products","ProductNumber='" & [ProductNumber] & "'","SIze"," /");
Be aware query can perform slowly with large dataset.
Building a stable report based on CROSSTAB query is tricky. Another tutorial from Allen: http://allenbrowne.com/ser-67.html#ColHead
In ConcatRelated query, Location would be another field for grouping. It would have to be in the SELECT and GROUP BY as well as in the function WHERE argument. In CROSSTAB, Location would be another row heading.