In MS Excel, go to Data โ New query โ From Other Sources โ Blank Query
This will open the Power Query Editor.
Click Advanced Editor and paste the code below. Replace <Service link>/<Entity Name> with your Test or Production service links and Entity name. Also, replace columnA, columnB, etc., with the column names in your Entity. When prompted for Credentials, select Basic Authentication and enter your OutSystems username and password for the service link.
This will paginate in blocks of 1000, retrieve all the records in the Entity and add it to your Excel model. Click Close and Load. This will close the Power Query Editor and load the query into the Excel Worksheet.
letย ย BaseUrl ย ย ย ย = "<Service link>/<Entity Name>", ย RecordsPerPage = 1000, ย ย ย GetJson = (Url) => ย ย ย ย let Options = [ ย ย ย Headers = [ #"accept" = "application/json"] ย ย ย ], ย ย ย ย ย ย RawData = Web.Contents(Url, Options), ย ย ย ย ย ย Json ย ย = Json.Document(RawData) ย ย ย ย in ย Json, GetTextData = (Url) => let Options = [ ย ย ย Headers = [ #"accept" = "application/json"] ย ย ย ], ย ย ย ย ย ย RawData = Web.Contents(Url, Options), ย ย ย ย ย ย TextData = Text.FromBinary(RawData) ย ย ย in ย TextData,ย ย GetRecordCount = () => ย ย ย let Url ย = BaseUrl & "/$count", ย ย ย ย ย TextData = GetTextData(Url), ย ย ย ย ย Count = Number.FromText(TextData) ย ย ย ย in ย Count, ย ย ย GetPage = (Index) => ย ย ย let Skip ย = "?$skip=" & Text.From(Index * RecordsPerPage), ย ย ย ย ย Top ย = "$top=" & Text.From(RecordsPerPage), ย ย ย ย ย Url ย = BaseUrl & Skip & Top, ย ย ย ย ย ย Json ย = GetJson(Url), ย ย ย ย ย ย Value = Json[#"value"] ย ย ย ย in ย Value, ย ย RecordCount = List.Max({ RecordsPerPage, GetRecordCount() }), ย PageCount ย = Number.RoundUp(RecordCount / RecordsPerPage), ย ย PageIndices = { 0 .. PageCount - 1 }, ย ย Pages ย ย ย = List.Transform(PageIndices, each GetPage(_)), ย Records ย ย = List.Union(Pages), ย Table ย ย ย = Table.FromList(Records, Splitter.SplitByNothing(), null, null, ExtraValues.Error), ย ย #"Expanded Column1" = Table.ExpandRecordColumn(Table, "Column1", {"columnA", "columnB", "columnC"}) in ย ย #"Expanded Column1"
We recommend you assess the implementation of an incremental load approach for these big tables, and you can achieve this by using 1 of 2 ways I list below. You can even combine both for optimal result:
-
Delta sync – filtering by date range, to sync only records created or updated after the last sync.
This article has detailed instructions on how to it.
-
Pagination – If applying the approach above, your result set is still bigger than the restriction, you can split it in smaller chunks and use pagination.
Here is another article you might find useful.
Optionally, we can increase the limit, in case you don’t see the need for the approaches above. From R2.3+ there’s a feature that allows you to customize this limit at a project level.