Wie bekomme ich den Langtext aus dem System raus?Laufzeitfehler
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
|Datum |Uhrzeit |App.Server | |Mandant|Halten|Laufzeitfehler|Ausnahme|Abgebrochenes Programm |WP-Index|Transaktions-ID |
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
|10.04.2017|10:41:22|q4de3csy080_KS2_00| |100 |C |MESSAGE_TYPE_X| |CL_GUI_ALV_GRID===============CP| 4 |63C91DE72288F1A580F6005056883A78|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hallo.JHM hat geschrieben:Wenn du Prüfungen einbauen willst: z.B. Material in Bestellposition vorhanden, dann gehören diese in das EVENT ON DATA CHANGE. Dann läuft das ganze Fehlerhandling über den ALV, aber das ist nicht unbedingt trivial.
Man muss die Fehlermeldung ins ALV-Log bekommen, dazu muss man aber erst mal die Änderungen auswerten. Dann fängt das Spiel an in dem man prüft ob der User die Fehlerbereinigt hat um diese wieder aus dem Protokoll zu bekommen.kkauerau hat geschrieben:Jetzt brauche ich den aber wieder, um die eingegebenen Daten zu prüfen ... Was meinst du mit "das ist nicht unbedingt trivial"?
Durch das reine aktiveren eines Events sollte der Datentransport weiter funktionieren oder hast du weiteres Coding im Event-Handler hinterlegt? Wenn ja welches?kkauerau hat geschrieben: Ich habe den EventHandler im ersten Schritt wieder aktiviert - und schwupps, funktioniert das Codig nicht mehr, d.h. ich habe keine Daten aus dem GRID mehr im ABAP-Teil
Code: Alles auswählen.
METHOD handle_data_changed.
PERFORM check_mat_vorhanden.
PERFORM check_mat_duplikate.
ENDMETHOD.
FORM check_mat_vorhanden.
DATA:
lv_delflag TYPE bapimatall-del_flag,
lv_return TYPE bapireturn1,
lv_stbl TYPE lvc_s_stbl,
msg TYPE string.
IF gs_position-material EQ '' OR
gs_position-material EQ ' ' OR
gs_position-material IS INITIAL.
msg = 'Bitte prüfen: Feld Material ist ungültig!'.
ELSE.
CALL FUNCTION 'BAPI_MATERIAL_EXISTENCECHECK' "Check Existence of Material
EXPORTING
material = gs_position-material " Material No.
IMPORTING
deletion_flag = lv_delflag " Material is flagged for deletion
return = lv_return. " Return Parameter
IF lv_return-type EQ 'E'.
CONCATENATE 'Bitte prüfen: Material ehlerhaft:'
lv_return-message INTO msg SEPARATED BY space.
ENDIF.
ENDIF.
IF msg IS NOT INITIAL.
" dem User zeigen, wo genau es klemmt:
lv_stbl-col = 'X'.
CALL METHOD go_alv->refresh_table_display
EXPORTING
is_stable = lv_stbl.
MESSAGE msg TYPE lv_return-type.
ENDIF.
ENDFORM.
Code: Alles auswählen.
IF gs_position-material EQ '' OR
gs_position-material EQ ' ' OR
gs_position-material IS INITIAL.
msg = 'Bitte prüfen: Feld Material ist ungültig!'.
ELSE.
Code: Alles auswählen.
CALL METHOD go_alv->refresh_table_display
EXPORTING
is_stable = lv_stbl.
MESSAGE msg TYPE lv_return-type.
Code: Alles auswählen.
METHOD handle_data_changed.
DATA lv_msg TYPE bapireturn1.
* auf Vorhandensein des Materials prüfen
PERFORM check_mat_vorhanden_evt USING er_data_changed->mt_mod_cells
CHANGING lv_msg.
IF lv_msg IS NOT INITIAL.
CALL METHOD er_data_changed->add_protocol_entry
EXPORTING
i_msgid = lv_msg-id
i_msgty = lv_msg-type
i_msgno = lv_msg-number
i_msgv1 = lv_msg-message
i_fieldname = 'MATERIAL' .
ENDIF.
ENDMETHOD.
FORM check_mat_vorhanden_evt USING lt_mod_cells TYPE lvc_t_modi
CHANGING rv_msg TYPE bapireturn1.
DATA: ls_mod_cells LIKE LINE OF lt_mod_cells,
lv_rowid TYPE i,
lv_delflag TYPE bapimatall-del_flag,
lv_return TYPE bapireturn1.
lv_rowid = 1.
CLEAR: gt_pos_daten, gs_position.
LOOP AT lt_mod_cells INTO ls_mod_cells.
IF ls_mod_cells-row_id EQ lv_rowid .
IF ls_mod_cells-fieldname = 'MATERIAL'.
gs_position-material = ls_mod_cells-value.
ENDIF.
ENDIF.
IF gs_position-material IS NOT INITIAL.
APPEND gs_position TO gt_pos_daten.
lv_rowid = lv_rowid + 1.
IF gs_position-material EQ '' OR gs_position-material EQ ' '
OR gs_position-material IS INITIAL.
rv_msg-message = 'Bitte prüfen: Feld Material ist ungültig!'.
ELSE.
CALL FUNCTION 'BAPI_MATERIAL_EXISTENCECHECK' "Check Existence of Material
EXPORTING
material = gs_position-material " Material No.
IMPORTING
deletion_flag = lv_delflag " Material is flagged for deletion
return = lv_return. " Return Parameter
IF lv_return-type EQ 'E'.
rv_msg = lv_return. "-message INTO msg SEPARATED BY space.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
Code: Alles auswählen.
*... This Row does not exist in the data table -> append to output table
read table mr_data_changed->mt_protocol into ls_msg
with key msgty = 'E'
row_id = ls_good_cells-row_id.
if sy-subrc eq 0.
assign component ls_msg-fieldname
of structure <ls_wa> to <l_field>.
if sy-subrc ne 0.
message x000(0k).
endif.
clear <l_field>.
endif.
append <ls_wa> to <tab1>.
Weil du dem Protokoll mit teilen musst, welches Feld genau betroffen ist:kkauerau hat geschrieben:Aber warum zeigt der meine eigene Meldung nicht mit in der Liste an? Und warum wird das Feld nicht rot?
Code: Alles auswählen.
CALL METHOD er_data_changed->add_protocol_entry
EXPORTING
i_msgid = lv_msg-id
i_msgty = lv_msg-type
i_msgno = lv_msg-number
i_msgv1 = lv_msg-message
i_fieldname = 'MATERIAL'
I_ROW_ID = ? "<- Welche Zeile der Anzeige hat den Fehler.
Code: Alles auswählen.
LOOP AT lt_mod_cells INTO ls_mod_cells WHERE fieldname = 'MATNR'.
IF ls_mod_cells-value EQ '' OR
ls_mod_cells-value EQ ' ' OR
ls_mod_cells IS INITIAL.
rv_msg-message = 'Bitte prüfen: Feld Material ist ungültig!'.
ELSE.
CALL FUNCTION 'BAPI_MATERIAL_EXISTENCECHECK' ... "hier muss ls_mod_cells in eine MATNR konvertiert werden!
IF lv_return-type EQ 'E'.
rv_msg = lv_return. "-message INTO msg SEPARATED BY space.
ENDIF.
ENDIF
IF rv_msg is not Initial.
CALL METHOD er_data_changed->add_protocol_entry
EXPORTING
i_msgid = lv_msg-id
i_msgty = lv_msg-type
i_msgno = lv_msg-number
i_msgv1 = lv_msg-message
i_fieldname = ls_mod_cells-fieldname
I_ROW_ID = ls_mod_cells-row_id
CLEAR rv_msg.
ENDIF.
ENDLOOP.
Danke, danke, danke!Weil du dem Protokoll mit teilen musst, welches Feld genau betroffen ist:
Code: Alles auswählen.
PROCESS BEFORE OUTPUT.
MODULE set_pf_status_0200.
CHAIN.
FIELD: zlrp_emc_kopf_s-re_datum, zlrp_emc_kopf_s-werks,
zlrp_emc_kopf_s-buchgs_datum, zlrp_emc_kopf_s-lgort,
zlrp_emc_kopf_s-lieferant, zlrp_emc_kopf_s-re_nr,
zlrp_emc_kopf_s-waerg
MODULE alv_grid_0200. " init ALV und anzeigen
ENDCHAIN.
MODULE status_0200.
MODULE clear_ok_code.
PROCESS AFTER INPUT.
MODULE user_command_0200 AT EXIT-COMMAND.
MODULE cmd_save_0200.
Code: Alles auswählen.
MODULE alv_grid_0200 OUTPUT.
IF go_custom IS INITIAL.
CREATE OBJECT go_custom
EXPORTING
container_name = 'CSTM_CTRL_200'. " Name of the dynpro CustCtrl name to link this container to
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
CREATE OBJECT go_alv
EXPORTING
* i_shellstyle = 0
* i_lifetime =
i_parent = go_custom " Parent-Container
i_appl_events = 'X' " alle Events registrieren
* i_parentdbg =
* i_applogparent = go_cstm_ctrl_fm " Container für das Fehler-Log
* i_graphicsparent =
* i_name =
* i_fcat_complete = SPACE
* EXCEPTIONS
* error_cntl_create = 1
* error_cntl_init = 2
* error_cntl_link = 3
* error_dp_create = 4
* others = 5
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
* Settings for grid...
lcl_settings=>set_fcat( CHANGING ct_fcat = gt_fcat ).
lcl_settings=>set_layout( CHANGING cs_layout = gs_layout ).
lcl_settings=>set_sort( CHANGING ct_sort = gt_sort ) .
lcl_settings=>set_toolbar( CHANGING ct_toolbar = gt_toolbar_excl ) .
* Edit-Mode aktiv setzen
CALL METHOD go_alv->set_ready_for_input EXPORTING i_ready_for_input = 1.
CALL METHOD go_alv->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified.
** Ereignisbehandler registrieren
SET HANDLER lcl_event_handler=>handle_data_changed FOR go_alv.
* ALV darstellen
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_buffer_active = 'X'
i_bypassing_buffer = 'X'
i_save = 'A' "U = nur benutzerspezif. Varianten abspeicherbar
i_default = 'X' " Benutzer darf Variante als Default kennzeichnen
is_layout = gs_layout
it_toolbar_excluding = gt_toolbar_excl
CHANGING
it_outtab = gt_pos_daten
it_fieldcatalog = gt_fcat
it_sort = gt_sort
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
IF go_custom IS NOT INITIAL.
go_alv->refresh_table_display( ).
ENDIF.
ENDMODULE. " ALV_GRID_0200 OUTPUT
Code: Alles auswählen.
FORM check_mat_vorhanden_evt USING lt_mod_cells TYPE lvc_t_modi
CHANGING rv_msg TYPE bapireturn1.
DATA: ls_mod_cells LIKE LINE OF lt_mod_cells,
lv_merker LIKE BAPIMATALL-MATERIAL,
lv_delflag TYPE bapimatall-del_flag,
lv_return TYPE bapireturn1.
LOOP AT lt_mod_cells INTO ls_mod_cells.
IF ls_mod_cells-fieldname = 'MATERIAL'
and ls_mod_cells-value IS NOT INITIAL.
IF ls_mod_cells-value EQ '' OR ls_mod_cells-value EQ ' '
OR ls_mod_cells-value IS INITIAL.
rv_msg-message = 'Bitte prüfen: Feld Material ist ungültig!'.
rv_msg-type = 'E'.
ELSE.
lv_merker = ls_mod_cells-value.
CALL FUNCTION 'BAPI_MATERIAL_EXISTENCECHECK' " Check Existence of Material
EXPORTING
material = lv_merker " Material No.
IMPORTING
deletion_flag = lv_delflag " Material is flagged for deletion
return = lv_return. " Return Parameter
IF lv_return-type EQ 'E'.
" CONCATENATE 'Bitte prüfen: Material fehlerhaft:'
rv_msg = lv_return. "-message INTO msg SEPARATED BY space.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM check_mat_duplikate.
* auf doppelt angegebene Materialien prüfen
DATA: lt_pos_list LIKE gt_pos_daten,
lv_cnt TYPE i,
lv_cnt_unique TYPE i.
" zuerst leere Zeilen aus der Vorlage entfernen
DELETE gt_pos_daten WHERE material = ''.
DELETE gt_pos_daten WHERE menge = 0.
" dann Kopie erstellen und um Material-Dubletten bereinigen
lt_pos_list = gt_pos_daten.
SORT lt_pos_list BY material.
DELETE ADJACENT DUPLICATES FROM lt_pos_list COMPARING material.
lv_cnt = lines( gt_pos_daten ).
lv_cnt_unique = lines( lt_pos_list ).
" vergleichen und evtl meckern
IF lv_cnt_unique NE lv_cnt.
MESSAGE 'Bitte prüfen: Material ist doppelt vorhanden!' TYPE 'S'.
ENDIF.
ENDFORM. " CHECK_MAT_DUPLIKATE
*&---------------------------------------------------------------------*
*& Form FORM_BUCHEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_buchen .
PERFORM form_emc_w_eing_buchen_00.
ENDFORM. " FORM_BUCHEN
FORM form_emc_w_eing_buchen_00 .
* alles prüfen
DATA: lv_techn_best_nr LIKE ct_bel_nr,
lv_anz_posi TYPE i.
CLEAR: gt_ko, gt_po, gt_p_ko, gt_p_po,
* gs_kopfdaten, gs_position,
gv_techn_best_nr.
** Variablen aus Dynpro-Feldern in lokale Variable übertragen
gs_kopfdaten-buchgs_datum = zlrp_emc_kopf_s-buchgs_datum.
gs_kopfdaten-lgort = zlrp_emc_kopf_s-lgort.
gs_kopfdaten-lieferant = zlrp_emc_kopf_s-lieferant.
gs_kopfdaten-re_datum = zlrp_emc_kopf_s-re_datum.
gs_kopfdaten-re_nr = zlrp_emc_kopf_s-re_nr.
gs_kopfdaten-waerg = zlrp_emc_kopf_s-waerg.
gs_kopfdaten-werks = zlrp_emc_kopf_s-werks.
** auf doppelt angegebene Materialien prüfen
PERFORM check_mat_duplikate.
** Übergabe an Folge-FORM, die die Buchung der techn. Bestellung anstößt
** + Rückgabeparameter: ID der techn. Bestellung
PERFORM form_emc_w_eing_buchen_01 CHANGING lv_techn_best_nr.
gv_techn_best_nr = lv_techn_best_nr.
** Buchung der einzenen Wareneingänge anstoßen
IF gv_techn_best_nr IS INITIAL OR gv_techn_best_nr = '0000000000'.
gv_subrc = 4.
" Fehlerhandling !!
ELSE.
PERFORM form_emc_w_eing_buchen_02 USING lv_techn_best_nr.
IF lv_techn_best_nr IS INITIAL OR lv_techn_best_nr = '0000000000'.
gv_subrc = 4.
" Fehlerhandling !!
ELSE.
DATA: text TYPE string,
lv_anz TYPE string,
lv_anz_pos TYPE i.
DESCRIBE TABLE gt_pos_daten LINES lv_anz_pos.
lv_anz = lv_anz_pos.
CONCATENATE 'Bestellung ' gv_techn_best_nr ' mit ' lv_anz ' Position(en) '
' wurde erfolgreich angelegt.'
INTO text SEPARATED BY space.
MESSAGE text TYPE 'I'.
ENDIF.
ENDIF.
ENDFORM.
************************************************************************
* lokale Hilfsobjekte
************************************************************************
CLASS lcl_event_handler IMPLEMENTATION.
METHOD handle_data_changed. " FOR EVENT data_changed
DATA: ls_mod_cells LIKE LINE OF er_data_changed->mt_mod_cells,
lv_msg TYPE bapireturn1.
* auf Vorhandensein des Materials prüfen
READ TABLE er_data_changed->mt_mod_cells INTO ls_mod_cells INDEX 1.
IF ls_mod_cells-fieldname EQ 'MATERIAL'.
PERFORM check_mat_vorhanden_evt USING er_data_changed->mt_mod_cells
CHANGING lv_msg.
IF lv_msg IS NOT INITIAL.
TRY .
CALL METHOD er_data_changed->add_protocol_entry
EXPORTING
i_msgid = lv_msg-id
i_msgty = lv_msg-type
i_msgno = lv_msg-number
i_msgv1 = lv_msg-message
* i_msgv2 =
* i_msgv3 =
* i_msgv4 =
i_fieldname = ls_mod_cells-fieldname
i_row_id = ls_mod_cells-row_id " Welche Zeile der Anzeige hat den Fehler.
* i_tabix = ls_mod_cells-tabix
.
CATCH CX_ROOT.
ENDTRY.
ENDIF.
** auf doppelt angegebene Materialien prüfen
** -> erst nach Drücken auf Speichern, sonst ist immer nur der aktuellste Wert vorhanden
ENDMETHOD.
ENDCLASS.