Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Sandra_Rossi
Active Contributor
871

In this blog post, I propose the code of a demo program to create Application Job Catalog Entries and Templates, which works in ABAP 7.52 SP04. In this version, the released API "CL_APJ_DT_CREATE_CONTENT" cannot be used as it doesn't exist. There are lots of things missing in this demo program, like error management. To be used at your own risk.

One word about the Application Job framework: it's the new way to schedule background jobs. It exists since ABAP 7.50, and it's still used and developed in ABAP Cloud. The old job framework (JOB_OPEN, etc.) cannot be used with ABAP Cloud, so I recommend reading more about the Application Jobs, for instance here: Scheduling Application Jobs in SAP S/4HANA Cloud Public EditionApplication Jobs in BTP, ABAP Environment | SAP Help PortalWorking with Application Job Objects | SAP Help Portal. Also, this external blog post series is well written and short: BTP - Application Jobs (Introduction)BTP - Application Job (Creation)BTP - Application Job (v2).

Here's the demo code below. Again, at your own risk!

Thanks for reading.

Sandra

 

 

REPORT zdemo_create_app_job_objects.

CLASS lcl_apj_helper DEFINITION FINAL
  CREATE PRIVATE.

  PUBLIC SECTION.
    "! Call TR_TASK_SET like does the method SET_INTERNAL of ZCL_ABAPGIT_DEFAULT_TRANSPORT.
    CLASS-METHODS set_default_transport
      IMPORTING trkorr TYPE trkorr.

    "! Call TR_TADIR_INTERFACE like does the method tadir_insert of ZCL_ABAPGIT_OBJECTS_SUPER.
    CLASS-METHODS write_tadir_entry
      IMPORTING !name             TYPE apj_w_jce_root-job_catalog_entry_name
                tadir_object_type TYPE trobjtype
                devclass          TYPE devclass.
ENDCLASS.


CLASS lcl_app DEFINITION FINAL
  CREATE PRIVATE.

  PUBLIC SECTION.
    CLASS-METHODS create
      RETURNING VALUE(result) TYPE REF TO lcl_app.

    METHODS create_or_change_catalog_entry.
    METHODS create_or_change_template.
    METHODS delete_catalog_entry.
    METHODS delete_template.
ENDCLASS.


CLASS lcl_jce DEFINITION FINAL
  CREATE PRIVATE.

  PUBLIC SECTION.
    DATA data_accessor TYPE REF TO cl_apj_dt_job_cat_entry READ-ONLY.

    CLASS-METHODS create
      IMPORTING !name         TYPE apj_w_jce_root-job_catalog_entry_name
      RETURNING VALUE(result) TYPE REF TO lcl_jce.

    CLASS-METHODS delete
      IMPORTING !name  TYPE apj_w_jce_root-job_catalog_entry_name
                trkorr TYPE trkorr.

    CLASS-METHODS get
      IMPORTING !name         TYPE apj_w_jce_root-job_catalog_entry_name
      RETURNING VALUE(result) TYPE REF TO lcl_jce.

    CLASS-METHODS exists
      IMPORTING !name         TYPE apj_w_jce_root-job_catalog_entry_name
      RETURNING VALUE(result) TYPE abap_bool.

    METHODS save_and_activate
      IMPORTING devclass TYPE devclass
                trkorr   TYPE trkorr.

  PRIVATE SECTION.
    CONSTANTS entity_type TYPE apj_s_dt_dba-entity_type VALUE if_apj_dt_types=>cs_entity_type-job_catalog_entry.

    DATA name TYPE apj_w_jce_root-job_catalog_entry_name.
    DATA mode TYPE if_apj_dt_types=>ty_mode.
ENDCLASS.


