Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 30

class ZCL_MESSAGES definition

public
create public .

public section.

constants:
begin of gc_fieldname,
row type fieldname value 'ROW' ##NO_TEXT,
condition type fieldname value 'CONDITION' ##NO_TEXT,
id type fieldname value 'ID' ##NO_TEXT,
end of gc_fieldname .
data MV_SUBOBJ type BALSUBOBJ .
data MV_LOGOBJ type BALOBJ_D .
data GV_CONTEXT type TABNAME value 'ZMESSAGE_CONTEXT' ##NO_TEXT.
constants GC_MESSAGE_TYPES type CHAR6 value 'SIWEAX' ##NO_TEXT.
constants GC_LOGCLASS type BALSUBOBJ value 'ZCL_MESSAGES' ##NO_TEXT.
constants GC_APPLOG_OBJECT type BALOBJ_D value 'Z_APPLOG' ##NO_TEXT.
constants C_LOGOBJ_ZR_AUF type BALOBJ_D value 'ZR_AUF' ##NO_TEXT.
constants C_LOGSUBOBJ_Z_MAT type BALSUBOBJ value 'Z_MAT' ##NO_TEXT.

events ADDED
exporting
value(IS_MSGH) type BALMSGHNDL
value(IS_LAST_MSGH) type BALMSGHNDL .
events DELETED
exporting
value(IT_MSGH) type BAL_T_MSGH .
class-events BATCHMODE
exporting
value(CV_BATCHMODE) type ref to SY-BATCH .

class-methods CLASS_CONSTRUCTOR .
class-methods GET_INSTANCE
importing
!IV_ID type CSEQUENCE optional
!IV_SUBOBJ type BALSUBOBJ optional
!IV_CONTEXT type TABNAME default 'ZMESSAGE_CONTEXT'
!IV_REOPEN type FLAG default SPACE
!IV_LOGOBJ type BALOBJ_D optional
preferred parameter IV_ID
returning
value(EO_INSTANCE) type ref to ZCL_MESSAGES
raising
ZCX_PARAMETER_MISSING
ZCX_NOT_FOUND .
class-methods SHOW_EXCEPTION
importing
!IO_EX type ref to CX_ROOT
!IV_MSGTY type MSGTY default 'I' .
methods ADD
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default SPACE
!IV_MSGID type SYMSGID default SY-MSGID
!IV_MSGTY type SYMSGTY default SY-MSGTY
!IV_MSGNO type SYMSGNO default SY-MSGNO
!IV_MSGV1 type SYMSGV default SY-MSGV1
!IV_MSGV2 type SYMSGV default SY-MSGV2
!IV_MSGV3 type SYMSGV default SY-MSGV3
!IV_MSGV4 type SYMSGV default SY-MSGV4
!IV_ROW type ZSRS_TABIX_4_HTML optional
preferred parameter IV_CONDITION
raising
ZCX_ERROR .
methods ADD_IN_DLG
importing
!IV_TEXT type CSEQUENCE optional
!IV_MSGID type SYMSGID default SY-MSGID
!IV_MSGTY type SYMSGTY default SY-MSGTY
!IV_MSGNO type SYMSGNO default SY-MSGNO
!IV_MSGV1 type SYMSGV default SY-MSGV1
!IV_MSGV2 type SYMSGV default SY-MSGV2
!IV_MSGV3 type SYMSGV default SY-MSGV3
!IV_MSGV4 type SYMSGV default SY-MSGV4
!IV_CONDITION type ZSRS_MSG_CONDITION default SPACE
!IV_ROW type ZSRS_TABIX_4_HTML optional
preferred parameter IV_TEXT
raising
ZCX_ERROR .
methods ADD_BAPIRETURN
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default SPACE
!IT_BAPIRETURN type BAPIRETTAB optional
!IS_BAPIRETURN type ANY optional
preferred parameter IV_CONDITION
returning
value(EV_SEVERITY) type SYMSGTY .
methods ADD_FREE_TEXT
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default SPACE
!IV_ROW type ZSRS_TABIX_4_HTML optional
!IV_MSGTY type SYMSGTY default 'I'
!IV_TEXT type CSEQUENCE .
methods ADD_FROM_BDC
importing
!IT_MSG type ETTCD_MSG_TABTYPE
!IV_CONDITION type ZSRS_MSG_CONDITION default SPACE
returning
value(EV_MSGS) type I .
methods ADD_FROM_EXCEPTION
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default SPACE
!IV_ROW type ZSRS_TABIX_4_HTML optional
!IO_EXCEPTION type ref to CX_ROOT
!IV_MSGTY type SYMSGTY default 'E'
!IV_ROOT_CAUSE type FLAG optional .
methods CONSTRUCTOR
importing
!IV_ID type CSEQUENCE
!IV_SUBOBJ type BALSUBOBJ
!IV_CONTEXT type TABNAME default 'ZMESSAGE_CONTEXT'
!IV_LOG_HANDLE type BALLOGHNDL optional
!IV_REUSE_BAL_MEMORY type FLAG default ABAP_FALSE
!IV_LOGOBJ type BALOBJ_D
raising
ZCX_NOT_FOUND .
methods COPY
importing
!IO_TARGET type ref to ZCL_MESSAGES
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
raising
ZCX_ERROR .
methods DELETE
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
!IS_AFTER_MSGH type BALMSGHNDL optional
preferred parameter IV_CONDITION .
methods DELETE_LOG
importing
!IV_ALSO_ON_DB type FLAG default ABAP_FALSE
raising
ZCX_ERROR .
methods DELETE_SINGLE
importing
!IS_MSGH type BALMSGHNDL .
methods DISPLAY
importing
!IV_FULLSCREEN type FLAG default 'X'
!IS_PROF type BAL_S_PROF optional
preferred parameter IV_FULLSCREEN .
methods GET_HANDLE
returning
value(EV_LOG_HANDLE) type BALLOGHNDL .
methods GET_HIGHEST_TYPE
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
preferred parameter IV_CONDITION
returning
value(EV_TYPE) type SYMSGTY .
methods GET_LAST_MESSAGE
exporting
!ES_MSG type BAL_S_MSG
!ES_MSGH type BALMSGHNDL
raising
ZCX_NOT_FOUND .
methods GET_MESSAGE
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
exporting
!EV_MSG_TYPE type SYMSGTY
!EV_MSG_TEXT type STRING .
methods GET_MESSAGES
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
returning
value(ET_MESSAGES) type ZCL_SRS_MESSAGE_TAB .
methods GET_MESSAGES_DETAILED
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
preferred parameter IV_CONDITION
returning
value(ET_MSG) type AQTBAL_S_MSG .
methods GET_MESSAGES_DETAILED_WITH_HDL
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
exporting
!ET_MESSAGES type SWF_APP_LOG_EXT_MSG_T .
class-methods ROOT_CAUSE
importing
!IO_EX type ref to CX_ROOT
returning
value(EO_EX) type ref to CX_ROOT .
methods GET_MESSAGE_DETAILED
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
preferred parameter IV_CONDITION
returning
value(ES_MSG) type BAL_S_MSG .
methods GET_MESSAGE_WITH_HANDLE
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
exporting
value(ES_MSGH) type BALMSGHNDL
!ES_MSG type BAL_S_MSG .
methods RESET_SECTION .
methods SAVE
importing
!IV_UPDATE_TASK type FLAG default 'X'
exporting
!EV_LOGNUMBER type BALOGNR
!EV_LOG_HANDLE type BALLOGHNDL
raising
ZCX_ERROR .
methods SET_CONTEXT
importing
!IS_CONTEXT type CLIKE .
methods SET_SECTION
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*' .
protected section.
*"* protected components of class ZCL_MESSAGES
*"* do not include other source files here!!!

