adesso orange🍊Stellenangebote:
Software Engineer Trainee · Senior | (Senior) Cloud Software Engineer BTP
(Senior) Consultant Technologie · Consultant ABAP
Werkstudent Softwareentwicklung · Fiori / UI5 · Consulting · Application Management

Ich habe manuell über mehrere Versionen das Wiki geupdated. Evtl. läuft es noch nicht ganz rund ツ

Jobvorlagen für Fiori App Anwendungsjob(F1240) erstellen: Unterschied zwischen den Versionen

Aus SAP Wiki ツ
M1ch3lde (Diskussion | Beiträge)
M1ch3lde (Diskussion | Beiträge)
 
(8 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie: Codeschnipsel]]
Jobvorlagen, auch bekannt als Job Templates, können erstellt werden, die dann in der App "Anwendungsjob" bzw. "Application Jobs" für Erstellung von Jobs genommen werden können.
Jobvorlagen, auch bekannt als Job Templates, können erstellt werden, die dann in der App "Anwendungsjob" bzw. "Application Jobs" für Erstellung von Jobs genommen werden können.


Zeile 7: Zeile 8:
*** if_apj_dt_exec_object
*** if_apj_dt_exec_object
*** if_apj_rt_exec_object
*** if_apj_rt_exec_object
** Implementierung Methode get_parameters
** Implementierung Methode if_apj_dt_exec_object~get_parameters.
** Implementierung Methode execute
** Implementierung Methode if_apj_rt_exec_object~execute
* Erstellung Application Job Catalog Entry
* Erstellung Application Job Catalog Entry
** Zuordnung der Klasse mit Execute Methode
** Zuordnung der Klasse mit Execute Methode
Zeile 21: Zeile 22:


<syntaxhighlight lang="python" line copy>
<syntaxhighlight lang="python" line copy>
  CLASS ycl_mm_pur_we_msg_pos_ajob DEFINITION
  CLASS ycl_name_of_class_ajob DEFINITION
   PUBLIC
   PUBLIC
   FINAL
   FINAL
Zeile 32: Zeile 33:
     "Spätere Parameter bei Jobanlage
     "Spätere Parameter bei Jobanlage
     CONSTANTS: cv_material      TYPE selname VALUE 'SO_MATNR' ##NO_TEXT,
     CONSTANTS: cv_material      TYPE selname VALUE 'SO_MATNR' ##NO_TEXT,
               cv_posting_date  TYPE selname VALIE 'P_PO_DATE' ##NO_TEXT.
               cv_posting_date  TYPE selname VALIE 'P_PODATE' ##NO_TEXT.
   PROTECTED SECTION.
   PROTECTED SECTION.
   PRIVATE SECTION.
   PRIVATE SECTION.
  ENDCLASS.
  ENDCLASS.


  CLASS ycl_mm_pur_we_msg_pos_ajob IMPLEMENTATION.
  CLASS ycl_name_of_class_ajob IMPLEMENTATION.
   METHOD if_apj_dt_exec_object~get_parameters.
   METHOD if_apj_dt_exec_object~get_parameters.


     et_parameter_def = VALUE #(
     et_parameter_def = VALUE #(
           ( selname = 'SO_MATNR'  kind = 'S' datatype = 'C' component_type = 'MATNR'      length = '40'  decimals = '0' param_text ='Material'(001) changeable_ind = 'X' )
           ( selname = 'SO_MATNR'  kind = 'S' datatype = 'C' component_type = 'MATNR'      length = '40'  decimals = '0' param_text ='Material'(001) changeable_ind = 'X' )
          ( selname = 'SO_WERKS'  kind = 'S' datatype = 'C' component_type = 'WERKS_D'    length = '4'  decimals = '0' param_text ='Plant'(002) changeable_ind = 'X' )
          ( selname = 'SO_BWART'  kind = 'S' datatype = 'C' component_type = 'BWART'      length = '3'  decimals = '0' param_text ='Movement Type'(003) changeable_ind = 'X' mandatory_ind = 'X' )
           ( selname = 'P_PODATE'  kind = 'P' datatype = 'D' component_type = 'BUDAT'      length = '6'  decimals = '0' param_text ='Posting Date'(004) changeable_ind = 'X' mandatory_ind = '' )
           ( selname = 'P_PODATE'  kind = 'P' datatype = 'D' component_type = 'BUDAT'      length = '6'  decimals = '0' param_text ='Posting Date'(004) changeable_ind = 'X' mandatory_ind = '' )
       ).
       ).
