Dynprofeld nicht ausgegeben

Benutzeroberflächen in SAP®-Systemen.
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

Dynprofeld nicht ausgegeben

Beitrag von Ines (ForumUser / 22 / 0 / 0 ) »
Hallo,

ich habe folgendes Problem. Ich habe ein Dynpro mit 2 ALV Grids und ein einfaches Ausgabefeld auf dem Dynpro. Bei Doppelklick auf das eine ALV möchte ich in dem Ausgabefeld einfach den Wert aus einem Feld der Workarea ausgeben. In der WA steht der richtige Wert auch drin, nur die Ausgabe funktioniert nicht, bzw kommt es im weiteren Programmverlauf zu Problemen.
Das Ausgabefeld ist immer 0 wenn ich das folgendermaßen mache:
FORM handle_double_click USING i_row TYPE lvc_s_row
i_column TYPE lvc_s_col
is_row_no TYPE lvc_s_roid.

READ TABLE i_plist INTO wa_preislist INDEX is_row_no-row_id .

DasFeld was ich ausgeben möchte heißt wa_preislist-z_prli_nr, dort steht wie gesagt auch der richtige Wert drin.

Ich bekomme das Feld richtig ausgegeben wenn ich nach den oberen Zeilen ein "LEAVE TO SCREEN 200." mache. 200 ist mein Dynpro auf dem die Aktion ausgeführt wird.
Jedoch funktioniert bei dieser Variante der Rest des Programms nicht richtig, zum einen ist beim Doppelklick auf diese Zeile, die dann nicht mehr markiert, was nicht das schlimmste wäre, könnte nur den Benutzer verwirren, da er denkt die Zeile sei nciht mehr markiert. außerdem funktionieren aber meine Userkommandos nicht mehr, wenn ich ein neues Dynpro öffne, kann ich dies nur durch mehrmaliges Klicken verlassen. Und auch die restlichen Benutzerkommandos funktionieren nicht richtig.
Weiß jemand wieso das so ist? Und wie ich das beheben kann? Ich will doch bloß ein Ausgabefeld angezeigt bekommen, das funktioniert übrigens auch nicht, wenn ich dort fest einen Wert reinschreibe, an der Zuweisung liegt es also nciht, es muss wohl irgendwas mit der Ablauflogik oder so zu tun haben...

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Arno Simon (ForumUser / 84 / 0 / 1 ) »
Hallo Ines,

innerhalb des selben Dynpros keinen "Leave to Screen" machen, sondern einfach nur dafür sorgen, das nach der Wert-Zuweisung im PAI keine weitere Aktion durchgeführt wird.

Sprich: Das Coding so aufbauen, das nach der Zuweisung des Wertes weder das Feld zurückgesetzt noch andere, ausser den gewollten, Aktionen durchgeführt werden.

Dann sollte es auch mit dem Nachbarn ... äh Feldwert klappen.

vG

Arno

Beitrag von Ines (ForumUser / 22 / 0 / 0 ) »
Danke für die Antwort.
Aber den Feldwert habe ich im Feld stehen, zumindest denke ich das. Das ist auch die einzige PAI Aktion die da ausgeführt wird und das Feld wird auch nicht gelöscht oder so. Wenn ich ein andeses Dynpro aufrufe, wo das gleiche Feld angezeigt werden soll, funktioniert das auch. Das muss irgendwie an der Anzeige liegen, im Debugger habe ich den richtigen Wert im Feld stehen.

Beitrag von Ines (ForumUser / 22 / 0 / 0 ) »
Gerade habe ich was erstaunliches festgestellt, was evtl auch hilfreich ist.
Beim Doppelklick auf das Ausgabefeld, wird der Inhalt plötzlich angezeigt...

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
Ines hat geschrieben:Gerade habe ich was erstaunliches festgestellt, was evtl auch hilfreich ist.
Beim Doppelklick auf das Ausgabefeld, wird der Inhalt plötzlich angezeigt...
Das liegt daran, das dieser Doppelklick auf dein Ausgabefeld das PAI auslösst!

Wenn du auf einem Grid z.B. ein Doppelklcik machst wird NUR ein Ereignis ausgelöst, das du abfangen kannst, es wird aber NICHT das PAI durchlaufen und deshalb wird das Ausgabefeld auch nicht aktualisiert!

Ruf am besten am ende deiner Ereignisbehandlung folgende Methode auf! CL_GUI_CFW=>SET_NEW_OK_CODE
Diese erzingt das PAI!

