06-24-2022 8:27 AM
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.
06-24-2022 8:34 AM
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
06-24-2022 9:11 AM
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
06-24-2022 9:22 AM
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.
06-24-2022 9:46 AM
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).
06-27-2022 11:15 AM
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.
06-27-2022 1:27 PM
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.
06-27-2022 9:46 PM
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.
06-28-2022 11:47 AM
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!
06-28-2022 12:03 PM
Sie haben recht aber als Frische Entwickler muss alles mal Probieren
06-27-2022 1:51 PM
SELECT-OPTIONS creates a range, which is an internal table.
06-27-2022 9:55 PM
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
06-28-2022 9:50 AM
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.
06-28-2022 11:29 AM
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.
06-28-2022 5:04 PM
It would be easier for you to only allow 'BT' in the option for the date range select-options.
06-29-2022 9:36 AM
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 ) ).