├── .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 | ZCOM_PROJ 7 | ZPROJECT_ID 8 | 95.0 9 | X 10 | 00000010 11 | 12 | 13 | D 14 | ZCOM_PROJ 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 | --------------------------------------------------------------------------------