Build a dynamic user interface from a ProDataSet
- Last Updated: February 11, 2026
- 6 minute read
- OpenEdge
- Version 13.0
- Documentation
In most cases, you expect that server-side
ProDataSet definitions will be static in most procedures of your
application. This is because each ProDataSet is likely to have a
unique combination of tables and relations. Also, it is much easier
to write business logic using static ABL statements that can reference
table and field names directly rather than using indirect references such
as BUFFER-FIELD(x):BUFFER-VALUE. Because business
logic tends to be unique to the tables involved in most cases, a
general purpose dynamic procedure that can handle many different
ProDataSets is less likely to be useful on the server-side of an
application, where you are loading ProDataSets from your database,
doing validation, and saving back updates. There will, of course,
be exceptions to this. The ability to mix and match DATASET and DATASET-HANDLE parameters
makes it easy to pass a ProDataSet to another procedure, either locally
or remotely, without being concerned about whether the other procedure
wants to match the parameter up to a static ProDataSet definition
or inspect it in a more general way through its handle.
In some cases, it is more likely that a user interface procedure on the client side of the application wants to accept a variety of different ProDataSets and display their data in a consistent way, by inspecting the ProDataSet structure and creating dynamic user interface objects such as fields and browses appropriate to the ProDataSet.
This topic shows you an example of how you can build these kinds of procedures. You will run the same DynamicDataSet2.p procedure you built earlier, but from an AppBuilder-built window procedure that creates a series of dynamic browses for the tables in the ProDataSet.
Attaching
a browse to a ProDataSet temp-table is very easy. If the table the browse
displays is the child of a Data-Relation, then you can simply associate the
browse with the dynamic query the ProDataSet generates for the relation.
In this way the browse automatically shows the right records for
the parent of the relation, because the dynamic query is filtered
based on the parent key values and automatically reopens itself
internally each time the record in the parent buffer changes. This
can happen either programmatically by using a GET-NEXT() method
or similar statement on the query, or by selecting a record in a
browse for the parent table.
To create the new window procedure:



