Thanks Mukthar.
Due to inconsistency of Period scaling(PERFY) getting error.
ANLB-PERFY =12 we are getting Error "AA662"
ANLB-PERFY=365 Working Fine.
Same raised to sap and sap has provided soluation with program corrections.
Apply below program and execute inconsistency Assets.
Program name : ZCORR_PERFY
See below the parameters for the execution:
************************
Company Code >>> 1000
Depreciation area >>> blank
Asset >>> indicate the inconsistent assets individually or leave
blank for the system to select all inconsistent assets only.
Subnumber >>> 0
Use of half periods
Dep.to the day >>>> X select this check box
Deact.
Expired useful life >>> X select this check box
Test run >>> If check box is empty the real update takes place to
correct the inconsistent.
*****************************
After applied above changes, its working fine and calculating the Depreciation vlues correctly.
ZCORR_PERFY :
*&---------------------------------------------------------------------*
*& Report ZCORR_PERFY
*&
*&---------------------------------------------------------------------*
*& Korrektur von PERFY Inkonsistenzen.
*&
*& Version : 2.0
*& Angelegt : ME, Datum unbekannt
*& DB Tabellen : ANLB (upd), ANLC (upd)
*& Schedman : Ja
*&
*& Parameter
*& ---------
*& P_MONMIT (Halbperioden prüfen)
*& Es wird geprüft ob der Buchungskreis Halbperioden verwendet (T093C).
*& Falls JA, dann wird in allen Bereichen, die eine Variante mit genau
*& 12 Perioden verwenden, der Faktor "ld_monmit_faktor" auf 2 gestellt.
*& Die Anzahl der Buchungsperioden wird mit diesem Faktor multipliziert.
*& Bei Ermittlung der Nutzungsdauer wird der Faktor dagegen wieder raus-
*& gerechnet, da MONMIT hier keinen Einfluss hat.
*&
*& P_XDAILY (Tages-AfA prüfen)
*& Es werden sämtliche Schlüssel mit XDAILY selektiert. Werden keine
*& Schlüssel gefunden, wird "ld_no_xdaily_found" gesetzt und es geht
*& ganz normal weiter. Einzige Ausnahme: In der ANLB werden auch solche
*& Einträge geprüft, die PERFY = 365 haben.
*&
*& P_XDEAKT (Deaktivierte Anlagen bearbeiten)
*&
*& P_NDABP (Abgelaufene Nutzungsdauer aktualisieren)
*&---------------------------------------------------------------------*
*&
*& 26.09.2011 - Version 2.0
*& - Optionale Bearbeitung deaktiver Anlagen.
*& - Option zur Anpassung der geplanten Nutzungsdauer entfernt.
*& - Schedman Anbindung
*& - Teilweise umfangreiche formale Überarbeitungen
*&---------------------------------------------------------------------*
REPORT zcorr_perfy.
TYPE-POOLS: slis.
INCLUDE: <icon>, racorr_schedman.
* Lokale Deklaration **************************************************
TYPES: BEGIN OF anlb_log.
INCLUDE STRUCTURE anlb.
TYPES: perfy_new TYPE anlb-perfy,
tab2 TYPE char4,
gjahr TYPE anlc-gjahr,
ndabj TYPE anlc-ndabj,
ndabp TYPE anlc-ndabp,
ndabp_new TYPE anlc-ndabp,
END OF anlb_log.
TYPES: BEGIN OF anlc_log.
INCLUDE STRUCTURE anlc.
TYPES: perfy_new TYPE anlb-perfy,
END OF anlc_log.
DATA: lt_anlb_log TYPE TABLE OF anlb_log,
ls_anlb_log TYPE anlb_log,
gt_anlc_log TYPE TABLE OF anlc_log,
ls_anlc_log TYPE anlc_log.
CONSTANTS: con_xdaily TYPE anlb-perfy VALUE 365,
con_monmit_faktor TYPE i VALUE 2,
con_true TYPE c VALUE 'X',
con_false TYPE c VALUE ' ',
con_anlb_log TYPE c VALUE 'B',
con_anlc_log TYPE c VALUE 'C'.
CONSTANTS: gc_handle_top_of_page_html(30) TYPE c
VALUE 'HANDLE_EVENT_TOP_OF_PAGE_HTML'.
DATA: lt_yanlb TYPE TABLE OF anlb, "ANLB von DB
lt_xanlb TYPE TABLE OF anlb, "Update-Tabelle
lt_xanlb_ges TYPE TABLE OF anlb,
gt_xanlc_ges TYPE TABLE OF anlc,
ls_t093c TYPE t093c,
lt_t093a TYPE TABLE OF t093a,
ls_t093a LIKE LINE OF lt_t093a,
ls_anlc TYPE anlc,
lt_afasl_xdaily_range TYPE RANGE OF t090c-afasl,
ld_no_xdaily_found TYPE c,
ld_perfy_allowed TYPE anlb-perfy,
ld_monmit_faktor TYPE i VALUE 1,
gt_deakt TYPE TABLE OF anla, "Deaktivierte Anlagen
ld_deakt TYPE anla-deakt,
ls_anlb TYPE anlb,
ld_anzbp TYPE t009-anzbp, "Wert für update in ANLB
ld_afabe TYPE anlb-afabe,
gd_success TYPE c,
ld_plabel TYPE char80,
gd_abgja TYPE t093b-abgja,
gd_afabe_cnt TYPE sy-dbcnt,
ld_msg TYPE string.
* ALV
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv.
*DATA: lt_sort TYPE slis_t_sortinfo_alv.
DATA: ls_layout TYPE slis_layout_alv.
DATA: lt_events TYPE slis_t_event.
*DATA: ls_variant TYPE disvariant.
*DATA: ls_print TYPE slis_print_alv.
*DATA: lt_excluding TYPE slis_t_extab.
*DATA: lt_quickinfo TYPE slis_t_qinfo_alv.
*DATA: lt_outtab TYPE TABLE OF anlcv.
* Message Handler / Schedman
CONSTANTS: con_balobject TYPE balobj_d VALUE 'FIAA',
con_balsubobj TYPE balsubobj VALUE '009'.
DATA: ld_ident TYPE sy-uzeit,
ld_loghandle TYPE balloghndl.
FIELD-SYMBOLS: <lfs_xanlb> TYPE anlb,
<lfs_yanlb> TYPE anlb,
<lfs_anlc_log> TYPE anlc_log.
************************************************************************
* SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK main WITH FRAME.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (30) l_bukrs FOR FIELD P_BUKRS.
PARAMETERS p_bukrs TYPE t093c-bukrs MEMORY ID buk OBLIGATORY.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (27) l_afabe FOR FIELD SO_AFABE.
SELECT-OPTIONS so_afabe FOR ls_anlb-afabe.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (27) l_anln1 FOR FIELD SO_ANLN1.
SELECT-OPTIONS so_anln1 FOR ls_anlb-anln1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (27) l_anln2 FOR FIELD SO_ANLN2.
SELECT-OPTIONS so_anln2 FOR ls_anlb-anln2.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF BLOCK checks WITH FRAME TITLE t_checks.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (25) l_monmit FOR FIELD P_MONMIT.
PARAMETERS p_monmit TYPE c AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (25) l_xdaily FOR FIELD P_XDAILY.
PARAMETERS p_xdaily TYPE c AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (25) l_xdeakt FOR FIELD P_XDEAKT.
PARAMETERS p_xdeakt TYPE c AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK checks.
SELECTION-SCREEN BEGIN OF BLOCK update WITH FRAME TITLE t_update.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (25) l_ndabp FOR FIELD P_NDABP.
PARAMETERS p_ndabp TYPE c AS CHECKBOX USER-COMMAND UPDOPTS.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK update.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_test TYPE c AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT (20) l_test FOR FIELD P_TEST.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS p_sepout TYPE c AS CHECKBOX MODIF ID SLI.
SELECTION-SCREEN COMMENT (40) l_sepout FOR FIELD P_SEPOUT.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK main.
************************************************************************
* INITIALIZATION
************************************************************************
INITIALIZATION.
t_checks = 'Advanced checks:'.
t_update = 'Advanced update:'.
PERFORM get_parameter_descr USING 'BUKRS' 'L' CHANGING ld_plabel.
l_bukrs = ld_plabel.
PERFORM get_parameter_descr USING 'AFABER' 'L' CHANGING ld_plabel.
l_afabe = ld_plabel.
PERFORM get_parameter_descr USING 'ANLN1' 'L' CHANGING ld_plabel.
l_anln1 = ld_plabel.
PERFORM get_parameter_descr USING 'ANLN2' 'L' CHANGING ld_plabel.
l_anln2 = ld_plabel.
PERFORM get_parameter_descr USING 'XHALBPER' 'L' CHANGING ld_plabel.
l_monmit = ld_plabel.
PERFORM get_parameter_descr USING 'XDAILY' 'L' CHANGING ld_plabel.
l_xdaily = ld_plabel.
PERFORM get_parameter_descr USING 'XDEAKT' 'S' CHANGING ld_plabel.
l_xdeakt = ld_plabel.
PERFORM get_parameter_descr USING 'NDABJ' 'L' CHANGING ld_plabel.
l_ndabp = ld_plabel.
PERFORM get_parameter_descr USING 'VVJTEST' 'L' CHANGING ld_plabel.
l_test = ld_plabel.
PERFORM get_parameter_descr USING 'DOPRXGAW' 'L' CHANGING ld_plabel.
CONCATENATE ld_plabel ' (ANLB, ANLC)' INTO ld_plabel.
l_sepout = ld_plabel.
************************************************************************
* AT SELECTION-SCREEN OUTPUT
************************************************************************
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
* Checkbox: Ausgabe in separaten Listen
IF screen-group1 = 'SLI'.
IF p_ndabp EQ con_true.
screen-input = 1.
ELSE.
screen-input = 0.
ENDIF.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
* Message Handler und Schedman starten
IF p_test IS INITIAL.
PERFORM open_schedman. "schedman
ENDIF.
CALL FUNCTION 'MESSAGES_INITIALIZE'
EXPORTING i_no_duplicate_count = 1
IMPORTING e_identification = ld_ident
EXCEPTIONS OTHERS = 3.
* Infos über Parametrisierung des Programms wegschreiben
PERFORM store_flag USING p_monmit 'Check use of half-periods'.
PERFORM store_flag USING p_xdaily 'Check depreciation to the day'.
PERFORM store_flag USING p_xdeakt 'Update deactivated assets'.
PERFORM store_flag USING p_ndabp 'Update exp. useful life'.
IF p_ndabp IS INITIAL.
p_sepout = con_false.
ENDIF.
* Standardmäßig XDAILY nicht(!) prüfen (siehe SELECT)
ld_perfy_allowed = con_xdaily.
ls_t093c-bukrs = p_bukrs.
CALL FUNCTION 'T093C_READ'
EXPORTING f_t093c = ls_t093c
IMPORTING f_t093c = ls_t093c.
* Selektionstabelle mit Tages-AfA Schlüsseln erstellen
IF NOT p_xdaily IS INITIAL.
PERFORM get_xdaily_afasl USING ' ' ls_t093c-afapl
CHANGING lt_afasl_xdaily_range[].
* Keine Schlüssel mit Tages-AfA gefunden?
IF lt_afasl_xdaily_range[] IS INITIAL.
* Weiter wie normal. Einzige Ausnahme: ANLBs mit PERFY 365 auch prüfen
CLEAR ld_perfy_allowed.
ld_no_xdaily_found = con_true.
ENDIF.
ENDIF.
SELECT * FROM t093a INTO TABLE lt_t093a[]
WHERE afapl EQ ls_t093c-afapl
AND afabe IN so_afabe[].
gd_afabe_cnt = sy-dbcnt.
* Verarbeitung bereichsweise, da sich ANZBP bei bereichsabh. PERIV
* unterscheiden kann.
LOOP AT lt_t093a INTO ls_t093a.
* Bereichsabhängige Variablen initialisieren **************************
CLEAR lt_xanlb[].
CLEAR lt_yanlb[].
ld_monmit_faktor = 1.
ld_afabe = ls_t093a-afabe.
CLEAR gd_abgja.
SELECT SINGLE abgja
FROM t093b INTO gd_abgja
WHERE bukrs EQ p_bukrs
AND afabe EQ ls_t093a-afabe.
* Korrekte Anzahl Buchungsperioden eines Bereichs ermitteln.
PERFORM get_anzbp_for_afabe USING p_bukrs ld_afabe
CHANGING ld_anzbp.
* MONMIT berücksichtigen
IF NOT p_monmit IS INITIAL AND NOT ls_t093c-monmit IS INITIAL.
IF ld_anzbp EQ 12.
ld_monmit_faktor = 2.
ENDIF.
ENDIF.
ld_anzbp = ld_anzbp * ld_monmit_faktor.
* Datenselektion: ANLB ************************************************
IF p_xdaily IS INITIAL OR ld_no_xdaily_found EQ con_true.
* Anlagen mit von Anzahl Perioden abweichendem PERFY selektieren.
* Initialer Wert für unbebuchte Anlagen (und evtl. 365) ist ok
SELECT * FROM anlb INTO TABLE lt_yanlb[]
WHERE bukrs EQ p_bukrs
AND anln1 IN so_anln1
AND anln2 IN so_anln2
AND afabe EQ ld_afabe
AND perfy NE ld_anzbp
AND perfy NE ld_perfy_allowed
AND perfy NE ' '
ORDER BY PRIMARY KEY.
ELSE.
* Wenn auch XDAILY des AfA-Schlüssels geprüft werden soll:
* Bereiche ohne AFASL mit XDAILY müssen PERFY = ANZBP haben.
* Für Bereiche mit einem XDAILY-Schlüssel muss PERFY = 365 sein.
SELECT * FROM anlb INTO TABLE lt_yanlb[]
WHERE bukrs EQ p_bukrs
AND anln1 IN so_anln1
AND anln2 IN so_anln2
AND afabe EQ ld_afabe
AND perfy NE ' '
AND ( ( perfy NE ld_anzbp AND
afasl NOT IN lt_afasl_xdaily_range )
OR ( afasl IN lt_afasl_xdaily_range AND
perfy NE con_xdaily ) )
ORDER BY PRIMARY KEY.
ENDIF.
* Arbeitstabellen korrigieren, Log schreiben **************************
* Daten für UPDATE vorbereiten. Log-Tabelle für Ausgabe füllen.
LOOP AT lt_yanlb[] ASSIGNING <lfs_yanlb>.
* Keine Bearbeitung, wenn Anlage deaktiviert
IF p_xdeakt IS INITIAL.
PERFORM get_deakt USING <lfs_yanlb>-bukrs
<lfs_yanlb>-anln1
<lfs_yanlb>-anln2 CHANGING ld_deakt.
ENDIF.
IF ld_deakt IS INITIAL.
APPEND <lfs_yanlb> TO lt_xanlb[] ASSIGNING <lfs_xanlb>.
* Log-Eintrag mit Daten vor Änderung initialisieren
MOVE <lfs_xanlb> TO ls_anlb_log.
* Erstmal PERFY auf ANZBP der GJahresveriante setzen.
<lfs_xanlb>-perfy = ld_anzbp.
* XDAILY erst jetzt prüfen, weil kein Einfluss auf NtzDauer
IF ( p_xdaily EQ con_true ) AND ( ld_no_xdaily_found EQ con_false ).
* PERFY 356 setzen, falls Schlüssel Tages-AfA verwendet.
IF <lfs_xanlb>-afasl IN lt_afasl_xdaily_range.
<lfs_xanlb>-perfy = con_xdaily.
ENDIF.
ENDIF.
* ANLB Änderungen in Log schreiben
ls_anlb_log-perfy_new = <lfs_xanlb>-perfy.
APPEND ls_anlb_log TO lt_anlb_log.
* Abgel. Nutzungsdauer in ANLC updaten
IF p_ndabp EQ con_true.
PERFORM recalculate_exp_ul USING <lfs_xanlb> ls_t093c.
ENDIF.
ENDIF.
ENDLOOP.
IF NOT lt_xanlb[] IS INITIAL.
DESCRIBE TABLE lt_xanlb[] LINES ld_msg.
CONCATENATE 'Area' ld_afabe '- Incorrect entries found in ANLB:' ld_msg
INTO ld_msg SEPARATED BY ' '.
PERFORM store_f5899_msg USING 'I' ld_msg.
APPEND LINES OF lt_xanlb[] TO lt_xanlb_ges[].
ENDIF.
ENDLOOP.
* Meldung über Anzahl insgesamt bearbeiteter ANLB Einträge
DESCRIBE TABLE lt_xanlb_ges[] LINES ld_msg.
CONCATENATE 'Number of entries to be corrected in ANLB:' ld_msg
INTO ld_msg SEPARATED BY ' '.
PERFORM store_f5899_msg USING 'I' ld_msg.
* DB Update durchführen ***********************************************
IF p_test IS INITIAL.
gd_success = 'X'.
UPDATE anlb FROM TABLE lt_xanlb_ges.
IF sy-subrc EQ 0.
LOOP AT gt_xanlc_ges[] INTO ls_anlc.
UPDATE anlc SET ndabj = ls_anlc-ndabj
ndabp = ls_anlc-ndabp
WHERE bukrs EQ ls_anlc-bukrs
AND anln1 EQ ls_anlc-anln1
AND anln2 EQ ls_anlc-anln2
AND gjahr EQ ls_anlc-gjahr
AND afabe EQ ls_anlc-afabe.
IF sy-subrc NE 0.
CLEAR gd_success.
ENDIF.
ENDLOOP.
ELSE.
CLEAR gd_success.
ENDIF.
* COMMIT nur, wenn alle Updates erfolgreich
IF NOT gd_success IS INITIAL.
PERFORM store_f5899_msg USING 'S' 'Updates performed successully.'.
COMMIT WORK.
ELSE.
PERFORM store_f5899_msg
USING 'E' 'Error during update. No changes performed.'.
ROLLBACK WORK.
ENDIF.
* Meldungen speichern und Schedman beenden
CALL FUNCTION 'MESSAGES_SAVE'
EXPORTING i_balobject = con_balobject
i_balsubobject = con_balsubobj
i_identification = ld_ident
IMPORTING e_log_handle = ld_loghandle
EXCEPTIONS OTHERS = 6.
PERFORM close_schedman USING ld_loghandle. "schedman
ELSE.
PERFORM store_f5899_msg USING 'I' 'Testrun. No Updates performed.'.
ROLLBACK WORK.
ENDIF.
************************************************************************
* END-OF-SELECTION
************************************************************************
END-OF-SELECTION.
CALL FUNCTION 'MESSAGES_SHOW'
EXCEPTIONS OTHERS = 3.
CALL FUNCTION 'MESSAGES_STOP'
EXPORTING i_reset_messages = 'X'
EXCEPTIONS OTHERS = 1.
* Ausgabe in nur einer Liste? Dann ANLC- und ANLB-Log verwurschteln
IF p_sepout IS INITIAL.
LOOP AT gt_anlc_log ASSIGNING <lfs_anlc_log>.
CLEAR ls_anlb_log.
MOVE-CORRESPONDING <lfs_anlc_log> TO ls_anlb_log.
ls_anlb_log-tab2 = 'ANLC'.
APPEND ls_anlb_log TO lt_anlb_log.
ENDLOOP.
SORT lt_anlb_log STABLE BY anln1 anln2 afabe.
ENDIF.
* ALV Ausgabe
PERFORM init_alv USING con_anlb_log
CHANGING lt_fieldcat[]
ls_layout
lt_events[].
IF p_sepout EQ con_true.
* "list_append geht nur bei ALV list
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_BYPASSING_BUFFER = 'X'
I_CALLBACK_PROGRAM = 'ZCORR_PERFY'
IS_LAYOUT = ls_layout
IT_FIELDCAT = lt_fieldcat
IT_EVENTS = lt_events
TABLES
t_outtab = lt_anlb_log[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
ELSE.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_BYPASSING_BUFFER = 'X'
I_CALLBACK_PROGRAM = 'ZCORR_PERFY'
I_CALLBACK_HTML_TOP_OF_PAGE = gc_handle_top_of_page_html
IS_LAYOUT = ls_layout
IT_FIELDCAT = lt_fieldcat
IT_EVENTS = lt_events
TABLES
t_outtab = lt_anlb_log[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
ENDIF.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*&---------------------------------------------------------------------*
*& Form get_anzbp_for_afabe
*&---------------------------------------------------------------------*
* Liefert zu einem Bereich die Anzahl der Perioden gemäß zu verwendender
* Geschäftsjahresvariante.
*&---------------------------------------------------------------------*
FORM get_anzbp_for_afabe USING u_bukrs TYPE t093c-bukrs
u_afabe TYPE t093b-afabe
CHANGING c_anzbp TYPE t009-anzbp.
DATA: ls_t001 TYPE t001,
ls_t093c TYPE t093c,
ls_t093b TYPE t093b,
ls_t009 TYPE t009,
ld_periv TYPE t001-periv.
CLEAR c_anzbp.
ls_t001-bukrs = u_bukrs.
ls_t093c-bukrs = u_bukrs.
ls_t093b-bukrs = u_bukrs.
ls_t093b-afabe = u_afabe.
* Zu verwendende Geshäftsjahresvariante ermitteln
CALL FUNCTION 'AM_T001_READ'
EXPORTING f_t001 = ls_t001
IMPORTING f_t001 = ls_t001.
CALL FUNCTION 'T093C_READ'
EXPORTING f_t093c = ls_t093c
IMPORTING f_t093c = ls_t093c
EXCEPTIONS OTHERS = 2.
CALL FUNCTION 'T093B_READ'
EXPORTING f_t093b = ls_t093b
IMPORTING f_t093b = ls_t093b
EXCEPTIONS OTHERS = 2.
IF ls_t093b-periv IS INITIAL.
IF ls_t093c-periv IS INITIAL.
ls_t009-periv = ls_t001-periv.
ELSE.
ls_t009-periv = ls_t093c-periv.
ENDIF.
ELSE.
ls_t009-periv = ls_t093b-periv.
ENDIF.
* Anzahl Buchungsperioden gemäß GJahresvariante lesen.
CALL FUNCTION 'T009_READ'
EXPORTING f_t009 = ls_t009
IMPORTING f_t009 = ls_t009
EXCEPTIONS not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
c_anzbp = ls_t009-anzbp.
ENDFORM. "GET_ANBZBP_FOR_AFABE
*&---------------------------------------------------------------------*
*& Form get_xdaily_afasl
*&---------------------------------------------------------------------*
* Liefert eine RANGE-Tabelle für alle AFASL mit gesetztem XDAILY.
*
* -> u_oldtab: Wenn 'X', Selektion über alte Tabellen
*&---------------------------------------------------------------------*
FORM get_xdaily_afasl USING u_oldtab TYPE c
u_afapl TYPE t093c-afapl
CHANGING c_afasl_range LIKE lt_afasl_xdaily_range.
DATA: ld_afasl TYPE t090c-afasl,
ls_afasl_range LIKE LINE OF c_afasl_range[].
ls_afasl_range-sign = 'I'.
ls_afasl_range-option = 'EQ'.
IF u_oldtab EQ con_true. "Alte Tabellen
SELECT c~afasl INTO ld_afasl
FROM t090c AS c JOIN t090 AS t
ON c~nafasl EQ t~afarsl
WHERE t~xdaily EQ con_xdaily.
ls_afasl_range-low = ld_afasl.
APPEND ls_afasl_range TO c_afasl_range[].
ENDSELECT.
ELSE. "Neue Tabellen
SELECT afasl FROM t090na INTO ld_afasl
WHERE afapl EQ u_afapl
AND xdaily EQ con_true.
ls_afasl_range-low = ld_afasl.
APPEND ls_afasl_range TO c_afasl_range[].
ENDSELECT.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form recalculate_exp_ul
*&---------------------------------------------------------------------*
* Abgelaufene Nutzungsdauer neurechnen
*&---------------------------------------------------------------------*
FORM recalculate_exp_ul USING us_anlb TYPE anlb
us_t093c TYPE t093c.
TYPES: BEGIN OF recalc_buf,
bukrs TYPE anla-bukrs,
anln1 TYPE anla-anln1,
anln2 TYPE anla-anln2,
ants TYPE ants,
gjahr TYPE anlc-gjahr,
END OF recalc_buf.
* Puffer, um doppelte Bearbeitung zu verhindern
STATICS: st_recalc_buf TYPE SORTED TABLE OF recalc_buf
WITH UNIQUE KEY bukrs anln1 anln2.
DATA: ls_ants TYPE ants,
lt_anlb TYPE TABLE OF anlb,
lt_anlc TYPE TABLE OF anlc,
ls_anlc LIKE LINE OF lt_anlc,
lt_anlz TYPE TABLE OF anlz,
ld_afabg TYPE anlb-afabg,
ld_gjahr TYPE anlc-gjahr,
lt_anfm TYPE TABLE OF anfm,
ls_recalc_buf TYPE recalc_buf.
FIELD-SYMBOLS: <lfs_anlb> TYPE anlb.
* Daten lesen *********************************************************
* Anlage schon bearbeitet (anderer AfA-Bereich)?
READ TABLE st_recalc_buf[] WITH KEY bukrs = us_anlb-bukrs
anln1 = us_anlb-anln1
anln2 = us_anlb-anln2
INTO ls_recalc_buf
BINARY SEARCH.
IF sy-subrc EQ 0.
ls_ants = ls_recalc_buf-ants.
ld_gjahr = ls_recalc_buf-gjahr.
ELSE.
CALL FUNCTION 'APER_GET_ANTS_FROM_DB'
EXPORTING i_bukrs = us_anlb-bukrs
i_anln1 = us_anlb-anln1
i_anln2 = us_anlb-anln2
i_budat = sy-datum
IMPORTING e_ants = ls_ants.
SELECT * FROM anlb INTO TABLE lt_anlb[]
WHERE bukrs EQ us_anlb-bukrs
AND anln1 EQ us_anlb-anln1
AND anln2 EQ us_anlb-anln2.
* Erstes Jahr der Berechnung ermitteln
* kleinstes AfA-Beginndatum feststellen, um Beginn-Gjahr zu ermitteln
CLEAR ld_afabg.
LOOP AT lt_anlb[] ASSIGNING <lfs_anlb>.
* Normal-AfA-Beginn checken
IF NOT <lfs_anlb>-afabg IS INITIAL.
IF ld_afabg IS INITIAL.
ld_afabg = <lfs_anlb>-afabg.
ELSE.
IF <lfs_anlb>-afabg < ld_afabg.
ld_afabg = <lfs_anlb>-afabg.
ENDIF.
ENDIF.
ENDIF.
* Sonder-AfA-Beginn checken
IF NOT <lfs_anlb>-safbg IS INITIAL.
IF ld_afabg IS INITIAL.
ld_afabg = <lfs_anlb>-safbg.
ELSE.
IF <lfs_anlb>-safbg < ld_afabg.
ld_afabg = <lfs_anlb>-safbg.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
* Wenn kein AFA-Beg gesetzt, kann auch keine Nutzd. ermittelt werden
IF NOT ld_afabg IS INITIAL.
* Erstes Geschäftsjahr der Anlage ermitteln
CALL FUNCTION 'DATE_TO_PERIOD_CONVERT'
EXPORTING i_date = ld_afabg
i_monmit = us_t093c-monmit
i_periv = us_t093c-periv
IMPORTING e_gjahr = ld_gjahr
EXCEPTIONS OTHERS = 01.
ENDIF.
* Puffer nur sinnvoll, wenn mehr als ein Bereich geprüft wird.
IF gd_afabe_cnt GT 1.
ls_recalc_buf-bukrs = us_anlb-bukrs.
ls_recalc_buf-anln1 = us_anlb-anln1.
ls_recalc_buf-anln2 = us_anlb-anln2.
ls_recalc_buf-ants = ls_ants.
ls_recalc_buf-gjahr = ld_gjahr.
* Anlage mit ld_gjahr Puffer schreiben
INSERT ls_recalc_buf INTO TABLE st_recalc_buf[].
ENDIF.
ENDIF.
* Abgel. Nutzungsdauer neurechnen *************************************
IF NOT ld_gjahr IS INITIAL.
* Leere ANLC als "Behälter" für Nutzungsdauer
MOVE-CORRESPONDING us_anlb TO ls_anlc.
ls_anlc-gjahr = ld_gjahr.
APPEND ls_anlc TO lt_anlc[].
CLEAR lt_anlb[].
APPEND us_anlb TO lt_anlb[].
* Bis zum aktuellen GJAHR neurechnen
WHILE ld_gjahr < us_t093c-lgjahr.
CALL FUNCTION 'RA_FISCAL_YEAR_CHANGE'
EXPORTING i_ants = ls_ants
i_ndab = 'X'
i_cal_closed_fyears = 'X'
TABLES t_anfm = lt_anfm[]
t_anlb = lt_anlb[]
t_anlc = lt_anlc[]
t_anlz = lt_anlz[]
EXCEPTIONS depr_not_posible = 01
minwert_verletzt = 02
normal_afa_verletzt = 03
period_false = 04
rbw_virt_afaber_verletzt = 05
sonder_afa_verletzt = 06.
* Wenn von existierendem ANLC an, dann neue zurückgeben
READ TABLE lt_anlc INTO ls_anlc INDEX 1.
IF ls_anlc-gjahr GT gd_abgja.
MOVE-CORRESPONDING ls_anlc TO ls_anlc_log.
APPEND ls_anlc_log TO gt_anlc_log.
APPEND ls_anlc TO gt_xanlc_ges.
ENDIF.
ld_gjahr = ld_gjahr + 1.
ENDWHILE.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_deakt
*&---------------------------------------------------------------------*
* Liefert Deaktivierungsdatum einer Anlage
*&---------------------------------------------------------------------*
FORM get_deakt USING u_bukrs TYPE anla-bukrs
u_anln1 TYPE anla-anln1
u_anln2 TYPE anla-anln2
CHANGING c_deakt TYPE anla-deakt.
STATICS: ss_last_asset TYPE anla_key,
sd_deakt TYPE anla-deakt.
DATA: ls_curr_asset TYPE anla_key.
ls_curr_asset-bukrs = u_bukrs.
ls_curr_asset-anln1 = u_anln1.
ls_curr_asset-anln2 = u_anln2.
IF ls_curr_asset NE ss_last_asset.
* Puffer aktualisieren
CLEAR sd_deakt.
SELECT SINGLE deakt FROM anla
INTO sd_deakt
WHERE bukrs EQ ls_curr_asset-bukrs
AND anln1 EQ ls_curr_asset-anln1
AND anln2 EQ ls_curr_asset-anln2.
ss_last_asset = ls_curr_asset.
ENDIF.
c_deakt = sd_deakt.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_parameter_description
*&---------------------------------------------------------------------*
* Liefert sprachabhängigen Feldbezeichner
*----------------------------------------------------------------------*
* -->U_DELEM Datenelement
* <--C_DESCR Text
*----------------------------------------------------------------------*
FORM get_parameter_descr USING u_delem TYPE char30
u_text TYPE c
CHANGING c_descr LIKE ld_plabel.
DATA ls_dfies TYPE dfies.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING tabname = u_delem
all_types = 'X'
IMPORTING dfies_wa = ls_dfies
EXCEPTIONS not_found = 1
internal_error = 2
OTHERS = 3
.
IF SY-SUBRC EQ 0.
CASE u_text.
WHEN 'S'. c_descr = ls_dfies-scrtext_s.
WHEN 'M'. c_descr = ls_dfies-scrtext_m.
WHEN 'L'. c_descr = ls_dfies-scrtext_l.
WHEN 'R'. c_descr = ls_dfies-reptext.
ENDCASE.
ELSE.
c_descr = '???'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form init_callback_routines
*&---------------------------------------------------------------------*
FORM init_alv USING u_alv
CHANGING ct_fieldcat TYPE slis_t_fieldcat_alv
cs_layout TYPE slis_layout_alv
ct_events TYPE slis_t_event.
CLEAR: ct_fieldcat, cs_layout, ct_events[].
PERFORM init_fieldcatalog USING u_alv CHANGING lt_fieldcat.
PERFORM init_layout USING u_alv CHANGING ls_layout.
* PERFORM init_sort CHANGING lt_sort.
* PERFORM init_excluding CHANGING lt_excluding.
* PERFORM init_print CHANGING ls_print.
PERFORM init_callback_routines USING u_alv CHANGING lt_events.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form init_fieldcatalog
*&---------------------------------------------------------------------*
FORM init_fieldcatalog USING u_alv
CHANGING ct_fieldcat TYPE slis_t_fieldcat_alv.
FIELD-SYMBOLS: <lfs_fieldcat> LIKE LINE OF ct_fieldcat.
DATA: lt_anlc_fieldcat TYPE slis_t_fieldcat_alv,
ls_fieldcat LIKE LINE OF ct_fieldcat,
ld_nextcol TYPE sy-cucol VALUE 1,
ld_col_pos TYPE sy-tabix.
IF u_alv EQ con_anlb_log.
* get ANLB fieldcat as default
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ANLB'
i_bypassing_buffer = 'X'
CHANGING
ct_fieldcat = ct_fieldcat
EXCEPTIONS
OTHERS = 1.
LOOP AT ct_fieldcat ASSIGNING <lfs_fieldcat>.
* Technischer Feldname als Überschrift
<lfs_fieldcat>-reptext_ddic = <lfs_fieldcat>-fieldname.
<lfs_fieldcat>-ddictxt = 'R'.
* Sonstiges Formatierungen
CASE <lfs_fieldcat>-fieldname.
WHEN 'MANDT'.
<lfs_fieldcat>-key = con_true.
WHEN 'BUKRS'.
<lfs_fieldcat>-key = con_true.
WHEN 'ANLN1'.
<lfs_fieldcat>-key = con_true.
WHEN 'ANLN2'.
<lfs_fieldcat>-key = con_true.
WHEN 'AFABE'.
<lfs_fieldcat>-key = con_true.
WHEN 'BDATU'.
<lfs_fieldcat>-key = con_true.
WHEN OTHERS.
IF <lfs_fieldcat>-fieldname NE 'ADATU' AND
<lfs_fieldcat>-fieldname NE 'ERNAM' AND
<lfs_fieldcat>-fieldname NE 'ERDAT' AND
<lfs_fieldcat>-fieldname NE 'XLOEV' AND
<lfs_fieldcat>-fieldname NE 'XSPEB' AND
<lfs_fieldcat>-fieldname NE 'AFABG' AND
<lfs_fieldcat>-fieldname NE 'AFASL' AND
<lfs_fieldcat>-fieldname NE 'NDJAR' AND
<lfs_fieldcat>-fieldname NE 'NDPER' AND
<lfs_fieldcat>-fieldname NE 'NDPER_NEW' AND
<lfs_fieldcat>-fieldname NE 'LGJAN' AND
<lfs_fieldcat>-fieldname NE 'PERFY' AND
<lfs_fieldcat>-fieldname NE 'PERFY_NEW'.
<lfs_fieldcat>-no_out = 'X'.
ELSE.
IF <lfs_fieldcat>-fieldname EQ 'PERFY'.
<lfs_fieldcat>-emphasize = 'C610'.
* Eintrag kopieren für geändertes PERFY
MOVE <lfs_fieldcat> TO ls_fieldcat.
ls_fieldcat-fieldname = 'PERFY_NEW'.
ls_fieldcat-emphasize = 'C510'.
APPEND ls_fieldcat TO ct_fieldcat.
ENDIF.
ENDIF.
ENDCASE.
ENDLOOP.
* Wenn Ausgabe in 1 Liste, dann einige ANLC Felder mit in Feldkatalog
IF p_ndabp EQ con_true AND p_sepout EQ con_false.
DESCRIBE TABLE ct_fieldcat LINES ld_col_pos.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ANLC'
i_bypassing_buffer = 'X'
CHANGING
ct_fieldcat = lt_anlc_fieldcat
EXCEPTIONS
OTHERS = 1.
LOOP AT lt_anlc_fieldcat ASSIGNING <lfs_fieldcat>.
* Technischer Feldname als Überschrift
IF <lfs_fieldcat>-fieldname EQ 'BUKRS' OR
<lfs_fieldcat>-fieldname EQ 'GJAHR' OR
<lfs_fieldcat>-fieldname EQ 'NDABJ' OR
<lfs_fieldcat>-fieldname EQ 'NDABP'.
ADD 1 TO ld_col_pos.
<lfs_fieldcat>-col_pos = ld_col_pos.
CASE <lfs_fieldcat>-fieldname.
WHEN 'BUKRS'.
<lfs_fieldcat>-fieldname = 'TAB2'.
CLEAR <lfs_fieldcat>-key.
<lfs_fieldcat>-emphasize = 'C410'.
<lfs_fieldcat>-reptext_ddic = <lfs_fieldcat>-fieldname.
WHEN 'GJAHR'.
CLEAR <lfs_fieldcat>-key.
<lfs_fieldcat>-emphasize = 'C410'.
WHEN 'NDABJ'.
<lfs_fieldcat>-emphasize = 'C500'.
WHEN 'NDABP'.
<lfs_fieldcat>-emphasize = 'C500'.
ENDCASE.
<lfs_fieldcat>-reptext_ddic = <lfs_fieldcat>-fieldname.
<lfs_fieldcat>-ddictxt = 'R'.
APPEND <lfs_fieldcat> TO ct_fieldcat.
ENDIF.
ENDLOOP.
ENDIF.
* Zweiter Feldkatalog für ANLC-Daten ---*
ELSE.
* get ANLC fieldcat as default
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING i_structure_name = 'ANLC'
i_bypassing_buffer = 'X'
CHANGING ct_fieldcat = ct_fieldcat
EXCEPTIONS OTHERS = 1.
LOOP AT ct_fieldcat ASSIGNING <lfs_fieldcat>.
* Technischer Feldname als Überschrift
IF <lfs_fieldcat>-fieldname NE 'BUKRS' AND
<lfs_fieldcat>-fieldname NE 'ANLN1' AND
<lfs_fieldcat>-fieldname NE 'ANLN2' AND
<lfs_fieldcat>-fieldname NE 'GJAHR' AND
<lfs_fieldcat>-fieldname NE 'AFABE' AND
<lfs_fieldcat>-fieldname NE 'NDABJ' AND
<lfs_fieldcat>-fieldname NE 'NDABP'.
<lfs_fieldcat>-tech = con_true.
ELSE.
<lfs_fieldcat>-reptext_ddic = <lfs_fieldcat>-fieldname.
<lfs_fieldcat>-ddictxt = 'R'.
IF <lfs_fieldcat>-fieldname EQ 'NDABJ'.
<lfs_fieldcat>-emphasize = 'C500'.
ELSEIF <lfs_fieldcat>-fieldname EQ 'NDABP'.
<lfs_fieldcat>-emphasize = 'C500'.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " init_fieldcatalog
*&---------------------------------------------------------------------*
*& Form init_layout
*&---------------------------------------------------------------------*
FORM init_layout USING u_alv
CHANGING cs_layout TYPE slis_layout_alv.
cs_layout-window_titlebar = 'ZCORR_PERFY: RESULTS'.
cs_layout-colwidth_optimize = con_true.
cs_layout-zebra = con_true.
IF p_sepout EQ con_true.
IF u_alv EQ con_anlb_log.
cs_layout-list_append = 'Y'.
ELSE.
cs_layout-list_append = 'X'.
ENDIF.
ENDIF.
ENDFORM. " init_layout
*&---------------------------------------------------------------------*
*& Form init_callback_routines
*&---------------------------------------------------------------------*
FORM init_callback_routines USING u_alv
CHANGING ct_events TYPE slis_t_event.
DATA: ls_events LIKE LINE OF ct_events.
IF u_alv EQ con_anlb_log AND P_NDABP EQ con_true.
*
ls_events-name = 'TOP_OF_LIST'.
ls_events-form = 'HANDLE_EVENT_TOP_OF_LIST'.
APPEND ls_events TO ct_events.
IF p_ndabp EQ con_true AND p_sepout EQ con_true.
* 2. ALV für ANLC-Daten anhängen
ls_events-name = 'END_OF_LIST'.
ls_events-form = 'HANDLE_EVENT_END_OF_LIST'.
APPEND ls_events TO ct_events.
ENDIF.
ENDIF.
ENDFORM. " init_callback_routines
*&---------------------------------------------------------------------*
*& Form handle_event_top_of_list
*&---------------------------------------------------------------------*
* Text erzeugen
*----------------------------------------------------------------------*
FORM handle_event_top_of_list .
SKIP 1.
IF p_test EQ con_true.
WRITE ICON_HINT AS ICON.
WRITE 'Program started in testmode: No updates performed'.
ELSE.
IF gd_success EQ con_true.
WRITE ICON_HINT AS ICON.
WRITE 'Updates performed successfully'.
ELSE.
WRITE ICON_ALERT AS ICON.
WRITE 'Errors during update'.
ENDIF.
ENDIF.
ULINE.
ENDFORM. " handle_event_top_of_list
*&---------------------------------------------------------------------*
*& Form handle_event_end_of_list
*&---------------------------------------------------------------------*
* Bei abgel. Nutzungsdauer neurechnen auch ANLC Daten anzeigen.
*----------------------------------------------------------------------*
FORM handle_event_end_of_list .
* ALV Ausgabe
PERFORM init_alv USING con_anlc_log
CHANGING lt_fieldcat[]
ls_layout
lt_events[].
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_BYPASSING_BUFFER = 'X'
I_CALLBACK_PROGRAM = 'ZCORR_PERFY'
IS_LAYOUT = ls_layout
IT_FIELDCAT = lt_fieldcat
IT_EVENTS = lt_events
TABLES
t_outtab = gt_anlc_log[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " handle_event_end_of_list
*&---------------------------------------------------------------------*
*& Form handle_event_top_of_page_html
*&---------------------------------------------------------------------*
* Text-Ausgabe
*----------------------------------------------------------------------*
FORM handle_event_top_of_page_html USING top TYPE REF TO cl_dd_document.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
ld_text(255) TYPE c,
ld_count TYPE i.
CONSTANTS: con_set_row_height(14) TYPE c VALUE 'SET_ROW_HEIGHT'.
FIELD-SYMBOLS <lfs_afasl_range> LIKE LINE OF lt_afasl_xdaily_range.
* Höhe des Info-Fensters setzen
TRY.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->parent->parent->(con_set_row_height)
EXPORTING
id = 1
height = 10.
CATCH CX_SY_DYN_CALL_ILLEGAL_FUNC.
* GET_GLOBALS_FROM_SLVC_FULLSCR ist erst seit Hw 407811 vorhanden.
ENDTRY.
IF NOT p_test IS INITIAL.
ld_text = 'Testmode: No actions performed.'.
ELSE.
ld_text = 'Updates performed.'.
ENDIF.
CALL METHOD top->add_text
EXPORTING
text = ld_text
sap_emphasis = 'STRONG'.
IF p_monmit EQ con_true.
ld_text = 'Half Periods (T093C-MONMIT):'.
IF ls_t093c-monmit IS INITIAL.
CONCATENATE ld_text ' not set' INTO ld_text.
ELSE.
CONCATENATE ld_text ls_t093c-monmit INTO ld_text.
ENDIF.
CALL METHOD top->underline.
CALL METHOD top->add_text
EXPORTING
text = ld_text
sap_emphasis = 'STRONG'.
ENDIF.
IF p_xdaily EQ con_true.
CALL METHOD top->underline.
CALL METHOD top->add_text
EXPORTING
text = 'AFASL with XDAILY set :'
sap_emphasis = 'STRONG'.
CALL METHOD top->add_gap.
* Schlüssel auflisten
CLEAR ld_text.
DESCRIBE TABLE lt_afasl_xdaily_range LINES ld_count.
SUBTRACT 1 FROM ld_count.
LOOP AT lt_afasl_xdaily_range ASSIGNING <lfs_afasl_range>.
CONCATENATE ld_text <lfs_afasl_range>-low
INTO ld_text.
IF sy-index LT ld_count.
CONCATENATE ld_text ',' INTO ld_text.
ENDIF.
CALL METHOD top->add_text
EXPORTING
text = ld_text.
CALL METHOD top->add_gap EXPORTING width = 1.
CLEAR ld_text.
ENDLOOP.
ENDIF.
ENDFORM. " handle_event_top_of_page_html
*&---------------------------------------------------------------------*
*& Form store_f5899_msg
*&---------------------------------------------------------------------*
FORM store_f5899_msg USING u_msgty TYPE c
CHANGING u_msgv1 TYPE string.
CALL FUNCTION 'MESSAGE_STORE'
EXPORTING
arbgb = 'F5'
msgty = u_msgty
msgv1 = u_msgv1
txtnr = 899.
CLEAR u_msgv1.
ENDFORM. " STORE_F5899_MSG
*&---------------------------------------------------------------------*
*& Form store_flag
*&---------------------------------------------------------------------*
* Wert einer Checkbox im Log speichern.
* ud_value -> Wert der Parameter-Checkbox
* ud_descr -> Bezeichnung für Log
*----------------------------------------------------------------------*
FORM store_flag USING ud_value TYPE xfeld
ud_descr TYPE string.
DATA: ld_msg TYPE string.
IF NOT ud_value IS INITIAL.
ld_msg = 'Yes'.
ELSE.
ld_msg = 'No'.
ENDIF.
CONCATENATE ud_descr ':' ld_msg
INTO ld_msg SEPARATED BY ' '.
PERFORM store_f5899_msg USING 'I' ld_msg.
ENDFORM. " store_flag
Regards
Devi