data GV_LOG_HANDLE type BALLOGHNDL .


private section.

*"* private components of class ZCL_MESSAGES


*"* do not include other source files here!!!
data GV_FOREIGN_LOG type FLAG .
data GV_END_LAST_SECTION type I value -1 ##NO_TEXT.
class-data GT_INSTANCES type ZMESSAGES_INSTANCE_TAB .
data GV_ID type STRING .
data GS_LAST_MSGH type BALMSGHNDL .
data GS_CONTEXT type ref to DATA .
data GS_CONTEXT_STD type ZMESSAGE_CONTEXT .
data GV_CONSTRUCTED_AT type TIMESTAMPL .

class-methods IN_BATCHMODE
returning
value(EV_BATCHMODE) type FLAG .
methods RECOMPUTE_LAST_MSGH .
methods FILL_CONTEXT
importing
!IV_ROW type ZSRS_TABIX_4_HTML optional
!IV_CONDITION type ZSRS_MSG_CONDITION
returning
value(ES_CONTEXT) type ref to DATA .
methods SEARCH_MESSAGES
importing
!IV_CONDITION type ZSRS_MSG_CONDITION default '*'
!IV_ROW type ZSRS_TABIX_4_HTML optional
preferred parameter IV_CONDITION
returning
value(ET_MSGH) type ref to BAL_T_MSGH .
ENDCLASS.

CLASS ZCL_MESSAGES IMPLEMENTATION.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->ADD
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
=SPACE)
* | [--->] IV_MSGID TYPE SYMSGID (default =SY-MSGID)
* | [--->] IV_MSGTY TYPE SYMSGTY (default =SY-MSGTY)
* | [--->] IV_MSGNO TYPE SYMSGNO (default =SY-MSGNO)
* | [--->] IV_MSGV1 TYPE SYMSGV (default =SY-MSGV1)
* | [--->] IV_MSGV2 TYPE SYMSGV (default =SY-MSGV2)
* | [--->] IV_MSGV3 TYPE SYMSGV (default =SY-MSGV3)
* | [--->] IV_MSGV4 TYPE SYMSGV (default =SY-MSGV4)
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [!CX!] ZCX_ERROR
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD add .

DATA: lt_msgh TYPE bal_t_msgh.

fill_context(
iv_row = iv_row
iv_condition = iv_condition ).
ASSIGN gs_context->* TO FIELD-SYMBOL(<ls_context>).

CALL METHOD lcl_bal=>add_msg_to_handler


EXPORTING
iv_logobj = mv_logobj
iv_subobj = mv_subobj
iv_log_handle = gv_log_handle
iv_msgid = iv_msgid
iv_msgno = iv_msgno
iv_msgty = iv_msgty
iv_msgv1 = iv_msgv1
iv_msgv2 = iv_msgv2
iv_msgv3 = iv_msgv3
iv_msgv4 = iv_msgv4
iv_context_name = gv_context
iv_context_value = <ls_context>
IMPORTING
ev_log_handle = gv_log_handle
et_msgh = lt_msgh.

DATA(ls_last_msgh) = gs_last_msgh.
READ TABLE lt_msgh INTO gs_last_msgh INDEX 1.

RAISE EVENT added


EXPORTING
is_msgh = gs_last_msgh
is_last_msgh = ls_last_msgh.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->ADD_BAPIRETURN
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
=SPACE)
* | [--->] IT_BAPIRETURN TYPE BAPIRETTAB(optional)
* | [--->] IS_BAPIRETURN TYPE ANY(optional)
* | [<-()] EV_SEVERITY TYPE SYMSGTY
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method add_bapireturn .

data: lt_msgh type bal_t_msgh.

fill_context( iv_condition ).
assign gs_context->* to field-symbol(<ls_context>).