Beitrag von Ines (ForumUser / 22 / 0 / 0 ) »
Vielen Dank.
Da ergibt sich jedoch das gleiche Problem, wie mit leave to screen 200. Die Spalte ist nicht mehr markiert, das Könnte den Benuter verwirren und wenn man ein neues Dynpro aufruft, lässt dich dieses erst nach mehrmaligen klicken beenden.
Angezeigt bekomme ich jedoch den gewünschten Wert...

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
Ines hat geschrieben:Vielen Dank.
Da ergibt sich jedoch das gleiche Problem, wie mit leave to screen 200. Die Spalte ist nicht mehr markiert, das Könnte den Benuter verwirren und wenn man ein neues Dynpro aufruft, lässt dich dieses erst nach mehrmaligen klicken beenden.
Angezeigt bekomme ich jedoch den gewünschten Wert...
der cl_gui_alv_grid_display hat auch ein paar Methoden namnes get/set_selectet_rows usw.
also einfach Markierungen merken und beim PBO wieder markieren.


Und zu dem mit dem neuen Dynpro und mehrmaligen wegklicken:
Da würd ich mir mal die Dynproreihenfolge/Aufrufe nochmals durchgehen.

Beitrag von Jupp (ForumUser / 47 / 0 / 2 ) »
Das nachfolgende Programm gibt eine Materialliste im Grid aus und öffnet auf den Doppleclick einer Zeile ein modales Dialogfenster.
Im Dialogfenster können die Werte Materialnummer, Erstelldatum und Ersteller zur Materialliste geändert werden.

Vielleicht gibzt dieses Beispielprogramm ja neue Impulse.

Code: Alles auswählen.

REPORT zz_testnochma .
TABLES mara.

* Ereignishandler für Doppelclick
CLASS lcl_event_receiver DEFINITION DEFERRED.

DATA: tab_mara TYPE TABLE OF mara.
DATA  wa_mara TYPE mara.

DATA container TYPE REF TO cl_gui_custom_container.
DATA grid      TYPE REF TO cl_gui_alv_grid.
DATA event_receiver TYPE REF TO lcl_event_receiver.
DATA okcode TYPE sy-ucomm.

SELECT-OPTIONS: so_matnr FOR mara-matnr.

SELECT * FROM mara INTO TABLE tab_mara
UP TO 20 ROWS
WHERE matnr IN so_matnr.

CALL SCREEN '100'.
*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS:
    handle_double_click
    FOR EVENT double_click
    OF cl_gui_alv_grid
    IMPORTING e_row e_column es_row_no .
ENDCLASS.
*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_double_click.
* Tabs für Zeilenmarkierung 
    DATA:
    it_index_rows TYPE lvc_t_row,
    it_row_no	TYPE lvc_t_roid.
    
*   Zeile lesen und Zeilen markierung merken     
    READ TABLE tab_mara INTO wa_mara INDEX es_row_no-row_id.
    APPEND e_row TO it_index_rows.
    APPEND es_row_no  TO it_row_no.

*   Aufruf modales Dynpro fürs Ändern    
    CALL SCREEN 200 STARTING AT 6 15.

*   Update auf interne Tabelle     
    MODIFY tab_mara FROM wa_mara INDEX es_row_no-row_id.

*   Refresh auf Grid    
    CALL METHOD grid->refresh_table_display.
    
*   Zeilenmarkierung setzen    
    CALL METHOD grid->set_selected_rows EXPORTING
    it_index_rows = it_index_rows
    it_row_no = it_row_no.
  ENDMETHOD.
ENDCLASS.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '100'.
*  SET TITLEBAR 'xxx'.
  IF container IS INITIAL.
    CREATE OBJECT container
    EXPORTING
    container_name = 'CONTAINER'.

    CREATE OBJECT grid
    EXPORTING
    i_parent = container.

    CALL METHOD grid->set_table_for_first_display
      EXPORTING
    i_structure_name              = 'MARA'
      CHANGING
        it_outtab                     = tab_mara
*  EXCEPTIONS
*    INVALID_PARAMETER_COMBINATION = 1
*    PROGRAM_ERROR                 = 2
*    TOO_MANY_LINES                = 3
*    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.
  ELSE.
    CALL METHOD grid->refresh_table_display.
  ENDIF.
  
* Ereignishandler auf Grid ereignis Doppelclick abonnieren  
  CREATE OBJECT event_receiver.
  SET HANDLER event_receiver->handle_double_click FOR grid.

  CALL METHOD cl_gui_control=>set_focus
    EXPORTING
      control = grid.

ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE okcode.
    WHEN 'BACK'.
      IF NOT grid IS INITIAL.
        FREE grid.
      ENDIF.
      IF NOT container IS INITIAL.
        CALL METHOD container->free.
        FREE container.
      ENDIF.
      LEAVE TO SCREEN 0.
      CLEAR okcode.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*&      Module  STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
  SET PF-STATUS '200'.
ENDMODULE.                 " STATUS_0200  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
  IF okcode = 'BEEN'.
    CLEAR okcode.
    LEAVE TO SCREEN 0.
  ENDIF.
ENDMODULE.                 " USER_COMMAND_0200  INPUT
Always Better Alternatives Possible.

Beitrag von Ines (ForumUser / 22 / 0 / 0 ) »
Also, mitterweile habe ich rausgefunden, dass ich nach dem Schließen des Fensters dieses erneut aufrufe. und zwar komme ich an diese stelle zurück wenn ich im neuen fenster auf abbrechen gehe.

