Set Cursor funktioniert nicht immer

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

Set Cursor funktioniert nicht immer

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Habe ein seltsames Phänomen mit Set Cursor im Falle von Subscreens in einem Report.
Der Cursor soll immer auf dem Feld P_FUNC positioniert werden.
Wenn der Cursor auf einem Feld im Dynpro 1000 steht (z.B. P_TYPE), dann funktioniert SET CURSOR.
Wenn aber der Cursor in einem Subscreen positioniert wird, dann funktioniert SET CURSOR nicht - der Cursor bleibt im Subscreen.
In normalen Dialoganwendungen (keine Reports) kenne ich den Effekt nicht.
Hier folgt ein Beispiel-Coding. Verhält sich das bei euch auch so ?
Hat jemand eine Idee ?

Code: Alles auswählen.

report.
parameters: p_func(132) type c  visible length 40.
parameters: p_type(01)  type c.

selection-screen begin of tabbed block tabs   for 10 lines.
 selection-screen tab (30) tab_901 user-command   901
                                   default screen 901.
 selection-screen tab (30) tab_902 user-command   902
                                   default screen 902.
selection-screen end   of        block tabs.

" tab 1
selection-screen begin of screen 901 as subscreen.
  parameters:  p_tab1 type c.
selection-screen end   of screen 901.

" tab 2
selection-screen begin of screen 902 as subscreen.
  parameters:  p_tab2 type c.
selection-screen end   of screen 902.

at selection-screen output.

check sy-dynnr eq 1000.
set cursor field 'P_FUNC'.

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


Re: Set Cursor funktioniert nicht immer

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

nun wenn der Cursor auf dem Subscreen Feld steht - dann ist der Screen auch nicht 1000 - daher dürfte deine Check Abfrage hier das Problem sein - schon mal im Debugger geschaut ob er überhaupt an diese Stelle kommt - denke kommt das Programm nicht ?

Gruss
thanks Jens

Re: Set Cursor funktioniert nicht immer

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Es funktioniert auch ohne den Check nicht - hatte ich alles bereits ausprobiert.
Das Ereignis "at selection-screen output" wird zweimal durchlaufen:
zuerst für Dynpro 1000 und dann für das Dynpro des aktuellen Subscreen.
Der Check ist nur deshalb da, weil ein Set Cursor sich ja auf das aktuelle Dynpro bezieht.
Da das gewünschte Feld aber nur in Dynpro 1000 ist und in den Subscreens nicht enthalten ist, mache ich den Set nur bei Dynpro 1000.

Re: Set Cursor funktioniert nicht immer

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

wofür ist der Parameter p_func ?
Hast du schon malö probiert die reihenfolge auf deinem Screen zu ändern - also die Parameter nach den Tabstrip ?

Gruss
thanks Jens

Re: Set Cursor funktioniert nicht immer

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Hallo Jens,

das hier ist nur ein Beispielprogramm.
Es spielt keine Rolle wofür der Parameter P_FUNC steht.
Habe die Reihenfolge der Felder geändert - gleicher Effekt.

Re: Set Cursor funktioniert nicht immer

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

also habe das mal schnell nachgebaut - bei mir klappt es -wenn der Cursor in eine Tabstripfeld steht, ich den Tabstrip wechsle - dann geht der Cursor genau in P_func - oder was erwartest du wie ?

Gruss
thanks Jens

Re: Set Cursor funktioniert nicht immer

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
genau so, wie es bei dir ist, habe ich es erwartet und gewollt.
Aber bei mir bleibt der Cursor in dem Tabstripfeld stehen und ich habe keine Ahnung woran das liegt.

Auf welchem Release hast du das getestet ?

Re: Set Cursor funktioniert nicht immer

Beitrag von jensschladitz (Specialist / 417 / 0 / 56 ) »
Sali,

Release 7.01

Gruss
thanks Jens

Re: Set Cursor funktioniert nicht immer

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Wir haben noch 7.00 - nun denn.
Danke für deine Anteilnahme.

Re: Set Cursor funktioniert nicht immer

Beitrag von black_adept (Top Expert / 4159 / 136 / 960 ) »
@Jens: Wenn du aber nicht den Tabstrip wechselst sondern einfach nur "ENTER" drückst, bleibt der Cursor im Tabstrip stehen ohne nach oben zu springen. Egal welches Release.

@Dele: Das Problem dürfte der Focus sein. SAP merkt sich wo der Focus sitzt. In deinem Fall geht der nämlich auf den Subscreen der dem Tab zugeordnet ist über. Und wenn du jetzt "OK" drückst sorgt SAP dafür, dass der Cursor den fokussierten Screen nicht verlässt. --> Er springt nicht nach oben.
Das erklärt auch das Verhalten bei Jens - wenn er den Tabstrip wechselt ist der "alte" Subscreen der vorher den Fokus hatte nicht mehr vorhanden --> SAP positioniert auf dem nächst höheren Level und findet dort dann auch wieder die Anweisung wo genau der Cursoer jetzt zu platzieren ist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Set Cursor funktioniert nicht immer

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
@ black_adept

Da ich das Problem mit normalen Dialog-Anwendungen nicht kenne, habe ich mir das mal genauer angesehen. Deine Vermutung mit dem Focus kommt der Sache ziemlich nahe.