try.
call method lcl_bal=>add_msg_to_handler
exporting
iv_logobj = mv_logobj
iv_subobj = mv_subobj
iv_log_handle = gv_log_handle
iv_context_name = gv_context
iv_context_value = <ls_context>
it_bapireturn = it_bapireturn
is_bapireturn = is_bapireturn
iv_msgid = space " Zeichen, daß keine Einzelnachricht gesammelt
werden soll
importing
ev_log_handle = gv_log_handle
ev_severity = ev_severity
et_msgh = lt_msgh.

data(ls_last_msgh) = gs_last_msgh.
describe table lt_msgh lines sy-tfill.
if sy-tfill > 0.
read table lt_msgh into gs_last_msgh index sy-tfill.
endif.

raise event added


exporting
is_msgh = gs_last_msgh
is_last_msgh = ls_last_msgh.

catch zcx_error.
* Leere BAPIRET-Daten übergeben - ignorieren
endtry.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->ADD_FREE_TEXT
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
=SPACE)
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [--->] IV_MSGTY TYPE SYMSGTY (default ='I')
* | [--->] IV_TEXT TYPE CSEQUENCE
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD add_free_text .

DATA: lt_msgh TYPE bal_t_msgh.

fill_context(
iv_row = iv_row
iv_condition = iv_condition ).
ASSIGN gs_context->* TO FIELD-SYMBOL(<ls_context>).

TRY.
CALL METHOD lcl_bal=>add_msg_to_handler
EXPORTING
iv_logobj = mv_logobj
iv_subobj = mv_subobj
iv_log_handle = gv_log_handle
iv_context_name = gv_context
iv_context_value = <ls_context>
iv_free_text = CONV text200( iv_text )
iv_msgty = iv_msgty
IMPORTING
ev_log_handle = gv_log_handle
et_msgh = lt_msgh.
DATA(ls_last_msgh) = gs_last_msgh.
READ TABLE lt_msgh INTO gs_last_msgh INDEX 1.
RAISE EVENT added
EXPORTING
is_msgh = gs_last_msgh
is_last_msgh = ls_last_msgh.

CATCH zcx_error INTO DATA(lo_ex). " <-- Für Debuggingzwecke


* Fehler ignorieren
ENDTRY.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->ADD_FROM_BDC
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IT_MSG TYPE ETTCD_MSG_TABTYPE
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
=SPACE)
* | [<-()] EV_MSGS TYPE I
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD add_from_bdc.

LOOP AT it_msg
TRANSPORTING NO FIELDS
WHERE msgtyp CA 'EAX'.
EXIT.
ENDLOOP.
IF sy-subrc EQ 0 OR " Die Tabelle enthält Fehlermeldungen -> Log in jedem
Fall schreiben
NOT in_batchmode( ). " Log im Dialog-Modus auf jeden Fall schreiben
LOOP AT it_msg ASSIGNING FIELD-SYMBOL(<ls_msg>).
MESSAGE ID <ls_msg>-msgid TYPE <ls_msg>-msgtyp NUMBER <ls_msg>-msgnr
WITH <ls_msg>-msgv1 <ls_msg>-msgv2 <ls_msg>-msgv3 <ls_msg>-msgv4
INTO sy-msgli.
add( iv_condition = iv_condition ).
ADD 1 TO ev_msgs.
ENDLOOP.
ENDIF.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->ADD_FROM_EXCEPTION
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
=SPACE)
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [--->] IO_EXCEPTION TYPE REF TO CX_ROOT
* | [--->] IV_MSGTY TYPE SYMSGTY (default ='E')
* | [--->] IV_ROOT_CAUSE TYPE FLAG(optional)
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD add_from_exception.

DATA: lv_text TYPE string,


lo_ex TYPE REF TO cx_root.

IF iv_root_cause = abap_true.
lo_ex = root_cause( io_exception ).
ELSE.
lo_ex = io_exception.
ENDIF.

* Strategie: Zuerst T100-Attribute anschauen,


* danach den Wert eines allfälligen TEXT-Attributs,
* dann erst den allgemeinen, im DDIC gepflegten Text verwenden

FIELD-SYMBOLS: <lv_msgid> TYPE symsgid,


<lv_msgno> TYPE symsgno,
<lv_msgv1> TYPE symsgv,
<lv_msgv2> TYPE symsgv,
<lv_msgv3> TYPE symsgv,
<lv_msgv4> TYPE symsgv,
<lv_text> TYPE c.

ASSIGN lo_ex->('T100_MSGID') TO <lv_msgid>.


IF sy-subrc EQ 0 AND <lv_msgid> NE space.
ASSIGN lo_ex->('T100_MSGNO') TO <lv_msgno>.
ASSIGN lo_ex->('T100_MSGV1') TO <lv_msgv1>.
ASSIGN lo_ex->('T100_MSGV2') TO <lv_msgv2>.
ASSIGN lo_ex->('T100_MSGV3') TO <lv_msgv3>.
ASSIGN lo_ex->('T100_MSGV4') TO <lv_msgv4>.
add( iv_condition = iv_condition
iv_row = iv_row
iv_msgid = <lv_msgid>
iv_msgno = <lv_msgno>
iv_msgty = iv_msgty
iv_msgv1 = <lv_msgv1>
iv_msgv2 = <lv_msgv2>
iv_msgv3 = <lv_msgv3>
iv_msgv4 = <lv_msgv4> ).
ELSE.
ASSIGN lo_ex->('TEXT') TO <lv_text>.
IF sy-subrc EQ 0 AND <lv_text> IS NOT INITIAL.
add_free_text( iv_condition = iv_condition
iv_row = iv_row
iv_msgty = iv_msgty
iv_text = <lv_text> ).
ELSE.
lv_text = lo_ex->get_text( ).
add_free_text( iv_condition = iv_condition
iv_row = iv_row
iv_msgty = iv_msgty
iv_text = lv_text ).
ENDIF.
ENDIF.