CLASS lcl_jt DEFINITION FINAL
  CREATE PRIVATE.

  PUBLIC SECTION.
    DATA data_accessor TYPE REF TO cl_apj_dt_job_template_entry READ-ONLY.

    CLASS-METHODS create
      IMPORTING !name         TYPE apj_w_jt_root-job_template_name
      RETURNING VALUE(result) TYPE REF TO lcl_jt.

    CLASS-METHODS delete
      IMPORTING !name  TYPE apj_w_jt_root-job_template_name
                trkorr TYPE trkorr.

    CLASS-METHODS get
      IMPORTING !name         TYPE apj_w_jt_root-job_template_name
      RETURNING VALUE(result) TYPE REF TO lcl_jt.

    CLASS-METHODS exists
      IMPORTING !name         TYPE apj_w_jt_root-job_template_name
      RETURNING VALUE(result) TYPE abap_bool.

    METHODS save_and_activate
      IMPORTING devclass TYPE devclass
                trkorr   TYPE trkorr.

  PRIVATE SECTION.
    CONSTANTS entity_type TYPE apj_s_dt_dba-entity_type VALUE if_apj_dt_types=>cs_entity_type-job_template.

    DATA name TYPE apj_w_jt_root-job_template_name.
    DATA mode TYPE if_apj_dt_types=>ty_mode.

ENDCLASS.


START-OF-SELECTION.
  lcl_app=>create( )->create_or_change_catalog_entry( ).
*  lcl_app=>create( )->create_or_change_template( ).
*  lcl_app=>create( )->delete_template( ).
*  lcl_app=>create( )->delete_catalog_entry( ).
  ASSERT 1 = 1.


CLASS lcl_apj_helper IMPLEMENTATION.
  METHOD set_default_transport.
    CALL FUNCTION 'TR_TASK_SET'
      EXPORTING  iv_order          = trkorr
                 iv_validdays      = 1
      EXCEPTIONS invalid_username  = 1
                 invalid_category  = 2
                 invalid_client    = 3
                 invalid_validdays = 4
                 invalid_order     = 5
                 invalid_task      = 6
                 OTHERS            = 7.
    IF sy-subrc <> 0.
      " TODO
    ENDIF.
  ENDMETHOD.

  METHOD write_tadir_entry.
    TYPES: BEGIN OF ty_params,
             wi_test_modus       TYPE trpari-s_checked,
             wi_tadir_pgmid      TYPE tadir-pgmid,
             wi_tadir_object     TYPE tadir-object,
             wi_tadir_obj_name   TYPE tadir-obj_name,
             wi_tadir_author     TYPE tadir-author,
             wi_tadir_devclass   TYPE tadir-devclass,
             wi_tadir_masterlang TYPE tadir-masterlang,
             iv_delflag          TYPE tadir-delflag,
           END OF ty_params.

    DATA(params) = VALUE ty_params( wi_test_modus       = abap_false
                                    wi_tadir_pgmid      = 'R3TR'
                                    wi_tadir_object     = tadir_object_type
                                    wi_tadir_obj_name   = name
                                    wi_tadir_author     = sy-uname
                                    wi_tadir_devclass   = devclass
                                    wi_tadir_masterlang = sy-langu
                                    iv_delflag          = abap_false ).
    CALL FUNCTION 'TR_TADIR_INTERFACE'
      EXPORTING  wi_test_modus                  = params-wi_test_modus
                 wi_tadir_pgmid                 = params-wi_tadir_pgmid
                 wi_tadir_object                = params-wi_tadir_object
                 wi_tadir_obj_name              = params-wi_tadir_obj_name
                 wi_tadir_author                = params-wi_tadir_author
                 wi_tadir_devclass              = params-wi_tadir_devclass
                 wi_tadir_masterlang            = params-wi_tadir_masterlang
                 iv_delflag                     = params-iv_delflag
      EXCEPTIONS tadir_entry_not_existing       = 1
                 tadir_entry_ill_type           = 2
                 no_systemname                  = 3
                 no_systemtype                  = 4
                 original_system_conflict       = 5
                 object_reserved_for_devclass   = 6
                 object_exists_global           = 7
                 object_exists_local            = 8
                 object_is_distributed          = 9
                 obj_specification_not_unique   = 10
                 no_authorization_to_delete     = 11
                 devclass_not_existing          = 12
                 simultanious_set_remove_repair = 13
                 order_missing                  = 14
                 no_modification_of_head_syst   = 15
                 pgmid_object_not_allowed       = 16
                 masterlanguage_not_specified   = 17
                 devclass_not_specified         = 18
                 specify_owner_unique           = 19
                 loc_priv_objs_no_repair        = 20
                 gtadir_not_reached             = 21
                 object_locked_for_order        = 22
                 change_of_class_not_allowed    = 23
                 no_change_from_sap_to_tmp      = 24
                 OTHERS                         = 25.
    IF sy-subrc <> 0.
      " TODO
    ENDIF.
  ENDMETHOD.