Zeile 65: Zeile 64:


     TRY.
     TRY.
         DATA(lv_posting_date) = it_parameters[ selname = 'P_PODATE' ]-low.
         DATA(lv_posting_date) = it_parameters[ selname = cv_posting_date ]-low.
       CATCH cx_sy_itab_line_not_found.
       CATCH cx_sy_itab_line_not_found.
       RETURN.
       RETURN.
Zeile 74: Zeile 73:
     LOOP AT it_parameters ASSIGNING FIELD-SYMBOL(<ls_para>).
     LOOP AT it_parameters ASSIGNING FIELD-SYMBOL(<ls_para>).
       CASE <ls_para>-selname.
       CASE <ls_para>-selname.
         WHEN material.
         WHEN cv_material.
           APPEND INITIAL LINE TO ltr_material ASSIGNING FIELD-SYMBOL(<ls_add_material>).
           APPEND INITIAL LINE TO ltr_material ASSIGNING FIELD-SYMBOL(<ls_add_material>).
           MOVE-CORRESPONDING <ls_para> TO <ls_add_material>.
           MOVE-CORRESPONDING <ls_para> TO <ls_add_material>.
Zeile 82: Zeile 81:
     ENDLOOP.
     ENDLOOP.


    "Dein
     "Application Code
     "Application Code
    "hier


     TRY.
     TRY.
Zeile 92: Zeile 93:
   ENDCLASS.
   ENDCLASS.
</syntaxhighlight>
</syntaxhighlight>
=== Erstellung Job Entry ===
Das Objekt in ADT heißt "Application Job Catalog Entry".
Selber bezeichne ich es am Ende mit "_JOB_CAT".
Wenn das Objekt angelegt ist, kann unter "General Information" die Klasse angegeben werden, worin sich die execute-Methode befindet
=== Erstellung Job Template ===
Das Objekt in ADT heißt "Application Job Template".
Selber bezeichne ich es am Ende mit "_JOB_TEMP".
Wenn das Objekt angelegt ist, kann unter "General Information" das bereits angelegte Job Catalog Entry zugeordnet werden.
Bei "Parameters " können Defaultwerte mitgegeben werden.


== Debugging Application Jobs ==
== Debugging Application Jobs ==
Angelegte Application Jobs, die via App angelegt und durchgeführt werden, sind wie die klassischen Jobs ebenfalls in SM37 zu sehen. Der Jobname hat allerdings eine zufällig generierten Namen. Das Debugging ist möglich, wenn man den Job via Checkbox markiert und in der GUI im Transaktionsfeld JDBG eingetragen wird und mit Enter bestätigt wird. Wenn ein Breakpoint in der o.g. Methoden in der GUI gesetzt ist, dann springt der Debugger an.
Angelegte Application Jobs, die via App angelegt und durchgeführt werden, sind wie die klassischen Jobs ebenfalls in SM37 zu sehen. Der Jobname hat allerdings eine zufällig generierten Namen. Das Debugging ist möglich, wenn man den Job via Checkbox markiert und in der GUI im Transaktionsfeld JDBG eingetragen wird und mit Enter bestätigt wird. Wenn ein Breakpoint in der o.g. Methoden in der GUI gesetzt ist, dann springt der Debugger an.
</sytnaxhighlight>

Aktuelle Version vom 24. November 2024, 19:08 Uhr

Jobvorlagen, auch bekannt als Job Templates, können erstellt werden, die dann in der App "Anwendungsjob" bzw. "Application Jobs" für Erstellung von Jobs genommen werden können.

Übersicht der benötigten Objekte in ADT

  • Erstellung Y/Z Klasse
    • Verwendung Interfaces
      • if_apj_dt_exec_object
      • if_apj_rt_exec_object
    • Implementierung Methode if_apj_dt_exec_object~get_parameters.
    • Implementierung Methode if_apj_rt_exec_object~execute
  • Erstellung Application Job Catalog Entry
    • Zuordnung der Klasse mit Execute Methode
  • Erstellung Job Template
    • Zuordnung Job Catalog Entry
    • Festlegung Defaultwerte, wenn ein Template für Joberstellung genutzt wird