ENDMETHOD..

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->ADD_IN_DLG
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_TEXT TYPE CSEQUENCE(optional)
* | [--->] IV_MSGID TYPE SYMSGID (default =SY-MSGID)
* | [--->] IV_MSGTY TYPE SYMSGTY (default =SY-MSGTY)
* | [--->] IV_MSGNO TYPE SYMSGNO (default =SY-MSGNO)
* | [--->] IV_MSGV1 TYPE SYMSGV (default =SY-MSGV1)
* | [--->] IV_MSGV2 TYPE SYMSGV (default =SY-MSGV2)
* | [--->] IV_MSGV3 TYPE SYMSGV (default =SY-MSGV3)
* | [--->] IV_MSGV4 TYPE SYMSGV (default =SY-MSGV4)
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
=SPACE)
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [!CX!] ZCX_ERROR
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method add_in_dlg .

* Wie ADD_FREE_TEXT( ) oder ADD( ), aber nur im Dialogmodus sammeln


check not in_batchmode( ).

if iv_text is not initial.


* Meldung in Freitext
data(lv_msgty) = cond symsgty( when iv_msgty is supplied then iv_msgty else 'I'
).

call method add_free_text


exporting
iv_condition = iv_condition
iv_row = iv_row
iv_msgty = lv_msgty
iv_text = iv_text.

elseif iv_msgid ne space.


* Meldung per Systemfelder
call method add
exporting
iv_condition = iv_condition
iv_msgid = iv_msgid
iv_msgty = iv_msgty
iv_msgno = iv_msgno
iv_msgv1 = iv_msgv1
iv_msgv2 = iv_msgv2
iv_msgv3 = iv_msgv3
iv_msgv4 = iv_msgv4
iv_row = iv_row.
else.
raise exception type zcx_error
exporting
text = 'Bitte Meldung als Freitext oder via IV_MSGID usw. übergeben'.
endif.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Static Public Method ZCL_MESSAGES=>CLASS_CONSTRUCTOR
*
+----------------------------------------------------------------------------------
---------------+
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method CLASS_CONSTRUCTOR.
lcl_debug=>setup( ).
endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->CONSTRUCTOR
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_ID TYPE CSEQUENCE
* | [--->] IV_SUBOBJ TYPE BALSUBOBJ
* | [--->] IV_CONTEXT TYPE TABNAME (default
='ZMESSAGE_CONTEXT')
* | [--->] IV_LOG_HANDLE TYPE BALLOGHNDL(optional)
* | [--->] IV_REUSE_BAL_MEMORY TYPE FLAG (default =ABAP_FALSE)
* | [--->] IV_LOGOBJ TYPE BALOBJ_D
* | [!CX!] ZCX_NOT_FOUND
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD constructor .

DATA: lo_ex TYPE REF TO cx_root,


ls_instance TYPE zmessages_instance,
lv_extnumber TYPE balnrext,
lv_text TYPE text255.

GET TIME STAMP FIELD gv_constructed_at.

gv_context = iv_context.
* Benutzerdefinierte Contextstruktur erzeugen
IF gv_context NE 'ZMESSAGE_CONTEXT'.
TRY.
CREATE DATA gs_context TYPE (gv_context).
CATCH cx_sy_create_data_error INTO lo_ex.
* Das Datenobjekt konnte nicht erzeugt werden. Die Struktur &1 existiert nicht
lv_text = lo_ex->get_text( ).
RAISE EXCEPTION TYPE zcx_not_found
EXPORTING
text = lv_text.
ENDTRY.
ENDIF.

IF iv_log_handle IS INITIAL.
mv_logobj = iv_logobj.
mv_subobj = iv_subobj.

* ID für Protokollverwaltung (wird Ext. ID auf der DB)


gv_id = iv_id.
ls_instance-id = iv_id.
ls_instance-messages = me.
lv_extnumber = iv_id.
gv_log_handle = lcl_bal=>create_log(
iv_logobj = iv_logobj
iv_subobj = iv_subobj
iv_extnumber = lv_extnumber
iv_use_existing_log = iv_reuse_bal_memory ).
ELSE.
lcl_bal=>set_log_handle( iv_log_handle ).
gv_log_handle = iv_log_handle.
gv_foreign_log = 'X'.
* Kein Eintrag in die Instanzverwaltung
RETURN.
ENDIF.

READ TABLE gt_instances TRANSPORTING NO FIELDS


WITH TABLE KEY id = ls_instance-id.
IF sy-subrc EQ 0.
* Durch Aufruf des Konstruktors ist explizit eine neue
* Sammler-Instanz gewünscht
MODIFY TABLE gt_instances FROM ls_instance.
ELSE.
INSERT ls_instance INTO TABLE gt_instances.
ENDIF.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->COPY
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IO_TARGET TYPE REF TO ZCL_MESSAGES
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [!CX!] ZCX_ERROR
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD copy.
DATA: lt_msg TYPE aqtbal_s_msg,
lv_log_handle TYPE balloghndl,
ls_context TYPE REF TO data,
lv_tabname TYPE baltabname.

FIELD-SYMBOLS: <ls_msg> TYPE bal_s_msg,


<ls_context> TYPE any,
<lv_id> TYPE zmessage_id.

* Meldungen holen
IF iv_row IS SUPPLIED.
CALL METHOD get_messages_detailed
EXPORTING
iv_condition = iv_condition
iv_row = iv_row
RECEIVING
et_msg = lt_msg.
ELSE.
CALL METHOD get_messages_detailed
EXPORTING
iv_condition = iv_condition
RECEIVING
et_msg = lt_msg.
ENDIF.

lv_log_handle = io_target->get_handle( ).

* ... und auf BAL-Ebene in das andere Log übertragen


LOOP AT lt_msg ASSIGNING <ls_msg>.

