Welcome to Community Week 2025! Join us to learn, connect, and be recognized as we celebrate the spirit of Community and the power of AI. Get the details  

chooseWindow question

hpesata
Kilo Expert

Hi!

 

I am calling a Calgary Scripted Webservice via an C# SOAP client to query several tables of our SN instance.

Because of the size of the tables I splitted the SOAP-calls by using chooseWindow() within the webservice.

the code in the webservice looks somehow like this, the new "window-begin" is a parameter used by the SOAP-client in my specific case:

 

var sysids = [];

var begin = 0;

var windowsize = 1000;

var done = false;

 

while(!done) {

  var gr = new GlideRecord('label_history');

  gr.orderBy('sys_id');

  gr.chooseWindow(begin, begin+windowsize);

  gr.query();

  if(gr.next()) {

      while(gr.next()) {

          sysids.push(gr.sys_id.toString());

      }

      begin += windowsize;

  } else {

      done = true;

  }

}

 

my result-rows are packed into JSON structures and returned to the client.

 

I realized, that sometimes I am receiving duplicate rows between the chooseWindow calls (usually the last row of the previous call is transferred again as first row of the new call) and I am wondering how this can happen ?

 

Maybe this happens beacuse of the insertion of new rows between the SOAP calls ?

 

Any suggestions would be greatly appreciated!

 

Thanx in advance,

Hans

2 REPLIES 2

Ravish Shetty
Tera Guru

This questions was asked 2 months back, so did you get any solution?


If not then i am getting a feeling that "if(gr.next()) {" is the culprit, check the modification at line 12.


Please check if this works.



var sysids = [];


var begin = 0;


var windowsize = 1000;


var done = false;




while (!done) {


      var gr = new GlideRecord('label_history');


      gr.orderBy('sys_id');


      gr.chooseWindow(begin, begin + windowsize);


      gr.query();


      if (gr.getRowCount() > 0) {


              while (gr.next()) {


                      sysids.push(gr.sys_id.toString());


              }


              begin += windowsize;


      } else {


              done = true;


      }


}



P.S: "getRowCount" is not advisable if we consider its performance.


Hi!



I think the problem is, that if You query the data of a big table with this approach (incident), it takes pretty long and


in between two window queries, new records get inserted, possibly within the new window and therefore the same sys_id is encountered again. maybe using the created-timestamp for the orderBy() clause would be a better approach.



regards,


Hans