Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Datum aus Select option bearbeiten

aboooood
Participant
0 Kudos

Hallo zusammen, ich versuche folgendes zu machen: der benutzer kann ein zeitraum eingeben die nicht länger als 21 Tage ist.

01.01.2000 22.01.2000. wenn er versucht irgendetwas anders einzugeben sollte ne fehlermeldung gezeigt und kann noch einmal versuchen.

ich bin dankbar für jeder hilfe

 SELECTION-SCREEN: BEGIN OF BLOCK s WITH FRAME TITLE TEXT-001.
DO.
SELECT-OPTIONS: p_datum  FOR  rbkp-budat OBLIGATORY.
SELECTION-SCREEN: SKIP.
*  PARAMETERS: p_knr        TYPE rbkp-lifnr.
*  PARAMETERS: p_ebeln      TYPE rseg-ebeln.
IF p_datum - p_datum = 21.
exit.
ELSE.
Message e000(ZAL_DATUM).
ENDIF.
ENDDO.
15 REPLIES 15

FredericGirod
Active Contributor

Wenn du eine Periode eingeben willst, brauchst du zwei PARAMETER

oder sonst musst du deinem Benutzer vertrauen und den oberen und unteren Wert deines SELECT-OPTIONS verwenden

P_DATUM-HIGH - P_DATUM-LOW

aber fügt die Option NO EXTENSION zur SELECT-OPTIONS-Deklaration hinzu

aboooood
Participant
0 Kudos

es hat funktioniert ich habe so gemacht:

IF p_datum-high - p_datum-low <= 21.

exit.

aber wenn die eingabe nicht <= 21 dann wiederholt es nicht. ich will beim falschen eingabe die möglichkeit haben dass der benutzer nochmal datum eingeben kann

FredericGirod
Active Contributor

Die Aktion, die du eingegeben hast, hat keine Informationen erhalten, sie geht davon aus, dass es im Programm steht. Das wäre das Gleiche, wenn du kurz zuvor START-OF-SELECTION eingegeben hättest.

Du musst angeben, dass das Programm ein Ereignis mit der Anweisung AT SELECTION-SCREEN verarbeiten soll ... du kannst alle Optionen mit der Transaktion ABAPDOCU überprüfen.

matt
Active Contributor

Wie frdric.girod gesagt hat, sind Parameter für diese Functionalität besser als Select-Options.

Bitte, schauen Sie mein blog hier: https://blogs.sap.com/2014/02/07/dates-and-select-options/ (Auf Englisch).

aboooood
Participant
0 Kudos

danke für die hilfe ich habe es jetzt so gemacht und es funktioniert:

SELECTION-SCREEN: BEGIN OF BLOCK s WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: p_datum  FOR  rbkp-budat OBLIGATORY.

AT SELECTION-SCREEN ON p_datum.
  PERFORM checkdate.

FORM checkdate .
  IF p_datum-high - p_datum-low > 21.
    MESSAGE e000(zal_datum).
  ENDIF.
ENDFORM.

matt
Active Contributor
0 Kudos

Ihre Lösung funktioniert nicht. Sie ist falsch. Denken Sie darüber nach. Die Select-Option darf nur ein Datum enthalten. Sie kann "> ein Datum" enthalten. Sie kann mehrere Datumsbereiche enthalten. Die richtige Lösung ist so:

PARAMETERS: p_datvon TYPE rbkp-budat OBLIGATORY,
            p_datbis TYPE rbkp-budat OBLIGATORY.

0 Kudos

die anforderungen waren dass ich nur select options benutzen darf von daher habe ich diese fuba benutzt: select_options_restrict

aber bin nicht sicher ob es passt. so sieht mein code aus:

SELECTION-SCREEN: BEGIN OF BLOCK s WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_datum  FOR  rbkp-budat OBLIGATORY.
SELECTION-SCREEN: END OF BLOCK s.

INITIALIZATION.
* Name einer Optionenliste für SELECT-OPTIONS-Restriktionen
  DATA(lv_opt_list) = 'OPT_LIST'.

* Optionenliste
  DATA(it_options) = VALUE sscr_opt_list_tab( ( name       = lv_opt_list
                                                options-gt = abap_true
                                                options-ge = abap_true ) ).

* Zuweisungen
  DATA(it_assignment) = VALUE sscr_as_tab( ( kind    = 'S'                 " A(ll), B(lock), S(elect-Option)
                                              name    = 'S_DATUM'           " Blockname, maximal 20 Zeichen
                                              sg_main = 'I'                " (only) I, SPACE = both
                                              op_main = lv_opt_list ) ).