* ID im Msg-Context ändern
IF <ls_msg>-context-tabname NE space.
IF lv_tabname NE <ls_msg>-context-tabname.
lv_tabname = <ls_msg>-context-tabname.
CREATE DATA ls_context TYPE (lv_tabname).
IF ls_context IS BOUND.
ASSIGN ls_context->* TO <ls_context>.
ASSIGN COMPONENT gc_fieldname-id OF STRUCTURE <ls_context>
TO <lv_id>.
ENDIF.
ENDIF.
IF <lv_id> IS ASSIGNED.
MOVE <ls_msg>-context-value TO <ls_context>.
<lv_id> = io_target->gv_id.
MOVE <ls_context> TO <ls_msg>-context-value.
ENDIF.
ENDIF.

CALL FUNCTION 'BAL_LOG_MSG_ADD'


EXPORTING
i_log_handle = lv_log_handle
i_s_msg = <ls_msg>
IMPORTING
e_s_msg_handle = io_target->gs_last_msgh
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_error
EXPORTING
t100_msgid = sy-msgid
t100_msgno = sy-msgno
t100_msgv1 = sy-msgv1
t100_msgv2 = sy-msgv2
t100_msgv3 = sy-msgv3
t100_msgv4 = sy-msgv4.
ENDIF.

ENDLOOP.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->DELETE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [--->] IS_AFTER_MSGH TYPE BALMSGHNDL(optional)
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD delete .

DATA: ls_mfil TYPE bal_s_mfil,


lt_cfil TYPE bal_t_cfil,
lt_logh TYPE bal_t_logh,
lt_msgh_del TYPE bal_t_msgh,
lt_msgh_new TYPE bal_t_msgh.

* Wenn Meldungen gesammelt wurden, gibt es ein Log Handle


CHECK gv_log_handle IS NOT INITIAL.
INSERT gv_log_handle INTO TABLE lt_logh.

* Kontext als Filter aufbereiten


IF iv_condition NE '*'.
INSERT VALUE #(
tabname = gv_context
fieldname = gc_fieldname-condition
t_range = VALUE #( (
option = 'EQ'
sign = 'I'
low = to_lower( iv_condition ) ) )
) INTO TABLE lt_cfil.
ENDIF.

* ID als Filter
INSERT VALUE #(
tabname = gv_context
fieldname = gc_fieldname-id
t_range = VALUE #( (
option = 'EQ'
sign = 'I'
low = gv_id ) )
) INTO TABLE lt_cfil.

* Zeilenfeld als Filter


IF iv_row IS NOT INITIAL.
INSERT VALUE #(
tabname = gv_context
fieldname = gc_fieldname-row
t_range = VALUE #( (
option = 'EQ'
sign = 'I'
low = iv_row ) )
) INTO TABLE lt_cfil.
ENDIF.

IF gv_end_last_section >= 0
OR is_after_msgh IS NOT INITIAL.

ls_mfil-msgnumber = VALUE #( (
sign = 'I'
option = 'GT'
low = nmax(
val1 = gv_end_last_section
val2 = is_after_msgh-msgnumber ) ) ).

ENDIF.

* Meldungen suchen
CALL FUNCTION 'BAL_GLB_SEARCH_MSG'
EXPORTING
i_s_msg_filter = ls_mfil
i_t_log_handle = lt_logh
i_t_msg_context_filter = lt_cfil
IMPORTING
e_t_msg_handle = lt_msgh_del
EXCEPTIONS
msg_not_found = 1
OTHERS = 2.

IF sy-subrc = 0.

* Meldungen löschen
LOOP AT lt_msgh_del ASSIGNING FIELD-SYMBOL(<ls_msgh>).
CALL FUNCTION 'BAL_LOG_MSG_DELETE'
EXPORTING
i_s_msg_handle = <ls_msgh>
EXCEPTIONS
OTHERS = 0.
ENDLOOP.

RAISE EVENT deleted


EXPORTING
it_msgh = lt_msgh_del.

* GS_LAST_MSGH ggf. aktualisieren


IF gs_last_msgh IS INITIAL
OR line_exists( lt_msgh_del[
log_handle = gs_last_msgh-log_handle
msgnumber = gs_last_msgh-msgnumber ] ).

recompute_last_msgh( ).

ENDIF.
ENDIF.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->DELETE_LOG
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_ALSO_ON_DB TYPE FLAG (default =ABAP_FALSE)
* | [!CX!] ZCX_ERROR
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD delete_log .

* Nach Aufruf dieser Methode kann die aktuelle Instanz nicht mehr verwendet werden
* ( Verwendung führt sofort zu Abbrüchen wg. fehlenden Log-Handles,
* und das ist auch richtig so.)

lcl_bal=>delete_log( iv_also_on_db ).

DELETE TABLE gt_instances WITH TABLE KEY id = gv_id.

CLEAR:
gs_context,
gs_context_std,
gs_last_msgh,
gv_constructed_at,
gv_context,
gv_end_last_section,
gv_foreign_log,
gv_id,
mv_logobj,
mv_subobj,
gv_log_handle.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->DELETE_SINGLE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IS_MSGH TYPE BALMSGHNDL
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD delete_single .

* Dieser Aufruf könnte natürlich auch direkt ausgeführt


* werden. Aus Sicht der Kapselung ist es aber besser, ihn
* durch ZCL_MESSAGES noch einmal zu verschalen: Wenn schon
* ZCL_MESSAGES die Klasse zum Sammeln von Nachrichten ist,
* so legt ihre Implementierung fest, WIE eine Nachricht zu
* behandeln ist
CALL FUNCTION 'BAL_LOG_MSG_DELETE'
EXPORTING
i_s_msg_handle = is_msgh
EXCEPTIONS
OTHERS = 0.

RAISE EVENT deleted


