Page 1 of 1

foundset.forEach() Continue Statement not Supported?

PostPosted: Tue Apr 17, 2018 7:06 pm
by kwpsd
Version: 8.2.3.3109

It appears that the Foundset Iterator loop structure does not support the continue statement to force advancement to the next record. When I attempt to use it, I get the following marker message:

The property continue is undefined for the type JSFoundset


So, how do you skip processing a record in the foundset.forEach() loop?

e.g. Say a record fails a validation test and you want to go to the next record:

Code: Select all
foundset.forEach(
            /**
             * @param {JSRecord} record
             * @param recordIndex
             * @param {JSFoundset} fs
             */
            function(record, recordIndex, fs)
            {
                if ( !validate( record ) foundset.continue

                ...
            }
        );



Thank you.

Re: foundset.forEach() Continue Statement not Supported?

PostPosted: Wed Apr 18, 2018 12:19 pm
by Manolo_Etec
I solve this with a 'throw'

Code: Select all
         
try {
   foundset.forEach(
   /**
    * @param {JSRecord<db:/modulo/pro>} _rc
    * @param {Number} _index
    * @param {JSFoundSet<db:/modulo/prov>} _fs
    */
    function(_rc, _index, _fs){
       try {

          if ( !validate( record ))    throw "stop";
       } catch (e) {
          if(e != "stop"){
               application.output('HC_relProvListPrec_articulos ERROR: '+e,LOGGINGLEVEL.ERROR);
               throw e;
            }
       }
      
    });
} catch (e) {
   if(e != "stop"){
      application.output('HC_relProvListPrec_articulos ERROR: '+e,LOGGINGLEVEL.ERROR);
      throw e;
   }
}

Re: foundset.forEach() Continue Statement not Supported?

PostPosted: Wed Apr 18, 2018 7:56 pm
by kwpsd
That's interesting...I would have never thought to use the error mechanism as a continue statement! I was hoping for a 'cleaner' solution but will give your method a try.

Thank you, Manuel.

Re: foundset.forEach() Continue Statement not Supported?

PostPosted: Thu Apr 19, 2018 11:18 am
by Ruben79
Since you are just running a function for each record, you can also just do a return:

Code: Select all
foundset.forEach(
            /**
             * @param {JSRecord} record
             * @param recordIndex
             * @param {JSFoundset} fs
             */
            function(record, recordIndex, fs)
            {
                if ( !validate( record ) return;

                ...
            }
        );

Re: foundset.forEach() Continue Statement not Supported?

PostPosted: Fri Apr 20, 2018 9:57 am
by Manolo_Etec
Sorry, I misunderstood you, I thought you wanted to break the foreach. As it says Ruben, with the 'return' you go straight to the next record.

Re: foundset.forEach() Continue Statement not Supported?

PostPosted: Sat Apr 21, 2018 11:07 pm
by kwpsd
Forest through the trees! I was thinking in terms of a loop structure as opposed to a function call. The return is obvious, once you brought it to my attention.

Thank you both for responding!

Re: foundset.forEach() Continue Statement not Supported?

PostPosted: Tue May 01, 2018 4:44 pm
by jcompagner
I think when you return something

like "return false"

then it will stop right away, for example if you would do something like

var recordFound = foundset.forEach(function(record){
if (record.xxx = "yes") return record;
});

then at the moment it hits a a record where "xxx" is "yes" it will stop and return that record.