Anlegen der benötigten Objekte in ADT

Y/Z-Klasse

Ich habe es mir angewöhnt die Klassen mit "_ajob" zu enden.

 CLASS ycl_name_of_class_ajob DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES: if_apj_dt_exec_object,
                if_apj_rt_exec_object.
    
    "Spätere Parameter bei Jobanlage
    CONSTANTS: cv_material       TYPE selname VALUE 'SO_MATNR' ##NO_TEXT,
               cv_posting_date   TYPE selname VALIE 'P_PODATE' ##NO_TEXT.
  PROTECTED SECTION.
  PRIVATE SECTION.
 ENDCLASS.

 CLASS ycl_name_of_class_ajob IMPLEMENTATION.
  METHOD if_apj_dt_exec_object~get_parameters.

    et_parameter_def = VALUE #(
          ( selname = 'SO_MATNR'  kind = 'S' datatype = 'C' component_type = 'MATNR'      length = '40'  decimals = '0' param_text ='Material'(001) changeable_ind = 'X' )
          ( selname = 'P_PODATE'  kind = 'P' datatype = 'D' component_type = 'BUDAT'      length = '6'  decimals = '0' param_text ='Posting Date'(004) changeable_ind = 'X' mandatory_ind = '' )
      ).

    " Default value
    et_parameter_val = VALUE #(
      ( selname = 'P_PODATE'
        kind    = 'P'
        sign    = 'I'
        option  = 'EQ'
        low     = sy-datum ) ##NO_TEXT
    ).
  ENDMETHOD.

  METHOD if_apj_rt_exec_object~execute.

    TRY.
        DATA(lo_log) = cl_bali_log=>create_with_header( cl_bali_header_setter=>create( object ='' subobject = '' external_id = '' ) ).
      CATCH cx_bali_runtime.
    ENDTRY.

    TRY.
        DATA(lv_posting_date) = it_parameters[ selname = cv_posting_date ]-low.
      CATCH cx_sy_itab_line_not_found.
       RETURN.
    ENDTRY.

    DATA: ltr_material      TYPE RANGE OF matnr.

    LOOP AT it_parameters ASSIGNING FIELD-SYMBOL(<ls_para>).
      CASE <ls_para>-selname.
        WHEN cv_material.
          APPEND INITIAL LINE TO ltr_material ASSIGNING FIELD-SYMBOL(<ls_add_material>).
          MOVE-CORRESPONDING <ls_para> TO <ls_add_material>.
        WHEN OTHERS.
         "Handling, wenn ein Parameter da ist, der nicht erwartet wird
      ENDCASE.
    ENDLOOP.

    "Dein
    "Application Code
    "hier

    TRY.
        cl_bali_log_db=>get_instance( )->save_log( log = lo_log
                                                   assign_to_current_appl_job = abap_true ).
     CATCH cx_bali_runtime.
    ENDTRY.
   ENDMETHOD.
  ENDCLASS.

Erstellung Job Entry

Das Objekt in ADT heißt "Application Job Catalog Entry". Selber bezeichne ich es am Ende mit "_JOB_CAT". Wenn das Objekt angelegt ist, kann unter "General Information" die Klasse angegeben werden, worin sich die execute-Methode befindet

Erstellung Job Template

Das Objekt in ADT heißt "Application Job Template". Selber bezeichne ich es am Ende mit "_JOB_TEMP". Wenn das Objekt angelegt ist, kann unter "General Information" das bereits angelegte Job Catalog Entry zugeordnet werden. Bei "Parameters " können Defaultwerte mitgegeben werden.

Debugging Application Jobs

Angelegte Application Jobs, die via App angelegt und durchgeführt werden, sind wie die klassischen Jobs ebenfalls in SM37 zu sehen. Der Jobname hat allerdings eine zufällig generierten Namen. Das Debugging ist möglich, wenn man den Job via Checkbox markiert und in der GUI im Transaktionsfeld JDBG eingetragen wird und mit Enter bestätigt wird. Wenn ein Breakpoint in der o.g. Methoden in der GUI gesetzt ist, dann springt der Debugger an.