EXPORTING
it_msgh = VALUE #( ( is_msgh ) ).

IF gs_last_msgh = is_msgh.
recompute_last_msgh( ).
ENDIF.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->DISPLAY
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_FULLSCREEN TYPE FLAG (default ='X')
* | [--->] IS_PROF TYPE BAL_S_PROF(optional)
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD display .

DATA: ls_prof TYPE bal_s_prof,


lt_logh TYPE bal_t_logh.

INSERT gv_log_handle INTO TABLE lt_logh.

IF is_prof IS SUPPLIED.
ls_prof = is_prof.
ELSE.
IF iv_fullscreen EQ 'X'.
CALL FUNCTION 'BAL_DSP_PROFILE_NO_TREE_GET'
IMPORTING
e_s_display_profile = ls_prof.
ELSE.
CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'
IMPORTING
e_s_display_profile = ls_prof.
ENDIF.
ls_prof-use_grid = 'X'.
ENDIF.
CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
EXPORTING
i_s_display_profile = ls_prof
i_t_log_handle = lt_logh
EXCEPTIONS
profile_inconsistent = 1
internal_error = 2
no_data_available = 3
no_authority = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Private Method ZCL_MESSAGES->FILL_CONTEXT
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION
* | [<-()] ES_CONTEXT TYPE REF TO DATA
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method fill_context.

data: lv_tstmpl type timestampl,


lv_duration type i.

gs_context_std-condition = to_lower( iv_condition ).


gs_context_std-id = gv_id.
gs_context_std-row = iv_row.
get time stamp field lv_tstmpl.
gs_context_std-collected_at = lv_tstmpl * 10000000.
lv_duration = cl_abap_tstmp=>subtract(
tstmp1 = lv_tstmpl
tstmp2 = gv_constructed_at
) * 1000.
gs_context_std-duration = lv_duration.

if gv_context eq 'ZMESSAGE_CONTEXT'.
gs_context = ref #( gs_context_std ).
else.
assign gs_context->* to field-symbol(<ls_context>).
move-corresponding gs_context_std to <ls_context>.
endif.
es_context = gs_context.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_HANDLE
*
+----------------------------------------------------------------------------------
---------------+
* | [<-()] EV_LOG_HANDLE TYPE BALLOGHNDL
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD get_handle .
ev_log_handle = gv_log_handle.
ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_HIGHEST_TYPE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<-()] EV_TYPE TYPE SYMSGTY
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD get_highest_type .

DATA: lt_msg TYPE aqtbal_s_msg,


lv_off TYPE i VALUE -1.

FIELD-SYMBOLS: <ls_msg> TYPE bal_s_msg.

IF iv_row IS SUPPLIED.
lt_msg = get_messages_detailed( iv_condition = iv_condition
iv_row = iv_row ).
ELSE.
lt_msg = get_messages_detailed( iv_condition ).
ENDIF.

LOOP AT lt_msg ASSIGNING <ls_msg>.


* Dieses if muss immer erfüllt sein
IF gc_message_types CA <ls_msg>-msgty.
IF sy-fdpos > lv_off.
lv_off = sy-fdpos.
ENDIF.
ELSE.
* Unbekannter Nachrichtentyp - Bearbeitung abbrechen
MESSAGE e013(zmvc) WITH <ls_msg>-msgty INTO sy-msgli.
RAISE EXCEPTION TYPE zcx_stop_no_check
EXPORTING
t100_msgid = sy-msgid
t100_msgno = sy-msgno
t100_msgv1 = sy-msgv1.
ENDIF.
ENDLOOP.

IF lv_off EQ -1.
ev_type = space.
ELSE.
ev_type = gc_message_types+lv_off(1).
ENDIF.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Static Public Method ZCL_MESSAGES=>GET_INSTANCE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_ID TYPE CSEQUENCE(optional)
* | [--->] IV_SUBOBJ TYPE BALSUBOBJ(optional)
* | [--->] IV_CONTEXT TYPE TABNAME (default
='ZMESSAGE_CONTEXT')
* | [--->] IV_REOPEN TYPE FLAG (default =SPACE)
* | [--->] IV_LOGOBJ TYPE BALOBJ_D(optional)
* | [<-()] EO_INSTANCE TYPE REF TO ZCL_MESSAGES
* | [!CX!] ZCX_PARAMETER_MISSING
* | [!CX!] ZCX_NOT_FOUND
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD get_instance .

DATA: ls_instance TYPE zmessages_instance,


lv_handle TYPE balloghndl,
lv_extnumber TYPE balnrext.

ls_instance-id = iv_id.
READ TABLE gt_instances INTO ls_instance
FROM ls_instance.
IF sy-subrc NE 0.
IF iv_logobj IS NOT INITIAL AND iv_subobj IS NOT INITIAL.
ls_instance-id = iv_id.
* ExtNumber übergeben? Dann schauen, ob es das Log auf der DB gibt
IF iv_reopen IS NOT INITIAL.
lv_extnumber = iv_id.
lv_handle = lcl_bal=>read_by_extnumber(
iv_extnumber = lv_extnumber
iv_object = iv_logobj
iv_subobject = iv_subobj ).
ENDIF.
* Log instanziieren
* Eintrag in Instanzverwaltung erfolgt im Konstruktor
CREATE OBJECT ls_instance-messages "ZCL_MESSAGES
EXPORTING
iv_id = ls_instance-id
iv_logobj = iv_logobj
iv_subobj = iv_subobj
iv_context = iv_context
iv_log_handle = lv_handle.
ENDIF.
ENDIF.
eo_instance = ls_instance-messages.

ENDMETHOD.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_LAST_MESSAGE
*
+----------------------------------------------------------------------------------
---------------+
* | [<---] ES_MSG TYPE BAL_S_MSG
* | [<---] ES_MSGH TYPE BALMSGHNDL
* | [!CX!] ZCX_NOT_FOUND
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_last_message .