METHOD handle_user_command.
DATA bukrs TYPE zvdb_preislist-bukrs.
CASE e_ucomm.



WHEN 'CHG'.
CALL SCREEN 0400
STARTING AT 5 5.


warum weiß ich allerdings nicht. hier wird dann das dynpro erneut aufgerufen, also wird es erst gar nicht geschlossen. beim nächsten klick auf abbrechen funktioniert es jedoch dann. ich verstehe nur nicht, wieso es geklappt hat, bevor ich die methode cl_gui_cfw=>set_new_ok_code eingefügt habe...
vielleicht habe ich dort einen falschen parameter? was muss denn "new_code" sein?und was für folgen hat das?

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
Ines hat geschrieben:ich verstehe nur nicht, wieso es geklappt hat, bevor ich die methode cl_gui_cfw=>set_new_ok_code eingefügt habe...
vielleicht habe ich dort einen falschen parameter? was muss denn "new_code" sein?und was für folgen hat das?
Da wo ich ja gesagt hab, das das mit dem cl_gui_cfw=>set_new_ok_code machen sollst, musst einfach irgenwas mitgeben. Am besten einfach sowas wie "DUMMY". Einfach ein nicht existierenden OK-Code, da man dadurch ja nur das PAI erzwingen will ohne ansonsten was zu machen.

Beitrag von Ines (ForumUser / 22 / 0 / 0 ) »
Aber wenn ich den PAI erzwinge, springe ich ja da rein und dann ruft er wieder das Dynpro auf, wie oben geschrieben, da das ja der letzte OK_CODE war. Ist ja irgendwie logisch, aber das soll er ja nicht. Sondern das Dynpro schließen...

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
Ines hat geschrieben:Aber wenn ich den PAI erzwinge, springe ich ja da rein und dann ruft er wieder das Dynpro auf, wie oben geschrieben, da das ja der letzte OK_CODE war. Ist ja irgendwie logisch, aber das soll er ja nicht. Sondern das Dynpro schließen...
HÄ????
Du willst doch nach dem Doppelcklick im Alv den Wert ind er Ausgagezeile, oder? Wenn ja, dann musst du den PAI bekommen.
Und wenn dann das Folgebild in den Eigenschaften des Dynpros das gleich ist, funktioniert es auch und es ist wie es sein soll (eventuell einen schalter im PBO einbauen damit nicht alles wirklich neu aufgebaut wird).

Oder hast du in deinem PAI "CALL SCRENN selbesdynpro" stehen?

Beitrag von JHM (Top Expert / 1209 / 1 / 202 ) »
Ines hat geschrieben: da das ja der letzte OK_CODE war.
Initialisierst du das ok_code feld? Es ist eine Eigenart des OK-CODE-FELDES welches im Dynpro eingetragen ist wird, dass nicht automatisch initialisiert wird.

Bsp.:

Du löst den ok-code 'CHECK' aus. Der code wird in das ok-code-feld geschrieben und die PAI-Verarbeitung beginnt. Irgendwann kommt die Routine, die den ok_code auswertet. Es wird irgendwas gemacht (z.B. Daten prüfen) und danach zur PBO-Verarbeitung gewechsel.

Nach der PBO-Verarbeitung wird das Dynpro wieder angezeigt. Druckst du jetzt enter wird wieder der PAI prozessiert. Da das ok-code-feld aber nicht nach der letzten Verarbeitung initilisiert wurde, steht in diesem immer noch 'CHECK' (Das reine Enter ist ein leerer OK-CODE, es findet hier kein Wert-Transport in das OK-Code-Feld statt).

Wenn du die Methode cl_gui_cfw=>set_new_ok_code aufrufst, ohne einen OK-Code mitzugeben, wird ein Enter nach der Verarbeitung des doppelklick-events simuliert. Wenn in deinem OK-Code noch der alte OK-Code für Call Screen steht wird dieser verarbeitet.

Hoffe das war verständlich.
Gruß Hendrik

Seite 1 von 1

Vergleichbare Themen

3
Antw.
1265
Views
ID wird immer mit ausgegeben
von Dyrdek » 05.06.2014 10:44 • Verfasst in ABAP® für Anfänger
0
Antw.
1292
Views
Anstatt Absatz wird # ausgegeben
von Irieman » 16.07.2008 12:13 • Verfasst in ABAP® für Anfänger
6
Antw.
2259
Views
Textsymbole werden nicht ausgegeben
von drama » 02.02.2016 11:04 • Verfasst in ABAP® für Anfänger
1
Antw.
1256
Views
Message wird in PAI nicht ausgegeben
von RIG » 11.08.2014 15:19 • Verfasst in ABAP® Core
0
Antw.
839
Views
neue nachrichtenart wird nicht ausgegeben
von Thanatos82 » 13.03.2013 10:15 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.