Die PBO-Ablauflogik des generierten Haupt-Dynpros 1000 sieht so aus:

Code: Alles auswählen.

MODULE %_INIT_PBO.
MODULE %_PBO_REPORT.
MODULE %_PF_STATUS.
  CALL SUBSCREEN %_SUBSCREEN_TABS
  INCLUDING TABS-PROG TABS-DYNNR.
MODULE %_END_OF_PBO.
Die PBO-Ablauflogik eines generierten Sub-Screens (z.B. 901) sieht so aus:

Code: Alles auswählen.

MODULE %_INIT_PBO_J.
MODULE %_PBO_REPORT.
MODULE %_PF_STATUS.
MODULE %_END_OF_PBO.
Es wird zuerst das Haup-Dynpro und dann der Sub-Screen prozessiert. (wichtig zu wissen)
In den Modulen %_INIT_PBO (Haupt-Dynpro) und %_INIT_PBO_J (Sub-Screen) wird die Form-Routine %_PBO_MODIFY_SCREEN von RSDBRUNT aufgerufen.

Code: Alles auswählen.

* Wird als letzte Routine aus Modul %_INIT_PBO gerufen
* Jedesmal bei PBO
FORM %_PBO_MODIFY_SCREEN.                                         "#EC *
....
....
....
  IF CURSOR-FIELD ne SPACE and
     cursor-prog = current_screen-program and
     cursor-dynnr = current_screen-dynnr.
    SET CURSOR FIELD CURSOR-FIELD.
  ENDIF.
Wenn nun der Cursor auf einem Subscreen-Feld positioniert ist, dann wird von SAP ein SET CURSOR auf dieses Feld ausgeführt und macht damit einen vorherigen SET CURSOR ungültig - das entspricht deiner Focus-Vermutung.
Ein eigener SET CURSOR auf ein Feld des Haupt-Dynpros während der PBO-Verarbeitung des Sub-Screens funktioniert nicht, da das Feld im Sub-Screen nicht bekannt ist.

Durch Zufall habe ich einen Trick entdeckt, wie man doch noch nach der PBO-Verabeitung des Sub-Screens in die PBO-Verarbeitung des Haupt-Screens gelangen kann, um dann noch mal einen SET CURSOR auszuführen. Denn im letzten Modul %_END_OF_PBO des Haupt-Screens, das nach der PBO-Verabeitung des Sub-Screens ausgeführt wird, wird unter bestimmten Umständen die Form-Routine %_SELSCREEN_TITLE_% des aktuellen Reports aufgerufen. Hier das Beispiel-Coding dazu:

Code: Alles auswählen.

report.

field-symbols: <titletype> type c.

parameters: p_type(01)     type c.
parameters: p_func(132)    type c  visible length 40.

selection-screen begin of tabbed block tabs   for 10 lines.
 selection-screen tab (30) tab_901 user-command   901
                                   default screen 901.
 selection-screen tab (30) tab_902 user-command   902
                                   default screen 902.
selection-screen end   of        block tabs.

" tab 1
selection-screen begin of screen 901 as subscreen.
  parameters:  p_tab1 type c.
selection-screen end   of screen 901.

" tab 2
selection-screen begin of screen 902 as subscreen.
  parameters:  p_tab2 type c.
selection-screen end   of screen 902.

************************************************************************
at selection-screen output.
************************************************************************
    " set screen-title-type of rsdbrunt to 'F'
    " This is a trick, to force rsdbrunt to call the routine
    " %_SELSCREEN_TITLE_% after pbo processing of subscreens
    if   sy-dynnr eq '1000'.
         assign         ('(RSDBRUNT)CURRENT_SCREEN-TITLETYPE')
              to        <titletype>.
         if   sy-subrc eq 0.
               move           'F'            to   <titletype>.
         endif.
    endif.

************************************************************************
* set cursor
************************************************************************

form  set_cursor                  using     f_field.

    set            cursor         field     f_field.

endform.

************************************************************************
* Trick to set cursor after subscreen processing
************************************************************************

form  %_SELSCREEN_TITLE_%         using     f_dynnr type sy-dynnr
                                  changing  f_title type csequence.

    perform set_cursor using 'P_FUNC'.

endform.

Folgende Benutzer bedankten sich beim Autor Dele für den Beitrag:
black_adept


Seite 1 von 1

Vergleichbare Themen

5
Antw.
12636
Views
GET/SET Cursor
von Gotti » 27.08.2008 14:10 • Verfasst in Dialogprogrammierung
4
Antw.
3275
Views
Set Cursor
von Roger » 15.02.2012 11:03 • Verfasst in ABAP Objects®
6
Antw.
4406
Views
Arbeitsbereichzugriff mit Cursor
von Cola » 17.10.2007 12:20 • Verfasst in SAP - Allgemeines
2
Antw.
3119
Views
Fetch next Cursor...
von MarkusW » 08.01.2008 12:31 • Verfasst in ABAP® Core
4
Antw.
4157
Views
SET CURSOR auf Feld
von debianfan » 11.06.2018 11:32 • Verfasst in Dialogprogrammierung

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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.