ENDCLASS.


CLASS lcl_app IMPLEMENTATION.
  METHOD create.
    result = NEW lcl_app( ).
  ENDMETHOD.

  METHOD create_or_change_catalog_entry.
    TYPES ty_jce TYPE REF TO lcl_jce.

    DATA(jce_name) = EXACT apj_w_jce_root-job_catalog_entry_name( 'ZZSRO' ).
    DATA(devclass) = EXACT devclass( 'ZZSRO' ).
    DATA(trkorr) = EXACT trkorr( 'NPLK900082' ).

    DATA(jce) = COND ty_jce( WHEN NOT lcl_jce=>exists( jce_name )
                             THEN lcl_jce=>create( jce_name )
                             ELSE lcl_jce=>get( jce_name ) ).

    DATA(jce_basic_information) = jce->data_accessor->get_root( ).
    DATA(jce_basic_information_update) = VALUE cl_apj_dt_job_cat_entry=>ty_set_root(
                                                   BASE CORRESPONDING #( jce_basic_information )
                                                   report_name = sy-repid
                                                   text        = EXACT #( |{ sy-datum } - { sy-uzeit }| ) ).
    jce->data_accessor->set_root( jce_basic_information_update ).

    jce->save_and_activate( devclass = devclass
                            trkorr   = trkorr ).
    COMMIT WORK.
  ENDMETHOD.

  METHOD create_or_change_template.
    TYPES ty_jt TYPE REF TO lcl_jt.

    DATA(jt_name) = EXACT apj_w_jt_root-job_template_name( 'ZZSRO_TEMPL' ).
    DATA(jce_name) = EXACT apj_w_jce_root-job_catalog_entry_name( 'ZZSRO' ).
    DATA(devclass) = EXACT devclass( 'ZZSRO' ).
    DATA(trkorr) = EXACT trkorr( 'NPLK900082' ).

    DATA(jt) = COND ty_jt( WHEN NOT lcl_jt=>exists( jt_name )
                           THEN lcl_jt=>create( jt_name )
                           ELSE lcl_jt=>get( jt_name ) ).

    DATA(jt_basic_information) = jt->data_accessor->get_root( ).
    " TODO: variable is assigned but never used (ABAP cleaner)
    DATA(jt_values) = jt->data_accessor->get_values( ).

    jt_basic_information-job_catalog_entry_name = jce_name.
    jt_basic_information-text                   = EXACT #( |{ sy-datum } - { sy-uzeit }| ).
    jt->data_accessor->set_root( jt_basic_information ).

    jt->save_and_activate( devclass = devclass
                           trkorr   = trkorr ).
    COMMIT WORK.
  ENDMETHOD.

  METHOD delete_catalog_entry.
    TYPES ty_jce TYPE REF TO lcl_jce.

    DATA(jce_name) = EXACT apj_w_jt_root-job_catalog_entry_name( 'ZZSRO' ).
    DATA(trkorr) = EXACT trkorr( 'NPLK900082' ).

    lcl_jce=>delete( name   = jce_name
                     trkorr = trkorr ).
    COMMIT WORK.
  ENDMETHOD.

  METHOD delete_template.
    TYPES ty_jt TYPE REF TO lcl_jt.

    DATA(jt_name) = EXACT apj_w_jt_root-job_template_name( 'ZZSRO_TEMPL' ).
    DATA(trkorr) = EXACT trkorr( 'NPLK900082' ).

    lcl_jt=>delete( name   = jt_name
                    trkorr = trkorr ).
    COMMIT WORK.
  ENDMETHOD.
ENDCLASS.


CLASS lcl_jce IMPLEMENTATION.
  METHOD create.
    IF exists( name ).
      " TODO raise exception
    ENDIF.
    result = NEW lcl_jce( ).
    result->name          = name.
    result->mode          = if_apj_dt_types=>cs_mode-create.
    result->data_accessor = NEW cl_apj_dt_job_cat_entry( is_root = VALUE #( job_catalog_entry_name = name ) ).
  ENDMETHOD.

  METHOD delete.
    IF NOT exists( name ).
      " TODO raise exception
    ENDIF.

    IF trkorr IS NOT INITIAL.
      lcl_apj_helper=>set_default_transport( trkorr ).
    ENDIF.

    DATA(lo_controller) = cl_apj_dt_controller=>get_instance( ).
    lo_controller->delete_single( VALUE #( entity_type    = entity_type
                                           entity_name    = name
                                           entity_version = if_apj_dt_types=>cs_entity_version-active ) ).

    " TODO: variable is assigned but never used (ABAP cleaner)
    DATA(is_success) = lo_controller->save( ).
  ENDMETHOD.

  METHOD exists.
    DATA(jce_dt_db_access) = cl_apj_dt_db_access_factory=>get_instance( )->get_db_access( entity_type ).
    DATA(active_jce_existence_info) = jce_dt_db_access->exists(
        it_name_version = VALUE #( ( entity_name    = name
                                     entity_version = if_apj_dt_types=>cs_entity_version-active ) ) ).
    DATA(active_jce_exists) = xsdbool( line_exists( active_jce_existence_info[ KEY entity_name
                                                                               entity_name = name
                                                                               exists      = abap_true ] ) ).
    IF active_jce_exists = abap_true.
      result = abap_true.
    ELSE.
      DATA(inactive_jce_existence_info) = jce_dt_db_access->exists(
          it_name_version = VALUE #( ( entity_name    = name
                                       entity_version = if_apj_dt_types=>cs_entity_version-inactive ) ) ).
      DATA(inactive_jce_exists) = xsdbool( line_exists( inactive_jce_existence_info[ KEY entity_name
                                                                                     entity_name = name
                                                                                     exists      = abap_true ] ) ).
      IF inactive_jce_exists = abap_true.
        result = abap_true.
      ELSE.
        result = abap_false.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD get.
    IF NOT exists( name ).
      " TODO raise exception
    ENDIF.
    DATA(lo_controller) = cl_apj_dt_controller=>get_instance( ).
    DATA(li_entity) = lo_controller->if_apj_dt_controller~retrieve_single(
                          is_entity_type_name = VALUE #( entity_type    = entity_type
                                                         entity_name    = name
                                                         entity_version = 0 )
                          iv_edit_mode        = if_apj_dt_types=>cs_edit_mode-exclusive ).
    ASSERT li_entity IS BOUND.

    result = NEW lcl_jce( ).
    result->name          = name.
    result->mode          = if_apj_dt_types=>cs_mode-update.
    result->data_accessor = CAST #( li_entity ).
  ENDMETHOD.

  METHOD save_and_activate.
    lcl_apj_helper=>write_tadir_entry( name              = name
                                       tadir_object_type = 'SAJC'
                                       devclass          = devclass ).

    IF trkorr IS NOT INITIAL.
      lcl_apj_helper=>set_default_transport( trkorr ).
    ENDIF.

    IF mode = if_apj_dt_types=>cs_mode-create.
      DATA(object_data) = NEW cl_apj_dt_gui_cat( ).
      object_data->if_wb_object_data_model~generate_from_key( EXACT #( name ) ).

      DATA(persist) = NEW cl_apj_wb_jce_persist( ).
      persist->if_wb_object_persist~save( p_object_data = object_data
                                          p_access_mode = if_wb_adt_rest_resource_co=>co_access_mode_insert ).
    ENDIF.

    DATA(lo_controller) = cl_apj_dt_controller=>get_instance( ).
    lo_controller->modify_single( is_modify = VALUE #( mode       = if_apj_dt_types=>cs_mode-update
                                                       entity_ref = data_accessor ) ).

    " Save and activate
    " TODO: variable is assigned but never used (ABAP cleaner)
    DATA(is_success) = lo_controller->save( ).
    lo_controller->activate( it_entity_type_and_name = VALUE #( ( entity_type = entity_type
                                                                  entity_name = name ) ) ).
  ENDMETHOD.
