Date: Thu, 28 Mar 2024 22:13:53 +0000 (UTC)
Message-ID: <701127317.10797.1711664033787@911f0a1bad02>
Subject: Exported From Confluence
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_Part_10796_1446605033.1711664033786"
------=_Part_10796_1446605033.1711664033786
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Content-Location: file:///C:/exported.html
In This Chapter
=20
The Servoy Foundset is a developer's window into Servoy's Data Binding l=
ayer. A single foundset always maps to a single database table (or view) an=
d is responsible for reading from and writing to that table. From the user =
interface, a foundset controls which records are loaded and displayed, as w=
ell as how records are created, edited and deleted. From the developer's pe=
rspective, a foundset is a programmable object with specific behaviors and =
run-time properties that provide a high-level abstraction to facilitate low=
-level data operations.
A Servoy Form is typically bound to a single database table and the form=
will always contain a single foundset which is bound to the same table. Mu=
ch of the action in the user interface, such as a user editing data fields,=
directly affects the form's foundset. Conversely, actions taken on the fou=
ndset, such as programmatically editing data, is immediately reflected in t=
he form.
Often, there can be several different forms which are bound to the same =
table. In most cases the forms will share the same foundset and thus provid=
e a unified view. For example, imagine a form showing a list of customer re=
cords, where clicking on one of the records switches to another form showin=
g a detailed view of only the selected record. The forms will automatically=
stay in sync and there is no need to coerce the forms to show the same rec=
ord. Exceptions to this behavior include scenarios where forms are shown th=
rough different Relations, or have been explicitly marked to use a separate=
foundset.
Loading Records
One of the primary jobs of a foundset is to load records from the table =
to which it is bound. A foundset is always based on an underlying SQL query=
, which may change often during the lifetime of the foundset. However the q=
uery will always take the form of selecting the Primary Key column(s) from =
the table and will also always includ=
e an ORDER BY
clause, which in its simplest form will sor=
t the results based on the Primary Key column(s).
=20
SELECT custome=
rid FROM customers ORDER BY customerid ASC
=20
After retrieving the results for Primary Key data, the foundset will iss=
ue subsequent SQL queries to load the matching record data in smaller, opti=
mized blocks. This query happens automatically in an on-demand fashion to s=
atisfy the foundset's scrollable interface.
=20
SELECT * FROM =
customers WHERE customerid IN (?,?,?,?,?,?,?,?) ORDER BY customerid ASC=20
A foundset's underlying query can change dramatically throughout the cli=
ent session. The following events will modify a foundset's underlying query=
:
- When a form to which it is bound is loaded
- When the =
loadRecords method is called programmatically
- When the sort definition is =
changed
- When it exits find mode
Loading Records=
Programmatically
The loadRecords
=
method is used to directly modify the underlying query that loads PK data.=
There are several uses.
Load by a Single PK
This is the simplest approach, which loads a single recordy by its prima=
ry key value.
=20
foundset.l=
oadRecords(123);
=20
Load by PK Data Set
This approach simply dictates that a foundset will load records based on=
specified primary key data.
=20
var ids =
=3D [1,2,3,6,9]; =09=09=09=09// an array of record PKs
var ds =3D databaseManager.convertToDataSet(ids); // convert the ids to a J=
SDataset
foundset.loadRecords(ds);=09=09=09// load records
=20
Load by Another Foundset=
This approach is useful to essentially copy the query of another foundse=
t.
=20
foundset.l=
oadRecords(anotherFoundset);
=20
Load by Query
This approach allows a SQL query fragment to be used to set the foundset=
's underlying query. There are certain restriction on the form that a query=
can take. For obvious reasons, the query must return the primary key colum=
n(s) from the table to which the foundset is bound. For a full description =
see the reference guide.
=20
var sql =
=3D 'select id from my_table where my_table.column1 in ?,?,?;
var args =3D [1,2,3];
foundset.loadRecords(sql, args);
=20
Sorting
All foundsets contain a sorting definition that determines the orde=
r in which records are loaded and displayed. Sorting is always express=
ed in the ORDER BY clause of a foundset's query and thus handled b=
y the database.
A foundset's sorting definition is encapsulated in a String property, wh=
ich can be programmatically read using the getCurrentSort method, and wr=
itten using the sort method.
Parameters for this property include an ordered list of one or more=
data providers, each of which having a sort direction, either ascending or=
descending. The string takes a form such that each data provider and its s=
ort direction are separated by white space. The direction is abbreviated ei=
ther asc or desc. Multiple data providers are separated b=
y commas.
Example: Sort String Format
=20
'column1 a=
sc, column2 desc'=09// Sort on column1 ascending, then column2 desceding
=20
The order of the data providers determines their relative priority when =
sorting, such that when two records contain the same value for a higher pri=
ority data provider, the sorting will be deferred the next lowest priority =
data provider.
Example: The following sort string will sort, first on =
last name, and second on first name.
=20
foundset.s=
ort('last_name asc, first_name asc');
=20
The result is that all records are sorted by last name. But in the case =
where the last names are the same, then the first name is used.
|| last_=
name || first_name ||
Sloan |
Zachary |
Smith |
Jane |
Smith |
Jon |
Snead |
Aaron |
Available Data Provider Types
The following data provider types may be used as sort criteria:
- Any Column
- Any Related Column
- Any Related Aggregate
Example: Sort a customers foundset based on the number =
of orders each customer has, in this case a related aggregation.
=20
SELECT cus=
tomers.customerid FROM customers
INNER JOIN orders ON customers.customerid=3Dorders.customerid
GROUP BY customers.customerid ORDER BY count(orders.orderid) ASC
=20
Results in the following query:
=20
SELECT cus=
tomers.customerid FROM customers
INNER JOIN orders ON customers.customerid=3Dorders.customerid
GROUP BY customers.customerid ORDER BY count(orders.orderid) ASC
=20
The foundset maintains a scrollable interface for traversing record data=
. This interface includes a numeric index for every record that is returned=
by the foundset's query.
Foundset Size
The foundset also has a size
property, which indicates=
the number of records that are indexed by the foundset at any given time. =
Because the foundset's SQL query may eventually return thousands or million=
s of results, the initial size of the foundset has a maximum of 200. This v=
alue can grow dynamically, in blocks of 200, as the foundset is traversed.<=
/p>
Selected Index
The foundset maintains a selected index, a cursor with which to step thr=
ough the records. If the selected index equals or exceeds the size of the f=
oundset, the foundset will automatically issue another query to load the ne=
xt batch of primary key data. Thus the foundset loads record data and grows=
dynamically with the changing Selected Index property. There are two metho=
ds used to get/set the foundsets selected index. They are getSelectedIndex=
and setSelectedIndex respectively.
Example: In the example below, note that the foundset's=
size changes after the selected index has changed. The foundset's cache gr=
ows dynamically
=20
// Foundse=
t size grows dynamically as the foundset is traversed
foundset.getSize(); // returns 200
foundset.setSelectedIndex(200);
foundset.getSize(); // returns 400 because the foundset loaded the next 200=
record pks
=20
Iterating Over a Founds=
et
Often, as part of some programming operation, it is necessary to iterate=
over a part or all of a foundset.
There are several approaches to iterating: using the foundset iterator, =
changing the selected index of the foundset, accessing a record object, acc=
essing data provider values as an array.
While the last three iterating options are more intuitive, and also vary=
with regards to performance and usage, the foundset iterator is the most r=
ecommended to be used since it is the only option that ensures iterating ov=
er all the records of the foundset, without missing any of them due to the =
multiple clients performing changes on the same foundset at the same time.<=
/p>
It is also possible to use J=
SFoundsetUpdater API to iterate over and update a foundset, though iter=
ating is not its main goal.
Using the Foundset It=
erator
Sometimes there is more than one user working on the same foundset, poss=
ibly inserting or deleting records. When iterating on a foundset, it needs =
to be ensured that the loop neither skips nor processes twice any record du=
e to the foundset modifications occurred from other clients. Thus, in such =
cases, a secure iterator is needed to perform the iteration on the foundset=
.
The forEach
method does exactly that, iterating over all the records of a foundset and calling the callback method gi=
ven as parameter for each one of them.
Example This is an example of how to use the forEach method for iterating over a foundset.
=20
foundset.l=
oadAllRecords();
foundset.forEach(
=09=09=09/**
=09=09=09 * @param {JSRecord} record
=09=09=09 * @param recordIndex
=09=09=09 * @param {JSFoundset} fs=20
=09=09=09 */
=09=09=09function(record, recordIndex, fs) {
=09=09=09=09application.output("record processed: " + record + ", record in=
dex: " + recordIndex);
=09=09=09}
=09=09);
=20
See also the JSFoundset's forEach
method.
Changing the Selected=
Index
Perhaps the most intuitive approach is to programmatically change the fo=
undset's selected index property.
Example: The example below iterates over the en=
tire foundset using a for loop.
=20
for(var i =
=3D 1; i <=3D foundset.getSize(); i++){
=09foundset.setSelectedIndex(i);
=09// operate on the selected record
}
=20
See also the JSFoundset's setSelectedIndex method.
Accessing a Record Obje=
ct
While setting the selected index of the foundset is sometimes necessary,=
it also contains some overhead and therefore is not always the most effici=
ent way to iterate over a foundset. However, one can iterate in a similar m=
anner, access a record object without changing the selected index of a foun=
dset by using the getRecord
method of the foundset.
Example This example iterates over the foundset, but do=
es not affect the selected index. The performance will be better than the p=
revious example, and will not have any side effects in the UI if the founds=
et is bound to a form.
=20
for(var i =
=3D 1; i <=3D foundset.getSize(); i++){
=09var rec =3D foundset.getRecord(i);=09// does not affect the selecte=
d index
}
=20
See also the JSFoundset's getRecord method.
Accessing=
Data Provider Values As an Array
Sometimes the purpose of iterating over a foundset is to access all the =
values for a particular data provider. The most efficient way to do this is=
to obtain an array of values for the foundset's data provider using the&nb=
sp;getFoundSetDataProviderAsArray
method of the dat=
abaseManager
API.
Example This example shows how to access all the v=
alues in a foundset for a single data provider. Iterating over a simple arr=
ay offers better performance over normal foundset iteration.
=20
var ids =
=3D databaseManager.getFoundSetDataProviderAsArray(foundset,'order_id');
for(i in ids){
var id =3D ids[i];
}
=20
See also the JSFoundset's getFoundSetDataProviderAsArray method.=
Foundsets are often constrained or filtered by a Relation. In this situa=
tion, the foundset is said to be a Related Foundset and its default SQL que=
ry will include in its WHERE
clause, the parameters by wh=
ich to constrain the foundset.
It is important to make the distinction that a relation and a foundset a=
re not one in the same. Rather, a relation name is used to reference a spec=
ific foundset object within a given context. The context for a related foun=
dset is always a specific record object. But for convenience, related found=
sets may be referenced within a form's scripting scope and as a property of=
any foundset. However in these cases, the context is always implied to be =
the selected record in the context.
For example:
Take a predefined Relation, customers_to_orders, which models a one-to-m=
any relationship between a customers table and an orders table. The followi=
ng three lines of code, executed within the scripting scope of a form based=
on the customers table, all produce the same result.
=20
// Retu=
rns the number of orders for the selected customer record in this form's fo=
undset
customers_to_orders.getSize();
// ...the same as:
foundset.customers_to_orders.getSize();
// ...also the same as:
foundset.getSelectedRecord().customers_to_orders.getSize();
=20
Related foundsets can be chained together using relation names. Again, t=
he shorthand implies the context of the selected record fo=
r each foundset.
Example
=20
// Returns=
the number of order details for the selected order record of the selected =
customer:
customers_to_orders.orders_to_order_details.getSize();
// ...is the same as:
customers_to_orders.getSelectedRecord().orders_to_order_details.getSelected=
Record().getSize();
=20
=20
=20
=20
=20
=20
=20
=20
| =20
=20
| =20
=20
=20
Foundsets and Dat=
a Broadcasting
A foundset may be automatically updated when the client receives a Data Broadcast Event=
. If the data change affected the table to which the foundset is bound=
, the foundset will be refreshed to reflect the change.
Foundsets are typically updated on a record-by-record basis, either as t=
he user operates on a foundset-bound GUI component, or through program=
matic interactions. However, sometimes it is necessary to perform an u=
pdate to an entire foundset. For performance reasons, it is not advised tha=
t this be done by programmatically iterating over the foundset's records. R=
ather, it is recommended that batch updates be performed using the JSFoundsetUpdater API.
The Foundset Updater API is ideal to use for the following situations:=
p>
Updating an Entire Fo=
undset
This essentially has the effect of issuing a SQL UPDATE statement using =
the WHERE clause that constrains the foundset. This presents a significant =
performance advantage over updating records individually. In the example be=
low, a related foundset is updated, meaning all orders belonging to the sel=
ected customer will be affected. Please note: This method =
will not trigger any associated Table Events or modification columns.
=20
var fsUpda=
ter =3D databaseManager.getFoundSetUpdater(customers_to_orders);
fsUpdater.setColumn('status',101);
fsUpdater.performUpdate();
=20
Updating a Partial Foundset with Different Values for Each Recor=
d
The Foundset Updater API can also be used to update part of a foundset. =
Moreover, unlike the above example, this approach allows for different valu=
es for each record. In the example below, the first 4 records (starting fro=
m the selected index) are updated by specifying an array of values for each=
column that is affected.
=20
//=09updat=
e first four records
var fsUpdater =3D databaseManager.getFoundSetUpdater(foundset);
fsUpdater.setColumn('customer_type',[1,2,3,4]);
fsUpdater.setColumn('my_flag',new [1,0,1,0]);
fsUpdater.performUpdate();
=20
------=_Part_10796_1446605033.1711664033786
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Location: file:///C:/8f99982469889aae076531e21d1e41a7
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
yiY3+xXnAAAAAElFTkSuQmCC
------=_Part_10796_1446605033.1711664033786--