if gs_last_msgh is initial.
raise exception type zcx_not_found.
else.
es_msgh = gs_last_msgh.
call function 'BAL_LOG_MSG_READ'
exporting
i_s_msg_handle = gs_last_msgh
importing
e_s_msg = es_msg
exceptions
log_not_found = 1
msg_not_found = 2
others = 3.
if sy-subrc <> 0.
raise exception type zcx_not_found.
endif.
endif.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_MESSAGE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<---] EV_MSG_TYPE TYPE SYMSGTY
* | [<---] EV_MSG_TEXT TYPE STRING
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_message .
data: ls_msg type bal_s_msg.

if iv_row is supplied.
call method get_message_with_handle
exporting
iv_condition = iv_condition
iv_row = iv_row
importing
es_msg = ls_msg.
else.
call method get_message_with_handle
exporting
iv_condition = iv_condition
importing
es_msg = ls_msg.
endif.

if not ls_msg is initial.


data: lv_aux type c length 269.
call function 'BAL_DSP_TXT_MSG_READ'
exporting
i_msgid = ls_msg-msgid
i_msgno = ls_msg-msgno
i_msgv1 = ls_msg-msgv1
i_msgv2 = ls_msg-msgv2
i_msgv3 = ls_msg-msgv3
i_msgv4 = ls_msg-msgv4
importing
e_message_text = lv_aux.
ev_msg_text = lv_aux.
else.
ev_msg_text = space.
endif.

ev_msg_type = ls_msg-msgty.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_MESSAGES
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [<-()] ET_MESSAGES TYPE ZCL_SRS_MESSAGE_TAB
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_messages .
data: lt_msg type aqtbal_s_msg,
ls_message type zcl_srs_message,
lv_aux type c length 269.

field-symbols: <ls_msg> type bal_s_msg.

lt_msg = get_messages_detailed( iv_condition ).

loop at lt_msg assigning <ls_msg>.


clear ls_message.
ls_message-type = <ls_msg>-msgty.
if <ls_msg>-msgid is not initial.
call function 'BAL_DSP_TXT_MSG_READ'
exporting
i_msgid = <ls_msg>-msgid
i_msgno = <ls_msg>-msgno
i_msgv1 = <ls_msg>-msgv1
i_msgv2 = <ls_msg>-msgv2
i_msgv3 = <ls_msg>-msgv3
i_msgv4 = <ls_msg>-msgv4
importing
e_message_text = lv_aux.
ls_message-text = lv_aux.
endif.
insert ls_message into table et_messages.
endloop.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_MESSAGES_DETAILED
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<-()] ET_MSG TYPE AQTBAL_S_MSG
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_messages_detailed . "#EC CI_VALPAR

data: lt_messages type swf_app_log_ext_msg_t.

field-symbols: <ls_message> type swf_app_log_ext_msg.

if iv_row is supplied.
call method get_messages_detailed_with_hdl
exporting
iv_condition = iv_condition
iv_row = iv_row
importing
et_messages = lt_messages.
else.
call method get_messages_detailed_with_hdl
exporting
iv_condition = iv_condition
importing
et_messages = lt_messages.
endif.

loop at lt_messages assigning <ls_message>.


insert <ls_message>-msg into table et_msg.
endloop.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_MESSAGES_DETAILED_WITH_HDL
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<---] ET_MESSAGES TYPE SWF_APP_LOG_EXT_MSG_T
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_messages_detailed_with_hdl .

data: ls_message type swf_app_log_ext_msg,


lt_msgh type ref to bal_t_msgh.

* Meldungen suchen
if iv_row is supplied.
lt_msgh = search_messages( iv_condition = iv_condition
iv_row = iv_row ).
else.
lt_msgh = search_messages( iv_condition ).
endif.

* Meldungs-Details für jede Meldung dazulesen


clear et_messages.
loop at lt_msgh->* into ls_message-msg_handle
where log_handle = gv_log_handle and
msgnumber > gv_end_last_section.
call function 'BAL_LOG_MSG_READ'
exporting
i_s_msg_handle = ls_message-msg_handle
i_langu = sy-langu
importing
e_s_msg = ls_message-msg
exceptions
log_not_found = 1
msg_not_found = 2
others = 3.
if sy-subrc <> 0.
continue.
endif.
insert ls_message into table et_messages.
endloop.

endmethod. "#EC CI_VALPAR

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_MESSAGE_DETAILED
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<-()] ES_MSG TYPE BAL_S_MSG
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_message_detailed .

* Verschalung - da Aufruf mit Returning-Parameter schon


* verbreitet ist (und auch komfortabel im Aufruf), als
* dass eine Schnittstellenänderung sich gelohnt hätte.
if iv_row is supplied.
call method get_message_with_handle
exporting
iv_condition = iv_condition
iv_row = iv_row
importing
es_msg = es_msg.
else.
call method get_message_with_handle
exporting
iv_condition = iv_condition
importing
es_msg = es_msg.
endif.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->GET_MESSAGE_WITH_HANDLE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<---] ES_MSGH TYPE BALMSGHNDL
* | [<---] ES_MSG TYPE BAL_S_MSG
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method get_message_with_handle .
data: ls_msg type bal_s_msg,
lt_msgh type ref to bal_t_msgh,
lv_offset type i.

field-symbols: <ls_msgh> type balmsghndl.

* Meldungen suchen
if iv_row is supplied.
lt_msgh = search_messages( iv_condition = iv_condition
iv_row = iv_row ).
else.
lt_msgh = search_messages( iv_condition = iv_condition ).
endif.

* Meldung von höchstem Meldungsgrad zurückgeben


