Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/scripts/build-package-branch.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const SRC = 'src';
// package.devc.xml (abapGit needs the parent package) and the overview app,
// which is the entry point on every branch - it lists all 30 samples and marks
// the ones this checkout does not carry as "not on this system"
const SRC_ALWAYS = /^(package\.devc\.xml|z2ui5_cl_smpe_app_00\.clas\..*)$/;
const SRC_ALWAYS = /^(package\.devc\.xml|z2ui5_cl_smps_app_00\.clas\..*)$/;

const branch = process.argv[2];
if (!branch) {
Expand Down Expand Up @@ -116,7 +116,7 @@ ${pkg.note ? `\n${wrap(pkg.note)}\n` : ''}
3. Set up whatever the package builds on: **[src/${pkg.dir}/README.md](src/${pkg.dir}/README.md)**
says so in one short section.
4. Start a sample with \`?app_start=<class name>\`, or start the overview with
\`?app_start=z2ui5_cl_smpe_app_00\`.
\`?app_start=z2ui5_cl_smps_app_00\`.

The overview app ships on every branch and lists **all 30 samples** of the
repository, not just this package's. The ones that are not on this branch are
Expand Down
12 changes: 6 additions & 6 deletions .github/scripts/check-overview.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node
// Keeps the overview app and the repository in sync.
//
// z2ui5_cl_smpe_app_00 references every sample BY NAME and resolves it at
// z2ui5_cl_smps_app_00 references every sample BY NAME and resolves it at
// runtime, so that it survives a package the system cannot activate and a
// checkout that carries only part of this repository (see the class
// documentation). The price is that the compiler no longer notices a renamed
Expand All @@ -27,7 +27,7 @@ import { readFileSync, readdirSync, statSync } from 'node:fs';
import { join, basename } from 'node:path';

const SRC = 'src';
const OVERVIEW = join(SRC, 'z2ui5_cl_smpe_app_00.clas.abap');
const OVERVIEW = join(SRC, 'z2ui5_cl_smps_app_00.clas.abap');
const packages = JSON.parse(readFileSync(join('.github', 'packages.json'), 'utf8'));
const PACKAGES = packages.map((entry) => entry.dir);

Expand All @@ -40,18 +40,18 @@ const walk = (dir) =>
const files = walk(SRC);

// a sample is an ABAP class implementing z2ui5_if_app - which leaves out
// z2ui5_cl_smpe_app_489_ws, the APC handler behind sample 489, and the
// z2ui5_cl_smps_app_489_ws, the APC handler behind sample 489, and the
// overview itself
const samples = files
.filter((path) => /^z2ui5_cl_smpe_app_.*\.clas\.abap$/.test(basename(path)))
.filter((path) => /^z2ui5_cl_smps_app_.*\.clas\.abap$/.test(basename(path)))
.filter((path) => basename(path) !== basename(OVERVIEW))
.filter((path) => /INTERFACES\s+z2ui5_if_app\s*\./i.test(readFileSync(path, 'utf8')))
.map((path) => basename(path).replace('.clas.abap', '').toUpperCase());

// every Z2UI5_CL_SMPE_* class name the overview carries as a string literal:
// every Z2UI5_CL_SMPS_* class name the overview carries as a string literal:
// the samples in model_init and the two demo data classes in cs_class
const overview = readFileSync(OVERVIEW, 'utf8');
const listed = [...overview.matchAll(/`(Z2UI5_C[LX]_SMPE_[A-Z0-9_]+)`/g)].map((match) => match[1]);
const listed = [...overview.matchAll(/`(Z2UI5_C[LX]_SMPS_[A-Z0-9_]+)`/g)].map((match) => match[1]);

const known = new Set(
files
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/check-overview.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: check-overview

# The overview app z2ui5_cl_smpe_app_00 names every sample as a string and
# The overview app z2ui5_cl_smps_app_00 names every sample as a string and
# resolves it at runtime, so that it survives a package the system cannot
# activate and a checkout carrying only part of this repository. The compiler
# therefore no longer notices a renamed or a newly added sample - this check
Expand Down
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[![abap version](https://img.shields.io/badge/abap%20version-standard%20%28%E2%89%A5%201909%29-blue)](#setup)
[![namespace](https://img.shields.io/badge/namespace-z2ui5__cl__smpe-blue)](abaplint.jsonc)
[![namespace](https://img.shields.io/badge/namespace-z2ui5__cl__smps-blue)](abaplint.jsonc)
[![dependency](https://img.shields.io/badge/dependency-abap2UI5-blue)](https://github.com/abap2UI5/abap2UI5)
<br>
<br>
Expand Down Expand Up @@ -42,7 +42,7 @@ for and try it out — the others can wait until you need them.
| [`src/03`](src/03) | **[RAP](src/03/README.md)** — consume a business object with EML | ABAP Platform >= 1909; the BO ships with this repo | Cloud + Standard ≥ 7.54 (1909) |
| [`src/04`](src/04) | **[RAP with Draft](src/04/README.md)** — use draft handling | as above | Cloud + Standard ≥ 7.54 (1909) |
| [`src/05`](src/05) | **[Business Events](src/05/README.md)** — react to RAP events, log them, show them | as above | Cloud + Standard ≥ 7.56 (2021) |
| [`src/06`](src/06) | **[Stateful Sessions / Locks](src/06/README.md)** — sticky session, `ENQUEUE` | ABAP Standard (on-premise), the table `Z2UI5_T_SMPE_01` | Standard only, ≥ 7.40 SP08 |
| [`src/06`](src/06) | **[Stateful Sessions / Locks](src/06/README.md)** — sticky session, `ENQUEUE` | ABAP Standard (on-premise), the table `Z2UI5_T_SMPS_01` | Standard only, ≥ 7.40 SP08 |
| [`src/07`](src/07) | **[AMC/APC](src/07/README.md)** — a news feed over WebSocket | on-premise APC/AMC, the ICF node `Z2UI5_APC_SMP_2` | Standard only, ≥ 7.50 |
| [`src/08`](src/08) | **[MIME Play Audio](src/08/README.md)** — play a sound from the MIME repository | the ICF service `/SAP/PUBLIC/BC/ABAP/mime_demo` | Standard only, ≥ 7.50 |
| [`src/09`](src/09) | **[Launchpad](src/09/README.md)** — startup parameters, shell title, cross-app navigation | a Fiori Launchpad with a tile pointing at abap2UI5 | Cloud + Standard ≥ 7.40 SP08 |
Expand Down Expand Up @@ -103,13 +103,13 @@ of them.
short section.
4. Start an app with `?app_start=<class name>`.

Every sample of the abap2UI5 sample scheme is called `Z2UI5_CL_SMPE_APP_<no>`, and
Every sample of the abap2UI5 sample scheme is called `Z2UI5_CL_SMPS_APP_<no>`, and
the tables in the package READMEs give you the number, so sample `487` is
`?app_start=z2ui5_cl_smpe_app_487`.
`?app_start=z2ui5_cl_smps_app_487`.

## The overview app

You do not have to look a number up. `?app_start=z2ui5_cl_smpe_app_00` lists
You do not have to look a number up. `?app_start=z2ui5_cl_smps_app_00` lists
**every sample of this repository**, one collapsible section per package, and
starts each one in a new browser tab — so the overview stays where it is and
several samples can run side by side. Its header button fills the demo data of
Expand Down Expand Up @@ -158,20 +158,20 @@ pushed to one is gone at the next build.

## Namespace

Every object carries the token **`SMPE`** behind its type token — the scheme the
Every object carries the token **`SMPS`** behind its type token — the scheme the
samples repository uses with its `SMP` token:

```
Z2UI5_CL_SMPE_<object> classes, including the behavior pools and event handlers
Z2UI5_T_SMPE_<object> persistent tables
Z2UI5_D_SMPE_<object> draft tables
Z2UI5_E_SMPE_<object> data elements
Z2UI5_R_SMPE_<object> CDS entities and their behavior definitions
Z2UI5_SD_SMPE_<object> service definitions
Z2UI5_SB_SMPE_<object> service bindings
Z2UI5_CL_SMPS_<object> classes, including the behavior pools and event handlers
Z2UI5_T_SMPS_<object> persistent tables
Z2UI5_D_SMPS_<object> draft tables
Z2UI5_E_SMPS_<object> data elements
Z2UI5_R_SMPS_<object> CDS entities and their behavior definitions
Z2UI5_SD_SMPS_<object> service definitions
Z2UI5_SB_SMPS_<object> service bindings
```

Runnable samples are `Z2UI5_CL_SMPE_APP_<no>`, so the class name is what you pass to
Runnable samples are `Z2UI5_CL_SMPS_APP_<no>`, so the class name is what you pass to
`?app_start=`.

Class names are capped at **25** characters, tables at **16**. Both limits and the
Expand Down
24 changes: 12 additions & 12 deletions abaplint.jsonc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"global": {
"files": "/src/**/*.*",
// z2ui5_cl_smpe_evt_tck is a RAP business event handler. Its two
// z2ui5_cl_smps_evt_tck is a RAP business event handler. Its two
// constructs - CLASS ... DEFINITION PUBLIC FOR EVENTS OF <entity> in the
// global class and METHODS ... FOR ENTITY EVENT <evt> FOR <entity>~<evt>
// in the handler pool - have no grammar in abaplint, so the class pool
Expand All @@ -15,8 +15,8 @@
// object_naming and xml_consistency still cover the object. Drop this
// once abaplint parses the RAP event syntax.
"noIssues": [
"z2ui5_cl_smpe_evt_tck\\.clas\\.abap$",
"z2ui5_cl_smpe_evt_tck\\.clas\\.locals_imp\\.abap$"
"z2ui5_cl_smps_evt_tck\\.clas\\.abap$",
"z2ui5_cl_smps_evt_tck\\.clas\\.locals_imp\\.abap$"
]
},
"dependencies": [
Expand Down Expand Up @@ -46,11 +46,11 @@
"line_length": {
"length": 255
},
// Every object carries the EML sample token SMPE behind its type token,
// Every object carries the stack sample token SMPS behind its type token,
// the scheme the samples repository uses with its SMP token:
// Z2UI5_CL_SMPE_<object> classes, including the behavior pools
// Z2UI5_T_SMPE_<object> persistent tables
// Z2UI5_D_SMPE_<object> draft tables
// Z2UI5_CL_SMPS_<object> classes, including the behavior pools
// Z2UI5_T_SMPS_<object> persistent tables
// Z2UI5_D_SMPS_<object> draft tables
// Class names are capped at 25 characters by the leading lookahead. ABAP
// allows 30, but build_rename (see abap2UI5) replaces the namespace
// z2ui5 (5 chars) with up to 9, which costs 4 - so 26 is the hard
Expand All @@ -63,8 +63,8 @@
"object_naming": {
"patternKind": "required",
"severity": "Error",
"clas": "^(?=.{1,25}$)Z2UI5_C(L|X)_SMPE_",
"tabl": "^(?=.{1,16}$)Z2UI5_(T|D)_SMPE_"
"clas": "^(?=.{1,25}$)Z2UI5_C(L|X)_SMPS_",
"tabl": "^(?=.{1,16}$)Z2UI5_(T|D)_SMPS_"
},
// enforces the per object type name length limits of the ABAP repository
"allowed_object_naming": true,
Expand All @@ -73,21 +73,21 @@
"check_include": true,
// see the note at "superclass_final" below
"check_syntax": {
"exclude": ["z2ui5_cl_smpe_app_489(_ws)?\\.clas\\."]
"exclude": ["z2ui5_cl_smps_app_489(_ws)?\\.clas\\."]
},
"global_class": true,
"definitions_top": false,
"implement_methods": true,
"method_implemented_twice": true,
"parser_error": true,
// z2ui5_cl_smpe_app_489_ws inherits from cl_apc_wsp_ext_stateless_base.
// z2ui5_cl_smps_app_489_ws inherits from cl_apc_wsp_ext_stateless_base.
// ABAP Push Channels are on-premise only and therefore absent from
// steampunk-2305-api, the single API dependency of this repository, so
// the superclass cannot be resolved. The class pool then fails to
// activate for abaplint, which is why app_489 - the app driving the
// channel - reports its references to it as unknown as well.
"superclass_final": {
"exclude": ["z2ui5_cl_smpe_app_489_ws\\.clas\\."]
"exclude": ["z2ui5_cl_smps_app_489_ws\\.clas\\."]
},
"unknown_types": true,
"xml_consistency": true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"! clearer written out in the app itself stays in the app - the local
"! ty_s_travel structures for instance, which every app declares with just
"! the fields it actually shows.
CLASS z2ui5_cl_smpe_context DEFINITION PUBLIC FINAL CREATE PRIVATE.
CLASS z2ui5_cl_smps_context DEFINITION PUBLIC FINAL CREATE PRIVATE.

PUBLIC SECTION.

Expand Down Expand Up @@ -61,7 +61,7 @@ CLASS z2ui5_cl_smpe_context DEFINITION PUBLIC FINAL CREATE PRIVATE.
ENDCLASS.


CLASS z2ui5_cl_smpe_context IMPLEMENTATION.
CLASS z2ui5_cl_smps_context IMPLEMENTATION.

METHOD msg_display.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SMPE_CONTEXT</CLSNAME>
<CLSNAME>Z2UI5_CL_SMPS_CONTEXT</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 EML sample - shared context</DESCRIPT>
<STATE>1</STATE>
Expand Down
6 changes: 3 additions & 3 deletions src/01/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@ the sample keeps working.

| Sample | Shows |
|---|---|
| [`315`](z2ui5_cl_smpe_app_315.clas.abap) | two OData models in one view, one table bound to each |
| [`315`](z2ui5_cl_smps_app_315.clas.abap) | two OData models in one view, one table bound to each |

Start it with `?app_start=z2ui5_cl_smpe_app_315`, or from the overview app
`?app_start=z2ui5_cl_smpe_app_00`, which lists every sample of this repository.
Start it with `?app_start=z2ui5_cl_smps_app_315`, or from the overview app
`?app_start=z2ui5_cl_smps_app_00`, which lists every sample of this repository.

`315` attaches **two** models in one view via `cs_event-set_odata_model`, each under
its own name, and binds one table to each: `{TRAVEL>/Currency}` and
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CLASS z2ui5_cl_smpe_app_315 DEFINITION PUBLIC.
CLASS z2ui5_cl_smps_app_315 DEFINITION PUBLIC.

PUBLIC SECTION.
INTERFACES z2ui5_if_app.
Expand All @@ -8,7 +8,7 @@ CLASS z2ui5_cl_smpe_app_315 DEFINITION PUBLIC.
ENDCLASS.


CLASS z2ui5_cl_smpe_app_315 IMPLEMENTATION.
CLASS z2ui5_cl_smps_app_315 IMPLEMENTATION.

METHOD z2ui5_if_app~main.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SMPE_APP_315</CLSNAME>
<CLSNAME>Z2UI5_CL_SMPS_APP_315</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Model - Use OData models</DESCRIPT>
<STATE>1</STATE>
Expand Down
24 changes: 12 additions & 12 deletions src/02/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,18 @@ written in — what they need is the service, not the platform.

| Sample | Shows | Service |
|---|---|---|
| [`313`](z2ui5_cl_smpe_app_313.clas.abap) | SmartFilterBar + SmartTable with variant management | `UI_PRODUCTLIST` |
| [`314`](z2ui5_cl_smpe_app_314.clas.abap) | switch the default model — device, HTTP and OData model side by side | `GWSAMPLE_BASIC` |
| [`319`](z2ui5_cl_smpe_app_319.clas.abap) | SmartMultiInput → an ABAP `SELECT-OPTIONS` range table | `UI_PRODUCTLIST` + value list annotations |
| [`475`](z2ui5_cl_smpe_app_475.clas.abap) | SmartField inside a SmartForm | `GWSAMPLE_BASIC` |
| [`476`](z2ui5_cl_smpe_app_476.clas.abap) | SmartForm, display/edit toggle | `GWSAMPLE_BASIC` |
| [`477`](z2ui5_cl_smpe_app_477.clas.abap) | SmartFilterBar driving a SmartTable | `GWSAMPLE_BASIC` |
| [`478`](z2ui5_cl_smpe_app_478.clas.abap) | page variant management | `GWSAMPLE_BASIC` |
| [`479`](z2ui5_cl_smpe_app_479.clas.abap) | SmartChart with NavigationPopover | an analytical service — you supply it |
| [`493`](z2ui5_cl_smpe_app_493.clas.abap) | classic FilterBar wired to variant management | none — the data is ABAP |

Start any of them with `?app_start=z2ui5_cl_smpe_app_<no>`, or from the overview
app `?app_start=z2ui5_cl_smpe_app_00`, which lists every sample of this repository.
| [`313`](z2ui5_cl_smps_app_313.clas.abap) | SmartFilterBar + SmartTable with variant management | `UI_PRODUCTLIST` |
| [`314`](z2ui5_cl_smps_app_314.clas.abap) | switch the default model — device, HTTP and OData model side by side | `GWSAMPLE_BASIC` |
| [`319`](z2ui5_cl_smps_app_319.clas.abap) | SmartMultiInput → an ABAP `SELECT-OPTIONS` range table | `UI_PRODUCTLIST` + value list annotations |
| [`475`](z2ui5_cl_smps_app_475.clas.abap) | SmartField inside a SmartForm | `GWSAMPLE_BASIC` |
| [`476`](z2ui5_cl_smps_app_476.clas.abap) | SmartForm, display/edit toggle | `GWSAMPLE_BASIC` |
| [`477`](z2ui5_cl_smps_app_477.clas.abap) | SmartFilterBar driving a SmartTable | `GWSAMPLE_BASIC` |
| [`478`](z2ui5_cl_smps_app_478.clas.abap) | page variant management | `GWSAMPLE_BASIC` |
| [`479`](z2ui5_cl_smps_app_479.clas.abap) | SmartChart with NavigationPopover | an analytical service — you supply it |
| [`493`](z2ui5_cl_smps_app_493.clas.abap) | classic FilterBar wired to variant management | none — the data is ABAP |

Start any of them with `?app_start=z2ui5_cl_smps_app_<no>`, or from the overview
app `?app_start=z2ui5_cl_smps_app_00`, which lists every sample of this repository.

## Two worth a closer look

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CLASS z2ui5_cl_smpe_app_313 DEFINITION PUBLIC.
CLASS z2ui5_cl_smps_app_313 DEFINITION PUBLIC.

PUBLIC SECTION.
INTERFACES z2ui5_if_app.
Expand All @@ -24,7 +24,7 @@ CLASS z2ui5_cl_smpe_app_313 DEFINITION PUBLIC.
ENDCLASS.


CLASS z2ui5_cl_smpe_app_313 IMPLEMENTATION.
CLASS z2ui5_cl_smps_app_313 IMPLEMENTATION.

METHOD z2ui5_if_app~main.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SMPE_APP_313</CLSNAME>
<CLSNAME>Z2UI5_CL_SMPS_APP_313</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Smart Controls - Smart Table and Variants</DESCRIPT>
<STATE>1</STATE>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CLASS z2ui5_cl_smpe_app_314 DEFINITION PUBLIC.
CLASS z2ui5_cl_smps_app_314 DEFINITION PUBLIC.

PUBLIC SECTION.
INTERFACES z2ui5_if_app.
Expand All @@ -23,7 +23,7 @@ CLASS z2ui5_cl_smpe_app_314 DEFINITION PUBLIC.
ENDCLASS.


CLASS z2ui5_cl_smpe_app_314 IMPLEMENTATION.
CLASS z2ui5_cl_smps_app_314 IMPLEMENTATION.

METHOD z2ui5_if_app~main.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SMPE_APP_314</CLSNAME>
<CLSNAME>Z2UI5_CL_SMPS_APP_314</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Smart Controls - Switch Default Model</DESCRIPT>
<STATE>1</STATE>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"!
"! Needs SAPUI5 (sap.ui.comp is SAPUI5-only) and a reachable, value-list-annotated
"! OData V2 service - see the OData service block in on_init.
CLASS z2ui5_cl_smpe_app_319 DEFINITION PUBLIC.
CLASS z2ui5_cl_smps_app_319 DEFINITION PUBLIC.

PUBLIC SECTION.
INTERFACES z2ui5_if_app.
Expand Down Expand Up @@ -75,7 +75,7 @@ CLASS z2ui5_cl_smpe_app_319 DEFINITION PUBLIC.
ENDCLASS.


CLASS z2ui5_cl_smpe_app_319 IMPLEMENTATION.
CLASS z2ui5_cl_smps_app_319 IMPLEMENTATION.

METHOD z2ui5_if_app~main.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SMPE_APP_319</CLSNAME>
<CLSNAME>Z2UI5_CL_SMPS_APP_319</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Smart Controls - Smart Multi Input</DESCRIPT>
<STATE>1</STATE>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CLASS z2ui5_cl_smpe_app_475 DEFINITION PUBLIC.
CLASS z2ui5_cl_smps_app_475 DEFINITION PUBLIC.

PUBLIC SECTION.
INTERFACES z2ui5_if_app.
Expand All @@ -15,7 +15,7 @@ CLASS z2ui5_cl_smpe_app_475 DEFINITION PUBLIC.
ENDCLASS.


CLASS z2ui5_cl_smpe_app_475 IMPLEMENTATION.
CLASS z2ui5_cl_smps_app_475 IMPLEMENTATION.

METHOD z2ui5_if_app~main.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SMPE_APP_475</CLSNAME>
<CLSNAME>Z2UI5_CL_SMPS_APP_475</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Smart Controls - SmartField in a SmartForm</DESCRIPT>
<STATE>1</STATE>
Expand Down
Loading