You have the base of the query in the code above. This should give you a count 1 to n for each location. This becomes the sub query that you select the records from. Example below:
SELECT [Location] ,[Item No_] ,TotalQuantity
FROM
(
SELECT
[Location]
,[Item No_]
,sum(-[Quantity]) AS TotalQuantity
,ROW_NUMBER()
OVER (PARTITION BY [Location Code]
ORDER BY sum(-[Quantity]) DESC) AS RN
FROM
[Ledger Entry]
LEFT JOIN [Item] i
ON [Ledger Entry].[Item Number] = i.No_
WHERE
[Date] BETWEEN @StartDate and @EndDate
GROUP BY
[Location Code]
,[Item No_]
) AS SubQuery
WHERE RN <= 20
Passing this limited result set to SSRS will give you only the top 20 items per location. Its generally better for performance to limit and filter in the Data Query rather than in SSRS.