clear es_msg.
clear es_msgh.
lv_offset = -1.
loop at lt_msgh->* assigning <ls_msgh>
where log_handle = gv_log_handle and
msgnumber > gv_end_last_section.
call function 'BAL_LOG_MSG_READ'
exporting
i_s_msg_handle = <ls_msgh>
i_langu = sy-langu
importing
e_s_msg = ls_msg
exceptions
log_not_found = 1
msg_not_found = 2
others = 3.
if sy-subrc <> 0.
continue.
endif.
find ls_msg-msgty in gc_message_types match offset sy-fdpos.
if sy-fdpos > lv_offset.
lv_offset = sy-fdpos.
es_msg = ls_msg.
es_msgh = <ls_msgh>.
endif.
endloop.

endmethod..

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Static Private Method ZCL_MESSAGES=>IN_BATCHMODE
*
+----------------------------------------------------------------------------------
---------------+
* | [<-()] EV_BATCHMODE TYPE FLAG
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method in_batchmode.
ev_batchmode = sy-batch.
raise event batchmode
exporting
cv_batchmode = ref #( ev_batchmode ).
endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Private Method ZCL_MESSAGES->RECOMPUTE_LAST_MSGH
*
+----------------------------------------------------------------------------------
---------------+
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method recompute_last_msgh.

data: lt_msgh type bal_t_msgh.

* Letzten Message Handle (GS_LAST_MSGH) neu berechnen


* Nötig z.B. nach Löschung von Nachrichten
call function 'BAL_GLB_SEARCH_MSG'
exporting
i_t_log_handle = value bal_t_logh( ( gv_log_handle ) )
importing
e_t_msg_handle = lt_msgh
exceptions
msg_not_found = 1
others = 2.

if lt_msgh is initial.
clear gs_last_msgh.
else.
gs_last_msgh = lt_msgh[ lines( lt_msgh ) ].
endif.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->RESET_SECTION
*
+----------------------------------------------------------------------------------
---------------+
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method reset_section.

gv_end_last_section = -1.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Static Public Method ZCL_MESSAGES=>ROOT_CAUSE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IO_EX TYPE REF TO CX_ROOT
* | [<-()] EO_EX TYPE REF TO CX_ROOT
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method ROOT_CAUSE.
eo_ex = io_ex.
while eo_ex->previous is bound.
eo_ex = eo_ex->previous.
endwhile.
endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->SAVE
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_UPDATE_TASK TYPE FLAG (default ='X')
* | [<---] EV_LOGNUMBER TYPE BALOGNR
* | [<---] EV_LOG_HANDLE TYPE BALLOGHNDL
* | [!CX!] ZCX_ERROR
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method save .

lcl_bal=>save_log(
iv_log_handle = gv_log_handle
iv_update_task = iv_update_task ).

ev_log_handle = gv_log_handle.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Private Method ZCL_MESSAGES->SEARCH_MESSAGES
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
* | [--->] IV_ROW TYPE ZSRS_TABIX_4_HTML(optional)
* | [<-()] ET_MSGH TYPE REF TO BAL_T_MSGH
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method SEARCH_MESSAGES.
endmethod.
*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->SET_CONTEXT
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IS_CONTEXT TYPE CLIKE
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method set_context.

field-symbols: <ls_context> type clike.

if gs_context is bound.
assign gs_context->* to <ls_context>.
move-corresponding is_context to <ls_context>.
endif.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Instance Public Method ZCL_MESSAGES->SET_SECTION
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IV_CONDITION TYPE ZSRS_MSG_CONDITION (default
='*')
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
method set_section .

data: lt_msgh type ref to bal_t_msgh.

field-symbols: <ls_msgh> type balmsghndl.

lt_msgh = search_messages( iv_condition = iv_condition ).

clear gv_end_last_section.
loop at lt_msgh->* assigning <ls_msgh>.
if <ls_msgh>-msgnumber > gv_end_last_section.
gv_end_last_section = <ls_msgh>-msgnumber.
endif.
endloop.

endmethod.

*
<SIGNATURE>------------------------------------------------------------------------
---------------+
* | Static Public Method ZCL_MESSAGES=>SHOW_EXCEPTION
*
+----------------------------------------------------------------------------------
---------------+
* | [--->] IO_EX TYPE REF TO CX_ROOT
* | [--->] IV_MSGTY TYPE MSGTY (default ='I')
*
+----------------------------------------------------------------------------------
----</SIGNATURE>
METHOD show_exception.

* Bitte prüfen, ob nicht direkt das neuere Idiom


*
* message lo_ex type 'I'.
*
* verwendet werden kann.

* Vorteil dieser Methode: Eine T100-Meldung wird nicht nur als Text angezeigt,
* sondern zeigt z.B. auch den korrekten Langtext

DATA: ls_msg TYPE balmi,


lv_text TYPE text255.

FIELD-SYMBOLS: <lv_any> TYPE any.

DEFINE get_msgfield.
ASSIGN io_ex->(&1) TO <lv_any>.
IF sy-subrc EQ 0.
&2 = <lv_any>.
ENDIF.
end-of-definition.

* Eine Exception im GUI als Meldung anzeigen


* Wichtig ist der Verweis auf einen möglichen Langtext
get_msgfield:
'T100_MSGID' ls_msg-msgid,
'T100_MSGNO' ls_msg-msgno,
'T100_MSGV1' ls_msg-msgv1,
'T100_MSGV2' ls_msg-msgv2,
'T100_MSGV3' ls_msg-msgv3,
'T100_MSGV4' ls_msg-msgv4.

IF ls_msg-msgid NE space.
MESSAGE ID ls_msg-msgid TYPE iv_msgty NUMBER ls_msg-msgno
WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4.
ELSE.
lv_text = io_ex->get_text( ).
MESSAGE lv_text TYPE iv_msgty.
ENDIF.

ENDMETHOD.
ENDCLASS.4

You might also like