├── .travis.yml
├── Design Patterns - ABAP CDR 17.pdf
├── zfactory
├── zif_output.intf.abap
├── zif_output.intf.xml
├── zcl_alv.clas.xml
├── zcl_factory.clas.xml
├── zcl_simple_output.clas.xml
├── zcl_alv.clas.abap
├── zcl_factory.clas.abap
├── zfactory_demo.prog.xml
├── zfactory_demo.prog.abap
└── zcl_simple_output.clas.abap
├── zstrategy
├── zif_log.intf.abap
├── zif_log.intf.xml
├── zcl_bal_log.clas.xml
├── zcl_salv_log.clas.xml
├── zstrategy_demo.prog.xml
├── zstrategy_demo.prog.abap
├── zcl_salv_log.clas.abap
├── zpattern.msag.xml
└── zcl_bal_log.clas.abap
├── ziterator
├── zif_predicate.intf.abap
├── zif_iterator.intf.abap
├── zif_iterator.intf.xml
├── zif_collection.intf.xml
├── zif_predicate.intf.xml
├── zcl_sap_user.clas.xml
├── zcl_collection.clas.xml
├── zcl_iterator.clas.xml
├── zcl_predicate_user_age.clas.xml
├── zif_collection.intf.abap
├── ziterator_demo.prog.xml
├── zcl_predicate_user_age.clas.abap
├── zcl_collection.clas.abap
├── zcl_sap_user.clas.abap
├── ziterator_demo.prog.abap
└── zcl_iterator.clas.abap
├── zbuilder
├── zcl_seat.clas.abap
├── zcx_incomplete_car.clas.abap
├── zcl_wheel.clas.abap
├── zcl_engine.clas.abap
├── zcl_seat.clas.xml
├── zcl_wheel.clas.xml
├── zcl_engine.clas.xml
├── zcl_car_builder.clas.xml
├── zcl_car.clas.xml
├── zcx_incomplete_car.clas.xml
├── zbuilder_demo.prog.xml
├── zcl_car.clas.abap
├── zbuilder_demo.prog.abap
└── zcl_car_builder.clas.abap
├── .abapgit.xml
├── zcomposite
├── zproject_id.doma.xml
├── zproject_type.dtel.xml
├── zcl_project_task.clas.xml
├── zcl_project_dao.clas.xml
├── zcl_project.clas.xml
├── zcom_prepare_data.prog.xml
├── zcom_proj.nrob.xml
├── zproject_done.dtel.xml
├── zproject_id.dtel.xml
├── zproject_completion.doma.xml
├── zproject_title.dtel.xml
├── zproject_completion.dtel.xml
├── zcx_project_error.clas.xml
├── zproject_type.doma.xml
├── zcx_project_error.clas.abap
├── zcom_prepare_data.prog.abap
├── zcl_project.clas.testclasses.abap
├── zcl_project_task.clas.abap
├── zcom_project.tabl.xml
├── z_manage_projects.prog.abap
├── zcl_project_dao.clas.abap
├── z_manage_projects.prog.xml
└── zcl_project.clas.abap
├── package.json
├── ztemplate
├── zcl_worker_experience_filter.clas.xml
├── zcl_worker_free_tasks_filter.clas.xml
├── zcl_filter.clas.xml
├── ztemplate_demo.prog.xml
├── zcl_filter.clas.abap
├── zworker.tabl.xml
├── zcl_worker_experience_filter.clas.abap
├── ztemplate_demo.prog.abap
└── zcl_worker_free_tasks_filter.clas.abap
├── README.md
└── LICENSE
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "4.1"
--------------------------------------------------------------------------------
/Design Patterns - ABAP CDR 17.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SchwarzIT/abap_oo_patterns/HEAD/Design Patterns - ABAP CDR 17.pdf
--------------------------------------------------------------------------------
/zfactory/zif_output.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_output PUBLIC.
2 |
3 | METHODS display_data importing value(i_data) type table.
4 |
5 | ENDINTERFACE.
6 |
--------------------------------------------------------------------------------
/zstrategy/zif_log.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_log
2 | PUBLIC .
3 |
4 | METHODS:
5 | log IMPORTING i_message TYPE bal_s_msg,
6 | finish.
7 |
8 | ENDINTERFACE.
9 |
--------------------------------------------------------------------------------
/ziterator/zif_predicate.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_predicate PUBLIC .
2 | METHODS accept IMPORTING i_element TYPE REF TO object
3 | RETURNING VALUE(r_valid) TYPE abap_bool.
4 | ENDINTERFACE.
5 |
--------------------------------------------------------------------------------
/zbuilder/zcl_seat.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_seat DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 | PROTECTED SECTION.
7 | PRIVATE SECTION.
8 | ENDCLASS.
9 |
10 |
11 |
12 | CLASS zcl_seat IMPLEMENTATION.
13 | ENDCLASS.
14 |
--------------------------------------------------------------------------------
/zbuilder/zcx_incomplete_car.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcx_incomplete_car DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC
4 | INHERITING FROM cx_dynamic_check.
5 |
6 | PUBLIC SECTION.
7 | PROTECTED SECTION.
8 | PRIVATE SECTION.
9 | ENDCLASS.
10 |
11 |
12 |
13 | CLASS zcx_incomplete_car IMPLEMENTATION.
14 | ENDCLASS.
15 |
--------------------------------------------------------------------------------
/zbuilder/zcl_wheel.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_wheel DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 | METHODS:
7 | turn.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | ENDCLASS.
11 |
12 |
13 |
14 | CLASS zcl_wheel IMPLEMENTATION.
15 |
16 |
17 | METHOD turn.
18 | WRITE: 'Wheel turns', /.
19 | ENDMETHOD.
20 | ENDCLASS.
21 |
--------------------------------------------------------------------------------
/zbuilder/zcl_engine.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_engine DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 | METHODS start.
7 | METHODS accelerate.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | ENDCLASS.
11 |
12 |
13 |
14 | CLASS ZCL_ENGINE IMPLEMENTATION.
15 |
16 |
17 | METHOD accelerate.
18 | write: 'Engine: vroom, vroom', /.
19 | ENDMETHOD.
20 |
21 |
22 | METHOD start.
23 | write: 'Engine purs softly', /.
24 | ENDMETHOD.
25 | ENDCLASS.
26 |
--------------------------------------------------------------------------------
/.abapgit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | D
6 | /
7 | FULL
8 |
9 | - /.gitignore
10 | - /LICENSE
11 | - /README.md
12 | - /package.json
13 | - /.travis.yml
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/ziterator/zif_iterator.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_iterator PUBLIC .
2 |
3 | METHODS has_next RETURNING VALUE(r_has_next) TYPE abap_bool.
4 | METHODS get_next RETURNING VALUE(r_object) TYPE REF TO object.
5 | METHODS get_current RETURNING VALUE(r_object) TYPE REF TO object.
6 | METHODS reset.
7 | METHODS add_predicate IMPORTING i_predicate TYPE REF TO zif_predicate.
8 | METHODS clear_predicates.
9 |
10 | DATA current_index TYPE i.
11 | DATA increment TYPE i.
12 | DATA collection TYPE REF TO zif_collection.
13 | ENDINTERFACE.
14 |
--------------------------------------------------------------------------------
/zcomposite/zproject_id.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_ID
7 | D
8 | NUMC
9 | 000010
10 | 000010
11 | ID of a Project
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ziterator/zif_iterator.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_ITERATOR
7 | 1
8 | D
9 | Iterator
10 | 2
11 | 1
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/zcomposite/zproject_type.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_TYPE
7 | D
8 | ZPROJECT_TYPE
9 | Type: Project or Task
10 | D
11 | D
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/zfactory/zif_output.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_OUTPUT
7 | 1
8 | E
9 | Output Interface
10 | 2
11 | 1
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ziterator/zif_collection.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_COLLECTION
7 | 1
8 | E
9 | Collection Interface
10 | 2
11 | 1
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/ziterator/zif_predicate.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_PREDICATE
7 | 1
8 | E
9 | Predicate Interface
10 | 2
11 | 1
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/zstrategy/zif_log.intf.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZIF_LOG
7 | 1
8 | D
9 | Interface for logging #ABAPCDR2017
10 | 2
11 | 1
12 | X
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "abap_oo_patterns",
3 | "version": "1.0.0",
4 | "description": "Example implementations for oo patterns in abap",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "abaplint **/*.abap"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git+https://github.com/kaufland/abap_oo_patterns"
12 | },
13 | "author": "Florian Barth & Alexander Flammer ",
14 | "license": "Apache-2.0",
15 | "bugs": {
16 | "url": "https://github.com/kaufland/abap_oo_patterns/issues"
17 | },
18 | "devDependencies": {
19 | "abaplint": "0.0.15"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/zbuilder/zcl_seat.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_SEAT
7 | 1
8 | D
9 | Seat for a zcl_car
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zbuilder/zcl_wheel.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_WHEEL
7 | 1
8 | D
9 | Wheel for zcl_car
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zbuilder/zcl_engine.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_ENGINE
7 | 1
8 | D
9 | Engine for a ZCL_CAR
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zbuilder/zcl_car_builder.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_CAR_BUILDER
7 | 1
8 | D
9 | Builds zcl_car objects
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zfactory/zcl_alv.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_ALV
7 | 1
8 | D
9 | ALV Output
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zstrategy/zcl_bal_log.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_BAL_LOG
7 | 1
8 | D
9 | BAL Logging Class #ABAPCDR2017
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zfactory/zcl_factory.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_FACTORY
7 | 1
8 | D
9 | Factory Class
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/ziterator/zcl_sap_user.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_SAP_USER
7 | 1
8 | E
9 | User Class
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zstrategy/zcl_salv_log.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_SALV_LOG
7 | 1
8 | D
9 | Class that shows logs in SALV #ABAPCDR2017
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zbuilder/zcl_car.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_CAR
7 | 1
8 | D
9 | Car with complex interior for demonstrating builder pattern.
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/ziterator/zcl_collection.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_COLLECTION
7 | 1
8 | E
9 | Collection Class
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/ziterator/zcl_iterator.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_ITERATOR
7 | 1
8 | E
9 | Iterator Implementation
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project_task.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_PROJECT_TASK
7 | 1
8 | D
9 | A task which is usually part of a project hierachy
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/zfactory/zcl_simple_output.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_SIMPLE_OUTPUT
7 | 1
8 | D
9 | Class Implementation
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/ziterator/zcl_predicate_user_age.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_PREDICATE_USER_AGE
7 | 1
8 | E
9 | Predicate Implementation
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/ztemplate/zcl_worker_experience_filter.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_WORKER_EXPERIENCE_FILTER
7 | 1
8 | D
9 | Filter workers by experience #ABAPCDR2017
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/ztemplate/zcl_worker_free_tasks_filter.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_WORKER_FREE_TASKS_FILTER
7 | 1
8 | D
9 | Filter workers by free tasks #ABAPCDR2017
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/ziterator/zif_collection.intf.abap:
--------------------------------------------------------------------------------
1 | INTERFACE zif_collection PUBLIC .
2 |
3 | METHODS add IMPORTING i_element TYPE REF TO object.
4 | METHODS remove IMPORTING i_element TYPE REF TO object.
5 | METHODS clear.
6 | METHODS size RETURNING VALUE(r_size) TYPE i.
7 | METHODS is_empty RETURNING VALUE(r_is_empty) TYPE abap_bool.
8 | METHODS get IMPORTING i_index TYPE i
9 | RETURNING VALUE(r_object) TYPE REF TO object.
10 | METHODS contains IMPORTING i_element TYPE REF TO object
11 | RETURNING VALUE(r_contains) TYPE abap_bool.
12 | METHODS get_iterator RETURNING VALUE(r_iterator) TYPE REF TO zif_iterator.
13 |
14 | ENDINTERFACE.
15 |
--------------------------------------------------------------------------------
/ztemplate/zcl_filter.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_FILTER
7 | 1
8 | D
9 | Template to filter internal tables #ABAPCDR2017
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project_dao.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_PROJECT_DAO
7 | 1
8 | D
9 | Loads and saves projects and tasks to and from db
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCL_PROJECT
7 | 1
8 | D
9 | Represents a project and all its subtasks as a composite
10 | 2
11 | 1
12 | X
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zcomposite/zcom_prepare_data.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCOM_PREPARE_DATA
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | .
19 | 1
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/zbuilder/zcx_incomplete_car.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_INCOMPLETE_CAR
7 | 1
8 | D
9 | Is thrown when a car is not initialized with all components
10 | 40
11 | 2
12 | 1
13 | X
14 | X
15 | X
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/zbuilder/zbuilder_demo.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZBUILDER_DEMO
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | Demo of Builder Pattern
19 | 23
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/zcomposite/zcom_proj.nrob.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ZPROJECT_ID
8 | 95.0
9 | X
10 | 00000010
11 |
12 |
13 | D
14 |
15 | IDs für Projektverwaltung as Composite Pattern Beispiel
16 | Projeknummer
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/zfactory/zcl_alv.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_alv DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | INTERFACES: zif_output.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | ENDCLASS.
11 |
12 |
13 |
14 | CLASS zcl_alv IMPLEMENTATION.
15 |
16 |
17 | METHOD zif_output~display_data.
18 | DATA salv_object TYPE REF TO cl_salv_table.
19 | TRY.
20 | cl_salv_table=>factory(
21 | IMPORTING
22 | r_salv_table = salv_object
23 | CHANGING
24 | t_table = i_data ).
25 | CATCH cx_salv_msg.
26 | ENDTRY.
27 |
28 | IF salv_object IS BOUND.
29 | salv_object->display( ).
30 | ENDIF.
31 | ENDMETHOD.
32 | ENDCLASS.
33 |
--------------------------------------------------------------------------------
/zcomposite/zproject_done.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_DONE
7 | D
8 | XFELD
9 | 55
10 | 10
11 | 20
12 | 40
13 | Done status of Project
14 | Done
15 | Done
16 | Done
17 | Done
18 | D
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/zfactory/zcl_factory.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_factory DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | CONSTANTS: output_as_salv TYPE char1 VALUE 'S',
8 | output_as_write TYPE char1 VALUE 'W'.
9 |
10 | CLASS-METHODS get_output_instance IMPORTING i_type TYPE char1
11 | RETURNING VALUE(r_instance) TYPE REF TO zif_output.
12 |
13 | PROTECTED SECTION.
14 | PRIVATE SECTION.
15 | ENDCLASS.
16 |
17 |
18 |
19 | CLASS zcl_factory IMPLEMENTATION.
20 |
21 | METHOD get_output_instance.
22 | r_instance = SWITCH #( i_type
23 | WHEN output_as_salv THEN NEW zcl_alv( )
24 | WHEN output_as_write THEN NEW zcl_simple_output( ) ).
25 | ENDMETHOD.
26 |
27 | ENDCLASS.
28 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ABAP OO Design Pattern
2 |
3 | This repository contains a small set of implementations of
4 | object-oriented design patterns written in ABAP. The implementation
5 | are supplementary material to a presentation for the ABAP CodeRetreat
6 | 2017 in Weinsberg. All the patterns showcased in the original version
7 | were used in production code and have proven to be useful.
8 |
9 | # Contributions
10 |
11 | We believe this repository could become a useful resource for examples
12 | of design patterns in ABAP. Therefore we welcome any kind of
13 | contribution to this repository in the form of issues and
14 | pull-requests. We also plan to contribute further patterns to this
15 | repository.
16 |
17 | To import the source into your system use the absolutly
18 | great [abapgit package](https://github.com/larshp/abapGit).
19 |
--------------------------------------------------------------------------------
/zfactory/zfactory_demo.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZFACTORY_DEMO
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | E
18 |
19 |
-
20 | R
21 | Factory Demo
22 | 12
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/ziterator/ziterator_demo.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZITERATOR_DEMO
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | E
18 |
19 |
-
20 | R
21 | Demo Iterator
22 | 13
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/zcomposite/zproject_id.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_ID
7 | D
8 | ZPROJECT_ID
9 | 55
10 | 10
11 | 20
12 | 40
13 | ID of a Project
14 | Projectnumber
15 | Project ID
16 | Projectnumber
17 | Projectnumber
18 | D
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/zfactory/zfactory_demo.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report zfactory_demo
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT zfactory_demo.
9 |
10 | DATA result TYPE STANDARD TABLE OF sflight WITH NON-UNIQUE KEY carrid connid fldate.
11 | SELECT * FROM sflight WHERE seatsmax >= 470 INTO TABLE @RESULT UP TO 30 ROWS.
12 |
13 | " Display as SALV
14 | DATA(output_object) = zcl_factory=>get_output_instance( i_type = zcl_factory=>output_as_salv ).
15 | output_object->display_data( result ).
16 |
17 | " Display as WRITE Output
18 | output_object = zcl_factory=>get_output_instance( i_type = zcl_factory=>output_as_write ).
19 | output_object->display_data( result ).
20 |
--------------------------------------------------------------------------------
/zcomposite/zproject_completion.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_COMPLETION
7 | D
8 | INT1
9 | 000003
10 | 000003
11 | X
12 | Completion Satus of a project in %
13 |
14 |
15 |
16 | ZPROJECT_COMPLETION
17 | 0001
18 | D
19 | 0
20 | 100
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/zcomposite/zproject_title.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_TITLE
7 | D
8 | 55
9 | 10
10 | 20
11 | 40
12 | Project or task title
13 | Projecttitle
14 | Title
15 | Projecttitle
16 | Projecttitle
17 | D
18 | CHAR
19 | 000100
20 | 000100
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/zcomposite/zproject_completion.dtel.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_COMPLETION
7 | D
8 | ZPROJECT_COMPLETION
9 | 55
10 | 10
11 | 20
12 | 40
13 | Completion of the project in %
14 | Completion in %
15 | Compl. %
16 | Completion in %
17 | Completion in %
18 | D
19 | D
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/zstrategy/zstrategy_demo.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZSTRATEGY_DEMO
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | Demo for strategy pattern #ABAPCDR2017
19 | 38
20 |
21 | -
22 | S
23 | P_BATCH
24 | Run in Background
25 | 25
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/zfactory/zcl_simple_output.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_simple_output DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | INTERFACES: zif_output.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | ENDCLASS.
11 |
12 |
13 |
14 | CLASS zcl_simple_output IMPLEMENTATION.
15 | METHOD zif_output~display_data.
16 | cl_demo_output=>set_mode( cl_demo_output=>text_mode ).
17 | cl_demo_output=>write_data( value = i_data ).
18 | DATA(string) = cl_demo_output=>get( ).
19 | DO.
20 | SPLIT string AT cl_abap_char_utilities=>newline INTO DATA(line) string.
21 | IF line = ''.
22 | EXIT.
23 | ENDIF.
24 | IF string IS INITIAL.
25 | WRITE: / line.
26 | EXIT.
27 | ENDIF.
28 | WRITE: / line.
29 | ENDDO.
30 |
31 | * cl_demo_output=>display( data = i_data ).
32 | ENDMETHOD.
33 |
34 | ENDCLASS.
35 |
--------------------------------------------------------------------------------
/zcomposite/zcx_project_error.clas.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCX_PROJECT_ERROR
7 | 1
8 | D
9 | .
10 | 40
11 | 2
12 | 1
13 | X
14 | X
15 | X
16 | X
17 |
18 |
19 |
20 | ZCX_PROJECT_ERROR
21 | CONSTRUCTOR
22 | D
23 | CONSTRUCTOR
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/zcomposite/zproject_type.doma.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPROJECT_TYPE
7 | D
8 | CHAR
9 | 000001
10 | 000001
11 | X
12 | Type: Project or Task
13 |
14 |
15 |
16 | ZPROJECT_TYPE
17 | 0001
18 | D
19 | P
20 | Project
21 |
22 |
23 | ZPROJECT_TYPE
24 | 0002
25 | D
26 | T
27 | Task
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/ztemplate/ztemplate_demo.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZTEMPLATE_DEMO
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 | -
17 | R
18 | Demo for Template Method pattern #ABAPCDR2017
19 | 45
20 |
21 | -
22 | S
23 | P_MINEXP
24 | Minimum Experience
25 | 26
26 |
27 | -
28 | S
29 | P_MINFRE
30 | Minimum free tasks
31 | 26
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/ziterator/zcl_predicate_user_age.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS ZCL_PREDICATE_USER_AGE DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | INTERFACES: zif_predicate.
8 | METHODS constructor IMPORTING i_age TYPE i
9 | i_option TYPE ddoption.
10 | PROTECTED SECTION.
11 | PRIVATE SECTION.
12 |
13 | DATA age TYPE i.
14 | DATA option TYPE ddoption.
15 | ENDCLASS.
16 |
17 |
18 |
19 | CLASS ZCL_PREDICATE_USER_AGE IMPLEMENTATION.
20 |
21 |
22 | METHOD constructor.
23 | me->age = i_age.
24 | me->option = i_option.
25 | ENDMETHOD.
26 |
27 |
28 | METHOD zif_predicate~accept.
29 | DATA user TYPE REF TO zcl_sap_user.
30 | IF i_element IS BOUND.
31 | TRY.
32 | user ?= i_element.
33 | DATA(predicate_range) = VALUE rseloption( ( sign = 'I' option = me->option low = me->age ) ).
34 | IF user->get_age( ) IN predicate_range.
35 | r_valid = abap_true.
36 | ENDIF.
37 | CATCH cx_sy_move_cast_error.
38 | ENDTRY.
39 | ENDIF.
40 | ENDMETHOD.
41 | ENDCLASS.
42 |
--------------------------------------------------------------------------------
/zcomposite/zcx_project_error.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcx_project_error DEFINITION
2 | PUBLIC
3 | INHERITING FROM cx_dynamic_check
4 | FINAL
5 | CREATE PUBLIC .
6 |
7 | PUBLIC SECTION.
8 |
9 | INTERFACES if_t100_message .
10 | CONSTANTS:
11 | BEGIN OF operation_not_supported,
12 | msgid TYPE symsgid VALUE '',
13 | msgno TYPE symsgno VALUE '',
14 | attr1 TYPE scx_attrname VALUE '',
15 | attr2 TYPE scx_attrname VALUE '',
16 | attr3 TYPE scx_attrname VALUE '',
17 | attr4 TYPE scx_attrname VALUE '',
18 | END OF operation_not_supported.
19 |
20 | METHODS constructor
21 | IMPORTING
22 | !textid LIKE if_t100_message=>t100key OPTIONAL
23 | !previous LIKE previous OPTIONAL .
24 | PROTECTED SECTION.
25 | PRIVATE SECTION.
26 |
27 |
28 |
29 |
30 | ENDCLASS.
31 |
32 |
33 |
34 | CLASS ZCX_PROJECT_ERROR IMPLEMENTATION.
35 |
36 |
37 | METHOD constructor ##ADT_SUPPRESS_GENERATION.
38 | CALL METHOD super->constructor
39 | EXPORTING
40 | previous = previous.
41 | CLEAR me->textid.
42 | IF textid IS INITIAL.
43 | if_t100_message~t100key = if_t100_message=>default_textid.
44 | ELSE.
45 | if_t100_message~t100key = textid.
46 | ENDIF.
47 | ENDMETHOD.
48 | ENDCLASS.
49 |
--------------------------------------------------------------------------------
/zstrategy/zstrategy_demo.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report zstrategy_demo
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT zstrategy_demo.
9 |
10 | PARAMETER: p_batch TYPE sybatch AS CHECKBOX.
11 |
12 | CLASS lcl_greeter DEFINITION.
13 | PUBLIC SECTION.
14 |
15 | METHODS:
16 | constructor IMPORTING i_logger TYPE REF TO zif_log,
17 | greet_participants.
18 |
19 | PRIVATE SECTION.
20 | DATA logger TYPE REF TO zif_log.
21 | ENDCLASS.
22 |
23 | CLASS lcl_greeter IMPLEMENTATION.
24 |
25 | METHOD constructor.
26 | me->logger = i_logger.
27 | ENDMETHOD.
28 |
29 | METHOD greet_participants.
30 | logger->log( VALUE #( msgid = 'ZPATTERN' msgno = '001' msgty = 'I' ) ).
31 | logger->log( VALUE #( msgid = 'ZPATTERN' msgno = '002' msgty = 'I' ) ).
32 | logger->finish( ).
33 | ENDMETHOD.
34 |
35 | ENDCLASS.
36 |
37 |
38 | START-OF-SELECTION.
39 | DATA:
40 | logger TYPE REF TO zif_log,
41 | greeter TYPE REF TO lcl_greeter.
42 |
43 | IF p_batch IS INITIAL.
44 | logger = new zcl_salv_log( ).
45 | ELSE.
46 | logger = new zcl_bal_log( ).
47 | ENDIF.
48 |
49 | greeter = new lcl_greeter( logger ).
50 |
51 | greeter->greet_participants( ).
52 |
--------------------------------------------------------------------------------
/ziterator/zcl_collection.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_collection DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | INTERFACES: zif_collection.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | DATA: collection TYPE STANDARD TABLE OF REF TO object.
11 |
12 | ENDCLASS.
13 |
14 |
15 |
16 | CLASS zcl_collection IMPLEMENTATION.
17 |
18 | METHOD zif_collection~add.
19 | APPEND i_element TO collection.
20 | ENDMETHOD.
21 |
22 |
23 | METHOD zif_collection~clear.
24 | CLEAR collection.
25 | ENDMETHOD.
26 |
27 |
28 | METHOD zif_collection~contains.
29 | IF line_exists( collection[ table_line = i_element ] ).
30 | r_contains = abap_true.
31 | ENDIF.
32 | ENDMETHOD.
33 |
34 |
35 | METHOD zif_collection~get.
36 | IF line_exists( collection[ i_index ] ).
37 | r_object = collection[ i_index ].
38 | ENDIF.
39 | ENDMETHOD.
40 |
41 |
42 | METHOD zif_collection~get_iterator.
43 | r_iterator = NEW zcl_iterator( me ).
44 | ENDMETHOD.
45 |
46 |
47 | METHOD zif_collection~is_empty.
48 | IF me->zif_collection~size( ) = 0.
49 | r_is_empty = abap_true.
50 | ENDIF.
51 | ENDMETHOD.
52 |
53 |
54 | METHOD zif_collection~remove.
55 | DELETE collection WHERE table_line = i_element.
56 | ENDMETHOD.
57 |
58 |
59 | METHOD zif_collection~size.
60 | r_size = lines( collection ).
61 | ENDMETHOD.
62 |
63 | ENDCLASS.
64 |
--------------------------------------------------------------------------------
/ztemplate/zcl_filter.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_filter DEFINITION
2 | PUBLIC
3 | ABSTRACT
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | TYPES: any_table TYPE REF TO data.
8 |
9 | METHODS:
10 | constructor
11 | IMPORTING
12 | i_log TYPE REF TO zif_log,
13 | filter FINAL
14 | CHANGING
15 | c_table TYPE INDEX TABLE .
16 | PROTECTED SECTION.
17 |
18 |
19 | METHODS:
20 | log_start_of_filter ABSTRACT
21 | IMPORTING i_table TYPE INDEX TABLE,
22 |
23 | log_exclusion ABSTRACT,
24 |
25 | log_filter_execution ABSTRACT
26 | IMPORTING i_table TYPE INDEX TABLE,
27 |
28 | is_valid ABSTRACT
29 | RETURNING VALUE(r_result) TYPE abap_bool,
30 |
31 | convert_to_internal_type ABSTRACT
32 | IMPORTING i_row TYPE any.
33 |
34 | DATA log TYPE REF TO zif_log.
35 | PRIVATE SECTION.
36 |
37 | ENDCLASS.
38 |
39 |
40 |
41 | CLASS ZCL_FILTER IMPLEMENTATION.
42 |
43 |
44 | METHOD constructor.
45 | me->log = i_log.
46 | ENDMETHOD.
47 |
48 |
49 | METHOD filter.
50 |
51 | log_start_of_filter( c_table ).
52 |
53 | LOOP AT c_table ASSIGNING FIELD-SYMBOL().
54 | convert_to_internal_type( ).
55 | IF is_valid( ) = abap_false.
56 | log_exclusion( ).
57 | DELETE c_table.
58 | ENDIF.
59 | ENDLOOP.
60 |
61 | log_filter_execution( c_table ).
62 |
63 | ENDMETHOD.
64 | ENDCLASS.
65 |
--------------------------------------------------------------------------------
/ziterator/zcl_sap_user.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_sap_user DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | METHODS constructor IMPORTING i_firstname TYPE char20
8 | i_lastname TYPE char30
9 | i_date_of_birth TYPE datum.
10 | METHODS get_name RETURNING VALUE(r_name) TYPE string.
11 | METHODS get_age RETURNING VALUE(r_age) TYPE i.
12 | Methods to_string returning value(r_object) type string.
13 | PROTECTED SECTION.
14 | PRIVATE SECTION.
15 | DATA: firstname TYPE char20,
16 | lastname TYPE char30,
17 | date_of_birth TYPE datum.
18 | ENDCLASS.
19 |
20 |
21 |
22 | CLASS ZCL_SAP_USER IMPLEMENTATION.
23 |
24 |
25 | METHOD constructor.
26 | me->firstname = i_firstname.
27 | me->lastname = i_lastname.
28 | me->date_of_birth = i_date_of_birth.
29 | ENDMETHOD.
30 |
31 | METHOD get_age.
32 | DATA years TYPE pea_scryy.
33 | CALL FUNCTION 'HR_HK_DIFF_BT_2_DATES'
34 | EXPORTING
35 | date1 = sy-datum
36 | date2 = me->date_of_birth
37 | IMPORTING
38 | years = years.
39 |
40 | r_age = years.
41 | ENDMETHOD.
42 |
43 | METHOD get_name.
44 | r_name = me->firstname && | | && me->lastname.
45 | ENDMETHOD.
46 |
47 | METHOD to_string.
48 | r_object = me->get_name( ) && | (| && me->get_age( ) && |) |.
49 | ENDMETHOD.
50 | ENDCLASS.
51 |
--------------------------------------------------------------------------------
/zstrategy/zcl_salv_log.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_salv_log DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | INTERFACES zif_log.
8 | PROTECTED SECTION.
9 | PRIVATE SECTION.
10 | DATA messages TYPE STANDARD TABLE OF bal_s_msg.
11 | ENDCLASS.
12 |
13 |
14 |
15 | CLASS ZCL_SALV_LOG IMPLEMENTATION.
16 |
17 |
18 | METHOD zif_log~finish.
19 | TYPES: BEGIN OF gty_string,
20 | message TYPE string,
21 | END OF gty_string.
22 |
23 | DATA:
24 | message_texts TYPE STANDARD TABLE OF gty_string,
25 | text LIKE LINE OF message_texts,
26 | salv TYPE REF TO cl_salv_table.
27 |
28 | LOOP AT messages ASSIGNING FIELD-SYMBOL().
29 | MESSAGE ID -msgid
30 | TYPE -msgty
31 | NUMBER -msgno
32 | WITH -msgv1 -msgv2 -msgv3 -msgv4
33 | INTO text-message.
34 | CONDENSE text-message.
35 | INSERT text INTO TABLE message_texts.
36 | ENDLOOP.
37 |
38 | TRY.
39 | cl_salv_table=>factory(
40 | IMPORTING
41 | r_salv_table = salv " Basisklasse einfache ALV Tabellen
42 | CHANGING
43 | t_table = message_texts ).
44 | CATCH cx_salv_msg.
45 | ENDTRY.
46 | salv->display( ).
47 |
48 | ENDMETHOD.
49 |
50 |
51 | METHOD zif_log~log.
52 | INSERT i_message INTO TABLE messages.
53 | ENDMETHOD.
54 | ENDCLASS.
55 |
--------------------------------------------------------------------------------
/ztemplate/zworker.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZWORKER
7 | D
8 | INTTAB
9 | Worker table for talk #ABAPCDR2017
10 | 1
11 |
12 |
13 |
14 | ZWORKER
15 | NAME
16 | 0001
17 | NAME
18 | 0
19 | E
20 |
21 |
22 | ZWORKER
23 | EXPERIENCE
24 | 0002
25 | INT4
26 | 0
27 | E
28 |
29 |
30 | ZWORKER
31 | CUR_TASKS
32 | 0003
33 | INT4
34 | 0
35 | E
36 |
37 |
38 | ZWORKER
39 | MAX_TASKS
40 | 0004
41 | INT4
42 | 0
43 | E
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/zcomposite/zcom_prepare_data.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report zfbtest
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT zcom_prepare_data.
9 |
10 |
11 | START-OF-SELECTION.
12 |
13 | TYPES tt_project TYPE STANDARD TABLE OF zcom_project WITH DEFAULT KEY.
14 |
15 | DATA(projects) = VALUE tt_project(
16 | ( project_id = 1 title = 'My very big project' parent_id = 0 assignee = '' type = 'P' done = abap_false )
17 | ( project_id = 2 title = 'Create a subtask' parent_id = 1 assignee = 'JOHN' type = 'T' done = abap_true )
18 | ( project_id = 3 title = 'Create a subproject' parent_id = 1 assignee = 'TINA' type = 'T' done = abap_false )
19 | ( project_id = 4 title = 'Some new subproject' parent_id = 1 assignee = '' type = 'P' done = abap_false )
20 | ( project_id = 5 title = '1. task of subproject' parent_id = 4 assignee = 'TIM' type = 'T' done = abap_false )
21 | ( project_id = 6 title = '2. task of subproject' parent_id = 4 assignee = 'ANNA' type = 'T' done = abap_true )
22 | ( project_id = 7 title = 'second subproject' parent_id = 1 assignee = '' type = 'P' done = abap_false )
23 | ( project_id = 8 title = 'another task' parent_id = 7 assignee = 'JANE' type = 'T' done = abap_false )
24 | ).
25 |
26 | DELETE FROM zcom_project.
27 |
28 | INSERT zcom_project FROM TABLE projects.
29 |
30 | WRITE sy-subrc.
31 |
--------------------------------------------------------------------------------
/zbuilder/zcl_car.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_car DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC.
4 |
5 | PUBLIC SECTION.
6 | TYPES:
7 | wheel_table TYPE STANDARD TABLE OF REF TO zcl_wheel WITH DEFAULT KEY,
8 | seat_table TYPE STANDARD TABLE OF REF TO zcl_seat WITH DEFAULT KEY.
9 | CONSTANTS min_wheel_count TYPE i VALUE 4.
10 |
11 | METHODS:
12 | constructor
13 | IMPORTING
14 | i_engine TYPE REF TO zcl_engine
15 | i_wheels TYPE wheel_table
16 | i_seats TYPE seat_table
17 | RAISING zcx_incomplete_car,
18 |
19 | start_engine,
20 | drive.
21 | PROTECTED SECTION.
22 | PRIVATE SECTION.
23 |
24 | DATA:
25 | engine TYPE REF TO zcl_engine,
26 | wheels TYPE wheel_table,
27 | seats TYPE seat_table.
28 | ENDCLASS.
29 |
30 |
31 |
32 | CLASS zcl_car IMPLEMENTATION.
33 |
34 |
35 | METHOD constructor.
36 | engine = i_engine.
37 | wheels = i_wheels.
38 | seats = i_seats.
39 | IF engine IS INITIAL.
40 | RAISE EXCEPTION TYPE zcx_incomplete_car.
41 | ENDIF.
42 |
43 | IF lines( wheels ) < min_wheel_count.
44 | RAISE EXCEPTION TYPE zcx_incomplete_car.
45 | ENDIF.
46 |
47 | IF seats IS INITIAL.
48 | RAISE EXCEPTION TYPE zcx_incomplete_car.
49 | ENDIF.
50 | ENDMETHOD.
51 |
52 |
53 | METHOD drive.
54 | WRITE: 'Starting to drive', /.
55 | engine->accelerate( ).
56 | LOOP AT wheels ASSIGNING FIELD-SYMBOL().
57 | ->turn( ).
58 | ENDLOOP.
59 | ENDMETHOD.
60 |
61 |
62 | METHOD start_engine.
63 | WRITE: 'Starting Engine', /.
64 | engine->start( ).
65 | ENDMETHOD.
66 | ENDCLASS.
67 |
--------------------------------------------------------------------------------
/ztemplate/zcl_worker_experience_filter.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_worker_experience_filter DEFINITION
2 | PUBLIC
3 | INHERITING FROM zcl_filter
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | METHODS:
8 | constructor
9 | IMPORTING
10 | i_log TYPE REF TO zif_log
11 | i_min_experience TYPE i.
12 | PROTECTED SECTION.
13 | METHODS:
14 | log_start_of_filter REDEFINITION,
15 | log_exclusion REDEFINITION,
16 | log_filter_execution REDEFINITION,
17 | is_valid REDEFINITION.
18 | METHODS: convert_to_internal_type REDEFINITION.
19 | PRIVATE SECTION.
20 |
21 | DATA min_experience TYPE i.
22 | DATA worker TYPE zworker.
23 | ENDCLASS.
24 |
25 |
26 |
27 | CLASS ZCL_WORKER_EXPERIENCE_FILTER IMPLEMENTATION.
28 |
29 |
30 | METHOD constructor.
31 | super->constructor( i_log ).
32 |
33 | min_experience = i_min_experience.
34 |
35 | ENDMETHOD.
36 |
37 |
38 | METHOD convert_to_internal_type.
39 | worker = i_row.
40 | ENDMETHOD.
41 |
42 |
43 | METHOD is_valid.
44 | r_result = cond #( when worker-experience >= min_experience
45 | then abap_true
46 | else abap_false ) .
47 | ENDMETHOD.
48 |
49 |
50 | METHOD log_exclusion.
51 | log->log( VALUE #(
52 | msgid = 'ZPATTERN'
53 | msgno = '003'
54 | msgty = 'I'
55 | msgv1 = worker-name
56 | msgv2 = worker-experience ) ).
57 |
58 | ENDMETHOD.
59 |
60 |
61 | METHOD log_filter_execution.
62 |
63 | data(line_count) = lines( i_table ).
64 | log->log( value #( msgid = 'ZPATTERN' msgno = '005' msgty = 'I' msgv1 = line_count ) ).
65 |
66 | ENDMETHOD.
67 |
68 |
69 | METHOD log_start_of_filter.
70 | log->log( VALUE #( msgid = 'ZPATTERN' msgno = '004' msgty = 'I' ) ).
71 | ENDMETHOD.
72 | ENDCLASS.
73 |
--------------------------------------------------------------------------------
/ztemplate/ztemplate_demo.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ztemplate_demo
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT ztemplate_demo.
9 |
10 | PARAMETER: p_minexp TYPE zworker-experience,
11 | p_minfre TYPE zworker-cur_tasks.
12 |
13 | START-OF-SELECTION.
14 |
15 | DATA:
16 | workers TYPE STANDARD TABLE OF zworker,
17 | exp_filter TYPE REF TO zcl_filter,
18 | free_task_filter TYPE REF TO zcl_filter,
19 | log TYPE REF TO zif_log.
20 |
21 |
22 |
23 | workers = VALUE #(
24 | ( name = 'Petra' experience = 2 cur_tasks = 1 max_tasks = 2 )
25 | ( name = 'Tom' experience = 7 cur_tasks = 1 max_tasks = 5 )
26 | ( name = 'Moritz' experience = 10 cur_tasks = 5 max_tasks = 8 )
27 | ( name = 'Tamara' experience = 7 cur_tasks = 1 max_tasks = 5 )
28 | ( name = 'Peter' experience = 2 cur_tasks = 1 max_tasks = 2 )
29 | ( name = 'Melanie' experience = 5 cur_tasks = 4 max_tasks = 4 )
30 | ( name = 'Max' experience = 5 cur_tasks = 4 max_tasks = 4 )
31 | ( name = 'Marie' experience = 10 cur_tasks = 5 max_tasks = 8 ) ).
32 |
33 | log = NEW zcl_salv_log( ).
34 |
35 | exp_filter = NEW zcl_worker_experience_filter(
36 | i_log = log
37 | i_min_experience = p_minexp ).
38 |
39 | free_task_filter = NEW zcl_worker_free_tasks_filter(
40 | i_log = log
41 | i_min_free_tasks = p_minfre ).
42 |
43 |
44 | exp_filter->filter(
45 | CHANGING
46 | c_table = workers ).
47 |
48 |
49 | free_task_filter->filter(
50 | CHANGING
51 | c_table = workers ).
52 |
53 | log->finish( ).
54 |
--------------------------------------------------------------------------------
/zbuilder/zbuilder_demo.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report zbuilder_demo
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT zbuilder_demo.
9 |
10 |
11 | CLASS lcl_fast_engine DEFINITION CREATE PUBLIC INHERITING FROM zcl_engine.
12 |
13 | PUBLIC SECTION.
14 | METHODS:
15 | start REDEFINITION,
16 | accelerate REDEFINITION.
17 | PROTECTED SECTION.
18 | PRIVATE SECTION.
19 |
20 | ENDCLASS.
21 |
22 | CLASS lcl_fast_engine IMPLEMENTATION.
23 |
24 |
25 | METHOD start.
26 | WRITE: 'The beast awakens', /.
27 | ENDMETHOD.
28 |
29 | METHOD accelerate.
30 | WRITE: 'VROOM, VROOM!', /.
31 | ENDMETHOD.
32 |
33 | ENDCLASS.
34 |
35 | CLASS lcl_fast_wheel DEFINITION CREATE PUBLIC INHERITING FROM zcl_wheel.
36 |
37 | PUBLIC SECTION.
38 | METHODS:
39 | turn REDEFINITION.
40 | PROTECTED SECTION.
41 | PRIVATE SECTION.
42 |
43 | ENDCLASS.
44 |
45 | CLASS lcl_fast_wheel IMPLEMENTATION.
46 |
47 | METHOD turn.
48 | WRITE: 'wheel spins really fast', /.
49 | ENDMETHOD.
50 |
51 | ENDCLASS.
52 |
53 | START-OF-SELECTION.
54 | DATA: normal_car TYPE REF TO zcl_car,
55 | tuned_car TYPE REF TO zcl_car,
56 | car_builder TYPE REF TO zcl_car_builder.
57 |
58 | car_builder = NEW #( ).
59 |
60 | normal_car = car_builder->build_car( ).
61 | WRITE: 'Driving with normal car', /.
62 | normal_car->start_engine( ).
63 | normal_car->drive( ).
64 |
65 | car_builder->reset( ).
66 |
67 | car_builder->set_engine( NEW lcl_fast_engine( ) ).
68 | DO 4 TIMES.
69 | car_builder->add_wheel( NEW lcl_fast_wheel( ) ).
70 | ENDDO.
71 |
72 | tuned_car = car_builder->build_car( ).
73 |
74 | WRITE: 'Driving with fast car', /.
75 | tuned_car->start_engine( ).
76 | tuned_car->drive( ).
77 |
--------------------------------------------------------------------------------
/ztemplate/zcl_worker_free_tasks_filter.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_worker_free_tasks_filter DEFINITION
2 | PUBLIC
3 | INHERITING FROM zcl_filter
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | METHODS:
8 | constructor
9 | IMPORTING
10 | i_log TYPE REF TO zif_log
11 | i_min_free_tasks TYPE i.
12 |
13 | PROTECTED SECTION.
14 | METHODS: log_start_of_filter REDEFINITION,
15 | log_exclusion REDEFINITION,
16 | log_filter_execution REDEFINITION,
17 | is_valid REDEFINITION,
18 | convert_to_internal_type REDEFINITION.
19 | PRIVATE SECTION.
20 | DATA:
21 | worker TYPE zworker,
22 | min_free_tasks TYPE i.
23 | ENDCLASS.
24 |
25 |
26 |
27 | CLASS ZCL_WORKER_FREE_TASKS_FILTER IMPLEMENTATION.
28 |
29 |
30 | METHOD constructor.
31 | super->constructor( i_log ).
32 | min_free_tasks = i_min_free_tasks.
33 | ENDMETHOD.
34 |
35 |
36 | METHOD convert_to_internal_type.
37 | worker = i_row.
38 | ENDMETHOD.
39 |
40 |
41 | METHOD is_valid.
42 | r_result = COND #( WHEN worker-max_tasks - worker-cur_tasks >= min_free_tasks
43 | THEN abap_true
44 | ELSE abap_false ).
45 | ENDMETHOD.
46 |
47 |
48 | METHOD log_exclusion.
49 | DATA: free_tasks TYPE i.
50 |
51 | free_tasks = worker-max_tasks - worker-cur_tasks.
52 | log->log( VALUE #(
53 | msgid = 'ZPATTERN'
54 | msgno = '007'
55 | msgty = 'I'
56 | msgv1 = worker-name
57 | msgv2 = free_tasks ) ).
58 | ENDMETHOD.
59 |
60 |
61 | METHOD log_filter_execution.
62 | DATA(line_count) = lines( i_table ).
63 | log->log( VALUE #( msgid = 'ZPATTERN' msgno = '008' msgty = 'I' msgv1 = line_count ) ).
64 | ENDMETHOD.
65 |
66 |
67 | METHOD log_start_of_filter.
68 | log->log( VALUE #( msgid = 'ZPATTERN' msgno = '006' msgty = 'I' msgv1 = min_free_tasks ) ).
69 | ENDMETHOD.
70 | ENDCLASS.
71 |
--------------------------------------------------------------------------------
/zstrategy/zpattern.msag.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZPATTERN
7 | D
8 | Messages for Pattern talk @ABAP Coderetreat 2017
9 |
10 |
11 |
12 | D
13 | ZPATTERN
14 | 001
15 | ABAP CodeRetreat is really cool!
16 |
17 |
18 | D
19 | ZPATTERN
20 | 002
21 | I'm glad you are all here!
22 |
23 |
24 | D
25 | ZPATTERN
26 | 003
27 | Worker & has not enough experience (&).
28 |
29 |
30 | D
31 | ZPATTERN
32 | 004
33 | Filtering Workers for experience.
34 |
35 |
36 | D
37 | ZPATTERN
38 | 005
39 | After filtering for experience & workers remain.
40 |
41 |
42 | D
43 | ZPATTERN
44 | 006
45 | Filtering workers for more than & free tasks.
46 |
47 |
48 | D
49 | ZPATTERN
50 | 007
51 | Worker & has not enough free tasks (&).
52 |
53 |
54 | D
55 | ZPATTERN
56 | 008
57 | After filtering for free tasks & workers remain.
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/ziterator/ziterator_demo.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report ziterator_demo
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT ziterator_demo.
9 |
10 | " Create collection and iterator
11 | DATA(collection) = NEW zcl_collection( ).
12 | DATA(iterator) = collection->zif_collection~get_iterator( ).
13 |
14 | "Create some dummy Objects
15 | DATA(user) = NEW zcl_sap_user( i_firstname = 'Max' i_lastname = 'Moritz' i_date_of_birth = '19900109' ).
16 | collection->zif_collection~add( user ).
17 | user = NEW zcl_sap_user( i_firstname = 'Tom' i_lastname = 'Muster' i_date_of_birth = '19650809' ).
18 | collection->zif_collection~add( user ).
19 | user = NEW zcl_sap_user( i_firstname = 'Peter' i_lastname = 'Mustermann' i_date_of_birth = '19971121' ).
20 | collection->zif_collection~add( user ).
21 | user = NEW zcl_sap_user( i_firstname = 'Philip' i_lastname = 'Muster' i_date_of_birth = '19850603' ).
22 | collection->zif_collection~add( user ).
23 |
24 | "Basic Loop without restrictions
25 | WRITE: / 'start of loop - output complete list'.
26 | WHILE iterator->has_next( ) = abap_true.
27 | user ?= iterator->get_next( ).
28 | WRITE: / user->to_string( ).
29 | ENDWHILE.
30 | WRITE: / 'end of loop'.
31 |
32 | *********************************************************************************
33 |
34 | "Create Predicates
35 | DATA(predicate_1) = NEW zcl_predicate_user_age( i_age = '30' i_option = 'GE' ).
36 | DATA(predicate_2) = NEW zcl_predicate_user_age( i_age = '50' i_option = 'LE' ).
37 | iterator->reset( ).
38 | iterator->add_predicate( i_predicate = predicate_1 ).
39 | iterator->add_predicate( i_predicate = predicate_2 ).
40 |
41 | "Second Loop considering the Predicates
42 | WRITE: / 'start of loop - predicate age GE 30 and age LE 50'.
43 | WHILE iterator->has_next( ) = abap_true.
44 | user ?= iterator->get_next( ).
45 | WRITE: / user->to_string( ).
46 | ENDWHILE.
47 | WRITE: / 'end of loop'.
48 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project.clas.testclasses.abap:
--------------------------------------------------------------------------------
1 | *"* use this source file for your ABAP unit test classes
2 | CLASS ltcl_project DEFINITION FINAL FOR TESTING
3 | DURATION SHORT
4 | RISK LEVEL HARMLESS.
5 |
6 | PRIVATE SECTION.
7 | DATA: project TYPE REF TO zcl_project,
8 | task TYPE REF TO zcl_project_task.
9 | METHODS:
10 | setup,
11 | assert_project_status_is IMPORTING i_status TYPE i,
12 | status_of_inital_project_is_0 FOR TESTING RAISING cx_static_check,
13 | status_of_done_project_is_100 FOR TESTING RAISING cx_static_check,
14 | status_with_half_tasks_done_50 FOR TESTING RAISING cx_static_check,
15 | project_done_closes_subtasks FOR TESTING RAISING cx_static_check,
16 | add_new_task_to_project
17 | RETURNING
18 | VALUE(r_task) TYPE REF TO zcl_project_task.
19 | ENDCLASS.
20 |
21 |
22 | CLASS ltcl_project IMPLEMENTATION.
23 |
24 | METHOD setup.
25 | CLEAR task.
26 | CREATE OBJECT project
27 | EXPORTING
28 | i_title = 'My Project'.
29 | ENDMETHOD.
30 |
31 | METHOD assert_project_status_is.
32 | cl_abap_unit_assert=>assert_equals( exp = i_status act = project->calculate_status( ) ).
33 | ENDMETHOD.
34 |
35 | METHOD status_of_inital_project_is_0.
36 | assert_project_status_is( 0 ).
37 | ENDMETHOD.
38 |
39 | METHOD status_of_done_project_is_100.
40 | project->mark_as_done( ).
41 | assert_project_status_is( 100 ).
42 | ENDMETHOD.
43 |
44 | METHOD status_with_half_tasks_done_50.
45 | add_new_task_to_project( ).
46 | task = add_new_task_to_project( ).
47 | task->mark_as_done( ).
48 | assert_project_status_is( 50 ).
49 | ENDMETHOD.
50 |
51 | METHOD add_new_task_to_project.
52 | CREATE OBJECT r_task
53 | EXPORTING
54 | i_title = 'Some Task'.
55 | project->add( r_task ).
56 | ENDMETHOD.
57 |
58 | METHOD project_done_closes_subtasks.
59 | task = add_new_task_to_project( ).
60 | project->mark_as_done( ).
61 | cl_abap_unit_assert=>assert_equals( exp = 100 act = task->calculate_status( ) ).
62 | ENDMETHOD.
63 |
64 | ENDCLASS.
65 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project_task.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_project_task DEFINITION
2 | PUBLIC
3 | INHERITING FROM zcl_project
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | CLASS-METHODS create_task
8 | IMPORTING
9 | i_id TYPE zcom_project-project_id OPTIONAL
10 | i_parent_id TYPE zcom_project-parent_id OPTIONAL
11 | i_title TYPE zcom_project-title
12 | i_assignee TYPE uname
13 | i_done TYPE abap_bool
14 | RETURNING
15 | VALUE(r_result) TYPE REF TO zcl_project_task.
16 |
17 | METHODS:
18 | get_assignees REDEFINITION,
19 | assign_to REDEFINITION,
20 | add REDEFINITION.
21 |
22 | PROTECTED SECTION.
23 | METHODS create_struct_for_saving REDEFINITION.
24 | METHODS:
25 | create_struct_representation REDEFINITION.
26 | PRIVATE SECTION.
27 | DATA:
28 | assignee TYPE uname.
29 | ENDCLASS.
30 |
31 |
32 |
33 | CLASS ZCL_PROJECT_TASK IMPLEMENTATION.
34 |
35 |
36 | METHOD add.
37 | RAISE EXCEPTION TYPE zcx_project_error
38 | EXPORTING
39 | textid = zcx_project_error=>operation_not_supported.
40 | ENDMETHOD.
41 |
42 |
43 | METHOD assign_to.
44 | modified = abap_true.
45 | assignee = i_assignee.
46 | ENDMETHOD.
47 |
48 |
49 | METHOD create_struct_for_saving.
50 | r_result = super->create_struct_for_saving( ).
51 | r_result-type = project_type-task.
52 | r_result-assignee = assignee.
53 | ENDMETHOD.
54 |
55 |
56 | METHOD create_struct_representation.
57 | r_result = super->create_struct_representation( ).
58 | r_result-assignee = assignee.
59 | ENDMETHOD.
60 |
61 |
62 | METHOD create_task.
63 |
64 | CREATE OBJECT r_result
65 | EXPORTING
66 | i_id = i_id
67 | i_parent_id = i_parent_id
68 | i_title = i_title.
69 |
70 | r_result->assignee = i_assignee.
71 | IF i_done = abap_true.
72 | r_result->mark_as_done( ).
73 | ENDIF.
74 |
75 | ENDMETHOD.
76 |
77 |
78 | METHOD get_assignees.
79 | INSERT assignee INTO TABLE r_assignees.
80 | ENDMETHOD.
81 | ENDCLASS.
82 |
--------------------------------------------------------------------------------
/zstrategy/zcl_bal_log.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_bal_log DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC .
4 |
5 | PUBLIC SECTION.
6 |
7 | INTERFACES zif_log .
8 |
9 | PROTECTED SECTION.
10 | PRIVATE SECTION.
11 | DATA:
12 | messages TYPE bal_t_msg.
13 | ENDCLASS.
14 |
15 |
16 |
17 | CLASS zcl_bal_log IMPLEMENTATION.
18 |
19 |
20 | METHOD zif_log~finish.
21 |
22 | IF messages IS INITIAL.
23 | RETURN.
24 | ENDIF.
25 |
26 | DATA: header TYPE bal_s_log,
27 | handle TYPE balloghndl,
28 | handles TYPE bal_t_logh,
29 | timestamp TYPE timestamp.
30 |
31 |
32 | GET TIME STAMP FIELD timestamp.
33 |
34 | header-extnumber = |ABAP CDR17 { timestamp }|.
35 | header-object = 'ZPATTERN'.
36 | header-aldate = sy-datum.
37 | header-altime = sy-uzeit.
38 | header-alprog = sy-repid.
39 | header-aluser = sy-uname.
40 | header-aldate_del = sy-datum + 7.
41 |
42 |
43 | CALL FUNCTION 'BAL_LOG_CREATE'
44 | EXPORTING
45 | i_s_log = header
46 | IMPORTING
47 | e_log_handle = handle
48 | EXCEPTIONS
49 | log_header_inconsistent = 1
50 | OTHERS = 2.
51 | IF sy-subrc <> 0.
52 | RETURN.
53 | ENDIF.
54 |
55 | INSERT handle INTO TABLE handles.
56 |
57 |
58 | LOOP AT messages ASSIGNING FIELD-SYMBOL().
59 | CALL FUNCTION 'BAL_LOG_MSG_ADD'
60 | EXPORTING
61 | i_log_handle = handle
62 | i_s_msg =
63 | EXCEPTIONS
64 | log_not_found = 1
65 | msg_inconsistent = 2
66 | log_is_full = 3
67 | OTHERS = 4.
68 | IF sy-subrc <> 0.
69 | EXIT.
70 | ENDIF.
71 |
72 | ENDLOOP.
73 |
74 |
75 |
76 | CALL FUNCTION 'BAL_DB_SAVE'
77 | EXPORTING
78 | i_client = sy-mandt
79 | i_t_log_handle = handles
80 | EXCEPTIONS
81 | log_not_found = 1
82 | save_not_allowed = 2
83 | numbering_error = 3
84 | OTHERS = 4.
85 |
86 |
87 | CLEAR messages.
88 |
89 | CALL FUNCTION 'BAL_LOG_REFRESH'
90 | EXPORTING
91 | i_log_handle = handle " Protokollhandle
92 | EXCEPTIONS
93 | OTHERS = 0.
94 |
95 |
96 | ENDMETHOD.
97 |
98 |
99 | METHOD zif_log~log.
100 |
101 | INSERT i_message INTO TABLE messages.
102 |
103 | ENDMETHOD.
104 | ENDCLASS.
105 |
--------------------------------------------------------------------------------
/ziterator/zcl_iterator.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_iterator DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | INTERFACES: zif_iterator.
8 | METHODS constructor IMPORTING i_collection TYPE REF TO zif_collection.
9 | PROTECTED SECTION.
10 | PRIVATE SECTION.
11 | DATA predicates TYPE STANDARD TABLE OF REF TO zif_predicate.
12 | METHODS check_predicates IMPORTING i_element TYPE REF TO object
13 | RETURNING VALUE(r_accept) TYPE xsdboolean.
14 |
15 | ENDCLASS.
16 |
17 |
18 |
19 | CLASS ZCL_ITERATOR IMPLEMENTATION.
20 |
21 |
22 | METHOD check_predicates.
23 | IF i_element IS NOT BOUND.
24 | RETURN.
25 | ENDIF.
26 |
27 | LOOP AT me->predicates ASSIGNING FIELD-SYMBOL().
28 | DATA(accepted) = ->accept( i_element = i_element ).
29 | IF accepted = abap_false.
30 | RETURN.
31 | ENDIF.
32 | ENDLOOP.
33 |
34 | r_accept = abap_true.
35 | ENDMETHOD.
36 |
37 |
38 | METHOD constructor.
39 | me->zif_iterator~collection = i_collection.
40 | me->zif_iterator~increment = 1.
41 | ENDMETHOD.
42 |
43 |
44 | METHOD zif_iterator~add_predicate.
45 | IF i_predicate IS BOUND.
46 | APPEND i_predicate TO me->predicates.
47 | ENDIF.
48 | ENDMETHOD.
49 |
50 |
51 | METHOD zif_iterator~clear_predicates.
52 | CLEAR me->predicates.
53 | ENDMETHOD.
54 |
55 |
56 | METHOD zif_iterator~get_current.
57 | r_object = me->zif_iterator~collection->get( me->zif_iterator~current_index ).
58 | ENDMETHOD.
59 |
60 |
61 | METHOD zif_iterator~get_next.
62 | IF check_predicates( me->zif_iterator~collection->get( me->zif_iterator~current_index ) ).
63 | r_object = me->zif_iterator~collection->get( me->zif_iterator~current_index ).
64 | ELSE.
65 | me->zif_iterator~current_index = me->zif_iterator~current_index + me->zif_iterator~increment.
66 | r_object = me->zif_iterator~get_next( ).
67 | ENDIF.
68 | ENDMETHOD.
69 |
70 |
71 | METHOD zif_iterator~has_next.
72 | IF check_predicates( me->zif_iterator~collection->get(
73 | me->zif_iterator~current_index + me->zif_iterator~increment ) ).
74 | me->zif_iterator~current_index = me->zif_iterator~current_index + me->zif_iterator~increment.
75 | r_has_next = abap_true.
76 | ELSE.
77 | IF me->zif_iterator~current_index < me->zif_iterator~collection->size( ).
78 | me->zif_iterator~current_index = me->zif_iterator~current_index + me->zif_iterator~increment.
79 | r_has_next = me->zif_iterator~has_next( ).
80 | ENDIF.
81 | ENDIF.
82 | ENDMETHOD.
83 |
84 |
85 | METHOD zif_iterator~reset.
86 | me->zif_iterator~current_index = 0.
87 | ENDMETHOD.
88 | ENDCLASS.
89 |
--------------------------------------------------------------------------------
/zcomposite/zcom_project.tabl.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | ZCOM_PROJECT
7 | D
8 | TRANSP
9 | X
10 | Hierachical Projects and Tasks
11 | A
12 | 1
13 |
14 |
15 | ZCOM_PROJECT
16 | A
17 | 0
18 | APPL0
19 | N
20 | R
21 |
22 |
23 |
24 | ZCOM_PROJECT
25 | MANDT
26 | 0001
27 | X
28 | MANDT
29 | 0
30 | X
31 | D
32 | E
33 |
34 |
35 | ZCOM_PROJECT
36 | PROJECT_ID
37 | 0002
38 | X
39 | ZPROJECT_ID
40 | 0
41 | X
42 | E
43 |
44 |
45 | ZCOM_PROJECT
46 | TITLE
47 | 0003
48 | ZPROJECT_TITLE
49 | 0
50 | E
51 |
52 |
53 | ZCOM_PROJECT
54 | PARENT_ID
55 | 0004
56 | ZPROJECT_ID
57 | 0
58 | E
59 |
60 |
61 | ZCOM_PROJECT
62 | ASSIGNEE
63 | 0005
64 | UNAME
65 | 0
66 | E
67 |
68 |
69 | ZCOM_PROJECT
70 | TYPE
71 | 0006
72 | ZPROJECT_TYPE
73 | 0
74 | X
75 | F
76 | E
77 |
78 |
79 | ZCOM_PROJECT
80 | DONE
81 | 0007
82 | ZPROJECT_DONE
83 | 0
84 | X
85 | F
86 | E
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/zbuilder/zcl_car_builder.clas.abap:
--------------------------------------------------------------------------------
1 | "! This class implements the builder pattern for zcl_car
2 | "!
3 | "! A builder encapsulates complex instaniation logic of
4 | "! another class. It makes coping with different configurations
5 | "! of a class easy where normally a lot of optional constructor
6 | "! parameters would be used the builder can provide separate methods
7 | "! for parameters or one method per configuration of parameters
8 | "! (the latter one is not implemented here). In this implementation
9 | "! I choose to automatically fill not passed parameters. This is not
10 | "! part of the pattern but a adaption I made.
11 | CLASS zcl_car_builder DEFINITION
12 | PUBLIC
13 | CREATE PUBLIC .
14 |
15 | PUBLIC SECTION.
16 |
17 | METHODS:
18 |
19 | "! Constructs car with the values passed to the other method
20 | "!
21 | "! Missing values are filled with suitable defaults.
22 | build_car RETURNING VALUE(r_car) TYPE REF TO zcl_car,
23 | add_wheels IMPORTING i_count TYPE i,
24 | add_wheel IMPORTING i_wheel TYPE REF TO zcl_wheel,
25 | add_seat IMPORTING i_seat TYPE REF TO zcl_seat,
26 | set_engine IMPORTING i_engine TYPE REF TO zcl_engine ,
27 | add_seats IMPORTING i_count TYPE i,
28 | "! Deletes all previously received values.
29 | reset.
30 |
31 | PROTECTED SECTION.
32 | PRIVATE SECTION.
33 | DATA:
34 | wheels TYPE zcl_car=>wheel_table,
35 | seats TYPE zcl_car=>seat_table,
36 | engine TYPE REF TO zcl_engine.
37 |
38 | METHODS:
39 | "! Check that the car gets at least one seat
40 | "! an engine, and 4 wheels. Missing components
41 | "! are created with default values.
42 | ensure_minimal_configuration.
43 |
44 | ENDCLASS.
45 |
46 |
47 |
48 | CLASS zcl_car_builder IMPLEMENTATION.
49 |
50 |
51 | METHOD add_seat.
52 | INSERT i_seat INTO TABLE seats.
53 | ENDMETHOD.
54 |
55 |
56 | METHOD add_seats.
57 | DO i_count TIMES.
58 | add_seat( NEW #( ) ).
59 | ENDDO.
60 | ENDMETHOD.
61 |
62 |
63 | METHOD add_wheel.
64 | INSERT i_wheel INTO TABLE wheels.
65 | ENDMETHOD.
66 |
67 |
68 | METHOD add_wheels.
69 | DO i_count TIMES.
70 | add_wheel( NEW #( ) ).
71 | ENDDO.
72 | ENDMETHOD.
73 |
74 |
75 | METHOD build_car.
76 | ensure_minimal_configuration( ).
77 | r_car = NEW #(
78 | i_wheels = wheels
79 | i_seats = seats
80 | i_engine = engine ).
81 | ENDMETHOD.
82 |
83 |
84 | METHOD ensure_minimal_configuration.
85 | DATA: missing_wheels TYPE i.
86 |
87 | missing_wheels = lines( wheels ) - zcl_car=>min_wheel_count.
88 | IF wheels IS INITIAL.
89 | add_wheels( zcl_car=>min_wheel_count ).
90 | ENDIF.
91 | IF seats IS INITIAL.
92 | add_seat( NEW #( ) ).
93 | ENDIF.
94 | IF engine IS INITIAL.
95 | set_engine( NEW #( ) ).
96 | ENDIF.
97 |
98 | ENDMETHOD.
99 |
100 |
101 | METHOD reset.
102 | CLEAR: engine, wheels, seats.
103 | ENDMETHOD.
104 |
105 |
106 | METHOD set_engine.
107 | engine = i_engine.
108 | ENDMETHOD.
109 | ENDCLASS.
110 |
--------------------------------------------------------------------------------
/zcomposite/z_manage_projects.prog.abap:
--------------------------------------------------------------------------------
1 | *&---------------------------------------------------------------------*
2 | *& Report z_manage_projects
3 | *&
4 | *&---------------------------------------------------------------------*
5 | *&
6 | *&
7 | *&---------------------------------------------------------------------*
8 | REPORT z_manage_projects.
9 |
10 | DATA:
11 | project TYPE REF TO zcl_project,
12 | dao TYPE REF TO zcl_project_dao,
13 | outtab TYPE STANDARD TABLE OF zcl_project=>ty_display WITH DEFAULT KEY.
14 |
15 | CLASS lcl_event_handler DEFINITION.
16 |
17 | PUBLIC SECTION.
18 | METHODS:
19 | double_click FOR EVENT double_click OF cl_salv_events_tree
20 | IMPORTING node_key columnname sender,
21 | constructor IMPORTING i_tree TYPE REF TO cl_salv_tree,
22 |
23 | on_function_click FOR EVENT added_function OF cl_salv_events_tree
24 | IMPORTING e_salv_function.
25 | PROTECTED SECTION.
26 | PRIVATE SECTION.
27 | DATA:
28 | tree TYPE REF TO cl_salv_tree,
29 | nodes TYPE REF TO cl_salv_nodes.
30 |
31 | ENDCLASS.
32 |
33 | CLASS lcl_event_handler IMPLEMENTATION.
34 |
35 | METHOD constructor.
36 | me->tree = i_tree.
37 | nodes = tree->get_nodes( ).
38 | ENDMETHOD.
39 |
40 | METHOD double_click.
41 | DATA: row TYPE REF TO zcl_project=>ty_display,
42 | node TYPE REF TO cl_salv_node.
43 |
44 | node = nodes->get_node( node_key ).
45 | row ?= node->get_data_row( ).
46 |
47 | IF columnname = 'COMPLETION' OR columnname = 'DONE'.
48 | row->ref->mark_as_done( ).
49 | ELSE.
50 | row->ref->assign_to( sy-uname ).
51 | ENDIF.
52 | nodes->delete_all( ).
53 |
54 | project->display_in_tree( tree ).
55 |
56 | ENDMETHOD.
57 |
58 |
59 | METHOD on_function_click.
60 |
61 | CASE e_salv_function.
62 | WHEN'SAVE'.
63 | dao->save_modified_parts_of_project( project ).
64 | WHEN 'BACK'.
65 | LEAVE TO screen 0.
66 | WHEN 'EXIT'.
67 | LEAVE PROGRAM.
68 | ENDCASE.
69 | ENDMETHOD.
70 |
71 | ENDCLASS.
72 |
73 |
74 |
75 | PARAMETER prj_id TYPE zcom_project-project_id.
76 |
77 | START-OF-SELECTION.
78 |
79 | DATA:
80 | tree TYPE REF TO cl_salv_tree,
81 | projects TYPE SORTED TABLE OF zcom_project WITH UNIQUE KEY parent_id project_id,
82 | functions TYPE REF TO cl_salv_functions_tree,
83 | columns TYPE REF TO cl_salv_columns_tree,
84 | event TYPE REF TO cl_salv_events_tree,
85 | handler TYPE REF TO lcl_event_handler.
86 |
87 |
88 | cl_salv_tree=>factory(
89 | IMPORTING
90 | r_salv_tree = tree " ALV: Tree model
91 | CHANGING
92 | t_table = outtab ).
93 | CREATE OBJECT dao.
94 |
95 |
96 | project = dao->load_project_by_id( prj_id ).
97 |
98 | IF project IS BOUND.
99 | project->display_in_tree( tree ).
100 | ENDIF.
101 |
102 | columns = tree->get_columns( ).
103 | columns->set_optimize( abap_true ).
104 |
105 | tree->set_screen_status(
106 | EXPORTING
107 | report = 'Z_MANAGE_PROJECTS'
108 | pfstatus = 'SAVE'
109 | ).
110 |
111 | event = tree->get_event( ).
112 |
113 | CREATE OBJECT handler
114 | EXPORTING
115 | i_tree = tree.
116 |
117 | SET HANDLER handler->double_click FOR event.
118 | SET HANDLER handler->on_function_click FOR event.
119 |
120 | tree->display( ).
121 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project_dao.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_project_dao DEFINITION
2 | PUBLIC
3 | FINAL
4 | CREATE PUBLIC .
5 |
6 | PUBLIC SECTION.
7 | METHODS:
8 | load_project_by_id
9 | IMPORTING i_project_id TYPE zcom_project-project_id
10 | RETURNING VALUE(r_project) TYPE REF TO zcl_project,
11 | load_project_by_struc
12 | IMPORTING
13 | i_project TYPE zcom_project
14 | RETURNING VALUE(r_project) TYPE REF TO zcl_project,
15 | save_modified_parts_of_project
16 | IMPORTING i_project TYPE REF TO zcl_project.
17 | PROTECTED SECTION.
18 | PRIVATE SECTION.
19 | METHODS instatiate_project
20 | IMPORTING
21 | i_project TYPE zcom_project
22 | RETURNING
23 | VALUE(r_project) TYPE REF TO zcl_project.
24 |
25 | ENDCLASS.
26 |
27 |
28 |
29 | CLASS ZCL_PROJECT_DAO IMPLEMENTATION.
30 |
31 |
32 | METHOD instatiate_project.
33 |
34 | IF i_project-type = zcl_project=>project_type-project.
35 | r_project = zcl_project=>create_project(
36 | i_id = i_project-project_id
37 | i_parent_id = i_project-parent_id
38 | i_title = i_project-title
39 | i_done = i_project-done
40 | ).
41 | ELSE.
42 | r_project = zcl_project_task=>create_task(
43 | i_id = i_project-project_id
44 | i_parent_id = i_project-parent_id
45 | i_title = i_project-title
46 | i_assignee = i_project-assignee
47 | i_done = i_project-done
48 | ).
49 | ENDIF.
50 |
51 |
52 | ENDMETHOD.
53 |
54 |
55 | METHOD load_project_by_id.
56 | DATA:
57 | projects TYPE SORTED TABLE OF zcom_project WITH UNIQUE KEY parent_id project_id,
58 | project LIKE LINE OF projects.
59 |
60 | FIELD-SYMBOLS: TYPE zcom_project.
61 |
62 | SELECT *
63 | FROM zcom_project
64 | INTO TABLE projects
65 | WHERE project_id = i_project_id
66 | OR parent_id = i_project_id.
67 |
68 | READ TABLE projects WITH KEY project_id = i_project_id ASSIGNING .
69 | IF sy-subrc <> 0.
70 | "todo exception
71 | RETURN.
72 | ENDIF.
73 |
74 | r_project = instatiate_project( ).
75 | LOOP AT projects ASSIGNING WHERE project_id <> i_project_id.
76 | r_project->add( i_sub = load_project_by_struc( ) ).
77 | ENDLOOP.
78 |
79 | ENDMETHOD.
80 |
81 |
82 | METHOD load_project_by_struc.
83 | DATA:
84 | projects TYPE SORTED TABLE OF zcom_project WITH UNIQUE KEY parent_id project_id.
85 |
86 | FIELD-SYMBOLS: TYPE zcom_project.
87 |
88 | SELECT *
89 | FROM zcom_project
90 | INTO TABLE projects
91 | WHERE parent_id = i_project-project_id.
92 |
93 | r_project = instatiate_project( i_project ).
94 |
95 |
96 | LOOP AT projects ASSIGNING .
97 | r_project->add( i_sub = load_project_by_struc( ) ).
98 | ENDLOOP.
99 |
100 | ENDMETHOD.
101 |
102 |
103 | METHOD save_modified_parts_of_project.
104 | DATA: project_struct TYPE zcom_project.
105 |
106 | IF i_project->modified = abap_true.
107 | project_struct = i_project->create_struct_for_saving( ).
108 |
109 | IF project_struct-project_id IS INITIAL.
110 |
111 | CALL FUNCTION 'NUMBER_GET_NEXT'
112 | EXPORTING
113 | nr_range_nr = '01'
114 | object = 'ZCOM_PROJ'
115 | IMPORTING
116 | number = project_struct-project_id
117 | EXCEPTIONS
118 | OTHERS = 1.
119 | IF sy-subrc <> 0.
120 | MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
121 | WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
122 | ENDIF.
123 |
124 | INSERT INTO zcom_project VALUES project_struct.
125 | ELSE.
126 | UPDATE zcom_project FROM project_struct.
127 | ENDIF.
128 | ENDIF.
129 |
130 | LOOP AT i_project->components ASSIGNING FIELD-SYMBOL().
131 | save_modified_parts_of_project( ).
132 | ENDLOOP.
133 |
134 | ENDMETHOD.
135 | ENDCLASS.
136 |
--------------------------------------------------------------------------------
/zcomposite/z_manage_projects.prog.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Z_MANAGE_PROJECTS
7 | A
8 | X
9 | S
10 | 1
11 | X
12 | D$S
13 | X
14 |
15 |
16 |
17 | 000001
18 | 000005
19 | 000001
20 |
21 |
22 |
23 | SAVE
24 | D
25 | 000001
26 | 000001
27 | 0001
28 | Save Tree status
29 |
30 |
31 |
32 |
33 | BACK
34 | 001
35 | S
36 | Zurück
37 |
38 |
39 | EXIT
40 | 001
41 | S
42 | Beenden
43 |
44 |
45 | EXIT
46 | 002
47 | S
48 | ICON_CANCEL
49 | @0W@
50 | Abbrechen
51 |
52 |
53 | SAVE
54 | 001
55 | S
56 | ICON_SYSTEM_SAVE
57 | @2L@
58 | Save
59 |
60 |
61 | SAVE
62 | 002
63 | S
64 | ICON_SYSTEM_SAVE
65 | @2L@
66 | Sichern
67 |
68 |
69 |
70 |
71 | 000001
72 | 02
73 | SAVE
74 | 001
75 |
76 |
77 | 000001
78 | 03
79 | BACK
80 | 001
81 |
82 |
83 | 000001
84 | 11
85 | SAVE
86 | 002
87 |
88 |
89 | 000001
90 | 12
91 | EXIT
92 | 002
93 |
94 |
95 | 000001
96 | 15
97 | EXIT
98 | 001
99 |
100 |
101 |
102 |
103 | SAVE
104 | BACK
105 |
106 |
107 | SAVE
108 | EXIT
109 |
110 |
111 | SAVE
112 | SAVE
113 |
114 |
115 |
116 |
117 | A
118 | 000001
119 | D
120 | Save Tree status
121 |
122 |
123 | P
124 | 000001
125 | D
126 | Save Tree status
127 |
128 |
129 | B
130 | 000001
131 | 0001
132 | D
133 | Save Tree status
134 |
135 |
136 |
137 |
138 | -
139 | R
140 | Manage Projects through the power of composite pattern
141 | 54
142 |
143 |
144 |
145 |
146 |
147 |
--------------------------------------------------------------------------------
/zcomposite/zcl_project.clas.abap:
--------------------------------------------------------------------------------
1 | CLASS zcl_project DEFINITION
2 | PUBLIC
3 | CREATE PUBLIC
4 | GLOBAL FRIENDS zcl_project_dao.
5 |
6 | PUBLIC SECTION.
7 | TYPES:
8 | tty_assignees TYPE SORTED TABLE OF uname WITH UNIQUE KEY table_line,
9 |
10 | BEGIN OF ty_display,
11 | title TYPE zcom_project-title,
12 | assignee TYPE zcom_project-assignee,
13 | completion TYPE zproject_completion,
14 | done TYPE zcom_project-done,
15 | ref TYPE REF TO zcl_project,
16 | END OF ty_display,
17 | tty_display TYPE STANDARD TABLE OF ty_display WITH DEFAULT KEY.
18 |
19 | CONSTANTS:
20 | BEGIN OF project_type,
21 | project TYPE zcom_project-type VALUE 'P',
22 | task TYPE zcom_project-type VALUE 'T',
23 | END OF project_type.
24 |
25 | CLASS-METHODS create_project
26 | IMPORTING
27 | i_id TYPE zcom_project-project_id OPTIONAL
28 | i_parent_id TYPE zcom_project-parent_id OPTIONAL
29 | i_title TYPE zcom_project-title
30 | i_done TYPE abap_bool
31 | RETURNING
32 | VALUE(r_result) TYPE REF TO zcl_project.
33 |
34 | METHODS:
35 | constructor
36 | IMPORTING
37 | i_title TYPE zcom_project-title
38 | i_id TYPE zcom_project-project_id OPTIONAL
39 | i_parent_id TYPE zcom_project-parent_id OPTIONAL ,
40 |
41 | mark_as_done ,
42 |
43 | assign_to IMPORTING i_assignee TYPE uname,
44 |
45 | add
46 | IMPORTING i_sub TYPE REF TO zcl_project
47 | RAISING zcx_project_error,
48 |
49 | calculate_status RETURNING VALUE(r_status) TYPE i,
50 |
51 | get_assignees RETURNING VALUE(r_assignees) TYPE tty_assignees,
52 |
53 | display_in_tree IMPORTING i_tree TYPE REF TO cl_salv_tree,
54 |
55 | recreate_tree_table RETURNING VALUE(r_result) TYPE tty_display.
56 |
57 | PROTECTED SECTION.
58 | METHODS create_struct_representation
59 | RETURNING
60 | VALUE(r_result) TYPE ty_display.
61 | METHODS create_struct_for_saving
62 | RETURNING
63 | VALUE(r_result) TYPE zcom_project.
64 |
65 |
66 | DATA: modified TYPE abap_bool VALUE abap_false.
67 |
68 | PRIVATE SECTION.
69 |
70 | DATA:
71 | title TYPE zcom_project-title,
72 | components TYPE STANDARD TABLE OF REF TO zcl_project WITH DEFAULT KEY,
73 | done TYPE abap_bool,
74 | id TYPE zcom_project-project_id,
75 | parent_id TYPE zcom_project-parent_id.
76 | METHODS display_in_tree_internal
77 | IMPORTING
78 | i_nodes TYPE REF TO cl_salv_nodes
79 | i_par_key TYPE salv_de_node_key OPTIONAL
80 | RETURNING VALUE(r_node) TYPE REF TO cl_salv_node.
81 |
82 |
83 |
84 | ENDCLASS.
85 |
86 |
87 |
88 | CLASS ZCL_PROJECT IMPLEMENTATION.
89 |
90 |
91 | METHOD add.
92 | INSERT i_sub INTO TABLE components.
93 | ENDMETHOD.
94 |
95 |
96 | METHOD assign_to.
97 | FIELD-SYMBOLS: TYPE REF TO zcl_project.
98 | LOOP AT components ASSIGNING .
99 | ->assign_to( i_assignee ).
100 | ENDLOOP.
101 | ENDMETHOD.
102 |
103 |
104 | METHOD calculate_status.
105 | DATA: total_status TYPE i VALUE 0.
106 | FIELD-SYMBOLS: TYPE REF TO zcl_project.
107 |
108 | IF done = abap_true.
109 | r_status = 100.
110 | RETURN.
111 | ENDIF.
112 | LOOP AT components ASSIGNING .
113 | total_status = total_status + ->calculate_status( ).
114 | ENDLOOP.
115 | r_status = total_status / lines( components ).
116 | ENDMETHOD.
117 |
118 |
119 | METHOD constructor.
120 | me->title = i_title.
121 | me->id = i_id.
122 | me->parent_id = i_parent_id.
123 | ENDMETHOD.
124 |
125 |
126 | METHOD create_project.
127 | CREATE OBJECT r_result
128 | EXPORTING
129 | i_id = i_id
130 | i_parent_id = i_parent_id
131 | i_title = i_title.
132 | r_result->done = i_done.
133 | ENDMETHOD.
134 |
135 |
136 | METHOD create_struct_for_saving.
137 | r_result-project_id = id.
138 | r_result-title = title.
139 | r_result-parent_id = parent_id.
140 | r_result-type = project_type-project.
141 | r_result-done = done.
142 | ENDMETHOD.
143 |
144 |
145 | METHOD create_struct_representation.
146 | r_result-title = title.
147 | r_result-done = done.
148 | r_result-completion = calculate_status( ).
149 | r_result-ref = me.
150 | ENDMETHOD.
151 |
152 |
153 | METHOD display_in_tree.
154 | DATA: node TYPE REF TO cl_salv_node,
155 | nodes TYPE REF TO cl_salv_nodes.
156 |
157 | nodes = i_tree->get_nodes( ).
158 | node = display_in_tree_internal(
159 | i_nodes = nodes ).
160 | TRY.
161 | node->get_children( ).
162 | node->expand( complete_subtree = abap_true ).
163 | CATCH cx_salv_msg.
164 | ENDTRY.
165 | ENDMETHOD.
166 |
167 |
168 | METHOD display_in_tree_internal.
169 | FIELD-SYMBOLS: TYPE REF TO zcl_project.
170 |
171 | i_nodes->add_node(
172 | EXPORTING
173 | related_node = i_par_key
174 | relationship = cl_gui_column_tree=>relat_last_child
175 | data_row = create_struct_representation( )
176 | RECEIVING
177 | node = r_node ).
178 | LOOP AT components ASSIGNING .
179 | ->display_in_tree_internal(
180 | EXPORTING
181 | i_nodes = i_nodes
182 | i_par_key = r_node->get_key( ) ).
183 | ENDLOOP.
184 |
185 | ENDMETHOD.
186 |
187 |
188 | METHOD get_assignees.
189 | FIELD-SYMBOLS:
190 | TYPE REF TO zcl_project,
191 | TYPE uname.
192 |
193 | LOOP AT components ASSIGNING .
194 | LOOP AT ->get_assignees( ) ASSIGNING .
195 | INSERT INTO TABLE r_assignees.
196 | ENDLOOP.
197 | ENDLOOP.
198 | ENDMETHOD.
199 |
200 |
201 | METHOD mark_as_done.
202 | FIELD-SYMBOLS: TYPE REF TO zcl_project.
203 |
204 | modified = done = abap_true.
205 | LOOP AT components ASSIGNING .
206 | ->mark_as_done( ).
207 | ENDLOOP.
208 | ENDMETHOD.
209 |
210 |
211 | METHOD recreate_tree_table.
212 | FIELD-SYMBOLS: TYPE REF TO zcl_project.
213 | INSERT create_struct_representation( ) INTO TABLE r_result.
214 | LOOP AT components ASSIGNING .
215 | INSERT LINES OF ->recreate_tree_table( ) INTO TABLE r_result.
216 | ENDLOOP.
217 |
218 | ENDMETHOD.
219 | ENDCLASS.
220 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------