Iterating and Updating a search result

Hi,

We have noticed that when we try to iterate and update a search result (as given in below sample code), updated records gets omitted from the original foundset. But this is only when the result consists of more than 200 records.

Example code is as follows (We have used the sample database “example” and loaded the table employees with 500 records to do this test):

function onActionMethod()
{
	databaseManager.setAutoSave(false);
	
	var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees');
	
	if(_fsEmp.find()){
		_fsEmp.country = 'USA'
		_fsEmp.search()	// When the result of this search is less than 200 records, this program works fine. But when it exceeds 200, it fails.
	}
	
	application.output("Size before Loop :"+databaseManager.getFoundSetCount(_fsEmp))
	
	for(var i = 1; i <= _fsEmp.getSize(); i++){
		_fsEmp.setSelectedIndex(i);
		application.output("Processing index : "+i+", empId : "+_fsEmp.employeeid)
		application.output("Foundset Size : "+databaseManager.getFoundSetCount(_fsEmp))
		application.output("get Size : "+_fsEmp.getSize())
		_fsEmp.country = 'SL'
		databaseManager.saveData();
		
	}
}

This has impacted our solution immensely, hence any help to solve this bug soon is greatly appreciated.

Servoy Version Used: Version: 4.1.3 - build 672

Thank you.

_fsEmp.getSize() will only give you the loaded records, and since Servoy loads records by batch of 200, you iteration stops there.

To retrieve the real number of records, you need to use databaseManager.getFoundsetCount(_fsEmp),so your loop should really be:

var max = databaseManager.getFoundsetCount(_fsEmp); // retrieve the count once because it is an expensive operation (says Servoy's built-in help)
for(var i = 1; i <= max; i++){
    //...
}

And you could probably use a JSFoundSetUpdater.
Although I’m not clear in terms of performances if it is a preferred approach… maybe Servoyans could answer on that?

Hi Nimeshe,

Like Patrick already stated using the getSize() function will only give you back the already loaded PK’s.
Also when you do a search() then you get the found count back so no need to retrieve the foundsetcount again.
There is also another bottleneck in your code and that is the controller.setSelectedIndex(). This will update the GUI each time you set this so this is very expensive.
Since you just want to update a column in the foundset you can do 2 things.

  1. iterate the foundset using foundset.getRecord(index)
  2. use a foundsetUpdater (like Patrick already suggested)

Also I think you want to put the loop inside the IF statement so when the find fails you are not updating the wrong foundset.

So your code will look like this:

function onActionMethod()
{
   databaseManager.setAutoSave(false);
   
   var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'),
         _rc;
   
   if(_fsEmp.find()){
      _fsEmp.country = 'USA';
      var _nRecCount = _fsEmp.search(); // returns the found count
   
      for(var i = 1; i <= _nRecCount; i++){
         _rc = _fsEmp.getRecord(i);
         _rc.country = 'SL';
         databaseManager.saveData();
      }
   }
}
function onActionMethod()
{
   databaseManager.setAutoSave(false);
   
   var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'),
         _fsUpdater;
   
   if(_fsEmp.find()){
      _fsEmp.country = 'USA';
      var _nRecCount = _fsEmp.search();

      if ( _nRecCount > 0 ) {   
         _fsUpdater = databaseManager.getFoundSetUpdater(_fsEmp);
         _fsUpdater.setColumn('country','SL');
         if ( !_fsUpdater.performUpdate() ) {
            // update was not successfull !
         }
         databaseManager.saveData(); // not sure if this is needed with a foundsetUpdater
      }
   }
}

Hope this helps.

Robert, you are the best!

I do like the precision of your answers! It just goes to show how much the experience of the platform makes all the difference.
Just hope that some good soul will gather all these useful tips and tricks and code snippets scattered all over the forum and make some good documentation out of it…

Anyone?

ptalbot:
_fsEmp.getSize() will only give you the loaded records, and since Servoy loads records by batch of 200, you iteration stops there.

This is not true!

fsEmp.getSize() within the for loop does not stop at 200 (we use this all over the place, and if it stops at 200 records, we had a huge problem! ;-) )
I looked at his code, and this should work!

So, beside the nice (and better) examples, this does not answer his problem, right? :)

Hmm…I think what happens is this:

You do a search on country and then start changing the country column in your foundset.
When you hit record 200 Servoy actually re-queries (with the criteria!) to fetch the next 200 and since you changed the data those changed records won’t show up again.
So I guess you can do 2 things (again :) )

  1. make sure all PK’s are loaded in the foundset so that no re-querying is done
  2. start looping at record 1 again after you hit record 200

So your code would look like this:

function onActionMethod()
{
   databaseManager.setAutoSave(false);
   
   var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'),
         _rc;
   
   if(_fsEmp.find()){
      _fsEmp.country = 'USA';
      var _nRecCount = _fsEmp.search(); // returns the found count
   
      // touch the last record so all PK's are loaded
      // WARNING: this can be VERY expensive when you have a LARGE foundset
      _rc = _fsEmp.getRecord(_nRecCount);

      for(var i = 1; i <= _nRecCount; i++){
         _rc = _fsEmp.getRecord(i);
         _rc.country = 'SL';
         databaseManager.saveData();
      }
   }
}
function onActionMethod()
{
   databaseManager.setAutoSave(false);
   
   var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'),
         _rc;
   
   if(_fsEmp.find()){
      _fsEmp.country = 'USA';
      var _nRecCount = _fsEmp.search(); // returns the found count
   
      for(var i = 1; i <= _fsEmp.getSize(); i++){
         _rc = _fsEmp.getRecord(i);
         _rc.country = 'SL';
         databaseManager.saveData();
         if ( i == 200 ) {
            i = 1;
         }
      }
   }
}

Although I think this last example might be error-prone.

Come to think of it when you use the FoundSetUpdater you don’t have any of these issues.

Hope this helps.

Harjo:
fsEmp.getSize() within the for loop does not stop at 200 (we use this all over the place, and if it stops at 200 records, we had a huge problem! ;-) )

Harjo, you live on the edge! ;-)

That’s true, once the foundset reaches the 200th record, it will load the others, but as Robert says in this case since the records are updated, the next 200 records might not be what you expected.

So FoundSetUpdate seems the best option to me.

When you hit record 200 Servoy actually re-queries

This is actually a very tricky thing. We have had a similar problem the other day. We loaded a foundset by a query and then iterated over it and changed one of the query’s criteria (that was the problematic point). Once you hit the fetch size limit (200), the query is fired again. Of course, now some of the original records did not meet the criteria anymore. We solved that by loading a dataset. That is not so efficient, so I try to prevent it. But in this case it was the only reliable thing to do, because the dataset will not change and Servoy loads the primary keys of the dataset, something that will not change.