ENDCLASS.


CLASS lcl_jt IMPLEMENTATION.
  METHOD create.
    IF exists( name ).
      " TODO raise exception
    ENDIF.
    result = NEW lcl_jt( ).
    result->name          = name.
    result->mode          = if_apj_dt_types=>cs_mode-create.
    result->data_accessor = NEW cl_apj_dt_job_template_entry( is_root = VALUE #( job_template_name = name ) ).
  ENDMETHOD.

  METHOD delete.
    IF NOT exists( name ).
      " TODO raise exception
    ENDIF.

    IF trkorr IS NOT INITIAL.
      lcl_apj_helper=>set_default_transport( trkorr ).
    ENDIF.

    DATA(lo_controller) = cl_apj_dt_controller=>get_instance( ).
    lo_controller->delete_single( VALUE #( entity_type    = entity_type
                                           entity_name    = name
                                           entity_version = if_apj_dt_types=>cs_entity_version-active ) ).
    " TODO: variable is assigned but never used (ABAP cleaner)
    DATA(is_success) = lo_controller->save( ).
  ENDMETHOD.

  METHOD exists.
    DATA(jt_dt_db_access) = cl_apj_dt_db_access_factory=>get_instance( )->get_db_access( entity_type ).
    DATA(active_jt_existence_info) = jt_dt_db_access->exists(
        it_name_version = VALUE #( ( entity_name    = name
                                     entity_version = if_apj_dt_types=>cs_entity_version-active ) ) ).
    DATA(active_jt_exists) = xsdbool( line_exists( active_jt_existence_info[ KEY entity_name
                                                                             entity_name = name
                                                                             exists      = abap_true ] ) ).
    IF active_jt_exists = abap_true.
      result = abap_true.
    ELSE.
      DATA(inactive_jt_existence_info) = jt_dt_db_access->exists(
          it_name_version = VALUE #( ( entity_name    = name
                                       entity_version = if_apj_dt_types=>cs_entity_version-inactive ) ) ).
      DATA(inactive_jt_exists) = xsdbool( line_exists( inactive_jt_existence_info[ KEY entity_name
                                                                                   entity_name = name
                                                                                   exists      = abap_true ] ) ).
      IF inactive_jt_exists = abap_true.
        result = abap_true.
      ELSE.
        result = abap_false.
      ENDIF.
    ENDIF.
  ENDMETHOD.

  METHOD get.
    IF NOT exists( name ).
      " TODO raise exception
    ENDIF.
    DATA(lo_controller) = cl_apj_dt_controller=>get_instance( ).
    DATA(li_entity) = lo_controller->if_apj_dt_controller~retrieve_single(
                          is_entity_type_name = VALUE #( entity_type    = entity_type
                                                         entity_name    = name
                                                         entity_version = 0 )
                          iv_edit_mode        = if_apj_dt_types=>cs_edit_mode-exclusive ).
    ASSERT li_entity IS BOUND.
    result = NEW lcl_jt( ).
    result->name          = name.
    result->mode          = if_apj_dt_types=>cs_mode-update.
    result->data_accessor = CAST #( li_entity ).
  ENDMETHOD.

  METHOD save_and_activate.
    lcl_apj_helper=>write_tadir_entry( name              = name
                                       tadir_object_type = 'SAJT'
                                       devclass          = devclass ).
    IF trkorr IS NOT INITIAL.
      lcl_apj_helper=>set_default_transport( trkorr ).
    ENDIF.

    IF mode = if_apj_dt_types=>cs_mode-create.
      DATA(object_data) = NEW cl_apj_dt_gui_tmp( ).
      object_data->if_wb_object_data_model~generate_from_key( EXACT #( name ) ).

      DATA(persist) = NEW cl_apj_wb_jt_persist( ).
      persist->if_wb_object_persist~save( p_object_data = object_data
                                          p_access_mode = if_wb_adt_rest_resource_co=>co_access_mode_insert ).
    ENDIF.

    DATA(lo_controller) = cl_apj_dt_controller=>get_instance( ).
    lo_controller->modify_single( is_modify = VALUE #( mode       = if_apj_dt_types=>cs_mode-update
                                                       entity_ref = data_accessor ) ).

    " Save and activate
    " TODO: variable is assigned but never used (ABAP cleaner)
    DATA(is_success) = lo_controller->save( ).
    lo_controller->activate( it_entity_type_and_name = VALUE #( ( entity_type = entity_type
                                                                  entity_name = name ) ) ).
  ENDMETHOD.
ENDCLASS.

 

 

 

2 Comments
Labels in this area