* Einschränkungen für die SELECT-OPTIONS
  DATA(it_restrictions) = VALUE sscr_restrict( opt_list_tab = it_options
                                               as_tab      = it_assignment ).

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = it_restrictions
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

  IF sy-subrc = 0.

  ENDIF.

FORM checkdate .
  IF s_datum-high - s_datum-low > 21.
    MESSAGE e000(zal_datum).
  ENDIF.
ENDFORM.

matt
Active Contributor
0 Kudos

Ich habe die Erfahrung gemacht, dass ich als Entwickler oft in Frage stellen muss, was der Funktionsanalytiker als Anforderung angibt. Um die gewünschte Funktionalität zu implementieren, muss man eine SELECT-OPTION dazu zwingen, sich wie zwei separate Parameter zu verhalten. Dazu braucht man eine Menge Code. Die Komplexität ist höher, ohne dass ein funktionaler Mehrwert entsteht.

Mit ein paar zusätzlichen SELECTION-SCREEN Statements kann man sogar erreichen, dass zwei Parameter wie eine Select-Option aussehen!

0 Kudos

Sie haben recht aber als Frische Entwickler muss alles mal Probieren

raymond_giuseppi
Active Contributor
0 Kudos

SELECT-OPTIONS creates a range, which is an internal table.

  • From your requirement, you should add the NO-EXTENSION option to restrict user to only one range
  • In your validation, you have to LOOP AT the select-option
  • You should also insure that user input some values, else you get an empty selection, so each and every date will be selected (either check in your code that the LOOP returns a record or add option OBLIGATORY to SELECT-OPTIONS statement)

0 Kudos

i wrote a Comment down how my code is now look like. should i still need a loop over my select options and a NO-EXTENSION?

i have a OBLIGATORY tho in my select options .

thx for ur help

0 Kudos

If you don't add the NO-EXTENSION, some users may add hundreds of date ranges of less than 21 days each bypassing your check...

The select-options has an header line in your program, with the two options OBLIGATORY and NO-EXTENSION there should be one and only one record, so you may omit the LOOP, only in this case.

Don't forget some other cases when (examples) user only filled one date (so only this exact date is selected) don't subtract (<select-options>-high is initial.) or user excluded a range (<select-options>-sign EQ 'E') or user use some other comparison operator (<select-options>-option should be 'BT' or 'EQ' and not 'LT' for example.

Hint: It could be easer to restrict user 'creativity' with the FM SELECT_OPTIONS_RESTRICT.

0 Kudos

i did an upgrade to my code now its looking like this but not sure if its right:

SELECTION-SCREEN: BEGIN OF BLOCK s WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_datum  FOR  rbkp-budat OBLIGATORY.
SELECTION-SCREEN: END OF BLOCK s.

INITIALIZATION.
* Name einer Optionenliste für SELECT-OPTIONS-Restriktionen
  DATA(lv_opt_list) = 'OPT_LIST'.

* Optionenliste
  DATA(it_options) = VALUE sscr_opt_list_tab( ( name       = lv_opt_list
                                                options-gt = abap_true
                                                options-ge = abap_true ) ).

* Zuweisungen
  DATA(it_assignment) = VALUE sscr_as_tab( ( kind    = 'S'                 " A(ll), B(lock), S(elect-Option)
                                              name    = 'S_DATUM'           " Blockname, maximal 20 Zeichen
                                              sg_main = 'I'                " (only) I, SPACE = both
                                              op_main = lv_opt_list ) ).

* Einschränkungen für die SELECT-OPTIONS
  DATA(it_restrictions) = VALUE sscr_restrict( opt_list_tab = it_options
                                               as_tab      = it_assignment ).

  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      restriction            = it_restrictions
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

  IF sy-subrc = 0.

  ENDIF.

FORM checkdate .
  IF s_datum-high - s_datum-low > 21.
    MESSAGE e000(zal_datum).
  ENDIF.
ENDFORM.

It would be easier for you to only allow 'BT' in the option for the date range select-options.

0 Kudos

i did this now is working like how it should

 DATA(it_options) = VALUE sscr_opt_list_tab( ( name       = lv_opt_list
                                                options-gt = abap_true
                                                options-ge = abap_true
                                                options-bt = abap_true
                                                options-eq = abap_true ) ).