Hi All,

Thanks a lot for all the replies. But the point is,

_fsEmp.getSize() will only give you the loaded records, and since Servoy loads records by batch of 200, you iteration stops there.

is not true. The loop continues and processes all records. The only issue is if we update records during the iteration. We had already tried using databaseManager.getFoundsetCount(_fsEmp) as well instead of ```
_fsEmp.getSize()


If I recall correctly the sample code I've originally posted functioned accurately in previous servoy versions (We have used it in quite a number of places in live customer environment). We can consider other methods like executing a raw sql and loading the foundset with a dataset. I was just wondering if this is a bug in the new version. As we have to change several places in our code to overcome this issue.

Thanks for any help on this.

Cheers.

Hi All,

Although I greatly appreciate everyone’s response to my query, I feel that most of the “solutions” provided are not really tested. As I’ve mentioned in my earlier post, I cannot use the foundsetUpdator in this instance as I need to analyze and process each record and updation of the record is just an additional activity I do.

The test results for various solutions given by many are as follows:
Solution 1:

function onActionMethod()
{
	
	databaseManager.setAutoSave(false);
   
   	var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'), _rc;
   
   	if(_fsEmp.find()){
      	_fsEmp.country = 'USA';
      	var _nRecCount = _fsEmp.search(); // returns the found count
   
      	for(var i = 1; i <= _nRecCount; i++){
         	_rc = _fsEmp.getRecord(i);
         	application.output("Processing index : "+i+", empId : "+_rc.employeeid)
         	_rc.country = 'SL';
         	databaseManager.saveData();
      	}
   	}

}

Result 1 (Processing stops at 200th record):

Processing index : 1, empId : 1
Processing index : 2, empId : 2
Processing index : 3, empId : 3
Processing index : 4, empId : 4
Processing index : 5, empId : 5
Processing index : 6, empId : 6
Processing index : 7, empId : 7
Processing index : 8, empId : 8
Processing index : 9, empId : 9
Processing index : 10, empId : 10
Processing index : 11, empId : 11
Processing index : 12, empId : 12
Processing index : 13, empId : 13
Processing index : 14, empId : 14
Processing index : 15, empId : 15
Processing index : 16, empId : 16
Processing index : 17, empId : 17
Processing index : 18, empId : 18
Processing index : 19, empId : 19
Processing index : 20, empId : 20
Processing index : 21, empId : 21
Processing index : 22, empId : 22
Processing index : 23, empId : 23
Processing index : 24, empId : 24
Processing index : 25, empId : 25
Processing index : 26, empId : 26
Processing index : 27, empId : 27
Processing index : 28, empId : 28
Processing index : 29, empId : 29
Processing index : 30, empId : 30
Processing index : 31, empId : 31
Processing index : 32, empId : 32
Processing index : 33, empId : 33
Processing index : 34, empId : 34
Processing index : 35, empId : 35
Processing index : 36, empId : 36
Processing index : 37, empId : 37
Processing index : 38, empId : 38
Processing index : 39, empId : 39
Processing index : 40, empId : 40
Processing index : 41, empId : 41
Processing index : 42, empId : 42
Processing index : 43, empId : 43
Processing index : 44, empId : 44
Processing index : 45, empId : 45
Processing index : 46, empId : 46
Processing index : 47, empId : 47
Processing index : 48, empId : 48
Processing index : 49, empId : 49
Processing index : 50, empId : 50
Processing index : 51, empId : 51
Processing index : 52, empId : 52
Processing index : 53, empId : 53
Processing index : 54, empId : 54
Processing index : 55, empId : 55
Processing index : 56, empId : 56
Processing index : 57, empId : 57
Processing index : 58, empId : 58
Processing index : 59, empId : 59
Processing index : 60, empId : 60
Processing index : 61, empId : 61
Processing index : 62, empId : 62
Processing index : 63, empId : 63
Processing index : 64, empId : 64
Processing index : 65, empId : 65
Processing index : 66, empId : 66
Processing index : 67, empId : 67
Processing index : 68, empId : 68
Processing index : 69, empId : 69
Processing index : 70, empId : 70
Processing index : 71, empId : 71
Processing index : 72, empId : 72
Processing index : 73, empId : 73
Processing index : 74, empId : 74
Processing index : 75, empId : 75
Processing index : 76, empId : 76
Processing index : 77, empId : 77
Processing index : 78, empId : 78
Processing index : 79, empId : 79
Processing index : 80, empId : 80
Processing index : 81, empId : 81
Processing index : 82, empId : 82
Processing index : 83, empId : 83
Processing index : 84, empId : 84
Processing index : 85, empId : 85
Processing index : 86, empId : 86
Processing index : 87, empId : 87
Processing index : 88, empId : 88
Processing index : 89, empId : 89
Processing index : 90, empId : 90
Processing index : 91, empId : 91
Processing index : 92, empId : 92
Processing index : 93, empId : 93
Processing index : 94, empId : 94
Processing index : 95, empId : 95
Processing index : 96, empId : 96
Processing index : 97, empId : 97
Processing index : 98, empId : 98
Processing index : 99, empId : 99
Processing index : 100, empId : 100
Processing index : 101, empId : 101
Processing index : 102, empId : 102
Processing index : 103, empId : 103
Processing index : 104, empId : 104
Processing index : 105, empId : 105
Processing index : 106, empId : 106
Processing index : 107, empId : 107
Processing index : 108, empId : 108
Processing index : 109, empId : 109
Processing index : 110, empId : 110
Processing index : 111, empId : 111
Processing index : 112, empId : 112
Processing index : 113, empId : 113
Processing index : 114, empId : 114
Processing index : 115, empId : 115
Processing index : 116, empId : 116
Processing index : 117, empId : 117
Processing index : 118, empId : 118
Processing index : 119, empId : 119
Processing index : 120, empId : 120
Processing index : 121, empId : 121
Processing index : 122, empId : 122
Processing index : 123, empId : 123
Processing index : 124, empId : 124
Processing index : 125, empId : 125
Processing index : 126, empId : 126
Processing index : 127, empId : 127
Processing index : 128, empId : 128
Processing index : 129, empId : 129
Processing index : 130, empId : 130
Processing index : 131, empId : 131
Processing index : 132, empId : 132
Processing index : 133, empId : 133
Processing index : 134, empId : 134
Processing index : 135, empId : 135
Processing index : 136, empId : 136
Processing index : 137, empId : 137
Processing index : 138, empId : 138
Processing index : 139, empId : 139
Processing index : 140, empId : 140
Processing index : 141, empId : 141
Processing index : 142, empId : 142
Processing index : 143, empId : 143
Processing index : 144, empId : 144
Processing index : 145, empId : 145
Processing index : 146, empId : 146
Processing index : 147, empId : 147
Processing index : 148, empId : 148
Processing index : 149, empId : 149
Processing index : 150, empId : 150
Processing index : 151, empId : 151
Processing index : 152, empId : 152
Processing index : 153, empId : 153
Processing index : 154, empId : 154
Processing index : 155, empId : 155
Processing index : 156, empId : 156
Processing index : 157, empId : 157
Processing index : 158, empId : 158
Processing index : 159, empId : 159
Processing index : 160, empId : 160
Processing index : 161, empId : 161
Processing index : 162, empId : 162
Processing index : 163, empId : 163
Processing index : 164, empId : 164
Processing index : 165, empId : 165
Processing index : 166, empId : 166
Processing index : 167, empId : 167
Processing index : 168, empId : 168
Processing index : 169, empId : 169
Processing index : 170, empId : 170
Processing index : 171, empId : 171
Processing index : 172, empId : 172
Processing index : 173, empId : 173
Processing index : 174, empId : 174
Processing index : 175, empId : 175
Processing index : 176, empId : 176
Processing index : 177, empId : 177
Processing index : 178, empId : 178
Processing index : 179, empId : 179
Processing index : 180, empId : 180
Processing index : 181, empId : 181
Processing index : 182, empId : 182
Processing index : 183, empId : 183
Processing index : 184, empId : 184
Processing index : 185, empId : 185
Processing index : 186, empId : 186
Processing index : 187, empId : 187
Processing index : 188, empId : 188
Processing index : 189, empId : 189
Processing index : 190, empId : 190
Processing index : 191, empId : 191
Processing index : 192, empId : 192
Processing index : 193, empId : 193
Processing index : 194, empId : 194
Processing index : 195, empId : 195
Processing index : 196, empId : 196
Processing index : 197, empId : 197
Processing index : 198, empId : 198
Processing index : 199, empId : 199
Processing index : 200, empId : 200

Solution2:

function onActionMethod()
{
	
	databaseManager.setAutoSave(false);
   
   	var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'), _rc;
   
   	if(_fsEmp.find()){
      	_fsEmp.country = 'USA';
      	_fsEmp.search(); // returns the found count
   
      	var _nRecCount = databaseManager.getFoundSetCount(_fsEmp);
      	
      	for(var i = 1; i <= _nRecCount; i++){
         	_rc = _fsEmp.getRecord(i);
         	application.output("Processing index : "+i+", empId : "+_rc.employeeid)
         	_rc.country = 'SL';
         	databaseManager.saveData();
      	}
   	}

}

Result 2 (Unexpected behaviour after the 200th record):

Processing index : 1, empId : 1
Processing index : 2, empId : 2
Processing index : 3, empId : 3
Processing index : 4, empId : 4
Processing index : 5, empId : 5
Processing index : 6, empId : 6
Processing index : 7, empId : 7
Processing index : 8, empId : 8
Processing index : 9, empId : 9
Processing index : 10, empId : 10
Processing index : 11, empId : 11
Processing index : 12, empId : 12
Processing index : 13, empId : 13
Processing index : 14, empId : 14
Processing index : 15, empId : 15
Processing index : 16, empId : 16
Processing index : 17, empId : 17
Processing index : 18, empId : 18
Processing index : 19, empId : 19
Processing index : 20, empId : 20
Processing index : 21, empId : 21
Processing index : 22, empId : 22
Processing index : 23, empId : 23
Processing index : 24, empId : 24
Processing index : 25, empId : 25
Processing index : 26, empId : 26
Processing index : 27, empId : 27
Processing index : 28, empId : 28
Processing index : 29, empId : 29
Processing index : 30, empId : 30
Processing index : 31, empId : 31
Processing index : 32, empId : 32
Processing index : 33, empId : 33
Processing index : 34, empId : 34
Processing index : 35, empId : 35
Processing index : 36, empId : 36
Processing index : 37, empId : 37
Processing index : 38, empId : 38
Processing index : 39, empId : 39
Processing index : 40, empId : 40
Processing index : 41, empId : 41
Processing index : 42, empId : 42
Processing index : 43, empId : 43
Processing index : 44, empId : 44
Processing index : 45, empId : 45
Processing index : 46, empId : 46
Processing index : 47, empId : 47
Processing index : 48, empId : 48
Processing index : 49, empId : 49
Processing index : 50, empId : 50
Processing index : 51, empId : 51
Processing index : 52, empId : 52
Processing index : 53, empId : 53
Processing index : 54, empId : 54
Processing index : 55, empId : 55
Processing index : 56, empId : 56
Processing index : 57, empId : 57
Processing index : 58, empId : 58
Processing index : 59, empId : 59
Processing index : 60, empId : 60
Processing index : 61, empId : 61
Processing index : 62, empId : 62
Processing index : 63, empId : 63
Processing index : 64, empId : 64
Processing index : 65, empId : 65
Processing index : 66, empId : 66
Processing index : 67, empId : 67
Processing index : 68, empId : 68
Processing index : 69, empId : 69
Processing index : 70, empId : 70
Processing index : 71, empId : 71
Processing index : 72, empId : 72
Processing index : 73, empId : 73
Processing index : 74, empId : 74
Processing index : 75, empId : 75
Processing index : 76, empId : 76
Processing index : 77, empId : 77
Processing index : 78, empId : 78
Processing index : 79, empId : 79
Processing index : 80, empId : 80
Processing index : 81, empId : 81
Processing index : 82, empId : 82
Processing index : 83, empId : 83
Processing index : 84, empId : 84
Processing index : 85, empId : 85
Processing index : 86, empId : 86
Processing index : 87, empId : 87
Processing index : 88, empId : 88
Processing index : 89, empId : 89
Processing index : 90, empId : 90
Processing index : 91, empId : 91
Processing index : 92, empId : 92
Processing index : 93, empId : 93
Processing index : 94, empId : 94
Processing index : 95, empId : 95
Processing index : 96, empId : 96
Processing index : 97, empId : 97
Processing index : 98, empId : 98
Processing index : 99, empId : 99
Processing index : 100, empId : 100
Processing index : 101, empId : 101
Processing index : 102, empId : 102
Processing index : 103, empId : 103
Processing index : 104, empId : 104
Processing index : 105, empId : 105
Processing index : 106, empId : 106
Processing index : 107, empId : 107
Processing index : 108, empId : 108
Processing index : 109, empId : 109
Processing index : 110, empId : 110
Processing index : 111, empId : 111
Processing index : 112, empId : 112
Processing index : 113, empId : 113
Processing index : 114, empId : 114
Processing index : 115, empId : 115
Processing index : 116, empId : 116
Processing index : 117, empId : 117
Processing index : 118, empId : 118
Processing index : 119, empId : 119
Processing index : 120, empId : 120
Processing index : 121, empId : 121
Processing index : 122, empId : 122
Processing index : 123, empId : 123
Processing index : 124, empId : 124
Processing index : 125, empId : 125
Processing index : 126, empId : 126
Processing index : 127, empId : 127
Processing index : 128, empId : 128
Processing index : 129, empId : 129
Processing index : 130, empId : 130
Processing index : 131, empId : 131
Processing index : 132, empId : 132
Processing index : 133, empId : 133
Processing index : 134, empId : 134
Processing index : 135, empId : 135
Processing index : 136, empId : 136
Processing index : 137, empId : 137
Processing index : 138, empId : 138
Processing index : 139, empId : 139
Processing index : 140, empId : 140
Processing index : 141, empId : 141
Processing index : 142, empId : 142
Processing index : 143, empId : 143
Processing index : 144, empId : 144
Processing index : 145, empId : 145
Processing index : 146, empId : 146
Processing index : 147, empId : 147
Processing index : 148, empId : 148
Processing index : 149, empId : 149
Processing index : 150, empId : 150
Processing index : 151, empId : 151
Processing index : 152, empId : 152
Processing index : 153, empId : 153
Processing index : 154, empId : 154
Processing index : 155, empId : 155
Processing index : 156, empId : 156
Processing index : 157, empId : 157
Processing index : 158, empId : 158
Processing index : 159, empId : 159
Processing index : 160, empId : 160
Processing index : 161, empId : 161
Processing index : 162, empId : 162
Processing index : 163, empId : 163
Processing index : 164, empId : 164
Processing index : 165, empId : 165
Processing index : 166, empId : 166
Processing index : 167, empId : 167
Processing index : 168, empId : 168
Processing index : 169, empId : 169
Processing index : 170, empId : 170
Processing index : 171, empId : 171
Processing index : 172, empId : 172
Processing index : 173, empId : 173
Processing index : 174, empId : 174
Processing index : 175, empId : 175
Processing index : 176, empId : 176
Processing index : 177, empId : 177
Processing index : 178, empId : 178
Processing index : 179, empId : 179
Processing index : 180, empId : 180
Processing index : 181, empId : 181
Processing index : 182, empId : 182
Processing index : 183, empId : 183
Processing index : 184, empId : 184
Processing index : 185, empId : 185
Processing index : 186, empId : 186
Processing index : 187, empId : 187
Processing index : 188, empId : 188
Processing index : 189, empId : 189
Processing index : 190, empId : 190
Processing index : 191, empId : 191
Processing index : 192, empId : 192
Processing index : 193, empId : 193
Processing index : 194, empId : 194
Processing index : 195, empId : 195
Processing index : 196, empId : 196
Processing index : 197, empId : 197
Processing index : 198, empId : 198
Processing index : 199, empId : 199
Processing index : 200, empId : 200
Processing index : 201, empId : 400
Processing index : 202, empId : 401
Processing index : 203, empId : 402
Processing index : 204, empId : 403
Processing index : 205, empId : 404
Processing index : 206, empId : 405
Processing index : 207, empId : 406
Processing index : 208, empId : 407
Processing index : 209, empId : 408
Processing index : 210, empId : 409
Processing index : 211, empId : 410
Processing index : 212, empId : 411
Processing index : 213, empId : 412
Processing index : 214, empId : 413
Processing index : 215, empId : 414
Processing index : 216, empId : 415
Processing index : 217, empId : 416
Processing index : 218, empId : 417
Processing index : 219, empId : 418
Processing index : 220, empId : 419
Processing index : 221, empId : 420
Processing index : 222, empId : 421
Processing index : 223, empId : 422
Processing index : 224, empId : 423
Processing index : 225, empId : 424
Processing index : 226, empId : 425
Processing index : 227, empId : 426
Processing index : 228, empId : 427
Processing index : 229, empId : 428
Processing index : 230, empId : 429
Processing index : 231, empId : 430
Processing index : 232, empId : 431
Processing index : 233, empId : 432
Processing index : 234, empId : 433
Processing index : 235, empId : 434
Processing index : 236, empId : 435
Processing index : 237, empId : 436
Processing index : 238, empId : 437
Processing index : 239, empId : 438
Processing index : 240, empId : 439
Processing index : 241, empId : 440
Processing index : 242, empId : 441
Processing index : 243, empId : 442
Processing index : 244, empId : 443
Processing index : 245, empId : 444
Processing index : 246, empId : 445
Processing index : 247, empId : 446
Processing index : 248, empId : 447
Processing index : 249, empId : 448
Processing index : 250, empId : 449
Processing index : 251, empId : 450
Processing index : 252, empId : 451
Processing index : 253, empId : 452
Processing index : 254, empId : 453
Processing index : 255, empId : 454
Processing index : 256, empId : 455
Processing index : 257, empId : 456
Processing index : 258, empId : 457
Processing index : 259, empId : 458
Processing index : 260, empId : 459
Processing index : 261, empId : 460
Processing index : 262, empId : 461
Processing index : 263, empId : 462
Processing index : 264, empId : 463
Processing index : 265, empId : 464
Processing index : 266, empId : 465
Processing index : 267, empId : 466
Processing index : 268, empId : 467
Processing index : 269, empId : 468
Processing index : 270, empId : 469
Processing index : 271, empId : 470
Processing index : 272, empId : 471
Processing index : 273, empId : 472
Processing index : 274, empId : 473
Processing index : 275, empId : 474
Processing index : 276, empId : 475
Processing index : 277, empId : 476
Processing index : 278, empId : 477
Processing index : 279, empId : 478
Processing index : 280, empId : 479
Processing index : 281, empId : 480
Processing index : 282, empId : 481
Processing index : 283, empId : 482
Processing index : 284, empId : 483
Processing index : 285, empId : 484
Processing index : 286, empId : 485
Processing index : 287, empId : 486
Processing index : 288, empId : 487
Processing index : 289, empId : 488
Processing index : 290, empId : 489
Processing index : 291, empId : 490
Processing index : 292, empId : 491
Processing index : 293, empId : 492
Processing index : 294, empId : 493
Processing index : 295, empId : 494
Processing index : 296, empId : 495
Processing index : 297, empId : 496
Processing index : 298, empId : 497
Processing index : 299, empId : 498
Processing index : 300, empId : 499
Processing index : 301, empId : 500
Processing index : 302, empId : 501
Processing index : 303, empId : 502
Processing index : 304, empId : 503
Processing index : 305, empId : 504
Processing index : 306, empId : 505
Processing index : 307, empId : 506
Processing index : 308, empId : 507
Processing index : 309, empId : 508
Processing index : 310, empId : 509
Processing index : 311, empId : 510
Processing index : 312, empId : 511
Processing index : 313, empId : 512
Processing index : 314, empId : 513
Processing index : 315, empId : 514
Processing index : 316, empId : 515
Processing index : 317, empId : 516
Processing index : 318, empId : 517
Processing index : 319, empId : 518
Processing index : 320, empId : 519
Processing index : 321, empId : 520
Processing index : 322, empId : 521
Processing index : 323, empId : 522
Processing index : 324, empId : 523
Processing index : 325, empId : 524
Processing index : 326, empId : 525
Processing index : 327, empId : 526
Processing index : 328, empId : 527
Processing index : 329, empId : 528
Processing index : 330, empId : 529
Processing index : 331, empId : 530
TypeError: Cannot read property “employeeid” from (D:\servoy_workspace_2\TestProjct\forms\employees\employees_methods.js#19)
at D:\servoy_workspace_2\TestProjct\forms\employees\employees_methods.js:19 (onActionMethod)

Solution 3:

function onActionMethod()
{
	
	databaseManager.setAutoSave(false);
   
   	var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'), _rc;
   
   	if(_fsEmp.find()){
      	_fsEmp.country = 'USA';
      	var _nRecCount = _fsEmp.search(); // returns the found count
   
      	for(var i = 1; i <= _fsEmp.getSize(); i++){
         	_rc = _fsEmp.getRecord(i);
         	application.output("Processing index : "+i+", empId : "+_rc.employeeid)
         	_rc.country = 'SL';
         	databaseManager.saveData();
         	if(i == 200){
         		i = 1;
         	}
      	}
   	}

}

Result 3 : Never ending Loop

Processing index : 1, empId : 1
Processing index : 2, empId : 2
Processing index : 3, empId : 3
Processing index : 4, empId : 4
Processing index : 5, empId : 5
Processing index : 6, empId : 6
Processing index : 7, empId : 7
Processing index : 8, empId : 8
Processing index : 9, empId : 9
Processing index : 10, empId : 10
Processing index : 11, empId : 11
Processing index : 12, empId : 12
Processing index : 13, empId : 13
Processing index : 14, empId : 14
Processing index : 15, empId : 15
Processing index : 16, empId : 16
Processing index : 17, empId : 17
Processing index : 18, empId : 18
Processing index : 19, empId : 19
Processing index : 20, empId : 20
Processing index : 21, empId : 21
Processing index : 22, empId : 22
Processing index : 23, empId : 23
Processing index : 24, empId : 24
Processing index : 25, empId : 25
Processing index : 26, empId : 26
Processing index : 27, empId : 27
Processing index : 28, empId : 28
Processing index : 29, empId : 29
Processing index : 30, empId : 30
Processing index : 31, empId : 31
Processing index : 32, empId : 32
Processing index : 33, empId : 33
Processing index : 34, empId : 34
Processing index : 35, empId : 35
Processing index : 36, empId : 36
Processing index : 37, empId : 37
Processing index : 38, empId : 38
Processing index : 39, empId : 39
Processing index : 40, empId : 40
Processing index : 41, empId : 41
Processing index : 42, empId : 42
Processing index : 43, empId : 43
Processing index : 44, empId : 44
Processing index : 45, empId : 45
Processing index : 46, empId : 46
Processing index : 47, empId : 47
Processing index : 48, empId : 48
Processing index : 49, empId : 49
Processing index : 50, empId : 50
Processing index : 51, empId : 51
Processing index : 52, empId : 52
Processing index : 53, empId : 53
Processing index : 54, empId : 54
Processing index : 55, empId : 55
Processing index : 56, empId : 56
Processing index : 57, empId : 57
Processing index : 58, empId : 58
Processing index : 59, empId : 59
Processing index : 60, empId : 60
Processing index : 61, empId : 61
Processing index : 62, empId : 62
Processing index : 63, empId : 63
Processing index : 64, empId : 64
Processing index : 65, empId : 65
Processing index : 66, empId : 66
Processing index : 67, empId : 67
Processing index : 68, empId : 68
Processing index : 69, empId : 69
Processing index : 70, empId : 70
Processing index : 71, empId : 71
Processing index : 72, empId : 72
Processing index : 73, empId : 73
Processing index : 74, empId : 74
Processing index : 75, empId : 75
Processing index : 76, empId : 76
Processing index : 77, empId : 77
Processing index : 78, empId : 78
Processing index : 79, empId : 79
Processing index : 80, empId : 80
Processing index : 81, empId : 81
Processing index : 82, empId : 82
Processing index : 83, empId : 83
Processing index : 84, empId : 84
Processing index : 85, empId : 85
Processing index : 86, empId : 86
Processing index : 87, empId : 87
Processing index : 88, empId : 88
Processing index : 89, empId : 89
Processing index : 90, empId : 90
Processing index : 91, empId : 91
Processing index : 92, empId : 92
Processing index : 93, empId : 93
Processing index : 94, empId : 94
Processing index : 95, empId : 95
Processing index : 96, empId : 96
Processing index : 97, empId : 97
Processing index : 98, empId : 98
Processing index : 99, empId : 99
Processing index : 100, empId : 100
Processing index : 101, empId : 101
Processing index : 102, empId : 102
Processing index : 103, empId : 103
Processing index : 104, empId : 104
Processing index : 105, empId : 105
Processing index : 106, empId : 106
Processing index : 107, empId : 107
Processing index : 108, empId : 108
Processing index : 109, empId : 109
Processing index : 110, empId : 110
Processing index : 111, empId : 111
Processing index : 112, empId : 112
Processing index : 113, empId : 113
Processing index : 114, empId : 114
Processing index : 115, empId : 115
Processing index : 116, empId : 116
Processing index : 117, empId : 117
Processing index : 118, empId : 118
Processing index : 119, empId : 119
Processing index : 120, empId : 120
Processing index : 121, empId : 121
Processing index : 122, empId : 122
Processing index : 123, empId : 123
Processing index : 124, empId : 124
Processing index : 125, empId : 125
Processing index : 126, empId : 126
Processing index : 127, empId : 127
Processing index : 128, empId : 128
Processing index : 129, empId : 129
Processing index : 130, empId : 130
Processing index : 131, empId : 131
Processing index : 132, empId : 132
Processing index : 133, empId : 133
Processing index : 134, empId : 134
Processing index : 135, empId : 135
Processing index : 136, empId : 136
Processing index : 137, empId : 137
Processing index : 138, empId : 138
Processing index : 139, empId : 139
Processing index : 140, empId : 140
Processing index : 141, empId : 141
Processing index : 142, empId : 142
Processing index : 143, empId : 143
Processing index : 144, empId : 144
Processing index : 145, empId : 145
Processing index : 146, empId : 146
Processing index : 147, empId : 147
Processing index : 148, empId : 148
Processing index : 149, empId : 149
Processing index : 150, empId : 150
Processing index : 151, empId : 151
Processing index : 152, empId : 152
Processing index : 153, empId : 153
Processing index : 154, empId : 154
Processing index : 155, empId : 155
Processing index : 156, empId : 156
Processing index : 157, empId : 157
Processing index : 158, empId : 158
Processing index : 159, empId : 159
Processing index : 160, empId : 160
Processing index : 161, empId : 161
Processing index : 162, empId : 162
Processing index : 163, empId : 163
Processing index : 164, empId : 164
Processing index : 165, empId : 165
Processing index : 166, empId : 166
Processing index : 167, empId : 167
Processing index : 168, empId : 168
Processing index : 169, empId : 169
Processing index : 170, empId : 170
Processing index : 171, empId : 171
Processing index : 172, empId : 172
Processing index : 173, empId : 173
Processing index : 174, empId : 174
Processing index : 175, empId : 175
Processing index : 176, empId : 176
Processing index : 177, empId : 177
Processing index : 178, empId : 178
Processing index : 179, empId : 179
Processing index : 180, empId : 180
Processing index : 181, empId : 181
Processing index : 182, empId : 182
Processing index : 183, empId : 183
Processing index : 184, empId : 184
Processing index : 185, empId : 185
Processing index : 186, empId : 186
Processing index : 187, empId : 187
Processing index : 188, empId : 188
Processing index : 189, empId : 189
Processing index : 190, empId : 190
Processing index : 191, empId : 191
Processing index : 192, empId : 192
Processing index : 193, empId : 193
Processing index : 194, empId : 194
Processing index : 195, empId : 195
Processing index : 196, empId : 196
Processing index : 197, empId : 197
Processing index : 198, empId : 198
Processing index : 199, empId : 199
Processing index : 200, empId : 200
Processing index : 2, empId : 2
Processing index : 3, empId : 3
Processing index : 4, empId : 4
Processing index : 5, empId : 5
Processing index : 6, empId : 6
Processing index : 7, empId : 7
Processing index : 8, empId : 8
Processing index : 9, empId : 9
Processing index : 10, empId : 10
Processing index : 11, empId : 11
Processing index : 12, empId : 12
Processing index : 13, empId : 13
Processing index : 14, empId : 14
Processing index : 15, empId : 15
Processing index : 16, empId : 16
Processing index : 17, empId : 17
Processing index : 18, empId : 18
Processing index : 19, empId : 19
Processing index : 20, empId : 20
Processing index : 21, empId : 21
Processing index : 22, empId : 22
Processing index : 23, empId : 23
Processing index : 24, empId : 24
Processing index : 25, empId : 25
Processing index : 26, empId : 26
Processing index : 27, empId : 27
Processing index : 28, empId : 28
Processing index : 29, empId : 29
Processing index : 30, empId : 30
Processing index : 31, empId : 31
Processing index : 32, empId : 32
Processing index : 33, empId : 33
Processing index : 34, empId : 34
Processing index : 35, empId : 35
Processing index : 36, empId : 36
Processing index : 37, empId : 37
Processing index : 38, empId : 38
Processing index : 39, empId : 39
Processing index : 40, empId : 40
Processing index : 41, empId : 41
Processing index : 42, empId : 42
Processing index : 43, empId : 43
Processing index : 44, empId : 44
Processing index : 45, empId : 45
Processing index : 46, empId : 46
Processing index : 47, empId : 47
Processing index : 48, empId : 48
Processing index : 49, empId : 49
Processing index : 50, empId : 50
Processing index : 51, empId : 51
Processing index : 52, empId : 52
Processing index : 53, empId : 53
Processing index : 54, empId : 54
Processing index : 55, empId : 55
Processing index : 56, empId : 56
Processing index : 57, empId : 57
Processing index : 58, empId : 58
Processing index : 59, empId : 59
Processing index : 60, empId : 60
Processing index : 61, empId : 61
Processing index : 62, empId : 62
Processing index : 63, empId : 63
Processing index : 64, empId : 64
Processing index : 65, empId : 65
Processing index : 66, empId : 66
Processing index : 67, empId : 67
Processing index : 68, empId : 68
Processing index : 69, empId : 69
Processing index : 70, empId : 70
Processing index : 71, empId : 71
Processing index : 72, empId : 72
Processing index : 73, empId : 73
Processing index : 74, empId : 74
Processing index : 75, empId : 75
Processing index : 76, empId : 76
Processing index : 77, empId : 77
Processing index : 78, empId : 78
Processing index : 79, empId : 79
Processing index : 80, empId : 80
Processing index : 81, empId : 81
Processing index : 82, empId : 82
Processing index : 83, empId : 83
Processing index : 84, empId : 84
Processing index : 85, empId : 85
Processing index : 86, empId : 86
Processing index : 87, empId : 87
Processing index : 88, empId : 88
Processing index : 89, empId : 89
Processing index : 90, empId : 90
Processing index : 91, empId : 91
Processing index : 92, empId : 92
Processing index : 93, empId : 93
Processing index : 94, empId : 94
Processing index : 95, empId : 95
Processing index : 96, empId : 96
Processing index : 97, empId : 97
Processing index : 98, empId : 98
Processing index : 99, empId : 99
Processing index : 100, empId : 100
Processing index : 101, empId : 101
Processing index : 102, empId : 102
Processing index : 103, empId : 103
Processing index : 104, empId : 104
Processing index : 105, empId : 105
Processing index : 106, empId : 106
Processing index : 107, empId : 107
Processing index : 108, empId : 108
Processing index : 109, empId : 109
Processing index : 110, empId : 110
Processing index : 111, empId : 111
Processing index : 112, empId : 112
Processing index : 113, empId : 113
Processing index : 114, empId : 114
Processing index : 115, empId : 115
Processing index : 116, empId : 116
Processing index : 117, empId : 117
Processing index : 118, empId : 118
Processing index : 119, empId : 119
Processing index : 120, empId : 120
Processing index : 121, empId : 121
Processing index : 122, empId : 122
Processing index : 123, empId : 123
Processing index : 124, empId : 124
Processing index : 125, empId : 125
Processing index : 126, empId : 126
Processing index : 127, empId : 127
Processing index : 128, empId : 128
Processing index : 129, empId : 129
Processing index : 130, empId : 130
Processing index : 131, empId : 131
Processing index : 132, empId : 132
Processing index : 133, empId : 133
Processing index : 134, empId : 134
Processing index : 135, empId : 135
Processing index : 136, empId : 136
Processing index : 137, empId : 137
Processing index : 138, empId : 138
Processing index : 139, empId : 139
Processing index : 140, empId : 140
Processing index : 141, empId : 141
Processing index : 142, empId : 142
Processing index : 143, empId : 143
Processing index : 144, empId : 144
Processing index : 145, empId : 145
Processing index : 146, empId : 146
Processing index : 147, empId : 147
Processing index : 148, empId : 148
Processing index : 149, empId : 149
Processing index : 150, empId : 150
Processing index : 151, empId : 151
Processing index : 152, empId : 152
Processing index : 153, empId : 153
Processing index : 154, empId : 154
Processing index : 155, empId : 155
Processing index : 156, empId : 156
Processing index : 157, empId : 157
Processing index : 158, empId : 158
Processing index : 159, empId : 159
Processing index : 160, empId : 160
Processing index : 161, empId : 161
Processing index : 162, empId : 162
Processing index : 163, empId : 163
Processing index : 164, empId : 164
Processing index : 165, empId : 165
Processing index : 166, empId : 166
Processing index : 167, empId : 167
Processing index : 168, empId : 168
Processing index : 169, empId : 169
Processing index : 170, empId : 170
Processing index : 171, empId : 171
Processing index : 172, empId : 172
Processing index : 173, empId : 173
Processing index : 174, empId : 174
Processing index : 175, empId : 175
Processing index : 176, empId : 176
Processing index : 177, empId : 177
Processing index : 178, empId : 178
Processing index : 179, empId : 179
Processing index : 180, empId : 180
Processing index : 181, empId : 181
Processing index : 182, empId : 182
Processing index : 183, empId : 183
Processing index : 184, empId : 184
Processing index : 185, empId : 185
Processing index : 186, empId : 186
Processing index : 187, empId : 187
Processing index : 188, empId : 188
Processing index : 189, empId : 189
Processing index : 190, empId : 190
Processing index : 191, empId : 191
Processing index : 192, empId : 192
Processing index : 193, empId : 193
Processing index : 194, empId : 194
Processing index : 195, empId : 195
Processing index : 196, empId : 196
Processing index : 197, empId : 197
Processing index : 198, empId : 198
Processing index : 199, empId : 199
Processing index : 200, empId : 200
Processing index : 2, empId : 2
Processing index : 3, empId : 3
Processing index : 4, empId : 4
Processing index : 5, empId : 5
Processing index : 6, empId : 6
Processing index : 7, empId : 7
Processing index : 8, empId : 8
Processing index : 9, empId : 9
Processing index : 10, empId : 10
Processing index : 11, empId : 11
Processing index : 12, empId : 12
Processing index : 13, empId : 13
Processing index : 14, empId : 14
Processing index : 15, empId : 15
Processing index : 16, empId : 16
Processing index : 17, empId : 17
Processing index : 18, empId : 18
Processing index : 19, empId : 19

I didn’t try loading the last record initially (the db expensive solution suggested) as this would be quite similar to excecuting a raw sql, loading the foundset with the resulting dataset.

Once again, I strongly feel that this is a new issue in the Servoy new version. It’s greatly appreciated if someone from Servoy looks into this issue.

Thanks you.

Cheers.

Hi Nimeshe,

You didn’t test the first solution in my second post. It’s very similar to the first solution but does something very significant. Namely it forces Servoy to load the whole foundset before you loop through it.

This is the code (now with emphasis on the get-latest-record code).

function onActionMethod()
{
   databaseManager.setAutoSave(false);
   
   var _fsEmp = databaseManager.getFoundSet(controller.getServerName(),'employees'),
         _rc;
   
   if(_fsEmp.find()){
      _fsEmp.country = 'USA';
      var _nRecCount = _fsEmp.search(); // returns the found count
   
      // ======================================================================

      // touch the last record so all PK's are loaded
      // WARNING: this can be VERY expensive when you have a LARGE foundset
      _rc = _fsEmp.getRecord(_nRecCount);

      // lets select the record in the GUI for good measure
      controller.setSelectedIndex(_nRecCount);

      // ======================================================================

      for(var i = 1; i <= _nRecCount; i++){
         _rc = _fsEmp.getRecord(i);
         application.output("Processing index : "+i+", empId : "+_rc.employeeid)
         _rc.country = 'SL';
         databaseManager.saveData();
      }
   }
}

EDIT: I now see at the end of your post the reason why you didn’t used this method.

I had a similar loop for updating after as search:

  • If i create a foundsetupdater and i update the whole foundsetupdater with a setcolumn and a performUpdate the table events triggers are not fired

  • If i loop with a “while founsetpudater.next()” the table events triggers are fired

Does anybody has the same behaviours ?

Robert is right

this behavior isnt introduced in a latest version of servoy but is always the case.

If you change data thats your search criteria column and now it falls out of it
there is a problem because the next set of pks doesnt align anymore to the previous set

so in small these pk’s i have in mem:

1
2
3
4
5

then the next bunch is loaded it (5 being the 200 limit) under nomral behavior when you scroll down:

1
2
3
4
5
6
7
8
9
10

but in your behavior this happens, you first have the first 5 pks
those you change the first 4 to something else then we hit number 5 and we query the next 5
then we still have this in mem

1
2
3
4
5

but the pk query that we do will not start from 1 but from 6, but we want the next 5 so we skip the first 5 from new new set:
So this is appended after you search to 5

11
12
13
14
15

so you miss 6-10

This is very tricky to fix in servoy if you change the query data.

So what you can do is not save the data in a loop and doing it by a batch of 200.

function onActionMethod()
{
   databaseManager.setAutoSave(false);
   
   while(_fsEmp.find()){
      _fsEmp.country = 'USA';
      if (_fsEmp.search() == 0) break;
   
      var count = Math.min(_fsEmp.getSize(), 200);
      for(var i = 1; i <= count; i++){
         _rc = _fsEmp.getRecord(i);
         application.output("Processing index : "+i+", empId : "+_rc.employeeid)
         _rc.country = 'SL';
      }
      databaseManager.saveData();
   }

   databaseManager.setAutoSave(true);
}

erdione:
I had a similar loop for updating after as search:

  • If i create a foundsetupdater and i update the whole foundsetupdater with a setcolumn and a performUpdate the table events triggers are not fired

  • If i loop with a “while founsetpudater.next()” the table events triggers are fired

Does anybody has the same behaviours ?

this is the correct behavior
if you set the column then a direct sql update query is being done (that updates many at the same time) and if you do the second thing we do it through the records of servoy so thats a normal save in servoy

patrick:

When you hit record 200 Servoy actually re-queries

This is actually a very tricky thing. We have had a similar problem the other day. We loaded a foundset by a query and then iterated over it and changed one of the query’s criteria (that was the problematic point). Once you hit the fetch size limit (200), the query is fired again. Of course, now some of the original records did not meet the criteria anymore. We solved that by loading a dataset. That is not so efficient, so I try to prevent it. But in this case it was the only reliable thing to do, because the dataset will not change and Servoy loads the primary keys of the dataset, something that will not change.

Servoy 5 will be able to handle such a situation.
When a foundset is loaded and is being iterated over, changing conditions will keep the foundset in a consistent state.

Rob

Hi Robert,

I tried (a version of) your method to solve a ‘related’ (pardon the pun) problem, but it doesn’t seem to work as expected. Here’s the situation:

I have a table with about 4000 contacts, and another with more than 3000 companies, linked together via a foreign key. My interface uses a list view on the left side and a details view on the right. What I’m trying to accomplish is a simple ‘Go To Related Record’ from the contacts table to its related company, while still maintaining the complete list of companies (not just a find) and keeping the sort order intact. The problem is that, since the rows are filled by groups of 200 rows, and if the company record I want to show is, let’s say, around 2000 records down, my method takes an inordinate amount of time to get to the correct company record (using the scrolling-at-every-200 trick).

Since I wanted to make this reusable solution-wide (ie. from companies to orders, companies to invoices, etc.), what I do is I store the foreign key and foreign key name in globals, and then run a global method that brings me to the related record, but to say the method is not snappy would be quite an understatement… :roll:

Here is my code, inspired in great part by the Sample CRM solution:

function setupRecordStatus()
{
//see what form is front-most
var frm = application.getMethodTriggerFormName();
if (utils.stringRight(frm, 4) != 'list') {
	frm = frm + '_list';
}

var fs = databaseManager.getFoundSetCount(forms[frm].foundset);
var tc = databaseManager.getTableCount(forms[frm].foundset);

if (globals.g_SetupRecordStatusID) {  // Go to correct record
	forms[frm].controller.setSelectedIndex(1);
	var vID;
    var vValue = 200;
    for (var i = 1; i < fs; i++) {
    	if (i == vValue) {
    		forms[frm].controller.setSelectedIndex(i);
    		vValue += 200;
    	}	else {
    		forms[frm].foundset.setSelectedIndex(i);
    	}
    	vID = forms[frm][globals.g_SetupRecordStatusPKName];
		if (globals.g_SetupRecordStatusID == vID) {
			break;
		}
	}

	globals.g_SetupRecordStatusID = null;
	globals.g_SetupRecordStatusPKName = null;
	
}

var cr = forms[frm].controller.getSelectedIndex();

globals.g_record_count = '<html><b>' + i18n.getI18NMessage('logisoft.record') + ':</b> ' + cr +' / ' + fs 

if( tc > fs)
{
	globals.g_record_count += ' (' + tc + ' total)'
}

if( globals.g_search_text )
{
	globals.g_record_count += " [ '" + globals.g_search_text + "' ]"
	globals.g_search_text = ''
}

globals.g_record_count += '</html>'

if (cr == 0) // current record 0 - so hide the "previous" button
{
	forms[frm].elements.btn_prev.visible = false
}
else if (cr == 1) //current record 1 - so hide the "previous" button
{
	forms[frm].elements.btn_prev.visible = false
}
else
{
	forms[frm].elements.btn_prev.visible = true
}

if(cr == fs || cr == tc) //current is last one - so hide the "next" button
{
	forms[frm].elements.btn_next.visible = false
}
else
{
	forms[frm].elements.btn_next.visible = true
}
}

Isn’t there any way to get this to work more smoothly? Some 4GLs do this without a sinch… :oops: I sure hope someone out there has come up with a viable solution to this problem.

Thanks in advance,

Ben

Hi Ben,

I optimised your code a bit by looping through the foundset instead of the controller. Using setSelectedIndex() will actually update the GUI and slows things down. Using the foundset.getRecord() won’t update the GUI.
And I couldn’t help myself to optimise the rest of your code as well ;) .

function setupRecordStatus()
{
    //see what form is front-most
    var frm = application.getMethodTriggerFormName();
    if (utils.stringRight(frm, 4) != 'list') {
        frm = frm + '_list';
    }
    
    var fs = databaseManager.getFoundSetCount(forms[frm].foundset),
        tc = databaseManager.getTableCount(forms[frm].foundset);
    
    if (globals.g_SetupRecordStatusID) {  // Go to correct record
        var vRC;
        for (var i = 1; i < fs; i++) {
            rc = forms[frm].foundset.getRecord(i); // get the record
            if (globals.g_SetupRecordStatusID == rc[globals.g_SetupRecordStatusPKName]) {
                forms[frm].controller.setSelectedIndex(i); // select it
                break;
            }
            
            // -----------------------------------------------
            // questionable if the following part is needed.
            // -----------------------------------------------
            if ( i%200 == 0 ) {
                forms[frm].controller.setSelectedIndex(i); // force a load of the next 200
            }
            // -----------------------------------------------
        }
    
        globals.g_SetupRecordStatusID = null;
        globals.g_SetupRecordStatusPKName = null;
    }
    
    globals.g_record_count = '<html><b>' + i18n.getI18NMessage('logisoft.record') + ':</b> ' + 
                             forms[frm].controller.getSelectedIndex() +' / ' + fs 
    
    if ( tc > fs) {
        globals.g_record_count += ' (' + tc + ' total)'
    }
    
    if ( globals.g_search_text ) {
        globals.g_record_count += " [ '" + globals.g_search_text + "' ]"
        globals.g_search_text = ''
    }
    globals.g_record_count += '</html>'
    
    // current record 0 or 1- so hide the "previous" button, else show it
    forms[frm].elements.btn_prev.visible = !(cr == 0 || cr == 1);
    
    //current is last one - so hide the "next" button, else show it
    forms[frm].elements.btn_next.visible = !(cr == fs || cr == tc)
}

Hope this helps.

Genius, Robert! That fixed it all right! :D

Thanks a million,

Ben

// -----------------------------------------------
// questionable if the following part is needed.
// -----------------------------------------------

no