|gflewis on VB Script|
|Praveen on VB Script|
|Gil Sabado on SNDML version 2.6.5|
|servicenow online tr… on SnowMirror|
|gflewis on VB Script|
Integration using Web Services
Someone help me out here. Did I miss something or am I just stupid?
On the wiki page Retrieving A Large Number Of Records From ServiceNow it says
ServiceNow has imposed a hard-limit of 250 records that can be retrieved at any time in a single query.
The wiki page was created in July 2009. The “Winter 2009 Stable 2” Release Notes mention the following new “feature”
ServiceNow seemed to be pretty serious about the 250 record limitation. However, in September 2012 a new property — glide.remote_glide_record.max_count — appeared on the Available System Properties wiki page with notes about controlling the “records returned when using a Perl API gliderecord query.” On the Direct Web Services wiki page there is an example of Perl code using windowing, with the following comment:
Using a windowed query mechanisms overcomes the default limitation of only getting a maximum of 250 records per query.
“Default” implies that the limitation can be overridden. I assumed that the purpose of the system property was to override the default.
This is, in fact, the behavior or the property. It raises the “hard-limit”. If you set the property, it will increase the number of records returned by the getRecords SOAP method. It is not Perl specific. It works for any language. I assumed that setting the property was the only way to get more than 250 record in a single SOAP call. There is a __limit extended query parameter documented; but I assumed that this parameter was for retrieving fewer records, and that it did not allow you to bypass the “hard-limit”.
The “hard-limit” is not a hard-limit at all! It is a soft-limit. It turns out that there is an easy way to get more than 250 records, and it does not require changing a system property. All you need to do is ask! By simply passing in the __limit parameter, you can override the “hard-limit”.
To test this theory, I modified the Visual Basic example from my previous post. This code now returns a list of all the users in single Web Services call.
Dim objGetUsers : Set objGetUsers = New ServiceNowDirectWS objGetUsers.SetMethod "sys_user", "getRecords" objGetUsers.SetValue "__limit", "2000" If objGetUsers.Post Then Dim nRows : nRows = objGetUsers.GetRowCount Dim i : For i = 1 To nRows WScript.Echo i & ": " & objGetUsers.GetRowValue(i, "user_name") & _ ": " & objGetUsers.GetRowValue(i, "name") Next Else WScript.Echo "Error: " & objGetUsers.Status WScript.Echo objGetUsers.StatusText End If
Obviously we do not want to get carried away. It is fine to bump up the limit if you are trying to retrieve a list of your 1500 users. To retrieve your list of 150,000 servers, you are still strongly advised to use windowing.
The thing I am still trying to figure out is: Has it always worked this way? Was the hard-limit really a hard-limit in the beginning, and then it was reduced to a soft-limit? Or was it always a soft-limit, and the wiki page simply written to discourage developers from bypassing the limit. Please leave a comment if you know the answer.