abap-cloud-gui
A report-style programming model for abap2UI5abap2UI5One ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.community org, abap: one class produces a selection screen with a WRITE list or an ALV grid, running as a UI5 app on ABAP Cloud as well as on NetWeaver 7.02.
ABAP Cloud has no SAP GUI, so no selection screen and no CL_SALV_TABLE: a quick report that took ten minutes on premise needs RAP and a Fiori app. This addon keeps the classic programming model instead. A class inherits from z2ui5_cl_cgui_report, the selection screen fields are PUBLIC attributes, and initialization, start_of_selection, at_line_selection and at_user_command are methods of those names, with write( ), alv( ), message( ) and popup_to_confirm( ) as calls. What runs is an abap2UI5abap2UI5One ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.community org, abap app: selection variants and ALV layouts in the two tables it installs, standard F4 from domain fixed values, the range popup of a select-option, and classic message semantics collected in a message popover. Reports that exist already are converted by report2cloud, a Node tool in the repository that parses with abaplintabaplintStatic analysis for ABAP that runs outside a system on serialised source in a repository, so ABAP checks run in a pull request and in CI before the code ever reaches a system.community org, abap and writes the class beside a migration report of the refusals and the objects to check for ABAP Cloud. Nothing of it is tooling on the stack: the classes with two interfaces and two tables are ABAP Cloud ready and downportable to 7.02, and install with abapGitabapGitA Git client written in ABAP that runs inside the system, so objects are cloned, pulled and pushed without leaving it; with no package manager in ABAP, a cloned repository is how code is distributed.community org, abap after abap2UI5 and the org's popups addon, which supplies the value helps and confirmation popups.
Facts
Where it sits
Who is behind it
In the atlas: maintains 21@abap2UI5-addonsmaintaineroblomov-devContributes to this
In the atlas: maintains 4, contributes to 44@oblomov-dev1 contributor
Before choosing this
Conditions
PracticalFunctional boundary
Not a way to run existing reports unchanged: a report is rewritten as a class, and CALL SCREEN, dynpro modules, batch input, SUBMIT and native SQL are refused by the converter rather than mapped. Not an SAP GUI in the browser either: the programming model is classic and the screens are UI5, and the README points at abap2UI5-addons/sapgui for SE16N or SM37. Output has gaps the README names — ALV cells show dates and times as the model carries them rather than in the user's format, print is a text file because ABAP Cloud has no spool, and value tables for F4 are read on premise only.
What it declares
Every artifact
- Type
- Package
- Origin
- Independently maintained
As a package
- Where it runs
- does not say
- Distributed through
- abapGit
Connections
Whether code can run in ABAP Cloud, and what to do when it cannot
Producing a web user interface from ABAP code
UI5 apps written as one ABAP class, rendered by a generic shell
Git client written in ABAP that runs inside the system
Download
README
quoted from abap2UI5-addons/abap-cloud-gui under MIT, readabap-cloud-gui
Try the report converter in the browser
Write abap2UI5 apps the way you write a classic ABAP report. Selection
screen, WRITE list, ALV grid, START-OF-SELECTION, AT LINE-SELECTION,
MESSAGE - the same concepts, running as a UI5 app in the browser. On ABAP
Cloud as well as on NetWeaver down to 7.02.
Part of abap2UI5-addons - addons and apps for abap2UI5, installed with abapGit.
Why
ABAP Cloud has no SAP GUI: no selection screens, no WRITE lists, no
CL_SALV_TABLE. A quick report that took ten minutes on premise suddenly
needs RAP, CDS and a Fiori app. And writing UI5 views by hand means learning
a new UI model first.
abap-cloud-gui closes that gap. You write a class that looks and reads like a
report - parameters, event blocks, write( ) - and get a UI5 app with a
selection screen, a result list or ALV grid, drilldown, value helps and
messages. No UI5 knowledge, no CDS, no RAP needed.
Good for:
- ABAP developers on ABAP Cloud who need a quick report or tool.
- Moving reports to ABAP Cloud - the event blocks and output statements map to methods with matching names, so a report keeps its structure.
- Starting with abap2UI5 in familiar terms before building views yourself.
What it is not:
- Not a way to run existing reports unchanged. A report is rewritten as a
class: event blocks become methods,
PARAMETERSbecome attributes,WRITEbecomeswrite( ). The structure stays, the syntax changes - report2cloud does most of it. - Not a SAP GUI clone. It uses the classic programming model, the screens look like modern UI5. If you are looking for SE80, SE16N or SM37 in the browser, that is abap2UI5-addons/sapgui.
Installation
Requirements
- ABAP Cloud (BTP ABAP Environment, S/4HANA Cloud) or Standard ABAP 7.50 or higher; NetWeaver 7.02 with a downported copy (see Compatibility)
- abap2UI5
- abap2UI5-addons/popups - the value helps and confirmation popups
Steps - with abapGit, in this order:
- abap2UI5
- abap2UI5-addons/popups
- this repository (branch
main) - classes, two interfaces and the two tablesZ2UI5_CGUI_VAR/Z2UI5_CGUI_LAY; nothing else to set up
Start - run a sample like any abap2UI5 app, e.g.
?app_start=z2ui5_cl_cgui_sample_05 for a complete report.
Quick start
Write your first report:
CLASS zcl_hello DEFINITION PUBLIC INHERITING FROM z2ui5_cl_cgui_report FINAL CREATE PUBLIC.
PUBLIC SECTION.
DATA p_name TYPE string.
DATA p_times TYPE i.
PROTECTED SECTION.
METHODS selection_screen REDEFINITION.
METHODS start_of_selection REDEFINITION.
ENDCLASS.
CLASS zcl_hello IMPLEMENTATION.
METHOD selection_screen.
screen->parameter( val = p_name text = `Your name` obligatory = abap_true
)->parameter( val = p_times text = `Lines` ).
ENDMETHOD.
METHOD start_of_selection.
write( |Hello { p_name }!| )->uline( ).
DO p_times TIMES.
write( |Line { sy-index }| )->new_line( ).
ENDDO.
ENDMETHOD.
ENDCLASS.
Start it like any abap2UI5 app (?app_start=zcl_hello): the selection screen
comes up, Execute runs the report and shows the list, Back returns to
the selection screen. For more, run the samples below — z2ui5_cl_cgui_sample_05
is a complete report.
What is there
| Class | Classic counterpart |
|---|---|
z2ui5_cl_cgui_report | the report itself — INITIALIZATION, AT SELECTION-SCREEN OUTPUT, AT SELECTION-SCREEN ON field, AT SELECTION-SCREEN, START-OF-SELECTION, AT LINE-SELECTION, AT USER-COMMAND, AT SELECTION-SCREEN ON VALUE-REQUEST, MESSAGE, POPUP_TO_CONFIRM |
z2ui5_cl_cgui_selscreen | PARAMETERS, SELECT-OPTIONS, SELECTION-SCREEN BEGIN OF BLOCK / LINE, COMMENT, PUSHBUTTON, AS CHECKBOX, RADIOBUTTON GROUP, OBLIGATORY, NO-DISPLAY, MODIF ID, USER-COMMAND, LOOP AT SCREEN / MODIFY SCREEN, F4 and the multiple selection of a select-option |
z2ui5_cl_cgui_list | WRITE, NEW-LINE, SKIP, ULINE, NEW-PAGE, FORMAT COLOR, HOTSPOT, HIDE, AS CHECKBOX, AS ICON |
z2ui5_cl_cgui_alv | CL_SALV_TABLE — columns and headers from RTTI/DDIC, sort, filter, double click |
z2ui5_cl_cgui_tree | CL_SALV_TREE — an ALV tree with lazy nodes and checkboxes |
z2ui5_cl_cgui_variant | selection variants — get, save, delete, start with a variant |
z2ui5_cl_cgui_variant_db | the server store of the selection variants — table Z2UI5_CGUI_VAR, shared and protected variants |
z2ui5_cl_cgui_layout, z2ui5_cl_cgui_layout_db | the ALV layout dialog and the store of the layouts — table Z2UI5_CGUI_LAY, shared, protected and a default per user |
z2ui5_cl_cgui_context | helpers — among them range_check( ), the IN of a select-option for internal tables |
Everything is ABAP Cloud ready, transpilable to Node and downportable to 7.02: classes, two interfaces, the two tables with their data elements - no programs, no tooling on the stack. Reports are converted with report2cloud, which runs in Node.
All views are built with z2ui5_cl_ui5_view_builder. The selection screen,
the list and the ALV can also be used on their own inside any abap2UI5 app:
each has render( ) to append itself to a view and stringify( ) to return
a complete view.
The report runtime
Inherit from z2ui5_cl_cgui_report, declare the selection screen fields as
PUBLIC attributes and redefine the event blocks you need:
| Method | When it runs |
|---|---|
initialization | once, before the selection screen is shown — set defaults here |
selection_screen( screen ) | every time the selection screen is shown — the layout |
at_selection_screen_output( screen ) | right after selection_screen — hide fields, make them read-only or required |
at_selection_screen_on( field ) | after Execute, once per field shown — message( type = 'E' ) marks the field and stops |
at_selection_screen | after Execute — message( type = 'E' ) keeps the user on the selection screen |
start_of_selection | read the data, output it with write( ) or alv( ) |
top_of_page | when the list of a run gets its first line, before it — the page header |
at_line_selection( row hide ) | a hotspot of the list or a row of the ALV was clicked |
at_user_command( ucomm ) | a button of the selection screen, a checkbox or radio button group with user_command, or a confirmed popup_to_confirm( ) |
at_value_request( field ) | F4 on a field — the default is the standard F4 of its DDIC type; redefine it for your own and call super-> for the rest |
Messages follow the classic semantics — S as a toast, I as a box, E
stops the run — and every message of a run but S is collected in the
message popover: a button at the left of the footer counts them, in red
for an error, and W and E open the popover by themselves. A message that
belongs to a field — raised in at_selection_screen_on( ), or with
message( field = 'P_QTY' ) — marks that field with its text, names it in
the popover, and a click on it puts the cursor into the field. Fields
declared obligatory are checked before at_selection_screen, each empty
one with a message of its own.
A dynamic selection screen
MODIF ID, USER-COMMAND and LOOP AT SCREEN work as in a classic report:
a radio button group or a checkbox with user_command runs
at_user_command( ) as soon as the user changes it, and the selection screen
is built anew — at_selection_screen_output( ) included.
METHOD selection_screen.
screen->radiobutton( val = p_disp text = `Display` group = `MODE` user_command = `MODE`
)->radiobutton( val = p_create text = `Create` group = `MODE`
)->parameter( val = p_matnr text = `Material` modif_id = `DIS`
)->parameter( val = p_name text = `Description` modif_id = `CRE` ).
ENDMETHOD.
METHOD at_selection_screen_output.
DATA(lt_screen) = screen->loop_at_screen( ).
LOOP AT lt_screen INTO DATA(ls_screen).
CASE ls_screen-group1.
WHEN `DIS`. ls_screen-active = p_disp.
WHEN `CRE`. ls_screen-active = p_create.
ENDCASE.
screen->modify_screen( ls_screen ).
ENDLOOP.
ENDMETHOD.
A line of loop_at_screen( ) has name, group1, active, input,
required and invisible — as abap_bool, not '0' / '1'. active hides
the field with its label (a block with no field left disappears), input
makes it read-only, required obligatory, invisible masks the input like a
password.
Value helps
Every parameter and select-option whose DDIC type has a standard F4 gets it
without code: the fixed values of the domain, or — on premise — its
value table. Fields declared with value_help = abap_true get F4 too and
are answered in at_value_request( ), with any table:
METHOD at_value_request.
CASE field.
WHEN `P_CARRID` OR `S_CARRID`.
value_help_popup( tab = lt_carrier col = `CARRID` title = `Airlines` ).
WHEN OTHERS.
super->at_value_request( field ). " the standard F4
ENDCASE.
ENDMETHOD.
On a select-option F4 picks any number of values, which become lines
I EQ — the ones already selected come up checked. A button beside the
field opens the range popup, the classic multiple selection, for every
other condition.
Selection variants
The footer of every selection screen has Get Variant, Save as
Variant and Delete Variant: a variant keeps every field of the screen
— parameters, select-options with all their lines, hidden NO-DISPLAY
fields — under a name, and the list of variants shows what each one holds.
A report starts with a variant through the URL (&variant=Q1) or from
initialization( ):
METHOD initialization.
set_variant( `DEFAULT` ). " if the user saved one - silently skipped if not
ENDMETHOD.
The variants are kept in table Z2UI5_CGUI_VAR
(z2ui5_cl_cgui_variant_db), one namespace per report class — nothing to
set up, on ABAP Cloud as on premise: shared with all users, protected against
changes of others, one owner each. A store of your own - another table, a
RAP business object - implements z2ui5_if_cgui_variant_store (load, save,
delete, check_sharing) and is set with set_variant_store( store ) in
initialization( ). set_variant_store( ) without a store keeps the
variants in the browser's local storage instead - per browser and device,
another device starts without them:
METHOD initialization.
set_variant_store( ). " the browser's local storage, no table
ENDMETHOD.
ALV layouts
The layout button of every ALV opens the classic "Change Layout": the
columns shown and their order, sort, totals and subtotals. A layout is saved
under a name, shared with all users or protected when wanted, and one of
them is the user's default - the report starts with it. They are kept in
table Z2UI5_CGUI_LAY (z2ui5_cl_cgui_layout_db), one namespace per report
class and ALV. A store of your own implements z2ui5_if_cgui_layout_store
and is set with set_layout_store( store ) in initialization( );
set_layout_store( ) without a store keeps the layouts with the selection
variants.
Output to keep
Export writes the ALV as CSV or as an Excel file (Office Open XML, zipped
with CL_ABAP_ZIP - no CL_SALV_TABLE), Print hands the list to the
browser as a text file - ABAP Cloud has no spool. There is no "Execute in
Background" button: a report runs without a browser through
cgui_run_in_background( ), e.g. in an application job of your own.
Samples
| Class | Shows |
|---|---|
z2ui5_cl_cgui_sample_01 | the selection screen on its own — every field type, blocks, a line, a button |
z2ui5_cl_cgui_sample_02 | the list on its own — colors, checkbox, icon, pages, hotspots with HIDE |
z2ui5_cl_cgui_sample_03 | the ALV on its own — column texts, a hidden column, row click |
z2ui5_cl_cgui_sample_04 | the smallest report — hello world |
z2ui5_cl_cgui_sample_05 | a complete report — select-option, F4 help, radio buttons for ALV or list, drilldown, reset with a confirmation popup, starts with the variant DEFAULT |
z2ui5_cl_cgui_sample_06 | a dynamic selection screen — MODIF ID, USER-COMMAND, LOOP AT SCREEN, read-only and password fields, NO-DISPLAY, AT SELECTION-SCREEN ON field |
z2ui5_cl_cgui_sample_07 | value helps — standard F4 from domain fixed values and value table, own F4 for a parameter and a select-option |
z2ui5_cl_cgui_sample_11 | a dynpro — CALL SCREEN, PBO with status and LOOP AT SCREEN, PAI with a push button, LEAVE TO SCREEN 0 and the list after the screen |
The converted reports: src/03
src/03 holds report classes as report2cloud writes them - the reports of
its test corpus (tools/report2cloud/test/corpus) converted, not touched by
hand: the test set to pull onto a system and run, ?app_start=z2ui5_cl_cgui_r2c_01
and so on. Only the reports that need nothing ABAP Cloud lacks are in it
(no SFLIGHT, SPFLI, SCARR - those convert too, see the snapshots), so the
repository installs on every target. The converter test keeps src/03 equal
to the conversion; UPDATE_SNAPSHOTS=1 npm run test:report2cloud writes it
anew.
| Class | Report |
|---|---|
z2ui5_cl_cgui_r2c_01 | zr2c_01_hello - The smallest report |
z2ui5_cl_cgui_r2c_03 | zr2c_03_forms - An order simulation in FORMs |
z2ui5_cl_cgui_r2c_06 | zr2c_06_dynamic - A dynamic selection screen |
z2ui5_cl_cgui_r2c_08 | zr2c_08_listformat - The list statements |
z2ui5_cl_cgui_r2c_09 | zr2c_09_localclass - A report with local classes |
z2ui5_cl_cgui_r2c_11 | zr2c_11_legacy - Older statements |
z2ui5_cl_cgui_r2c_12 | zr2c_12_pages - Pages of a list - LINE-COUNT, TOP-OF-PAGE with the page number |
z2ui5_cl_cgui_r2c_13 | zr2c_13_includes - A report in three pieces, as a grown one is |
z2ui5_cl_cgui_r2c_22 | zr2c_22_files - The files of the user |
z2ui5_cl_cgui_r2c_23 | zr2c_23_dynpro - A dynpro of fields |
z2ui5_cl_cgui_r2c_25 | zr2c_25_textedit - Notes of an airline on a dynpro with two SAP GUI controls |
z2ui5_cl_cgui_r2c_26 | zr2c_26_events - The events of SAP GUI controls, handled by a local class |
z2ui5_cl_cgui_r2c_28 | zr2c_28_browser - A price list as an HTML page |
z2ui5_cl_cgui_r2c_29 | zr2c_29_demooutput - A small inventory written with cl_demo_output |
z2ui5_cl_cgui_r2c_30 | zr2c_30_salvcolumns - Exam results in a CL_SALV_TABLE grid, every column header its name and its text |
z2ui5_cl_cgui_r2c_31 | zr2c_31_toolbar - A toolbar and an HTML viewer on the screen itself |
z2ui5_cl_cgui_r2c_32 | zr2c_32_xmlpopup - An order as XML in a window of its own |
z2ui5_cl_cgui_r2c_33 | zr2c_33_strings - A name split into its parts and rebuilt |
z2ui5_cl_cgui_r2c_34 | zr2c_34_controllevels - Sales per region and month with the classic control levels |
z2ui5_cl_cgui_r2c_35 | zr2c_35_dates - Dates of a project |
z2ui5_cl_cgui_r2c_36 | zr2c_36_ranges - A product list filtered with select-options on local data |
z2ui5_cl_cgui_r2c_37 | zr2c_37_expressions - The constructor expressions of a team roster |
z2ui5_cl_cgui_r2c_38 | zr2c_38_confirm - Cleaning up a to-do list |
z2ui5_cl_cgui_r2c_39 | zr2c_39_textedit - A note editor on the screen itself |
z2ui5_cl_cgui_r2c_40 | zr2c_40_sapevent - A menu as an HTML page on the screen |
Converting existing reports: report2cloud
A report that exists already does not have to be rewritten by hand.
tools/report2cloud converts a classic
report into a report class of this addon - PARAMETERS and
SELECT-OPTIONS into attributes and selection_screen( ), the event blocks
into the methods of the same name, WRITE / FORMAT / HIDE into the list,
CL_SALV_TABLE and REUSE_ALV_GRID_DISPLAY into alv( ), MESSAGE into
message( ), FORMs into methods:
npm ci
npm run report2cloud -- zflights.prog.abap --out src/02
The includes of a report are read from beside it, as abapGit writes them,
and macros are expanded at their calls. It is deterministic and refuses
rather than guesses: what has no counterpart in a browser app (CALL SCREEN,
dynpro modules, batch input, SUBMIT, native SQL) is reported with file,
line and column. npm run report2cloud:coverage -- <dir> converts a whole
folder of reports in memory and says how many convert and what stops the
rest - the measurement the roadmap below is ordered by. Next to the class it writes a
migration report - the TODOs, and the tables and APIs that are not released on
ABAP Cloud, with their successors as hints: the work list for a person or an
AI model, checked with abaplint's ABAP Cloud rules, the abap2UI5 linter and
unit tests.
report2cloud is the generator of this repository: there is no converter or painter on the stack any more, the conversion runs in Node, on the reports of an abapGit export.
Compatibility
- ABAP Cloud and Standard ABAP; NW 7.02 through a downport — the source is written in 7.50 syntax and every release is checked in CI (see below).
- UI5 1.71 is the floor, as for abap2UI5 itself.
- The views and the report flow have been driven end to end in the transpiled abap2UI5 backend (Node.js) in a headless browser.
Known limitations:
- ALV cells show dates and times as the model carries them (
2026-01-05), not in the user's format yet. - In the transpiled JavaScript runtime,
INonly knowsI EQ,E EQandI CP— usez2ui5_cl_cgui_context=>range_check( )for internal tables if the report must also run there. On an SAP systemINandSELECT ... WHERE ... INwork as usual. WRITE ... CURRENCYtakes the decimals of the currency from ISO 4217,UNITformats the number as it is —TCURXandT006are not released on ABAP Cloud. Print is a text file, not a spool request.- Value tables are read on premise only — on ABAP Cloud the DDIC is not read, and the standard F4 is the domain's fixed values.
alv( )binds a PUBLIC attribute directly; any other table is copied into a data reference, which the draft has to rebuild with RTTI on every roundtrip.
Roadmap
Done
- Phase 0 — cleanup:
z2ui5_cl_cguiprefix, packages01core /02samples, CI for v750, ABAP Cloud and 7.02, abap2UI5-linter, unit tests - Phase 1 — report runtime: event blocks, selection screen ↔ output, Execute / Back
- Phase 2 — selection screen: parameters by type, checkbox, radio button
groups, blocks, lines, comments, push buttons, select-options with the
range popup,
OBLIGATORY, F4 throughat_value_request; fields are found by reference,select_option( )needs no name - Phase 3 — output: ALV grid (RTTI/DDIC columns, sort, filter, row click),
WRITElist (colors, icons, checkboxes, pages, hotspots,HIDE) - Phase 4 — messages with classic semantics,
POPUP_TO_CONFIRM - Phase 5 — dynamic selection screen:
AT SELECTION-SCREEN OUTPUTwithLOOP AT SCREEN/MODIFY SCREEN(hide, read-only, required, invisible),MODIF ID,USER-COMMANDat checkboxes and radio button groups,NO-DISPLAY,AT SELECTION-SCREEN ON fieldand messages with the value state on their field; unit tests for the selection screen - Phase 6 — value helps: standard F4 from domain fixed values (ABAP Cloud and on premise) and value tables (on premise), automatic for every DDIC-typed field; F4 with multiple selection on select-options, preselected, the range popup on a button of its own
- Phase 7 — selection variants: get, save as, delete, start with a
variant from the URL or
set_variant( ), kept in the browser's local storage - Phase 8 — selection screen painter (since replaced by report2cloud: reports and classes are generated in Node, not on the stack)
- Phase 9 — message popover: the messages of a run in one place, counted in the footer, opened by W and E, each message of a field leading to the field; one message per empty required field
Next
The order is the measurement's: report2cloud:coverage over a corpus of
real reports says which construct stops the most of them, and that construct
is next. Every stage is a release of its own.
Stage 0 - release, and the number to move
- A release of this addon with report2cloud and the MCP server's
migrate_report; the documentation's preview note goes - A corpus of real reports: the open-source ABAP of the web, converted
weekly (
report2cloud:web), the share that converts without a refusal and the refusals ranked in the job summary - the number every stage below is measured by - The share of the web corpus that starts in the transpiled runtime:
report2cloud:web --startchecks, builds and starts the converted reports weekly, the funnel and where they stopped in the job summary (first run: 74 of 596 converted reports start, 82 with the upload dialog ofGUI_UPLOADandcl_demo_output; most of the others read a class or table of their repository the sparse clone lacks) - A site with the converter in the browser - GitHub Pages, the
playground converts a pasted report on the page (
npm run site) -
report2cloud:coverage- the measurement over a folder of reports - Includes inlined from beside the report, macros expanded
Stage 1 - the converter: the constructs that stop the most reports
- Tables with a header line (
OCCURS,WITH HEADER LINE) rewritten into a table and a work area - mechanical, and in every report older than 7.0 -
SUBMIT ... AND RETURNandCALL SELECTION-SCREEN: the called report converted with the caller and started withsubmit( ), itsWITHvalues handed over; a screen of the report's own as a dialog, the statements after the call continued inafter_call_selection_screen( )- reports call reports - The synchronous popups (
POPUP_TO_CONFIRM,POPUP_TO_CONFIRM_STEP,POPUP_TO_DECIDE,POPUP_GET_VALUES): the event block cut at the call, the rest continued inat_user_command( )- the one transformation that changes a block's shape, and the one in every report that posts something -
SET PF-STATUS,SET TITLEBAR,AT PFnnasset_pf_status( ), toolbar functions and the keyboard shortcuts of the runtime - the status read from the<CUA>of the.prog.xml - Secondary lists (
sy-lsind) andWRITE ATpositions, in a column mode of the list (every item of a line with a position in a box of its width in characters) - the evaluations that live by the column -
cl_gui_alv_gridin a container with its simple handlers (hotspot, double click, toolbar, user command) asalv( ), the screen's PBO and PAI modules resolved - the ALV every report since 2005 is written with -
AT SELECTION-SCREEN ON HELP-REQUEST,SELECTION-SCREEN FUNCTION KEY,TABBED BLOCKandBEGIN OF SCREEN(AS WINDOWandAS SUBSCREEN) on the runtime's own counterparts - A documentation page per refusal: why, and the rewrite that unblocks it (tools/report2cloud/docs/refusals.md, linked from every refusal of the migration report)
Stage 2 - the runtime: what a report's user sees
Selection screen
- Value helps: CDS value helps (
@Consumption.valueHelpDefinition), text tables beside value tables, search helps, F4 inside the range popup of a select-option -
AT SELECTION-SCREEN ON BLOCK,ON RADIOBUTTON GROUP,AS LISTBOX -
MEMORY ID - A phone layout of the selection screen
- Selection variants on the server (table
Z2UI5_CGUI_VAR): shared and protected variants, a pluggable store beside the browser's local storage, dynamic date values
Output
- ALV: Excel export (Office Open XML), layouts on the server (table
Z2UI5_CGUI_LAY, shared, protected, a default per user) - ALV: user-formatted dates, times and amounts, totals and subtotals, hotspot per column, toolbar with own functions, editable cells
- ALV: a chart over the grid - the columns as series, the layout's sort and filter applied
- List:
WRITE ATpositions andUNDER, columns that line up (every item of a positioned line in a box of its width), secondary lists (sy-lsind,set_lsind( )) - Print as PDF; "Execute in background" as an application job with the list as a file or a mail
Messages and logging
- Short API in the style of abap2UI5:
_msg( )->e( ),_msg_box( )->e( ) - Application log (BAL) and ABAP Logger as a source for the message popover and a log popup; the internal message table is replaced by the log
Dialogs and screens
- Popups:
_popup( )->decide(POPUP_TO_DECIDE),POPUP_GET_VALUES, transport request selection (from abap2UI5-addons/popups) -
CALL SCREENand back, also of a screen in another class -
CALL SELECTION-SCREENof another report, as a popup or by screen number
Navigation and transactions
- Launchpad tiles and intent navigation for a converted class
- Command field instead of a plain input: transaction codes,
/n,/o - Command palette (
Cmd+K/Ctrl+K) to search and start reports - Input history: the last entries of a field, opened with the space bar
- Keyboard shortcuts: F8 Execute, F3 Back,
AT PFnnand the function keys of a GUI status (set_pf_status( shortcuts = )) - Transaction logic: start with a variant, prefill the last entries, create a draft
-
SET/GET PARAMETER IDwith user parameters (like SU3), system parameters and customizing parameters
Stage 3 - clean core at the scale of a code base
- A
SELECTfrom a table with a known released successor rewritten, field names included, where the mapping is certain; a typed wrapper stub for an unreleased function module, for a person to fill - ATC findings in the migration report
- A whole package or transport converted in one run: the dependency
graph over
SUBMITandPERFORM ... IN PROGRAM, one coverage table for the estate, the refusals ranked across it
Stage 4 - in the browser, and with an agent
- The converter in the abap2UI5 playground: drop a
.prog.abapinto the AI Studio, the class runs on the stage, the refusals are the model's work list - nothing to install -
migrate_reportin the MCP server with the class deployed into the sandbox and its first screen answered - An evaluation harness for the AI loop: a model works the migration reports of the corpus, and the share that ends clean is measured
Stage 5 - research
- Simple dynpros: the screens of fields of the .prog.xml (texts,
inputs, checkboxes, radio buttons, frames, push buttons) built with
the selection-screen builder in
dynpro_screen( ), the modules methods called bydynpro_pbo( )/dynpro_pai( ),CALL SCREEN,SET SCREEN,LEAVE TO SCREENand the statements after the call inafter_call_screen( ) - The SAP GUI controls of a custom control area or a docking container:
the containers, the text editor and the HTML viewer as stand-ins of the
same methods (
z2ui5_cl_cgui_gui*), in a local class too - Their events: the toolbar (
function_selected,dropdown_clicked), the SAPEVENT links of the HTML viewer, the close of a dialog box -SET HANDLERasset_handler( )of the stand-in - The grid in a local class: the stand-in
z2ui5_cl_cgui_gui_alv_grid, the ALV of the report in its container, with its toolbar, user command, double click and hotspot - Controls on the screen itself (
cl_gui_container=>default_screen): toolbar, text editor and HTML viewer above the list of the run, no dynpro needed;cl_abap_browseras the stand-inz2ui5_cl_cgui_abap_browser; the loop over the columns of a SALV grid; static event handlers of a local class -
cl_demo_output(in 72 reports of the web corpus): the stand-inz2ui5_cl_cgui_demo_outputwrites into the list - values, structures and tables as columns, sections as headings - More than one grid, F1 of the editor, the tree and the picture; table controls, subscreens and tabstrips on a dynpro
Quality, through every stage
- Tests for the report runtime and the ALV with a client test double (the selection screen has them), samples in the abap2UI5 playground, documentation page
- Semantic tests: the classic report and its class driven against the same seeded rows in the transpiled runtime, their lists compared
Later
- Tree lists
Development
npm ci
npm run lint # abaplint, v750 syntax + downport rule
npm run check:cloud # abaplint, ABAP Cloud
npm run check:702 # downport a scratch copy to 7.02 and check it
npm run check:abap2ui5 # abap2UI5-linter over apps and views
npm run check:regex # no regular expressions in src/
npm run unit # ABAP Unit in the transpiled backend (needs ../mcp-server and .deps/popups)
npm run test:report2cloud # the report converter: snapshots and abaplint over its output
npm run site # the GitHub Pages site with the converter playground into build/site (-- --serve: on :8080)
The ABAP Unit tests run in CI in the transpiled abap2UI5 backend
(.github/workflows/unit.yaml, scripts/unit.mjs with
abap2UI5/mcp-server as a library),
the tables of the two stores in SQLite.
Contributing
Issues and pull requests are welcome. Read AGENTS.md first - it holds the layout, the release targets and the rules of this repository.
License
MIT - see LICENSE.
Others providing
- abap2UI5-localabap2UI5-localThe whole abap2UI5 framework folded into the local classes of one HTTP handler, so an app runs without the framework installed as a package.community org, abapabap2UI5 folded into the local classes of one HTTP handlerfrom ABAP
- abap2UI5abap2UI5One ABAP class implementing z2ui5_if_app is the whole app: the browser loads a generic UI5 shell once, and every interaction after that is an HTTP roundtrip back into ABAP.community org, abapUI5 apps written as one ABAP class, rendered by a generic shellfrom ABAP
- custom-controlscustom-controlsThirteen custom controls for abap2UI5, a signature pad and a scanner that reads several barcodes at once among them, each one an ABAP builder class with a single render( ) method and all of them shipped in a BSP of their own.community org, abapThirteen custom UI5 controls for abap2UI5 appsfrom ABAP
- http-connectorhttp-connectorAn add-on that makes the abap2UI5 apps of one ABAP system reachable through another: a thin ICF handler on the consumer system forwards every roundtrip to the source system through an SM59 destination.community org, abapForwards abap2UI5 roundtrips to another system over HTTPfrom ABAP
- layout-managementlayout-managementAn abap2UI5 addon that renders an internal table or a structure as a UI5 table or form with a settings popup, where the user lays it out and saves the result as a layout variant.independent, abapTable and form layouts with saved variants for abap2UI5from ABAP
- abap2UI5 for Excelabap2UI5 for ExcelAn Office add-in that runs an abap2UI5 app in Excel's task pane, where the app reads and writes the workbook through the z2ui5.cc.ExcelBridge control.community org, abapOffice add-in running an abap2UI5 app in Excel's task panefrom ABAP
- abap2UI5-addons/popupsabap2UI5-addons/popupsReady-made dialogs for an abap2UI5 app: confirm, inform, select from a list, file up- and download, table, text edit, PDF, HTML, messages, range, value help and search help, each opened with one factory( ) call.community org, abapReady-made dialogs for abap2UI5 appsfrom ABAP
- rap-extrap-extFloorplan classes that read a CDS entity's UI annotations at runtime and render a list report, worklist, tree, object page, overview page, value help or action dialog as an abap2UI5 app.community org, abapFloorplans rendered from CDS UI annotations as abap2UI5 appsfrom ABAP
- selection-screenselection-screenSelect-options with saved variants for an abap2UI5 app, built from a database table name or from an internal table the app passes in.independent, abapSelect-options with saved variants for abap2UI5 appsfrom ABAP
- abap2UI5 frontend-webcomponentabap2UI5 frontend-webcomponentAn alternative abap2UI5 frontend: one ES module registering <abap2ui5-app>, which renders the views an unchanged abap2UI5 app class sends with UI5 Web Components and no UI5 core.community org, abapabap2UI5 frontend rendering with UI5 Web Componentsfrom ABAP
- abap2UI5 frontendabap2UI5 frontendThe abap2UI5 frontend as installable ABAP artefacts: per system type one generated branch carrying the BSP or HTTP service with its handler, pulled into the system with abapGit.community org, abapabap2UI5 frontend as ABAP artefacts installed with abapGitfrom ABAP
- abap2UI5 Layout Editorabap2UI5 Layout EditorA browser editor that lays out a UI5 view by drag and drop and writes it out as one abap2UI5 app class, pulled into the system with abapGit.community org, abapDrag-and-drop UI5 view editor that writes an abap2UI5 app classfrom ABAP
- abap2UI5 protocolabap2UI5 protocolThe abap2UI5 roundtrip written down: a versioned specification of the wire between frontends and backends, JSON Schemas for its messages, and two conformance suites that test either side.community org, abapVersioned specification of the abap2UI5 roundtrip protocolfrom ABAP
- ZFPM_TOOLSZFPM_TOOLSA report that shows the development objects of an FPM hierarchy in one view and edits, copies, deletes, imports and exports the hierarchy as a whole rather than one object at a time.independent, abapEdits, copies and transports a whole FPM hierarchy at oncefrom ABAP
- ZWD_CALENDAR_VHZWD_CALENDAR_VHA value help for date fields in Web Dynpro ABAP screens that shows a calendar view, so the user picks a day from it instead of typing the date.independent, abapWeb Dynpro ABAP calendar value help for date fieldsfrom ABAP
- abap_mustacheabap_mustacheA Mustache template engine for ABAP, rendering logic-less templates into HTML or any other text from a structure or table of any type, with partials and a separate Steampunk-compatible branch.independent, abapMustache template engine for ABAPfrom ABAP
- codepagecodepageA polyfill class, ZCL_ABAP_CODEPAGE, that converts strings to binary and back behind one interface, where Clean Core blocks CL_ABAP_CODEPAGE and older systems lack CL_ABAP_CONV_CODEPAGE.independent, abapPolyfill for CL_ABAP_CODEPAGE under Clean Corefrom ABAP
- Modernization Agents for SAP on AWSModernization Agents for SAP on AWSAWS's suite of agents for SAP modernisation work: custom ABAP converted for S/4HANA, PI/PO interfaces moved to Integration Suite, BW objects moved to SAP Datasphere, deployed into a customer's own AWS account and reached only after registration.partner, abapAWS agents for ABAP, PI/PO and BW modernisation workfrom ABAP
- ROSAROSAAnswers whether an SAP object is released for ABAP Cloud, and what to use instead when it is not — served from SAP's own Cloudification Repository over MCP and over plain REST.independent, abapMCP server answering whether SAP objects are released for ABAP Cloudfrom ABAP
- Cloudification RepositoryCloudification RepositorySAP's list of released APIs for SAP Cloud ERP, with the successors of the objects that are not released — the content the ABAP test cockpit's cloud readiness and clean core checks are pointed at.sap official, abapSAP's list of released APIs for SAP Cloud ERP with successorsfrom ABAP
- code pal for ABAP — Cloud Editioncode pal for ABAP — Cloud EditionThe same Clean ABAP check set for ABAP Cloud, where the legacy edition cannot run.sap official, abapClean ABAP check set for ABAP Cloudfrom ABAP
- Clean-Core.ioClean-Core.ioA free hosted workspace that reads one piece of custom ABAP, redraws its business process as BPMN with a line anchor on every element, grades the SAP objects it uses Level A–D and ends in a keep, rebuild, move-to-standard or retire decision.independent, abapHosted workspace redrawing custom ABAP as BPMN and grading itfrom ABAP
- Clean Core MeasurementClean Core MeasurementAn ABAP application for a central ATC system that imports Clean Core check results and reports them per system as Level A to D KPIs, technical debt scores and documented assignments.independent, abapReports Clean Core ATC results per system as Level A to D KPIsfrom ABAP
- ABAP Select ConverterABAP Select ConverterConverts a classic Open SQL SELECT against dictionary tables to the equivalent statement against released Core Data Services entities and their fields.independent, abapConverts classic Open SQL SELECTs to released CDS entitiesfrom ABAP
- abap-system-fieldsabap-system-fieldsAn ABAP Cloud class that wraps SY system fields and calendar-date functions behind an injectable instance, so code that reads them stays stable under unit tests.independent, abapInjectable wrapper for SY fields and date functions in ABAP Cloudfrom ABAP
- Cloudification Repository ViewerCloudification Repository ViewerA browser form over the Cloudification Repository, the list SAP publishes of which standard objects are released for ABAP Cloud and what replaces the ones that are not.independent, abapBrowser form over SAP's Cloudification Repository for ABAP Cloudfrom ABAP
Details
Sources
Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.
Compatibility and provenance
Flavors
“**ABAP Cloud** and **Standard ABAP**; **NW 7.02** through a downport” — abap2UI5-addons/abap-cloud-gui — README, Compatibility
“**ABAP Cloud** and **Standard ABAP**; **NW 7.02** through a downport” — abap2UI5-addons/abap-cloud-gui — README, Compatibility
Contributors
History in the atlas
- First seen.
For your agent
- Ref
artifact:abap2ui5-addons-abap-cloud-gui- JSON
- /artifacts/abap2ui5-addons-abap-cloud-gui.json
- MCP
- Connecting an agent